2013-07-21 44 views
0

目標:如果紙張1上A1:A2中的任何值發生更改,則紙張2上A1:A2中的值應自動更新這些值。下面表1的事件處理程序無法工作:自動複印紙張1 A1:A2到紙張2 A1:A2當Sheet1 A1:A2更改

Private Sub Worksheet_Calculate() 

Application.EnableEvents = False 

Dim target As Range 
Set target = Range("A1:A2") 

    If Not Intersect(target, Sheets(2).Range("A1:A2")) Is Nothing Then 
     Range("A1:A2").Value = Sheets(2).Range("A1:A2").Value 
    End If 

Application.EnableEvents = True 

End sub 

像往常一樣,VBA的頭腦麻木不透明的語法是我的垮臺。任何意見在執行上述簡單的任務將不勝感激,因爲將引用VBA參考指南,實際上有助於解釋VBA的隱藏細節。

+2

Sheet1工作模塊中的事件處理程序將只在Sheet1響應事件。如果你想捕獲sheet2中的事件,那麼你需要在該工作表的代碼模塊中使用一個處理程序。 –

+0

_VBA參考指南,實際上很有用_:你已經在這裏... –

+0

我試過泰德的建議沒有成功。也就是說,我將事件處理程序放在工作表1代碼模塊中。當工作表1中的單元格更改時,工作表2中的單元格不會按預期更改。一定有辦法。 – jmaz

回答

1

正如其他人所說的,您需要將事件處理程序放在要監視的工作表中。

Worksheet_Change將回應用戶對所作的更改。如果一個單元格由於其他原因而改變,例如計算公式,則不調用該事件。

Worksheet_Calculate將響應表單重新計算。它沒有概念表單上的哪些單元格發生變化。要在您的使用情況下使用它,要麼不管複製的細胞和接受它會做一些unnecassary副本,或跟蹤A1:A2值自己的變化對你的代碼

注意複製:

  • 限定引用至Range請參閱您的代碼所在的工作表。Me也是如此。
  • 您可以參考工作表CodeName來引用特定工作表,無論用戶調用它或將其移動。
  • 試圖做範圍的Intersect上不同片不作任何SENCE和將出錯
  • Sheets(1)Sheet1可能並不相同的工作表。 Sheets收集索引的順序是在Excel中顯示工作表,並且可以由用戶更改。

這是你的代碼的重構(把這個表1個模塊上表中複製更改表2)

Private Sub Worksheet_Calculate() 
    If Sheet2.Cells(1, 1).Value <> Me.Cells(1, 1).Value Or _ 
     Sheet2.Cells(1, 2).Value <> Me.Cells(1, 2).Value Then 

     Application.EnableEvents = False 
     Sheet2.Range("A1:A2").Value = Me.Range("A1:A2").Value 
     Application.EnableEvents = True 
    End If 

End Sub 
+0

事實上,對VBA代碼所做的工作表的更改確實會觸發'Worksheet_Change' – mattboy

+0

@mattboy,thx,已更改它 –

+0

剛剛更新以匹配您的標題(問題的身體仍然說相反)並糾正了錯誤在'如果'語句 –

相關問題