Если ваши макросы ведут себя так, как вы их описали, они, вероятно, зависят явно или неявно от
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
.