如何避免在错误的工作簿中执行VBAfunction

我有几个有计时器和macros执行的Excel文件。 但是一个大问题是工作簿A的macros被调用,而工作簿B是活动的。 macros在错误的书中执行失败。

  1. 我是否需要在每个函数的开始处放置windows()。
  2. 如果我有不同的模块,我怎么把这个工作簿的名字传给他们呢?
  3. 这看起来过分而不正确。 有什么好的解决scheme来解决这个问题吗?

期待你的回答

你在这个正确的轨道上

2.如果我有不同的模块,我如何将这个工作簿名称传递给他们

我假设你的macros正在使用ActiveWorkbook属性,或者只是使用像Range这样的Worksheet属性而不限制它们?

而不是使用ActiveWorkbook使用ThisWorkbook 。 而不是使用Range使用ThisWoorkbook.Worksheets(1).Range等等。 否则macros将假定活动工作表是你想要的。

 Sub MyMacro Range("A1").Text = "Test" End Sub 

尝试

 Sub MyMacro(ByVal oWorksheet as Worksheet) oWorksheet.Range("A1").Text = "Test" End Sub 

然后传递工作表对象作为参数。

您也可以find有用的ThisWorkbook对象 – 它是macros驻留的工作簿,或者是调用当前macros的对象的Application.Caller对象,例如Range对象(如果是单元格公式),或者可能是计时器在你的情况下的对象。

如果你的macros按照你描述的方式行事,那么他们可能明确地或隐含地依赖于它

 ActiveWorkbook 

要么

  ActiveSheet 

如果可能的话,应避免这种依赖关系。 macroslogging器产生这样的代码,你应该立即改变它,每当你已经logging了一个macros。

例如,如果你有一些类似的代码

 s = Range("A1").Value 

Excel隐式地将其更改为

 s = ActiveSheet.Range("A1").Value 

通过显式使用正确的工作表或工作簿对象,可以避免访问所有单元格,范围,工作簿部分等:

 Dim sh as Worksheet Set sh = .... ' Initialize sh the first time where the sheet is created or loaded 'later on: s = sh.Range("A1").Value 

通过使用表单的参数

 sh as Worksheet, wb as workbook 

对于您的潜水艇和function,您可以在模块之间传递正确的工作表和工作簿,这将回答您的第二个问题。 如果您需要访问macros驻留的工作簿,请使用ThisWorkbook

我会更进一步…确保您的代码没有select或ActiveCell

他们内的对象。 您将需要使用Range对象重写这些。