两个工作表上的VBAmacros

我在Excel 2003中有一个VBA对象,当通过stream数据获得某些值时,触发三个简单的macros。 它运行良好。 我想打开一个重复的工作表,但是使用不同的stream数据,并在各自的工作表上触发macros。 它现在工作,但只在我目前select的工作表上。 每个工作表都有对象和macros。

对象监视三个单元格,当第一个单元格被触发时,继续监视下一个单元格,并在触发时监视下一个单元格,然后重复。

我会帮助他们同时在各自的电子表格上运行。

这是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 

而且,这三个macros – 它们本质上是相同的 – 它们从相同的位置复制,但粘贴到不同的位置。 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事件中将其locking到给定的工作表。

我build议将Worksheet_Calculate的代码移入一个单独函数中的模块,并将感兴趣的单元格作为参数。 这可以让你干起你的代码,并允许你调用Worksheet_Activate事件中的函数。

如果您不想重写代码,只需将Worksheet_Calculate调用到Worksheet_Activate事件中即可:

 Private Sub Worksheet_Activate() Worksheet_Calculate End Sub 

这将在input工作表时启动您的代码。