vba编程基础2
安装office2010的时候, 最好是 完全安装/完整安装 , 这样可以查阅 excel的 "帮助文档" 帮助文档中包含了更多的/更详细的 参考信息.
普通模块无事件, 只有 子过程和函数等.. / 而类模块(包括工作表/工作簿/窗体)模块 才有 事件!
工作表的名称: 要注意, 在vba代码中, 是用的 worksheet表示工作表, 而在excel中表示工作表的 默认名称直接是 : Sheet1, Sheet2,Sheet3 没有work-
但是在excel对象中, 是三个sheet1/2/3 对象. 不是 worksheet1.2.3 对象~
工作表和vba中引用 其他工作表 的方式不同?
-
一个工作表中要引用 另外一个(其他) 工作表, 要 使用 感叹号, 而且 工作表名称 : 要使用 你所看到 的工作表的名称, 不能使用 sheet1, 也不能 加引号:
=SUM(A生产线 ! A2)
-
而在vba中 则要使用 sheet1加点号: 不能使用excel中的名称, 也不能使用 感叹号, 要使用 点语法 如:
' 在sheet2 中:
Sub foo()
Dim rg As Range
Set rg = Sheet1.Range("a2")
MsgBox rg.Value
End Sub
方法Add, 只能作用于 表示复数的对象, 如 workbooks, worksheets, 而不能应用于 单数的对象,如 worksheet, workbook等.
workbooks.add, worksheets.add
默认的工作表中的按钮事件过程, 是private的, 但是你可以 手动地修改为 public, 这样 在其他工作表中就可以使用了.
最重要 的: **vba 的函数, 通常 用在 赋值语句中, 因为 要返回值, 而凡是没有 /不需要返回值的 都使用 子过程.. 而且子过程 的调用方式 , 第一 , 都是 不用call, 不用括号, 第二, 而且 参数的写法通常采用 冒号等号的方式, 第三, 对于可选参数, 顺序是没有规定的, 可以是 随意 ; 而且 有些可选参数 你不是 必须 要写的, 有些参数 你可以 不写! 第四, 最重要的是, 不管 是括号内的参数, 还是这种用 冒号等号的方式, 多个参数之间, 一定要用 逗号 连接 分隔. 不能使用 空格来 进行分隔 ,否则会报错! **
在pagesetup对象的属性中: orentation有两个值: xllandscape, xlPortrait: xl 表示 excel的前缀, landscape表示 横向, Portrait本意是肖像, 这里是 竖版的意思.
vba编辑器会 自动识别 代码中的 "属性和方法" 等关键字, 在 "保存" 时, 会自动转换为 首字母大写的 驼峰法. 但是 如果某个 "属性或方法" 没有变成 首字母大写, 就说明, 这个 写法 一定 是错误的了, 也一定会 报错: "没有那个属性或方法" .
工作表的激活: 激活是: activate, 激活后的工作表叫做 : activeSheet. 即: activate-- active.
工作表的集合worksheets.add before:=(这里需要的是一个工作表对象, 而不只是工作表的名称, 所以 要使用 worksheets(1) worksheets("sheet1"), worksheets(worksheets.count)) .
format是格式化 数字/字符串/货币/日期时间等的. 其格式参考: http://blog.sina.com.cn/s/blog_715070f20100w9me.html
释放对象, 使用set foo=nothing. 只有工作簿才有 另存为: saveas... 的方法, 而worksheet是没有 saveas的 方法, 因为 saveas 是存储为一个文件!!!
ActiveX 部件不能创建对象或返回对该对象的引用(错误 429)
这种错误, 不仅是vba中可能碰到, 而且在 上一次 安装机房 软件时, 也碰到:
定义某个变量的时候, 如果你拿不准 它, 可以将它定义为 variant , 或者干脆就不要定义 类型., 干脆就定义为 dim some_var // 不要as type
杂项
-
一个vba窗口可以对应 很多个 工作簿 workbooks. 每个工作簿在vba中 都有一个 vba project工程, 一个vba工程包括两个部分( ms excel对象=sheet1, sheet2, ... 和模块对象= 模块1, 模块2, 模块3....)
-
application.getsaveasFilename 弹出一个另存为 的窗口, 可以获得他的文件名, (这个文件名, 要自己给出 扩展名), 返回的是一个 "字符串". string
-
Range("range1"):这里使用的是 单元格/区域的 名称!! 也是可以的!
-
用中括号将单元格地址括起来 也表示 单元格, 这时候, 地址 不能用引号: 如: [A1] [C10].select
工作表的三种 表示方法
-
worksheets("name").Range("a1")
-
sheet1.Range("a1") // 这里的sheet1是代码名称, 但是他是容易变的. 因为在属性窗口中, (名称) 那里, 可以 直接修改的.比如 , 将sheet1 可以直接 修改为 sheet10.... 那么 excel对象下就变成 sheet10 了
-
worksheets(1). range("a1")
-
选中所有的单元格: cells, 选中所有的行: Rows.select, Columns.select.
-
标签内容文字, 显示为当前文件的路径:
label2.caption = thisbookwork. path
-
name是所有控件都有的属性; caption一般只有 label等 一般不用来 做修改的"标题", text是文本框中的内容.
-
组合框: combobox: = combo - box: combo 组合, box框. combobox表示的是 组合框.... combobox的方法additem是 添加条目的意思:
combobox1 . additem ("abc")
-
设置窗体中某个控件为 焦点:
textbox1.setFocus
在windows中, "打开"和 "编辑"的区别?
- 对config, ini, xml等配置文件, 打开: 是指 运行Run, 比如: html文件打开, 就是 在browser中 显示.
- 而 要对他的代码/内容, 进行编辑修改, 要使用 右键菜单中 的 "编辑" edit 命令...
通过录制宏:
-
并不会像 录音机一样, 把所有的操作都记录下来::: 只会记录 成功的 , 有结果的操作.
-
通过录制宏, 可以 在 "编辑"代码中 , 看到 录制的宏, sub, 从而学习 vba代码的书写., 比如: 当我们选中了单元格区域后, 要对选中区域进行引用, 可以使用 with selection.font...
-
tint: 色调, 色相; 染色剂等 . tintandshade =0
-
interior: 是一个属性, 同时返回一个 interior对象, 然后可以对这个interior对象进行 颜色的填充.
-
vba中的colorindex是指颜色 索引值从0开始的 整数, 会显示相应的颜色引用. 这个索引值和颜色 是相对应的.. 比如: 0 : 无色透明; 1: 黑色, 2: 白色, 3:红色...
-
vba的 pattern是指 interior对象的 填充模式, 是纯色, 还是渐变, 还是 图案等?
-
vba的active可以作为前缀, 使用在很多对象的前面, 如: activeworksheet, activeCell, activeRange...
-
设置选择区域的边框//边线, 使用的 对象和属性是: selection.border(xlEdgeRight).. : 你可以直接使用 border属性, 要么你就使用某一条边框: borders(xlEdgeTop)但是这里的borders就要用 "复数" borders.
-
xlLineStyle 主要的有 : xlContinuous, xlDash(虚线, 短线), xlDot, xlDashDot, xlDashDotdot, xlDouble等... 边框线的 另一个属性是 weight, 粗细: xlThin, 和 xlThick
Public Sub CommandButton1_Click()
Sheet1.Range("a1").Select
With Selection.Borders(xlEdgeRight)
.ColorIndex = 13
.LineStyle = xlDot
.Weight = xlThin
End With
Selection.Font.Color = RGB(255, 0, 0)
End Sub
对vba编程, 还是使用 规范的/ 成熟的/ 老到的编程方式和 编程习惯. 比如, 代码的书写 还是 像其他 语言的编程 一样, 采用 首字母 大写的 驼峰 标识法
创建sub子过程/宏等, 有的时候, 写代吗可能比较麻烦, 有一个变通的方法,就是 录制宏, 来自定义自己的 sub过程 . 而且 当录制好宏后(或者说编写好 sub后(有点类似于dw中的 可视化设计, 生成对应代码的例子)) 可以 在工作表中创建 按钮/ 或自定义工具栏按钮, 来执行 宏/sub, 这样会更快更方便.
宏和vba的区别? (vb for application).
- 宏是vba的子集
- 宏可能包含了一些不需要的步骤/代码/资料
- 宏无法进行/完成 更深入的功能和操作
- 宏无法完成 循环/条件等 程序设计结构方面的东西...
excel的最大行和列?
- 2003的最大行数是 65536. 而2010的最大行数是: 1048576: 104: 8~5, 2010的最大列数是xfd (即幸福的: xfd)
- 在excel中, 要快速的移动到尾端, 使用"end模式", 然后按方向键.
- RangeExp. End(xlDirection) 代表最后一个"有数据"的单元格... .Row的行号.
- 在excel帮助中, 要选择 库: excel 开发人员, 而不是excel帮助, 这个是 具体的excel中的操作. 不是编码
- 在vba中的很多参数, 是 enum枚举类型的. 包括以前缀 开头的, 只有几个固定值的变量,如: 这里的 xlDirection. =
r = ActiveSheet.Range("A65535"). End(xlUp). Row
表示第一列中, 最后一个 有数据的( 非空)的单元格的 行号.
====================
-
感觉 vba编程中 ,很多都表示 集合中的 某一部分的时候, 是用的复数 形式, 如worksheets, sheets , workbooks, columns等等.
-
column和columns 两种属性都有. 其中, columns是 工作表的 某些列或某一列. 而column则是 " listbox, combobox" 等控件中的列 的属性.
-
selection表示 所有 被选择的区域, 每一个连续的单元格 成为一个 区域area. 所以 属性areas 表示 选择范围中 区域的个数. 如
selection. areas. count
, 那么如何选中多个areas呢? 那就是在选择的时候, 使用 ctrl 可以选中多个 区域:
Dim c As Integer
c = Selection.Areas.Count
MsgBox c
-
要表示 某一行或 某一列, 可以使用 两种方式 , 一是:
activeSheet. Range("1:1") .Range("A:A")
二是, 使用 列columns属性:activeSheet.columns(1)
-
如果报错: "未找到命名参数"就是 你的 子过程的名称(单词)写错了. 请检查拼写.
-
可以直接 使用 copy 就把 单元格内容 "一次性的 " 复制/粘贴 到了 目标 单元格中: 那就是: 在copy (子)过程 中 , 指定 destination参数.
expression .copy( [destination])
默认的是复制到 剪贴板( 剪切/粘贴板) 中. -
参数名称不要写错了... 可以使用 下 划线连接 两行, 可以在 任何地方换行, 只要不是 两个地方除外: 一个是 单词 内部不能换行; 一个是 引号双引号内部 不能换行.... 其他地方都可以换行, 换行时, 格式必须是: "... 至少一个空格+ 下划线 +回车....."
-
在使用copy的时候, 被copy的单元格会一直 保持 "选中,被选择"的状态, 所以, 后面使用 粘贴的目标对象时, 就不能再使用 selection了....
Sub 宏2()
'
' 宏2 宏
' 复制和粘贴
'
'
Range("c4").Select
Selection.Copy
Range("c9").Select
Selection.PasteSpecial _
Paste:=xlPasteValues, operation:=xlPasteSpecialOperationAdd
End Sub
当代码中的 变量名称 写错了的时候, 如果定义了 option explicit, 那么会 提示 写错误了的单词 为 未定义的变量; 而 如果不定义 explicit, 则只会弹出提示 方法无效:
-
On Errror Resume Next 是容错语句, 表示 忽略错误 继续向下执行, 一般是那些 不方便用if 来判断错误的情况. Err.number表示错误号.
-
find 就是 word /excel 中的"查找" 对话框, 包括 findNext, FindPrevious函数等 , what="查找的内容", lookin:=xlValues, 条件语句: if cis nothing, 或 : if not c is nothing...
-
在vba中, 只要2不打引号, vba把"字符序列"都当成是变量 来解析. 而且, 如果 不设置 explicit选项, 也不会报错, 只是显示 空值,
-
在运行和设置 控件的时候, 要 "取消/或选中" 设计模式, 来 进行切换.
-
vba在编译时, 不会进行类型检查, 只会检查 语法 和 语义, 只有在 运行时才会 检查 变量类型, 所以 提示 " 变量类型不匹配的错误" 是 运行时错误 "13".
-
调试时的 "逐过程/ 逐语句/跳出过程"等, 这里的"过程 "指的是 程序语法中的 分支/选择/条件/循环等结构, 而不是说的 是 sub/function. 比如: 对于 逐过程而言, 会忽略 if....end if中间的 语句, 而是 一下子 执行完整个 "if结构" 但是, 对于 循环结构, 逐过程只会 一次执行完 "一次循环" , 但是不会跳出 循环, 而是进入下一次循环..
-
do 和 while之间的 结合使用, while不仅可以放在 do的后面, 也可以放在 loop的后面:
do while ... loop , 或者 do .. .. until while ...
-
msgbox的按钮, 可以是多个vbButton的 相加, 比如: vbQuesiton + vbYesNo + vbDefaultButton1/2 ( 其中的1/2 表示 默认选中的是第一个按钮还是第二个按钮?)
-
**可以 将excel的菜单栏/工具栏 完全自定义 ,然后 封装 应用程序的 界面, 成为一个 封装的 应用程序界面 **
excel中的对象
chart对象, 代表的是图表, 是特指的
shape对象, 包括: 自选图形 (即绘图中的那些图形), 和 图片(picture等)
caption:一般是指那些 固定的 , 不变的内容,如 label等的显示内容, 就用caption.
text:属性, 一般是指 textbox等可以编辑的 控件中的内容, ....
-
collection集合对象 跟数组类似, 但是 集合包含 的是: 具有相同属性和方法的 对象. 而数组 中的 元素, 其数据类型 没有要求必须一样. 字典的功能/速度比 collection集合 更快.
-
做一个系统, 首先还是要 明确的, 文本化的, 纸质化的 表达出 所要 完成的功能, 子系统, 模块等. 然后 分模块子系统来写, 而不是 "眉毛胡子一把抓", 那样太混乱confused了, 然后处理好 每个模块之间的 关联和相互交互就好了..
-
对单元格组 如: a1: c10赋值, 则是 对立面的所有单元格 都赋予成 同样的 一个 值!
-
alt+ F8 : 选择已经编写好了的 宏, alt+f11: 打开vba编辑器.
vba的立即窗口, 就是一个 小型的 命令行编辑器 , 以 ? 开头, 输入/输出 表达式的 结果
调试 代码的时候, 善于使用 Debug对象. Debug对象提供了两个方法: print方法,将会在 "立即窗口输出 内容" 其中 的 vbTab表示 tab键. 另一个 assert方法:
Debug.assert(expression) : 断言, 坚称, 宣告. 意思是: "程序员相信, 在某个特定点, 某个测试表达式的值应该为真" assert是异常捕捉的高级形式. 相当于 if true then continue else exit sub , 只是assert比if else的更方便的是, 只有你定义 #NDEBUG就可以一次性的禁用assert, 而if..else 还要寻找位置去禁用就比较麻烦.
单步执行时, 不会执行 变量定义语句, 会 跳过变量定义语句...
中断程序的方法:
+ break point
+ assert (是 在表达式的值为false 时候, 中断)
+ 设置 监视条件表达式, 当监视值为true的时候, 中断程序. 监视表达式的中断跟assert中断 正好是相反的!
vba中的 + 号和 & 号的区别?
&是什么东西都可以连接, 字符串 和数字可以连接为 字符串.
而+ 分情况: 如果 前后两端是数字 , 则相加, 如果是字符串 则相连接, 但是要注意 前后数据类型一定要 相同. 如果是数字和字符串相加则会报错: 运行时错误13, 类型不匹配!
appdata和application data的区别?
appdata相当于 linux的 ~/.appCustomConfig, 是用户的个人 应用程序配置 文件...
里面的东西一般不要删除..
excel加载宏? AddIns/macro: xlam
- 就是可以被 很多工作簿(一个workbook就是一个 excel文件) 公共使用的文件(包括其中的函数和子过程)
- 首先是 制作/保存为 "excel加载宏" 格式: *.xlam 文件
- 使用时, 在"开发工具" -> 加载宏... 加载后即可使用...
vba 中常用的几个窗格是: 资源ctrl+R, 属性窗格: f4, 代码窗格:f7, 立即窗格ctrl+g(go)的意思. 通过立即窗口, 可以看到 代码的debug.print输出.
excel中的批注, 就是 comment对象, 属性(property)有: author, creator, parent, shape, visible等 方法有: text, next, previous, delete
遍历excel中的 comments:
+ 使用 for each cmt in activeSheet. comments .... next cmt
+ 使用 for i=1 to comments.counts .... comments(i). text.... next i
+ 批注即comment的 形状是通过: comment. shape. autoshapetype =1/2/3~20? 数字或枚举: msoShape... msoChart, msoGragram....
property和attribute的区别?
+ property: 主要是指, 类 向外 提供的 数据区域.
+ attribute: 主要是指, 对象在编译 和 运行时的属性.
coder 常用的 图画的单词之间的区别?
参考: http://blog.sina.com.cn/s/blog_64a2ab4c0100nbwo.html
paint painting picture draw drawing chart map plot graph figure diagram
paint 名词意思是油漆,涂料,颜料,也可以理解为绘画作品,应该是油画类的。我所理解的油画的意境,就是缺耳朵的梵高在清风的旷野之中,头顶温暖的阳光,挥动着画刷,盯着向日葵沉思。
painting意思应该就是用画刷,不是画笔,画的,比如油画,水彩画等。我想这个词应该像艺术家专有的,比较专业哈。
picture一般咱都知道,应该是图像之类,照片。**这个词更重在真实,而不是艺术,**所以毕加索的抽象画应该不能称其为picure。估计只有相机等数字画的东西处理的图才能称为picture。 这个词在金山词霸中的最重要的一点解释就是"相似物", 所以计算机中图像与图形的区别就是
picture与graph的区别。贵在与真实相似。
draw 编程的人估计最熟悉这个单词,看都看腻味了。draw是个动词,任何人都可以draw,但不是任何人都可以paint(涂鸦也是这个词吧)。幼儿园的小鬼比较喜欢draw,图形编程的一天到晚也是和小朋友们差不多,整天draw。
drawing 说到drawing这个词,**这个词是素描或者线条画的意思,所用的工具只能是硬头的画笔,比如铅笔,而不是软的画刷。**素,就是颜色没有油画鲜艳了。从这个角度看,图形学只能是drawing了哈。
chart 意思重在图表,比如excel上常见的柱状图等。**这个与数字关系最大,咱画前面几种,图的来源与数字无关,但chart自所以是chart你必须先有数字存在,然后才能按数字画图。**比如统计数字,每月的gdp增长率等。
map 这个咱们初中都知道是地图的意思,以后不要瞎用这个单词咯。
plot 如果说中国地图是map的话,那么放大湖北这块区域就是plot。
graph 这个词的意思就非常广泛了。**一般咱们的图形学就是这个词,它应该重在基本的集合元素绘制,比如由点,线段,曲线以及多边形等表示的图。基本上与数据无关
figure是轮廓图的意思,就是你看一个人的背影,但看不清人的全貌就用figure,有点犹抱琵琶半遮面的意思,不是有句流行的话就是,从后面看想犯罪,从侧面看想后退,从正面看想自卫。figure不代表全貌。
diagram 看看英文解释Diagram is drawn by ideas or concept. 这句话什么意思???自己发晕。概念图?电路图就是一种diagram.它的意思应该是 **解释现象与本质之间联系的因果图,与数字无关,比如地理上海洋环流图**。比较抽象,咱不懂,用得少。
大概就是这么理解,每个词都有其侧重的意思,咱们coder整天离不开英文,更应该正确使用,但老外估计也没几个理解这些区别的,够晕的,
从今以后咱应该知道,咱绘图软件绘制的多是graph以及chart,画家美眉画的估计是painting或者drawing。
selection.Insert shift:=xlDown
这种语法叫做: "命名参数"
sub macro1()
Range("A1").Select
ActiveCell.FormulaR1C1 = "123"
Range("B1").Select
ActiveCell.FormulaR1C1 = "456"
Range("C1").Select
ActiveCell.FormulaR1C1 = "abc"
Range("D1").Select
ActiveCell.FormulaR1C1 = "7"
Range("E1").Select
ActiveCell.FormulaR1C1 = "89"
Rows("1:1").Select
Selection.Copy
Rows("4:4").Select
ActiveSheet.Paste // 没有特殊要求就这样写.
Application.CutCopyMode = False
// (设置或返回剪切/复杂的模式, 有false, xlcopy, xlCut三种值. ) // 据说, 如果不设为 false, 在关闭时会提示保存剪贴板中的内容...
// 通常在复制/剪切完毕操作完了的时候, 要这样设置一下.
ActiveWorkbook.Save
End Sub
变量的声明语句, 是非执行语句, f8时,不会执行它, 也不能设置断点.
如果声明变量时, 不as type, 则默认的把变量声明为 variant.
函数: InStr([start], searchString, searchChar, [compare]):
start: 比较的开始位置, 是从1开始计数算起的;
compare: vbBinaryCompare =0, vbTextCompare=1, 指定是以二进制还是 以文本的方式进行比较, 对于大小写字母来说, 二进制比较是不同的, 文本方式比较是相同的.
Instr函数, 返回 char在string中首次出现的位置, 总是 从 1 开始 算起的....
其中 chr(10) 表示 回车 enter.
Debug.Print InStr(2, "abcdEAbCefg", "e", 1)
输出5.
-
len和lenB(返回字符串中在内存中的字节数).
-
mid$ 明确告诉了返回值的类型为 string, 如果只是 mid 则返回值的类型为 variant....
-
由于所有的 "全局函数, 都是 VBA 对象的属性函数, 所以 你写/不写 vba. 都可以
-
vba的数组类型定义,
dim iArr (1 to 5) as integer
表示 iArr是一个数组, 整数数组, 其中的下标从a(1) 到 a(10), 它不像 c/c++语言一样, 简单明了, 如int a[10]
vba中, 要返回变量的类型, 使用全局函数, TypeName(varName), 变量类型是一个 字符串... 主要有: Null, String, Single,...integer()
杂项
单模只传输一个模式, 一种传播路径, 摸间色散较小.
多模, 传输多个模式, 多种传播路径, 膜间色散较大.
单模光纤较细, 8~10um, 传送带宽 2000 MHz /km, 传输光源频率: 1310nm, 和1 550nm,
多模光纤光源: 850nm, 1.31um 传送带宽: 50MHz--500MHz/km,
1.31um的 材料色散和波导色散一正一副 ,刚好抵消, 是单模和多模都可以使用的波长.
单模光纤要求光源的谱宽和稳定性很高, 要求谱宽窄, 稳定性好. 因此 光端机昂贵..
characters, 代表, 包含文本对象的 所有字符序列, 包括: characters.text, 和 characters(start, len) 两种用法, 通常是只对文本中的某一部分字符进行格式处理时, 才有必要使用 characters 对象, 否则 没有必要
整个文档中的形状,是一个集合shapes, 如: shapes(1), shapes(“shapeName")来引用
但是对于 selection,则只有shapeRange集合,当然你可以对整个集合使用填充, 也可以对其中的一个进行设置等。
range: 表示区域, 范围。 在vba中, 应该叫 区域!
形状Shape,不是cells, 要清除形状, 应该用 shapes.clear, 而不是cells.clear
对于一个单元格来说, 包含的内容有: contents,comments, notes, formats, hyperlinks, outline. 所以 在使用时, 可以clear 前面的这些所有的属性....
单元格的comments和notes的区别?
没有区别? 两种都是一样的, 删除批注, 可以使用: ClearComments, 或 ClearNotes. 两种方法的效果/结果是一样的.
// 三种方法 都能删除 批注, 是一样的.
Cells(19, "C").ClearComments
Cells(6, "D").ClearNotes
Cells(12, "E").Comment.Delete
一个原则, 凡是没有 返回值, 或者说,不需要返回值的,没有赋值的,都应该使用子过程, 或者说,如果使用了括号, 表示的函数,就要 在左边对变量进行赋值,使用等号。。 否则, 就会报错: 编译错误, 没有"="等号:
shape、shapeRange的Textframe属性和 textframe2属性的区别?
??? 在使用上, 这两种属性对象, 基本上是一样的, 你可以任意 的使用 两个中的任何一个对象或属性!!!
!!!! 只有selection才有shapeRange属性, 而 worksheet才有shape属性???
判断一个对象是否存在,, 使用 if obje is nothing.... 或者: if Range("A1").comment is nothing ...then
为单元格添加批注:
With Range("A1")
if .comment is nothing then
. AddComment .Text:=.value
.Comment.Visible = True
end if
end with
关于形状中的 -> 文本框 -> 文本区域等几个类的层次关系
Shape
-> HasTextFrame :: Shapes(1).TextFrame)
-> hasText
:: Shapes(1).TextFrame. TextRange. text ="something"
单元格的change事件和selectionChange事件?
-
注意, 是 selectionChange事件,不是 selectchange.
-
注意 , 像 worksheet等, "非按钮" 对象的时间 触发编写, 不能 在 vbe(vb editor编辑器窗口) , 通过事件右键来添加, 要自己手动添加, 只有当手动添加后, 才会在事件/函数列表中看到.
-
单元格选择/变化等事件, 不是 由单元格来执行, 而是由 worksheet 工作表来触发的
-
selectchange事件是当选择的单元格发生改变时触发该事件, 比如, 由 A1单元格 选择到 B1..
-
但是 change事件就不一样, 他不是指 该单元格值的变化, 而是指单元格的状态: 单元格包含两种状态: 选择和 激活(编辑), 当由 选择-> 激活的时候, 不会触发change事件, 但是 当 由 激活/active /编辑 状态 -> 选中 状态时, 就会 激活/触发 change事件.
-
因此, 单元格的事件顺序中, change事件总是 先于 changeSelection触发....
-
在某一个事件处理函数中, (内部), 如果又有可能 触发同样类型的事件, 此时会引起 事件的 递归 调用, 所以 为了消除这种递归 调用, 需要 在事件处理的开始 设置
application.EnableEvent =false;
, 关闭事件的响应处理功能; 在 事件处理的结束 设置application.EnableEvent=true
恢复事件的响应.
SelectionChange 事件
当工作表上的选定区域发生改变时,将产生本事件。
Private Sub Worksheet_SelectionChange(ByVal Target As Excel.Range)
Target 新选定的区域。
本示例滚动工作簿窗口,直至选定区域位于窗口的左上角。
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
With ActiveWindow
.ScrollRow = Target.Row
.ScrollColumn = Target.Column
End With
End Sub
---------
// 注意 , 这个selectionChange中的 参数 Target 是 变化后 的 单元格地址, 不是 之前的 单元格地址!!
Private Sub Worksheet_SelectionChange(ByVal Target As Range) '类似单击事件
Application.EnableEvents = False
If Target.Column = 1 And Target.Row >= 2 And Target.Row <= 9 And Target.Cells.Count = 1 Then
If Cells(Target.Row, 2) = "√" Then
Cells(Target.Row, 2) = ""
Cells(Target.Row, 2).Select // 人为地造成 单元格的selectionChange事件的触发...
Else
Cells(Target.Row, 2) = "√"
Cells(Target.Row, 2).Select
End If
End If
Application.EnableEvents = True
End Sub