#arrays #excel #vba #performance #copy-paste
#массивы #excel #vba #Производительность #копировать-вставить
Вопрос:
У меня есть приведенный ниже код, и я обнаружил, что копирование-вставка происходит медленно, а внутренний цвет также медленный.
Я пытаюсь разобраться с этим кодом с 700 000 строк 120 столбцов данных.
Любые предложения по повышению скорости.
В настоящее время мне может потребоваться более 20 минут, чтобы закончить эту строку кода.
Application.ScreenUpdating = False
Application.DisplayAlerts = False
Application.Calculation = xlCalculationManual
Application.EnableEvents = False
Application.DisplayStatusBar = False
For i = keycolumns 2 To ILcol 1
'Result.Cells(1, resultcolumn).EntireColumn.Insert
rColumnLetter = Split(Cells(1, resultcolumn - 1).Address, "$")(1)
iColumnLetter = Split(Cells(1, i - 1).Address, "$")(1)
IL.Range(iColumnLetter amp; "1:" amp; iColumnLetter amp; ILrow).Copy Result.Range(rColumnLetter amp; "1:" amp; rColumnLetter amp; ILrow)
colNum = Application.WorksheetFunction.Match(Result.Cells(1, resultcolumn - 1).Value, PL.Range("1:1"), 0)
Result.Cells(1, resultcolumn) = Result.Cells(1, resultcolumn - 1) amp; " Postload - " amp; colNum
'Result.Cells(1, resultcolumn 1).EntireColumn.Insert
Result.Cells(1, resultcolumn 1) = Result.Cells(1, resultcolumn - 1) amp; " Comparison"
ColumnLetter = Split(Cells(1, resultcolumn 1).Address, "$")(1)
Result.Range(ColumnLetter amp; "1:" amp; ColumnLetter amp; ILrow).Interior.Color = RGB(146, 208, 80)
resultcolumn = resultcolumn (2 * (i - i 1)) 1
Next i
Комментарии:
1. Не могли бы вы включить описание того, что должен делать код?
2. @VBasic2008 , мой код предполагает копирование данных на другой лист и вставку 2 пустых столбцов для каждого столбца
3. Вы имеете в виду копировать
A
вA
,B
вD
,C
вG
… и т.д.?4. @VBasic2008 да, я сделал это, но это очень медленно и заняло много времени, так как мои данные содержат 710 тысяч строк и 110 столбцов данных
5. Вы пробовали вместо использования копирования / вставки диапазонов выполнять прямой перенос из ячейки в ячейку с помощью
For
. Один для столбцов, а другой для строк? Возможно ли это с вашими данными? Взгляните на этот веб-сайт xylos.com/en/learning/blog /…
Ответ №1:
По моему опыту, лучше избегать операций непосредственно на листах. Что я бы сделал, так это:
- создайте переменную массива
- измените размер массива, чтобы он мог содержать все данные
- заполните массив действиями, которые в настоящее время включены в ваш цикл «for»
- распечатайте массив на листе
Конечный результат будет близок к этому:
public sub populateArray()
dim arr_data() as Variant
dim numberOfRows,numberOfColumns,currentRow,currentCollumn as integer
currentRow = 0
currentCollumn = 0
numberOfRows = 10
numberOfColumns = 10
redim arr_data(numberOfRows,numberOfColumns)
for currentRow to numberOfRows
for currentCollumn to numberOfColumns
arr_data (currentRow,currentCollumn) = "TEXT"
next currentCollumn
next currentRow
with activesheet
.range("A1") = arr_data
next with
end sub
Пожалуйста, обратите внимание, что я не тестировал приведенный выше код, не стесняйтесь настраивать его под свои нужды.
Комментарии:
1. я не очень хорошо знаком с массивом, могу ли я привести пример для вставки столбцов в массив?
2. Не хватает памяти для моего номера строки = 798000 и количества столбцов = 318
3. измените объявление типа с «как целое число» на «как длинный» — длинный тип может содержать числа от -2 147 483 648 до 2 147 483 647.