vba-在验证列表中选择后触发的操作

时间:2019-07-16 13:27:56

标签: excel vba

给出一个下拉列表,其中包含来自不同工作表的值,我想用与所选行相关的值来填充某些单元格:

这样,当我选择参数名称时: enter image description here

来自另一张纸:

enter image description here

我用与所选行相关的值填充“值”单元格和其他值。

我正确地列出了列表,并尝试添加WorksheetChange:

Private Sub Worksheet_Change(ByVal Target As Range)

Dim param As String
param = Target.value

Set lineBool = .Find(param, LookIn:=xlValues)
If Not lineBool Is Nothing Then
    ActiveSheet.Cells(lineBool, 2) = Worksheets("DEF_BOOLEAN").Cells(lineBool, 6).value
End If


End Sub

但是我没有确切知道上面的代码应该放在哪里(我在工作表文件中尝试过,但是在运行时给了我一个参考错误),而且实际上也无法工作。

2 个答案:

答案 0 :(得分:0)

您必须在工作表代码中添加代码

enter image description here

并将代码更改为此:

Private Sub Worksheet_Change(ByVal Target As Range)

If Not Intersect(Target, Range("A1:A" & Cells(Rows.Count, "A").End(xlUp).Row + 10)) Is Nothing Then

Dim param As String
Dim lineBool As Range

param = Target.Value
Set lineBool = Find(param, LookIn:=xlValues)

If Not lineBool Is Nothing Then
    Cells(lineBool.Row, 2).Value = Worksheets("DEF_BOOLEAN").Cells(lineBool.Row, 6).Value
End If

End If


End Sub

您未致电相交。您只想在A行中的某些内容发生更改时激活此代码。

答案 1 :(得分:0)

顾名思义,Worksheet_Change事件是由工作表上的更改触发的。要使代码工作,必须将其放在验证列表的工作表的代码窗格中。
您可以像与其他过程一样,从与事件过程相同的代码模块中存在的另一个过程中手动调用该过程。为此,您需要向Range过程提供一个Worksheet_Change对象。

但是我建议对您的代码稍作调整:

Private Sub Worksheet_Change(ByVal Target As Range)
    Dim param As String
    If Application.Intersect(Target, Me.Columns("A")) Is Nothing Then Exit Sub

    param = Target.value
    Set lineBool = Worksheets("DEF_BOOLEAN").UsedRange.Find(param, LookIn:=xlValues) ' My guess
    If Not lineBool Is Nothing Then
        Me.Cells(lineBool.Row, 2) = Worksheets("DEF_BOOLEAN").Cells(lineBool.Row, 6).Value
    End If
End Sub