Вопрос или проблема
Я пытаюсь копировать листы из другой рабочей книги, но проблема в том, что я хочу начать копирование листов с определенного листа, название которого я знаю.
Я попытался адаптировать несколько кодов, которые копируют все листы, но у меня не получается.
Вот пример моего кода:
Sub CreationDeBaseDeDonneesAvril2018()
Worksheets.Add After:=ThisWorkbook.ActiveSheet
Dim Counter As Integer
Dim ws As Worksheet
Dim FirstMonth As Integer
Dim i As Integer
Dim wb As Workbook
Set wb = Workbooks.Open(")
For Each ws In wb
If ws.Name = "01m" Then
Exit For
End If
Next
ws.Activate
Counter = activeworksheet.Count
For i = Counter To ActiveWorkbook.Worksheets.Count
Worksheets(i).Copy After:=ThisWorkbook.Worksheets(1)
Next
End Sub
Заранее благодарю за вашу помощь
Этот код VBA (Macro) поможет вам скопировать определенные листы из закрытой рабочей книги в текущую рабочую книгу.
Sub CopyFromClosedWBK()
Dim wbSource As Workbook
Dim wbTarget As Workbook
Dim Sht As Worksheet
Set wbTarget = ThisWorkbook
Set wbSource = Workbooks.Open("C:\FolderName\WhicheverFile.xlsm")
wbSource.Sheets("Sheet2").Copy After:=wbTarget.Sheets("Sheet4")
wbSource.Close
End Sub
N.B
- Путь к файлу с исходной книгой, а также название папки
и имя листа редактируемые. - Вы можете добавить столько листов для копирования, используя
wbSource.Sheets("Sheet2").Copy After:=
в командной строке.
Ответ или решение
Вопрос, который вы подняли, касается копирования листов из одного рабочего Excel-файла в другой посредством использования макросов VBA. Задача осложняется тем, что вы хотите начать этот процесс с определенного листа, имя которого вам известно. Давайте рассмотрим, как можно решить эту проблему, исчерпывающе и близко к вашему коду.
Теория: Продвинутое копирование листов в Excel с использованием VBA
VBA (Visual Basic for Applications) — это мощный инструмент для автоматизации задач в приложениях Microsoft Office. Копирование листов между рабочими книгами с его помощью позволяет значительно сократить рутинные ручные операции.
Основная задача — начать копирование с листа, имя которого нам известно, и продолжить копирование всех последующих листов. Для этого мы можем использовать цикл, чтобы найти нужный лист, и затем скопировать все листы, которые идут за ним.
Пример: Существующий код
Ваш текущий код содержит несколько логических шагов, но имеет некоторые недостатки в части напрямую работающей логики и возможных ошибок. Основные моменты кода включают:
- Открытие рабочего файла: ваш код пытается открыть файл, но требует доработки пути к файлу.
- Поиск и переход на нужный лист: ваш цикл при нахождении определенного листа использует оператор
Exit For
, что правильно выводит из цикла, но затем wm.Activate может вызвать ошибку, если указанного листа, "01m", не существует. - Копирование листов: с использованием счетчика вы пытаетесь скопировать листы, однако структура цикла может быть более ясной и эффективной.
Применение: Оптимизированный код VBA
Давайте создадим улучшенный и более понятный скрипт:
Sub CopySheetsStartingFromSpecificSheet()
Dim wbSource As Workbook
Dim wbTarget As Workbook
Dim ws As Worksheet
Dim startCopying As Boolean
Dim startSheetName As String
' Инициализация переменных
startCopying = False
startSheetName = "01m" ' Имя листа, с которого начинается копирование
Set wbTarget = ThisWorkbook
' Открытие рабочей книги, из которой будем копировать листы
Set wbSource = Workbooks.Open("C:\FolderPath\SourceWorkbook.xlsx")
' Поиск нужного листа и начало копирования
For Each ws In wbSource.Worksheets
If ws.Name = startSheetName Then
startCopying = True
End If
' Начало копирования, если достигнутый лист имеет заданное имя
If startCopying Then
ws.Copy After:=wbTarget.Sheets(wbTarget.Sheets.Count)
End If
Next ws
' Закрытие источника после завершения копирования
wbSource.Close SaveChanges:=False
End Sub
Пояснения к коду:
-
Структура цикла For Each: мы используем цикл для итерации по всем листам в
wbSource
. ПеременнаяstartCopying
установлена вTrue
после нахождения нужного листа, в результате чего все последующие листы копируются. -
Безопасность и обработка ошибок: по завершении выполнения всех операций,
wbSource
закрывается без сохранения изменений. Это важно, чтобы защить оригинальные данные от случайных изменений во время исполнения макроса. -
Гибкость и масштабируемость: путь к файлу и имя начального листа заданы через переменные, это позволяет легко адаптировать макрос под различные сценарии использования.
Заключение:
Используя подход, предложенный в данном решении, вы сможете эффективно и корректно копировать листы из одного рабочего файла Excel в другой, точно контролируя начало процесса. Это — пример успешного применения VBA для ускорения и упрощения рабочих процессов в Excel.