Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/excel/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
两个工作表上的VBA宏_Vba_Excel - Fatal编程技术网

两个工作表上的VBA宏

两个工作表上的VBA宏,vba,excel,Vba,Excel,我在Excel2003中有一个VBA对象,当通过流数据获得某些值时,它会触发三个简单的宏。它运行得很好。我想打开一个重复的工作表,但是使用不同的流数据,并在各自的工作表上触发宏。它现在可以工作了,但只在我当前选择的工作表上。每个工作表中都有对象和宏 对象监视三个单元格,当第一个单元格被触发时,继续监视下一个单元格,当被触发时,监视下一个单元格,然后重复 我想让他们同时在各自的电子表格上运行 以下是VBA对象: Private Sub Worksheet_Calculate() Static o

我在Excel2003中有一个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

对于任何代码格式错误,我深表歉意。

您的代码无法工作的原因在于您使用范围函数的方式。仅使用范围是Application.Range的缩写

Excel帮助文件对此进行了说明:

在没有对象限定符的情况下使用时,此属性是ActiveSheet.Range的快捷方式(它从活动工作表返回一个范围;如果活动工作表不是工作表,则该属性失败)

将其保存在
工作表\u Calculate
事件中会将其锁定到给定的工作表

我建议将
工作表\u Calculate
中的代码移动到一个单独函数中的模块中,并将感兴趣的单元格作为参数。这将允许您干燥代码,并允许您在
工作表\u Activate
事件中调用函数

如果不想重写代码,只需在
工作表\u Activate
事件中调用
工作表\u Calculate

Private Sub Worksheet_Activate()
  Worksheet_Calculate
End Sub 

这将在输入工作表时启动代码。

尝试在其他Excel实例中打开它?VBA不支持多线程。因此,正如@SiddharthRout所建议的,要么在单独的Excel实例中打开工作表,要么让宏轮流运行。
Private Sub Worksheet_Activate()
  Worksheet_Calculate
End Sub