Посмотрите на это решение. Он решает несколько проблем и может упростить то, что вы пытаетесь сделать, или, по крайней мере, дать вам некоторые идеи для новых подходов к этому.
Некоторые примечания:
Вы должны использовать Long вместо Integer для своих циклов.
Если все листы находятся в одной книге, вам не нужно объявлять «ActiveWorkbook.Sheets».
Вы пытались соединить переменную строку ни с чем другим внутри определения пункта назначения. '(& temp2 & )'. Вам нужно сделать это только при создании строк, но поскольку temp1 и temp2 уже являются строками и имеют переменную форму, вам не нужно этого делать. Кроме того, они имеют одно и то же значение в этой точке, ЕСЛИ они используются, поэтому любой из них будет работать в этой строке.
Вам не нужно включать оператор Else, если вы не собираетесь его писать.
Строка ниже относится к строке i, но DCM в данный момент находится не в строке i, а в строке x, поэтому вы получите неправильное имя листа. Вы только что сопоставили Master(i) с DCM(x) и используете значение DCM(i), которое находится где-то еще на листе и не обрабатывается. Кроме того, в этой строке, поскольку вы действительно просто передаете значение, не пытаетесь ли вы передать temp1/temp2, который уже имеет это значение?
ссылка выше:
AddSheetIfMissing (ActiveWorkbook.Sheets("DCM").Cells(i, 1).Value)
- Вы можете установить значения с помощью цикла по столбцам вместо копирования строки, что помогает избежать операторов выбора. Это просто еще один способ сделать это. Это мой предпочтительный способ копирования строки, дающий мне больше контроля, чтобы пропустить определенные значения, если мне нужно.
Пример цикла для копирования всей строки с одного листа на другой.
For lCol = 1 to lastCol
Sheets(sheet2).Cells(tRow, lCol) = Sheets(sheet1).Cells(lRow, lCol)
Next lCol
Рассмотрите это решение:
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
Функция, возвращающая логический тест, который возвращает значение True, если лист был новым. Ложь, если нет.
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
Функция, которая у вас была, была настроена на возврат рабочего листа, но в исходном коде у вас не было ничего, что могло бы захватить эту переменную, поэтому она не нужна. Я заставляю его вернуть тест, чтобы увидеть, был ли лист новым или нет, чтобы помочь определить строку, в которую необходимо переместить данные.
Ознакомьтесь с этой ссылкой, которая лучше объясняет разницу между подчиненными и функциями.< br> В упрощенном виде это то, что они оба ДЕЛАЮТ что-то, но Функции ВОЗВРАЩАЮТ значение.
person
peege
schedule
30.12.2014
Destination:=Worksheets(temp2).Range(...
. - person   schedule 31.12.2014