Использование Personal.xlsb — ссылка на активную книгу в VBA

#excel #vba

#vba #превосходить

Вопрос:

У меня есть несколько сценариев, которые находятся в модуле в моем личном файле.xlsb. Он скрыт, но в этом сценарии идея заключается в том, что вы каждый раз запускаете его из другой книги. Он открывает отдельную рабочую книгу (source.xlsx), копирует диапазон из него, вставляет в исходную книгу, а затем закрывает source.xlsx.

Когда дело доходит до «Этой рабочей книги.Активная таблица.Часть «Вставить», она вставляет ее в книгу Personal.xlsb вместо целевой книги, которая фактически открыта и видна. Как я могу убедиться, что он вставлен в правильную рабочую книгу? Имя файла книги всегда будет отличаться, поэтому я не могу указать путь или что-то в этом роде.

 Sub CopyData()  Application.DisplayAlerts = False  Dim wbSource As Workbook  Set wbSource = Workbooks.Open(Filename:="source.xlsx", UpdateLinks:=3)  wbSource.Sheets(1).Range("A1:X105").Copy   ThisWorkbook.ActiveSheet.Paste  wbSource.Close  Application.DisplayAlerts = True  Call CopyCFormat End Sub  

Ответ №1:

ThisWorkbook В большинстве случаев не используйте, так как он ссылается на книгу, в которой хранится макрос (в данном случае personal.xlsb).

Вместо этого вы можете использовать ActiveWorkbook для ссылки на любую книгу, которая имеет фокус во время выполнения макроса. Вы также можете назначить ActiveWorkbook переменную для удобства использования.

 Sub CopyData() Application.DisplayAlerts = False Dim wbSource As Workbook Dim wbTarget as Workbook  Set wbTarget = ActiveWorkbook  Set wbSource = Workbooks.Open(Filename:="source.xlsx", UpdateLinks:=3) wbSource.Sheets(1).Range("A1:X105").Copy  wbTarget.ActiveSheet.Paste wbSource.Close Application.DisplayAlerts = True  Call CopyCFormat End Sub  

Вы также можете ссылаться на активный лист, не указывая, в какой книге он находится, как:

 Dim wbSource As Workbook Dim shtTarget as Worksheet  Set shtTarget = ActiveSheet  Set wbSource = Workbooks.Open(Filename:="source.xlsx", UpdateLinks:=3) wbSource.Sheets(1).Range("A1:X105").Copy  shtTarget.ActiveSheet.Paste  

Удачи!

Комментарии:

1. Я бы ActiveSheet также избегал использования

2. Как и я, в большинстве случаев, но в данном случае в ОП конкретно указано, что идея заключалась в том, чтобы запустить макрос из нескольких книг и скопировать информацию на любой экран, который был активен в то время.

Ответ №2:

Если я правильно понимаю, вам следует просто добавить еще одну переменную рабочей книги.

 Sub CopyData() Dim mainWB As Workbook Dim mainWS As Worksheet Set mainWB = ActiveWorkbook Set mainWS = mainWB.Sheets(1) ' Change this to whatever you need it to be  Application.DisplayAlerts = False Dim wbSource As Workbook Set wbSource = Workbooks.Open(Filename:="source.xlsx", UpdateLinks:=3) wbSource.Sheets(1).Range("A1:X105").Copy  mainWS.Paste wbSource.Close Application.DisplayAlerts = True Call CopyCFormat End Sub  

Комментарии:

1. Потрясающе. Это прекрасно! Спасибо!