动态Target.Adress Excel VBA中
问题描述:
解决(在评论是针对这个问题的解决,谢谢罗恩)
刚刚签署了,因为我没能找到一个答案,这个任务,虽然我已经试过真的很难做到这一点没有困扰。动态Target.Adress Excel VBA中
事情是,我试图在特定的单元格每次他们改变它的值时做一个VLookUp。直到我要求Excel使用“Worksheet_Change”创建它们时,这些单元格不存在
工作表添加尽可能多的行,然后根据需要选择的字段进行编辑。
例如。我需要放3个过程变量,所以我在第一行旁边输入“3”(“$ R $ 30”)。通过这样的改变,excel增加了2行(在第一个编程部分的末尾,我得到了第一个已经存在的部分,然后再增加2个部分来完成我需要的3行)。
完成这部分,我需要使用“process cell”(“$ R $ ...”)中的信息来更新具有“验证数据”列表(已经完成且工作正常)的流程定义需要自动添加一个定义代码。
例如。当我从验证数据中选择“Flow Calibration”时,我会在它旁边看到“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“,等等,当行被创建。
我真的希望你能帮助我。
在此先感谢。
AGUS
答
假设你有兴趣时,目标可能是在范围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'多于一个单元格,就会发生这种情况。换句话说,如果你的选择恰好是多个单元格。查看我的编辑解决方案。 –
在事件处理程序运行时禁用事件的原因是为了防止在事件处理程序运行时触发事件处理程序。这可能导致无限循环。在调试时需要小心,因为调试停止不会重新启用事件处理程序---需要手动完成。 –