这个帖子也许可以成为你学编程的启蒙课。
1、用户需求
在汇总表上点击产品名称后会自动打开明细表并进行筛选?
这里的一个关键词是“点击”,这里的点击,指的是“点击单元格”。
我们希望点击单元格(产品名称)后自动打开明细表;
或者,点击单元格后,自动生成一个当前日期……
或者,点击单元格后,自动填充一个颜色……
或者,点击单元格后,自动汇总一个数据……
等等
2、认识工作表事件
在Excel中,系统为我们提供一个事件,SelectionChange,就是处理“选定一个新的单元格区域”后,简称“点击”后,允许用户处理表格或数据。
在当前工作表模块中,添加下面两行代码:
- Private Sub Worksheet_SelectionChange(ByVal Target As Range)
- End Sub
复制代码新手看这行代码,第一反应也是是“记不住”,这个不用担心,我也没记住。 在代码窗口工作表模块中,用鼠标点击对象框的下拉箭头,选择“Worksheet”,窗口中就会自动添加上面这两行代码。
把你想做的事,写在代码块中间就可以,代码编写完毕后,返回工作表,只要选定了新的单元格(区域),系统就会执行这段代码。 3、Target 参数 括号里面的Target是一个参数,代表所选定的单元格,选定的是A1,Target就代表A1,选定B3:G7,Target就代表B3:G7,在程序中可以使用Target代表所选定的单元格。 举个简单的例子,选定哪个单元格,哪个单元格就显示数字1,代码可以这样写: - Private Sub Worksheet_SelectionChange(ByVal Target As Range)
- Target = 1
- End Sub
复制代码
首尾两行是系统自动生成的,我们要写的就是中间的一句代码。 当点击单元格时,希望显示当前日期,代码可以这样写: Target=Date 如果希望,把选定的单元格合并,代码可以这样写: Target.Merge
Target是系统默认的参数名,也可以使用自定义名称,如:Dyg、单元格: - Private Sub Worksheet_SelectionChange(ByVal 单元格 As Range)
- 单元格 = Date
- End Sub
复制代码
4、VBA语法 VBA是一种编程语言,是语言就有语法。其中“if……then……”是最常用的一种语法,称条件语句,就是“如果……就……”的意思。 当单元格为空时,自动给该单元格填充当前时间,否则,清空该单元格。 编程实现这个需求,就要用上条件语句: - Private Sub Worksheet_SelectionChange(ByVal Target As Range)
- If Target.Value = "" Then '如果单元格的值等于空,则
- Target.Value = Time '给单元格赋值:系统时间
- Else '否则
- Target.Value = "" '给单元格赋值:空值
- End If '结束条件语句
- End Sub
复制代码注意:上面的代码,当选定多个单元格时会出错。
5、对象、属性与方法 前面代码中,Target代表选定是单元格,它是一个对象。如果要引用其它单元格,可以使用Range(),见程序示例。 Value是单元格其中一个属性,意思是“值”,Target.Value理解为单元格的值。Merge是单元格的一个方法——将单元格合并。
6、示例 Private Sub Worksheet_SelectionChange(ByVal Target As Range) '选定新的单元格区域时,自动执行下面的代码(Target引用选定的单元格区域)
Dim cCP$, nRow% '定义两个变量
If Target.Row = 1 Or Target.Column > 1 Then Exit Sub '如果选定的单元格在第1行,或者不是第1列,则退出程序,不再运行下面的代码
If Target.CountLarge > 1 Then Exit Sub '如果选定超过1个单元格的区域,则退出程序
If Target.Value = "" Then Exit Sub '如果选定的单元格为空,则退出程序
cCP = Target.Value '把当前单元格的值保存到变量cCP中
With Sheets("明细") '在“明细”工作表中
nRow = .Range("a65536").End(xlUp).Row '获得A列数据最大行号,并保存到变量nRow中
.Range("$A$1:$D$" & nRow).AutoFilter Field:=1, Criteria1:=cCP '自动筛选
.Activate '激活工作表
End With
End Sub
|