【问题标题】:Dynamic Target.Adress excel vba动态Target.Address excel vba
【发布时间】:2016-11-06 17:55:20
【问题描述】:

已解决(在 cmets 中是该问题的解决方案,谢谢 Ron)

刚刚注册,因为我无法找到此任务的答案,尽管我已经非常努力地完成了它而没有打扰。

问题是,每次更改特定单元格的值时,我都会尝试在特定单元格上进行 VLookUp。在我要求 excel 使用“Worksheet_Change”创建它们之前,这些单元格不存在

工作表根据我的要求添加尽可能多的行,并使用我将选择的字段对其进行编辑。

例如。我需要放置 3 个流程变量,所以我在第一行(“$R$30”)旁边输入“3”。通过进行此更改,excel 增加了 2 行(在第一个编程部分的末尾,我得到了已经存在的第一行,然后再增加 2 行来完成我需要的 3 行)。

完成这部分后,我需要使用来自“流程单元”(“$R$...”)的信息,使用“验证数据”列表(已经完成并且工作正常)更新流程定义。自动在其旁边添加定义代码。

例如。当我从验证数据中选择“流量校准”时,旁边会出现“XD61DD”。

对于第一行,它可以正常工作...我无法使其适用于所有添加的行。

这是我一直在编写的代码:(我正在学习,请不要对我太苛刻,我知道这就像石器时代的编码:P)

Private Sub Worksheet_Change(ByVal Target As Range)
Dim cant As Integer
Dim RowNumber As Integer
    If Target.Address = "$AG$30" Then
        If Range("$AG$30") <> "" Then
        cant = Range("$AG$30")
        For i = 1 To cant - 1
            Var = 30 + i
            Range("A" & Var).Select
            RowNumber = ActiveCell.Row
            Rows(RowNumber).Select
            Selection.Insert Shift:=xlDown, CopyOrigin:=xlFormatFromLeftOrAbove
            rango1 = "L" & RowNumber & ":" & "Q" & RowNumber
            rango2 = "R" & RowNumber & ":" & "AF" & RowNumber
            Range(rango1).Select
            Selection.Merge True
            Range(rango2).Select
            Selection.Merge True
            rango3 = "AG" & RowNumber
            Range(rango3).Select
            With Selection.Validation
                .Delete
                .Add Type:=xlValidateInputOnly, AlertStyle:=xlValidAlertStop, Operator _
                :=xlBetween
                .IgnoreBlank = True
                .InCellDropdown = True
                .ShowInput = True
                .ShowError = True
            End With
        Next i
    End If
End If

直到这里它工作正常,第一部分仅供参考,但是:

Range("R30").Select
If Target.Address = "$R$30" Then
    If Range("$R$30") <> "" Then
        Range("$L$30") = Application.VLookup(Range("$R$30"), Range("$BG$3:$BH$9"), 2, False)
    End If
    If Range("$R$30") = "" Then
        Range("$L$30") = ""
    End If
End If
End Sub

我留下了“$R$30”,因为它工作正常,但我需要对“$R$31”执行相同的指令,因此,在创建行时。

我真的希望你能帮助我。

提前致谢。

阿古斯

【问题讨论】:

    标签: excel vba dynamic vlookup target


    【解决方案1】:

    假设您对 Target 可能在 R30:R1000 范围内时感兴趣。所以类似(未调试)

    Dim myRange as Range
    Set myRange = Range("R30:R1000")
    If Not Intersect(Target, myRange) is Nothing then
       'consider if you need to disable events temporarily
       If Target <> "" Then _
       Target.Offset(0,-6) = Application.VLookup(Target, Range("$BG$3:$BH$9"), 2, False)
    end if
    
    'Don't forget to re-enable events if you disabled them
    

    编辑:如果您在myRange 中的选择恰好不止一个单元格,则上述简化版本将不起作用。您需要一次测试一个单元格。一种修改可能是这样的:

    Dim myRange As Range, C As Range
    Set myRange = Range("R30:R1000")
    
    If Not Intersect(Target, myRange) Is Nothing Then
        For Each C In Intersect(Target, myRange)
            If C <> "" Then _
                C.Offset(0,-6) = Application.VLookup(C, Range("$BG$3:$BH$9"), 2, False)
            End If
        Next C
    End If
    End Sub
    

    【讨论】:

    • 我刚才试过了......它不起作用......“如果目标 ”“然后_”处的“类型不匹配”......不确定“禁用事件”在哪里" 可以工作
    • 如果Target 不止一个单元格,就会发生这种情况。换句话说,如果您的选择恰好是多个单元格。请参阅我的编辑以获取解决方案。
    • 在事件处理程序运行时禁用事件的原因是为了防止在事件处理程序运行时触发事件处理程序。这可能导致无限循环。调试时需要小心,因为调试停止不会重新启用事件处理程序 --- 这需要手动完成。
    • 谢谢 Ron,我会尝试并尽快通知您。再次感谢您的宝贵时间和快速响应。
    猜你喜欢
    • 1970-01-01
    • 2023-03-27
    • 2019-06-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-05-31
    相关资源
    最近更新 更多