[英]VBA Macros on two worksheets
我在Excel 2003中有一個VBA對象,當通過流數據獲得某些值時,該對象會觸發三個簡單的宏。 運行良好。 我想打開一個重復的工作表,但要使用不同的流數據,並在各自的工作表上觸發宏。 現在可以使用,但僅在我當前選擇的工作表上可用。 每個工作表中都有對象和宏。
該對象監視三個單元,當第一個單元被觸發時,繼續監視下一個單元,而當觸發時,監視下一個單元,然后重復。
我希望能使它們同時在各自的電子表格上運行。
這是VBA對象:
Private Sub Worksheet_Calculate()
Static oldval1
Static oldval2
Static oldval3
Static LastAction As Integer
' Initial state will be 0, neither Fast nor Slow
Const Fast As Integer = 1
Const Fast2 As Integer = 2
Const Slow As Integer = 3
Application.EnableEvents = False
If Range("I1").Value = "1" And oldval1 <> "1" And LastAction <> Fast Then
PasteFast
LastAction = Fast
ElseIf Range("Q1").Value = "1" And oldval2 <> "1" And LastAction <> Slow Then
PasteFast2
LastAction = Fast2
ElseIf Range("Y1").Value = "1" And oldval3 <> "1" And LastAction <> Slow Then
PasteSlow
LastAction = Slow
End If
oldval1 = Range("I1").Value
oldval2 = Range("Q1").Value
oldval3 = Range("Y1").Value
Application.EnableEvents = True
End Sub
而且,這是三個宏–它們本質上是相同的–它們從相同的位置復制,但粘貼到不同的位置。 PasteSlow和PasteFast在一個模塊上,而PasteFast2在另一個模塊上(無緣無故)。
Sub PasteSlow()
'
' PasteSlow Macro
'
'
Application.ScreenUpdating = False
Range("G5:G57").Select
Selection.Copy
Range("H5").Select
Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
:=False, Transpose:=False
Range("K5:K57").Select
Application.CutCopyMode = False
Selection.Copy
Range("L5").Select
Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
:=False, Transpose:=False
Range("A1").Select
End Sub
Sub PasteFast()
'
' PasteFast Macro
'
'
Application.ScreenUpdating = False
Range("g5:g57").Select
Selection.Copy
Range("P5").Select
Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
:=False, Transpose:=False
Range("k5:k57").Select
Application.CutCopyMode = False
Selection.Copy
Range("T5").Select
Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
:=False, Transpose:=False
Range("A1").Select
End Sub
Sub PasteFast2()
'
' PasteFast2 Macro
'
'
Application.ScreenUpdating = False
Range("g5:g57").Select
Selection.Copy
Range("x5").Select
Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
:=False, Transpose:=False
Range("k5:k57").Select
Application.CutCopyMode = False
Selection.Copy
Range("ab5").Select
Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
:=False, Transpose:=False
Range("A1").Select
End Sub
對於任何代碼格式錯誤,我深表歉意。
您的代碼無法正常工作的原因在於您使用Range函數的方式。 單獨使用范圍是Application.Range的縮寫。
Excel幫助文件對此進行了說明:
在不使用對象限定符的情況下使用時,此屬性是ActiveSheet.Range的快捷方式(它返回活動工作表中的范圍;如果活動工作表不是工作表,則該屬性失敗)。
將其保留在Worksheet_Calculate
事件中會將其鎖定到給定的工作表。
我建議將Worksheet_Calculate
的代碼移動到單獨的函數中的模塊中,並將感興趣的單元格作為參數。 這將允許您干燥代碼,並允許您在Worksheet_Activate
事件中調用該函數。
如果你不希望重寫代碼,只是拋出一個呼叫Worksheet_Calculate
到Worksheet_Activate
事件:
Private Sub Worksheet_Activate()
Worksheet_Calculate
End Sub
輸入工作表后,這將啟動您的代碼。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.