Медленная вставка копирования в Excel vba

#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:

По моему опыту, лучше избегать операций непосредственно на листах. Что я бы сделал, так это:

  1. создайте переменную массива
  2. измените размер массива, чтобы он мог содержать все данные
  3. заполните массив действиями, которые в настоящее время включены в ваш цикл «for»
  4. распечатайте массив на листе

Конечный результат будет близок к этому:

 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.