Проблема VBA Excel с копированием книги в другую книгу — приложение зависает при копировании определенных файлов

#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