我在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
我对任何代码格式错误表示超级道歉。
答案 0 :(得分:0)
您的代码不起作用的原因在于您使用Range函数的方式。单独使用Range是Application.Range的缩写。
Excel帮助文件说明了这一点:
在没有对象限定符的情况下使用时,此属性是ActiveSheet.Range的快捷方式(它从活动工作表中返回一个范围;如果活动工作表不是工作表,则属性将失败)。
将此保留在Worksheet_Calculate
事件中会将其锁定到给定的工作表。
我建议将Worksheet_Calculate
中的代码移动到单独函数中的模块中,并将感兴趣的单元格作为参数。这样您就可以干掉代码,并允许您在Worksheet_Activate
事件中调用该函数。
如果您不想重写代码,只需将Worksheet_Calculate
的电话拨入Worksheet_Activate
事件:
Private Sub Worksheet_Activate()
Worksheet_Calculate
End Sub
这将在您输入工作表时启动您的代码。