簡體   English   中英

兩個工作表上的VBA宏

[英]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_CalculateWorksheet_Activate事件:

Private Sub Worksheet_Activate()
  Worksheet_Calculate
End Sub 

輸入工作表后,這將啟動您的代碼。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM