2016-07-05 70 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

在事件處理程序運行時禁用事件的原因是爲了防止在事件處理程序運行時觸發事件處理程序。這可能導致無限循環。在調試時需要小心,因爲調試停止不會重新啓用事件處理程序---需要手動完成。 –