Excel 工作表更改事件与combobox的更新事件类似

Excel 工作表更改事件与combobox的更新事件类似,excel,vba,Excel,Vba,好的,我想在不使用helper列或combobox控件的情况下进行可搜索下拉列表数据验证…那么我如何才能完成此操作..一切正常,但如果我放置在然后单击下拉箭头,它将不会计算工作表更改事件..我想在每次值更改时运行工作表更改事件某些单元格..假设我在输入时,工作表更改事件应运行2次..我的意思是每次单击键盘字母表时,工作表更改事件都需要运行。我如何才能完成此操作。。。 这是我的密码: 工作表更改事件: Private Sub Worksheet_Change(ByVal Target As Ran

好的,我想在不使用helper列或combobox控件的情况下进行可搜索下拉列表数据验证…那么我如何才能完成此操作..一切正常,但如果我放置在然后单击下拉箭头,它将不会计算工作表更改事件..我想在每次值更改时运行工作表更改事件某些单元格..假设我在输入时,工作表更改事件应运行2次..我的意思是每次单击键盘字母表时,工作表更改事件都需要运行。我如何才能完成此操作。。。 这是我的密码:

工作表更改事件:

Private Sub Worksheet_Change(ByVal Target As Range)
Dim DestinationRng As Range, SourceRng As Range
Set SourceRng = Range("A1:A25")
Set DestinationRng = Range("C1:C25")
If Not Application.Intersect(DestinationRng, Range(Target.Address)) Is Nothing Then
    'Target.Validation.Delete
    If Target.Value = "" Then
        DVDL SourceRng, Target, ""
    Else
        DVDL SourceRng, Target, Range(Target.Address).Value
    End If
End If
End Sub
下面是工作表选择更改事件

Private Sub Worksheet_SelectionChange(ByVal Target As Range)
Dim DestinationRng As Range, SourceRng As Range
Set SourceRng = Range("A1:A25")
Set DestinationRng = Range("C1:C25")
'    'If Target = ActiveCell Then Debug.Print yes
Debug.Print "Active:" & ActiveCell.Address
Debug.Print Target.Address

If Not Application.Intersect(DestinationRng, Range(Target.Address)) Is Nothing Then
    If Target.Value = "" Then
        DVDL SourceRng, Target, ""
    Else
        DVDL SourceRng, Target, Range(Target.Address).Value
    End If
End If
End Sub
以下是数据验证子过程:

Public Sub DVDL(SourceRng As Range, PlaceRng As Range, SearchTxt As String)
Dim arr As Variant, arr2 As Variant

If SourceRng.Columns.Count > 1 Then
    arr = Application.WorksheetFunction.Transpose(Application.WorksheetFunction.Transpose(SourceRng.Value))
ElseIf SourceRng.Rows.Count > 1 Then
    arr = Application.WorksheetFunction.Transpose(SourceRng.Value)
End If
arr = RemoveDuplicateS(arr)
If SearchTxt = "" Then
    arr2 = arr
Else
    arr2 = Filter(arr, SearchTxt, , vbTextCompare)
End If
For Each el In arr2
    Debug.Print el
Next el
If LBound(arr2) <> UBound(arr) Then
'PlaceRng.Select
With PlaceRng.Validation
    .Delete
    .Add Type:=xlValidateList, AlertStyle:=xlValidAlertStop, Operator:= _
    xlBetween, Formula1:=Join(arr2, ",")
    .IgnoreBlank = True
    .InCellDropdown = True
    .InputTitle = ""
    .ErrorTitle = ""
    .InputMessage = ""
    .ErrorMessage = ""
    .ShowInput = True
    .ShowError = False
    
End With
End If
End Sub
Public Sub DVDL(SourceRng作为范围,PlaceRng作为范围,SearchTxt作为字符串)
Dim arr作为变型,arr2作为变型
如果SourceRng.Columns.Count>1,则
arr=Application.WorksheetFunction.Transpose(Application.WorksheetFunction.Transpose(SourceRng.Value))
ElseIf SourceRng.Rows.Count>1则
arr=Application.WorksheetFunction.Transpose(SourceRng.Value)
如果结束
arr=移除的副本(arr)
如果SearchTxt=“”,则
arr2=arr
其他的
arr2=过滤器(arr、SearchTxt、vbTextCompare)
如果结束
对于arr2中的每个el
调试。打印el
下一个el
如果LBound(arr2)UBound(arr),则
'PlaceRng.Select
使用PlaceRng.Validation
.删除
.Add类型:=xlValidateList,AlertStyle:=xlValidAlertStop,运算符:=_
xlBetween,公式1:=连接(arr2,“,”)
.IgnoreBlank=True
.InCellDropdown=True
.InputTitle=“”
.ErrorTitle=“”
.InputMessage=“”
.ErrorMessage=“”
.ShowInput=True
.ROR=错误
以
如果结束
端接头
以下是从源范围中删除重复值的代码:如果源包含唯一值,则不需要

Public Function RemoveDuplicateS(arr As Variant) As Variant
'From this function we return an array from an sorted array.
'It doesn't required extra space in memory because we use same array.
Dim i As Long, j As Long
If IsEmpty(arr) Then
    RemoveDuplicateS = arr(0) 'If incoming array is empty then return empty one.
Else
    j = LBound(arr)
    For i = LBound(arr) To UBound(arr) - 1  'Run loop from first one to second last one.
        If arr(i) <> arr(i + 1) Then                    'if arr(5)<>arr(6) then put put the arr(5) value to the unique list.
            arr(j) = arr(i)
            j = j + 1                                             'Increase the j for indexing.
        End If
    Next i
    arr(j) = arr(UBound(arr))                          'Put the last data to unique list.
    ReDim Preserve arr(LBound(arr) To j)     'Delete the extra data from the array.
    RemoveDuplicateS = arr                           'Return the array.
End If
End Function
公共函数作为变量移除了副本(arr作为变量)
'通过此函数,我们从排序数组返回一个数组。
它不需要额外的内存空间,因为我们使用相同的数组。
我和我一样长,我和我一样长
如果我是空的,那么
RemovedUpplicates=arr(0)'如果传入数组为空,则返回空数组。
其他的
j=LBound(arr)
对于i=LBound(arr)到UBound(arr)-1’,从第一个循环运行到第二个循环。
如果arr(i)arr(i+1),则“如果arr(5)arr(6),则将arr(5)值放入唯一列表。
arr(j)=arr(i)
j=j+1'增加索引的j。
如果结束
接下来我
arr(j)=arr(UBound(arr))'将最后一个数据放入唯一列表。
ReDim Preserve arr(LBound(arr)To j)“从阵列中删除额外数据。
RemoveDuplicateS=arr'返回数组。
如果结束
端函数

请不要在问题中包含指向excel文件的外部链接。如果有人想查看该文件。所以我附上了,好的。