.Add Type:=xlValidateList, AlertStyle:=xlValidAlertStop, _ Operator:=xlBetween, Formula1:=Join(d.keys, \ End With
Target.Offset(0, 1) = \
ElseIf Target.Column = 4 And Target.Offset(0, -1) <> \Then For i = 1 To UBound(Arr) If Arr(i, 1) <> \Then r = r + 1
ReDim Preserve Arr1(1 To r) Arr1(r) = i End If Next i For i = 1 To r
If Arr(Arr1(i), 1) = Target.Offset(0, -1).Text Then If i <> r Then
js = Arr1(i + 1) - 1 Else
js = Myr - 1 End If ks = Arr1(i) For j = ks To js
cp = cp & Arr(j, 2) & \ Next End If Next i
cp = Left(cp, Len(cp) - 1) With Target.Validation .Delete
.Add Type:=xlValidateList, AlertStyle:=xlValidAlertStop, _ Operator:=xlBetween, Formula1:=cp End With
Target = Split(cp, \
31
End If
Set d = Nothing End Sub
三、代码详解
1、Private Sub Worksheet_SelectionChange(ByVal Target As Range) :本例用的是工作表选择变化事件,只要鼠标点击单元格都会激活这个事件。Private 可译为私有的,限制了这段代码只能在指定的工作表里有效。参数Target声明为单元格区域对象,有了关键字ByVal,说明可以按值传递参数。
2、If Target.Count > 1 Then Exit Sub :由于是鼠标点击单元格都会激活这个事件,所以最好要作一些限制,使得你能避免点击了不需要激活事件的地方而激活本事件产生错误。本句是如果目标单元格的数目大于1就退出本过程。这样当你点选了多个单元格的时候,过程运行了这句代码就会结束过程了。
3、If Target.Column <> 4 And Target.Column <> 3 Then Exit Sub :再加一个限制,如果目标单元格的列不是3列(C列)也不是4列(D列)的话就退出过程。
4、接着的四句代码分别是声明变量、创建字典对象、B列最后一个非空单元格的行数以及把单元格区域的值赋给数组变量等等与前面的实例相同。请注意这里选择了B列求最后一个非空单元格的行数,是因为A列各数据之间有空格,如果选择A列,就会遗漏一些数据。
5、If Target.Column = 3 Then :现在分两种情况判断,如