#excel #vba
#excel #vba
Вопрос:
У меня проблема, которая, честно говоря, ставит меня в тупик.
Я копирую набор книг в «основной» книге (копирую все листы). Я могу использовать 2 метода: либо просматривать каждый лист в рабочих книгах, чтобы скопировать каждый из них в основную книгу, либо скопировать книгу целиком и поместить в основную книгу. Я использую второй метод, используя массив для удаления листов, которые мне не нужны.
Dim ws() As String ' declare string array
ReDim ws(wb.Worksheets.Count) As String ' set size dynamically
Dim counter As Long ' running counter for ws array
counter = 0
For c = 1 to WS_Count
If wb.Worksheets(c).Name <> "TEST" Then
ws(counter) = wb.Worksheets(c).Name
counter = counter 1
End If
Next
ReDim Preserve ws(counter-1) As String
wb.Worksheets(ws).Copy Before:=master.Worksheets(master.Worksheets.Count)
Однако оба подхода, которые я пробовал, хорошо работают с определенными файлами:
1) Первый подход проблематичен, поскольку он оставляет ссылку на исходный файл, и поэтому я перешел к подходу 2, который обходит эту проблему, поскольку ссылка не сохраняется.
2) подход 2 приводит к некоторому бесконечному циклу в определенном файле. самое смешное в этом то, что если я изменю порядок, в котором они объединяются, команда не застревает, и с другими примерно 50 книгами коды, похоже, работают просто отлично. (обратите внимание, что эта проблема не возникает при использовании метода 1, но метод 1 был отменен из-за ссылок на файлы)
Строка, на которой она просто застревает (без ошибок), является wb.Worksheets(ws).Copy Before:=master.Worksheets(master.Worksheets.Count)
Кто-нибудь когда-нибудь сталкивался с этой проблемой, когда файл не хотел объединяться? Я где-то достиг какого-то предела? Я в растерянности, потому что, используя 26 разных книг, моему коду в целом удалось создать основную книгу из 896 листов. В этом наборе, который застревает, я объединяю файл рабочего листа 164 с новым рабочим листом, содержащим файлы 164. Я использую Office Professional Plus 2010.
В настоящее время я скрываю оповещения, однако, я полагаю, что получал те сообщения, в которых он спрашивает меня, хочу ли я дождаться приложения.
Кто-нибудь может указать мне правильное направление, пожалуйста?
Комментарии:
1. Ваш код сбивает меня с толку, но вот пара мыслей. Предполагая, что вы не установили параметр Base 1, ваш
ws
массив содержит на один элемент больше, чем wb.Worksheets. Подсчет. Я предпочитаю делать что-то вроде: ReDim ws (от 1 до wb.Worksheets. Количество), в настоящее время это то же самое, что и ReDim ws (от 0 до wb.Worksheets. Подсчет). Кроме того, вы должны быть в состоянии избавитьсяCounter
, поскольку, напримерc
, оно просто увеличивается на 1.2. У меня есть начальный ReDim, который выполняет то, что вы говорите, однако затем я удаляю пустые записи (т. Е. Тестовые страницы). Счетчик отслеживает страницы, которые необходимо скопировать, т.е. игнорирует страницы, называемые «ТЕСТОВЫМИ».
3. Это много листов, я не удивлюсь, если используется слишком много памяти. Кроме того, отмените первый метод (который, я думаю, вы не показали) — вы можете решить проблему со связью, связав целевую книгу с самой собой, чтобы заменить исходные ссылки
4. Извините, конечно, на счетчике. Небрежное чтение с моей стороны.
5. @MP24
dictionary.Keys()
илиdictionary.Values()
оба возвращают массив 🙂 Но да, количество листов здесь кажется вероятной проблемой.
Ответ №1:
Поскольку вы пропускаете «тестовые» страницы, вы пробовали начинать с последней страницы и переходить на -1?
For c = WS_Count to 1
If wb.Worksheets(c).Name <> "TEST" Then
ws(counter) = wb.Worksheets(c).Name
counter = counter - 1
End If
Next c