Что нужно сделать, чтобы избежать выполнения функции VBA в неправильной рабочей книге - PullRequest
0 голосов
/ 10 марта 2011

У меня есть несколько файлов Excel, которые выполняют таймер и макросы.Но большая проблема заключается в том, что макрос рабочей книги A вызывается, а рабочая книга B активна.Макрос выполняется в неправильной книге и не выполнен.

  1. Нужно ли включать windows (). Active в начале каждой функции?
  2. Если у меня разные модули, как это сделать?Я передаю название этой книги всем им?
  3. Это кажется чрезмерным и не правильным.Есть ли хорошее решение этой проблемы?

Ждем ваших ответов

Ответы [ 3 ]

2 голосов
/ 10 марта 2011

Если ваши макросы ведут себя так, как вы их описали, они, вероятно, зависят явно или неявно от

ActiveWorkbook

или

 ActiveSheet

Подобных зависимостей следует избегать, если это возможно.Устройство записи макросов создает такой код, и вы должны немедленно изменить его при каждой записи макроса.

Например, если у вас есть какой-либо код, такой как

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

для ваших подводных лодок и функций вы можете передать правильный лист и рабочую книгу между модулями, что отвечает на ваш второй вопрос.А если вам нужен доступ к книге, в которой находится ваш макрос, используйте ThisWorkbook.

2 голосов
/ 10 марта 2011

Вы на правильном пути с этим

2.Если у меня разные модули, как передать всем имя этой книги

Я предполагаю, что ваш макрос использует свойство ActiveWorkbook или просто использует свойства рабочего листа, такие как Range, без их квалификации?

Вместо использования ActiveWorkbook используйте ThisWorkbook. Вместо использования Range используйте ThisWoorkbook.Worksheets(1).Range и так далее. В противном случае макрос будет считать, что вам нужен активный рабочий лист.

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

Попробуйте

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

Затем передайте объект рабочего листа в качестве параметра.

Вы также можете найти полезным объект ThisWorkbook - это рабочая книга, в которой находится макрос, или объект Application.Caller, который является объектом, вызывающим текущий макрос, например объект Range, если это формула ячейки. или предположительно объект таймера в вашем случае.

0 голосов
/ 10 марта 2011

Я бы пошел еще дальше ... убедитесь, что в вашем коде нет объектов Selection или ActiveCell

.Вам нужно будет переписать их, используя объект Range.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...