Sama-sama mas @Alan13... Untuk hal yang ditanyakan terakhir, sebenarnya informasi yang diberikan dari tautan tersebut sudah jelas:
Untuk mengatasi masalah ini jika makro VBA Anda menyalin dan pasta kisaran 2,516 baris atau lebih baris, Ubah kode makro VBA untuk loop Salin dan tempel kecil kisaran data hingga kisaran yang akan disalin dan ditempel.
Saya pernah menyusun proses yang sama (menyalin Worksheet dari Workbook berbeda), dengan jumlah data lebih dari 3000 baris dengan jumlah kolom 40 kolom. Untuk prosesnya, maka saya menyusun proses looping per n baris (n bisa 100, 500 atau 1000).
Jika script di atas dikembangkan, sebaiknya dibuatkan prosedur khusus untuk menangani proses penyalinan data dengan pengulangan tersebut (opsional). Konsepnya:
[1] Buka Workbook sumber (sesuai script di atas).
[2] Periksa apakah sheet target ada pada file target. Jika ada, hitung jumlah kolom dan baris data. Misalkan:
...
For Each sh In sourceWb.Worksheets
If UCase$(Trim$(sh.Name)) = "UT" Then
With sh
lCols = Application.CountA(.Range("1:1"))
lRows = Application.CountA(.Range("A1:A" & .Rows.Count))
bValid = CBool(lCols * lRows)
End With
If bValid Then
'+-- Ubah nilai 2500 ke estimasi nilai yang tepat
'+-- (baris yang bisa disalin secara langsung)
If lRows <= 2500 Then
sh.Copy After:=targetWb.Sheets("My")
Else
'+-- Susun proses penyalinan data manual.
'+-- Buat sheet baru [3]
'+-- Pengulangan proses menyalin data [4]
End If
End If
Exit For
End If
Next
...
Pada potongan script di atas, jika bValid = True
, maka proses penyalinan akan didasari oleh jumlah baris (lRows
). Idenya, proses penyalinan data hanya akan dilakukan jika ada data yang akan disalin.Namun hal tersebut disesuaikan saja dengan keinginan mas @Alan13...
[3]. Untuk proses menyalin data secara berulang, buat dahulu sheet baru pada target Workbook, misalkan saja:
...
Set xlTargetSheet = ThisWorkbook.Sheets.Add
xlTargetSheet.Name = sh.Name
...
[4]. Lakukan proses penyalinan data secara berulang dari sheet sumber ke sheet target:
...
lRow = 1
bDone = (lRows <= 100)
lCount = IIf(bDone, lRows, 100)
Do
sh.Cells(lRow, 1).Resize(lRow + lCount, lCols).Copy
xlTargetSheet.Range("A1").Offset(lRow).PasteSpecial xlPasteValues
If lRows > 100 Then
lRow = lRow + 100
If (lRow \ 100) = (lRows \ 100) Then
lCount = lRows - ((lRows \ 100) * 100)
Else
bDone = (lRow > lRows)
End If
End If
DoEvents
Loop While Not bDone
...
[5]. Tutup Workbook sumber.
Hal yang perlu diperhatikan antara lain adalah bentuk (layout) dari Workbook sumber, apakah data dimulai dari baris pertama atau tidak, untuk menyesuaikan variabel-variabel yang digunakan, seperti lRow
.
Demikian pengalaman dan pengetahuan yang dapat saya bagikan... ;)