#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. Потрясающе. Это прекрасно! Спасибо!