|
楼主 |
发表于 2025-1-11 15:26
|
显示全部楼层
不好意思,我以为用类似上面函数就能处理了。用VBA代码的话不知道实时判断单元格变化是否消耗资源。参照你的代码,我修改的VBA代码如下:
一个是字典的,一个只用字符的。不知道哪个效率最高,有请高手点评一下。
- Private Sub Worksheet_Change(ByVal T As Range)
- If Not Intersect(T, Me.Range("F1")) Is Nothing Then
- Dim d As Object, d2 As Object, bj As String
- bj = T.Value2
- If Len(bj) > 0 Then '防止一级菜单值为空
- Cells(2, 6).Value2 = "" '清空二级菜单原有的值
- Set d = CreateObject("scripting.dictionary")
- Set d2 = CreateObject("scripting.dictionary")
- d(bj) = 1 '使用字典来判断
- r = Cells(Rows.Count, 2).End(xlUp).Row
- arr = Range("b1:c" & r)
- For i = 2 To UBound(arr)
- If d.exists(arr(i, 1)) Then d2(arr(i, 2)) = i 'If arr(i, 1) = bj Then 不知道哪个效率更快
- Next i
- Cells(2, 6).Select
- With Selection.Validation
- .Delete
- '防止找不到对应的二级菜单值
- If d2.Count > 0 Then .Add Type:=xlValidateList, AlertStyle:=xlValidAlertStop, Operator:=xlBetween, Formula1:=Join(d2.keys, ",")
- End With
- Set d = Nothing
- Set d2 = Nothing
- End If
- End If
- End Sub
- Private Sub Worksheet_Change(ByVal T As Range)
- If Not Intersect(T, Me.Range("F1")) Is Nothing Then
- Dim bj As String, cd2 As String
- bj = T.Value2
- If Len(bj) > 0 Then '防止一级菜单值为空
- Cells(2, 6).Value2 = "" '清空二级菜单原有的值
- r = Cells(Rows.Count, 2).End(xlUp).Row
- arr = Range("b1:c" & r)
- For i = 2 To UBound(arr)
- If arr(i, 1) = bj Then
- If cd2 <> "" Then
- cd2 = cd2 & "," & arr(i, 2)
- Else
- cd2 = arr(i, 2)
- End If
- End If
- Next i
-
- Cells(2, 6).Select
- With Selection.Validation
- .Delete
- '防止找不到对应的二级菜单值
- If cd2 <> "" Then .Add Type:=xlValidateList, AlertStyle:=xlValidAlertStop, Operator:=xlBetween, Formula1:=cd2
- End With
- Set d = Nothing
- Set d2 = Nothing
- End If
- End If
- End Sub
复制代码
|
|