Lihatlah solusi ini. Ini mengatasi beberapa masalah dan mungkin menyederhanakan apa yang Anda coba lakukan, atau setidaknya memberi Anda beberapa ide tentang cara baru untuk melakukan pendekatan ini.
Beberapa catatan:
Anda harus menggunakan Long, bukan Integer untuk loop Anda.
Jika semua lembar ada di buku kerja yang sama, Anda tidak perlu mendeklarasikan "ActiveWorkbook.Sheets"
Anda mencoba menggabungkan string variabel dengan tidak ada yang lain di dalam definisi tujuan Anda. '( & suhu2 & )'. Anda hanya perlu melakukan itu saat membuat string, tetapi karena temp1, dan temp2 keduanya sudah berupa string, dan dalam bentuk variabel, Anda tidak perlu melakukan itu. Selain itu, nilainya sama pada saat itu JIKA digunakan, jadi keduanya akan berfungsi di baris itu.
Anda tidak perlu menyertakan pernyataan Else jika Anda tidak ingin menulisnya.
Baris di bawah mengacu pada baris i, tetapi DCM saat itu tidak ada di baris i, melainkan di baris x, Anda akan mengambil nama sheet yang salah. Anda baru saja mencocokkan Master(i) dengan DCM(x) dan menggunakan nilai DCM(i) yang ada di tempat lain pada lembar, tidak ditangani. Lebih jauh lagi, karena Anda sebenarnya hanya meneruskan suatu nilai, bukankah Anda mencoba meneruskan temp1/temp2 yang sudah memiliki nilai itu?
referensi di atas:
AddSheetIfMissing (ActiveWorkbook.Sheets("DCM").Cells(i, 1).Value)
- Anda dapat mengatur nilai dengan perulangan melalui kolom alih-alih menyalin baris, yang membantu menghindari pernyataan pemilihan. Ini hanyalah cara lain untuk melakukannya. Ini adalah cara pilihan saya untuk menyalin baris, memberi saya kontrol lebih besar untuk melewati nilai tertentu jika perlu.
Contoh loop untuk menyalin seluruh baris dari satu lembar ke lembar lainnya.
For lCol = 1 to lastCol
Sheets(sheet2).Cells(tRow, lCol) = Sheets(sheet1).Cells(lRow, lCol)
Next lCol
Pertimbangkan solusi ini:
Private Sub AddtoWorksheet()
Dim temp1 As String, temp2 As String
Dim i As Long, x As Long, tRow As Long
Dim lastRow1 As Long, lastRow2 As Long, lastCol As Long
Dim Sheet1 As String, Sheet2 As String, tempSheet As String
Dim isNew As Boolean
'Define your sheet names
Sheet1 = "Master"
Sheet2 = "DCM"
'Get last row for each sheet
lastRow1 = Sheets(Sheet1).Range("A" & Rows.count).End(xlUp).row
lastRow2 = Sheets(Sheet2).Range("A" & Rows.count).End(xlUp).row
For i = 2 To lastRow1
temp1 = Sheets(Sheet1).Cells(i, 1).Value
For x = 1 To lastRow2
temp2 = Sheets(Sheet2).Cells(x, 1).Value
If temp1 = temp2 Then
' AddSheetIfMissing (ActiveWorkbook.Sheets("DCM").Cells(i, 1).Value)
isNew = AddSheetIfMissing(temp1)
'Grab the last column number from Master sheet
lastCol = Sheets(Sheet1).Cells(1, Columns.count).End(xlToLeft).column
'Set the row on the new sheet
If isNew = True Then
tRow = 1
Else
tRow = Sheets(temp1).Range("A" & Rows.count).End(xlUp).row + 1
End If
' ActiveWorkbook.Sheets("Master").Cells(i, 1).EntireRow.Copy _
' Destination:=Worksheets(" & temp2 & ").Range("A" & Rows.count).End(xlUp).Offset(1)
For lCol = 1 To lastCol
Sheets(temp1).Cells(tRow, lCol).Value = Sheets(Sheet1).Cells(i, lCol).Value
Next lCol
End If
Next x
Next i
End Sub
Fungsi mengembalikan pengujian boolean yang menghasilkan True jika sheetnya Baru. Salah jika tidak.
Function AddSheetIfMissing(tempName As String) As Boolean
Dim ws As Worksheet
Dim isNew As Boolean
isNew = False
On Error Resume Next
Set ws = ThisWorkbook.Worksheets(tempName)
If ws Is Nothing Then
Set ws = ThisWorkbook.Worksheets.Add
ws.name = tempName
isNew = True
End If
AddSheetIfMissing = isNew
End Function
Fungsi yang Anda atur untuk mengembalikan Lembar Kerja, namun pada kode asli Anda, Anda tidak memiliki apa pun yang benar-benar mengambil variabel itu, jadi itu tidak diperlukan. Saya memintanya mengembalikan tes untuk melihat apakah lembar itu baru atau tidak, untuk membantu menentukan baris di mana data perlu dipindahkan.
Lihat tautan ini yang menjelaskan dengan lebih baik perbedaan antara sub dan fungsi.< br> Ringkasan sederhananya adalah keduanya MELAKUKAN sesuatu, tetapi Fungsi MENGEMBALIKAN sebuah nilai.
person
peege
schedule
30.12.2014
Destination:=Worksheets(temp2).Range(...
. - person   schedule 31.12.2014