2016-07-05 71 views
0

解决(在评论是针对这个问题的解决,谢谢罗恩)

刚刚签署了,因为我没能找到一个答案,这个任务,虽然我已经试过真的很难做到这一点没有困扰。动态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

回答

0

假设你有兴趣时,目标可能是在范围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 
+0

我刚才试过,它不工作...“类型不匹配”在“如果目标<>”“然后_”...不是确定“禁用事件”可以在哪里工作 –

+0

如果'Target'多于一个单元格,就会发生这种情况。换句话说,如果你的选择恰好是多个单元格。查看我的编辑解决方案。 –

+0

在事件处理程序运行时禁用事件的原因是为了防止在事件处理程序运行时触发事件处理程序。这可能导致无限循环。在调试时需要小心,因为调试停止不会重新启用事件处理程序---需要手动完成。 –