Excel VBA - Range.Copy Увеличение размера файла и замедление работы - PullRequest
0 голосов
/ 19 марта 2019

Из названия моя проблема может показаться очевидной, но выслушайте меня.

Я работаю над электронной таблицей, которая отслеживает больничные дни для сотрудников, и в ней указаны строки с именем сотрудника и столбцами.каждый день года.

Я работаю над макросом, который сдвигает данные обратно на один месяц, позволяя вводить новые данные.Мой текущий порядок операций состоит в том, чтобы скопировать данные (со второго месяца по последний месяц) и переместить их на один месяц влево, а затем очистить данные за последний месяц.Эта фотография могла бы объяснить это лучше.

Из-за этого макета я перемещаю массив данных размером примерно 50 строк на 330 столбцов.До сих пор я использовал следующий код и функциональность, он работает так, как задумано:

(C1-C8 - это угловые точки календаря, как показано на фотографии)

Основная подпрограмма:

'Copying entire calender into undo tab for the undo subroutine to use
Sheets(1).Range(C1 & ":" & C8).Copy Sheets(5).Range(C1)

'Moving the "moving zone" months 31 cells to the left
Sheets(1).Range(C2 & ":" & C8).Copy Sheets(1).Range(C1)

'Clearing the last month to make room for new information
Sheets(1).Range(C3 & ":" & C8).ClearContents
Sheets(1).Range(C3 & ":" & C8).ClearComments

Подпрограмма «Отменить»:

'Copies information from undo tab back into sheet 1
Sheets(5).Range(C1 & ":" & C8).Copy Sheets(1).Range(C1)

Проблема заключается в том, что при каждом запуске кода размер файла увеличивается, а код работает медленнее.Из того, что мне известно об этом типе Range.Copy, не требуется флаг «Application.CutCopyMode = False», и он, похоже, не имеет значения, когда я его все равно использовал.

Причина, по которой я 'Я использую функцию копирования, а не функцию обрезки, потому что я хочу оставить форматирование (границы, цвета и т. д.) без изменений в самом правом углу календаря.

Был бы лучший способ достичь моих результатов, потому что сейчас кажется, что в результате выполнения кода накапливаются скрытые данные, которые я не вижу.

1 Ответ

0 голосов
/ 02 апреля 2019

Благодаря всей помощи, которую я получил от ответов на этот пост, и некоторому дополнительному анализу электронной таблицы, над которой я работал, я считаю, что нашел способ достичь желаемых результатов без замедления и увеличения размера файла, которым я занимался.переживает.Я подумал, что было бы неплохо опубликовать мои результаты здесь, если кто-то столкнется с такими же проблемами.

Основной причиной, вызывающей замедление и увеличение размера файла, был не сам код, а способ, которым была сама таблицавыложил, как предложил @Absinthe.Существовали правила условного форматирования в разделе ввода данных календаря, чтобы закрасить даты, которые были выходными, праздничными днями и т. Д. Проблемы, с которыми я столкнулся, были связаны с тем, что исходный код в исходном сообщении копировал все, включая правила условного форматирования назад31 кл.

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

Чтобы обойти эту проблему, я использовал комбинацию sheets.range.value=sheets.range.value и sheets.range.copy sheets.range.paste special xlPasteComments, чтобы получить следующий код.(С1 по С8 - это угловые точки календаря, показанные на фотографии, прикрепленной к исходному сообщению)

With Application
.ScreenUpdating = False
.EnableEvents = False
.Calculation = xlCalculationManual
End With

'Copying entire calender into undo tab for the undo subroutine to use
Sheets(4).Range(C1 & ":" & C8).ClearContents
Sheets(4).Range(C1 & ":" & C8).ClearComments
Sheets(4).Range(C1 & ":" & C8).Value = Sheets(1).Range(C1 & ":" & C8).Value
Sheets(1).Range(C1 & ":" & C8).Copy
Sheets(4).Range(C1).PasteSpecial xlPasteComments
Application.CutCopyMode = False

'Moving the "moving zone" months 31 cells to the left
Sheets(1).Range(C1 & ":" & C6).ClearContents
Sheets(1).Range(C1 & ":" & C6).ClearComments
Sheets(1).Range(C2 & ":" & C8).Copy
Sheets(1).Range(C1).PasteSpecial xlPasteValues
Sheets(1).Range(C2 & ":" & C8).Copy
Sheets(1).Range(C1).PasteSpecial xlPasteComments
Application.CutCopyMode = False

'Clearing the last month to make room for new information
Sheets(1).Range(C3 & ":" & C8).ClearContents
Sheets(1).Range(C3 & ":" & C8).ClearComments

With Application
.ScreenUpdating = True
.EnableEvents = True
.Calculation = xlCalculationAutomatic
End With

Циклы with в начале и конце - это то, что ускоряет код, не обновляяэкран во время работы кода.

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

...