如何避免在错误的工作簿中执行VBAfunction
我有几个有计时器和macros执行的Excel文件。 但是一个大问题是工作簿A的macros被调用,而工作簿B是活动的。 macros在错误的书中执行失败。
- 我是否需要在每个函数的开始处放置windows()。
- 如果我有不同的模块,我怎么把这个工作簿的名字传给他们呢?
- 这看起来过分而不正确。 有什么好的解决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对象重写这些。