Переместить строку на лист с именем переменной

Я пытаюсь переместить всю строку рабочего листа на другой рабочий лист, имя которого изменится по мере его прохождения. Если temp1 (данные на мастер-листе) равен temp2 (данные на листе DCM), то он либо создаст рабочий лист с общим именем, либо, если рабочий лист уже существует, он скопирует всю строку из мастера. рабочий лист на новый (или уже существующий) рабочий лист. Вот мой код. Я получаю сообщение об ошибке «Нижний индекс вне диапазона» в этой строке:

ActiveWorkbook.Sheets("Master").Cells(i, 1).EntireRow.Copy _
                        Destination:=Worksheets(" & temp2 & ").Range("A" & Rows.Count).End(xlUp).Offset(1)

Private Sub AddtoWorksheet()
Dim temp1 As String
Dim temp2 As String
Dim i As Integer
Dim x As Integer
Dim RowsUsed As Long
Dim RowsUsed2 As Long

 RowsUsed = ActiveWorkbook.Sheets("Master").UsedRange.Rows.Count
 RowsUsed2 = ActiveWorkbook.Sheets("DCM").UsedRange.Rows.Count

 For i = 2 To RowsUsed
    temp1 = ActiveWorkbook.Sheets("Master").Cells(i, 1).Value
        For x = 1 To RowsUsed2
            temp2 = ActiveWorkbook.Sheets("DCM").Cells(x, 1).Value
            If temp1 = temp2 Then
            AddSheetIfMissing (ActiveWorkbook.Sheets("DCM").Cells(i, 1).Value)
            ActiveWorkbook.Sheets("Master").Cells(i, 1).EntireRow.Copy _
                        Destination:=Worksheets(" & temp2 & ").Range("A" & Rows.Count).End(xlUp).Offset(1)
            Else:
            End If
            Next x

        Next i
End Sub

Function AddSheetIfMissing(Name As String) As Worksheet

    On Error Resume Next
    Set AddSheetIfMissing = ThisWorkbook.Worksheets(Name)
    If AddSheetIfMissing Is Nothing Then
        Set AddSheetIfMissing = ThisWorkbook.Worksheets.Add
        AddSheetIfMissing.Name = Name
    End If

End Function

person Tara Travino    schedule 30.12.2014    source источник
comment
Попробуйте Destination:=Worksheets(temp2).Range(....   -  person    schedule 31.12.2014
comment
Я вижу там много ActiveWorkbook. Вы используете более одной книги? Или все листы в одной книге?   -  person peege    schedule 31.12.2014


Ответы (1)


Посмотрите на это решение. Он решает несколько проблем и может упростить то, что вы пытаетесь сделать, или, по крайней мере, дать вам некоторые идеи для новых подходов к этому.

Некоторые примечания:

  • Вы должны использовать 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