Существует ли более быстрый способ копирования значений ячеек с одного листа на другой, если количество строк и столбцов постоянно меняется - PullRequest
1 голос
/ 04 марта 2020

Здравствуйте, я пытаюсь создать самый общий макрос для передачи данных из одной ячейки в другую в тот момент, когда я копирую ячейку за ячейкой в ​​переменную var и устанавливаю значения таким образом, но это действительно тормозит все идеи?

 For i = TableDataRowNum To lastDataRow - 1
        For activeCounter = 0 To colCount
            aCellValue = ServiceTemp.Cells(TableDataRowNum + printCounter, activeCounter + 1).Text
            aSheet.Cells(rowCount + printCounter, activeCounter + 1).value2 = "'" & aCellValue
            aSheet.Cells(rowCount + printCounter, activeCounter + 1).Font.colorIndex = colorValue
        Next
        printCounter = printCounter + 1
        statusBarCounter = statusBarCounter + 1
        If statusBarCounter = 450 Then
             theStatus.ShowStatus "Formatting Data To WorkSheet " & aSheet.Name & " " & printCounter & " Rows Processed"
             statusBarCounter = 1
        End If
    Next

Ответы [ 2 ]

3 голосов
/ 04 марта 2020

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

Dim luc As Range
Dim src As Range
Dim dest As Range

Set luc = Cells(1, 1)
Set dest = Cells(10, 1)


Set src = Range(luc, luc.End(xlToRight))
Set src = Range(src, src.End(xlDown))

src.Copy

dest.PasteSpecial (xlPasteAll)

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

1 голос
/ 04 марта 2020

Работать с данными в массивах намного быстрее, чем с фактическим содержимым ячейки таблицы или рабочего листа.

Sub GetArrayData()

'Set the table to a listObject
Dim tbl As ListObject
Set tbl = shData.ListObjects("tblTest")

'Create array and fill it with the data of the table
Dim arr As Variant
arr = tbl.DataBodyRange()

Dim row As Long, col As Long

'Loop through the rows/columns of the array if you need to process the data
For row = LBound(arr, 1) To UBound(arr, 1)
    For col = LBound(arr, 2) To UBound(arr, 2)
        'Debug.Print arr(row, col)
    Next col
Next row

'Paste data to cell F1
shData.Range("F1:G999") = arr

End Sub

Это будет выполняться почти мгновенно для 2000 фрагментов данных и будет работать так же быстро, как Вы добавляете больше данных.

...