Копирование ячеек из столбца B: D в Sheet1 в C: E в Sheet2 на основе номера строки - PullRequest
0 голосов
/ 30 апреля 2018

У меня есть лист (Sheet2), где в столбцах B: D вставлены строки с разными номерами строк.

Эти номера строк фактически соответствуют номерам строк на листе (Sheet1), которые являются пустыми, и я хочу динамически вставить ячейки в столбцы C: E.

У меня есть следующий код, который позволяет мне скопировать строку из столбцов B: D на основе текстового значения = "LAW" и вставить в Sheet1, пока я знаю диапазон ячеек в столбце C.

Я полагаю, что то, что я ищу, является эквивалентом того, когда "LAW" найден, сопоставьте строку со строкой в ​​Sheet1 и вставьте в столбец C. Цикл необходим, поскольку есть другие случаи, когда "LAW" найден и эти клетки должны быть вставлены в соответствующий диапазон ячеек.

    Dim WBT As Workbook
    Dim WSD1 As Worksheet
    Dim WSD2 As Worksheet

    Set WBT = Workbooks("Invoices.csv")
    Set WSD1 = WBT.Worksheets("Sheet1")
    Set WSD2 = WBT.Worksheets("Sheet2")


    Set r2 = WSD1.Range("C11")

    With WSD2
        N = .Cells(Rows.Count, "B").End(xlUp).row
        For i = 1 To N
           If .Cells(i, "B").Value = "LAW" Then
                Set r1 = Range(.Cells(i, "B"), .Cells(N, "D"))
                r1.Copy r2
           End If
        Next i
    End With

Мне было довольно сложно найти отказоустойчивое решение, однако, я надеюсь, что кто-то может дать мне несколько советов о том, как я должен поступить об этом.

Пример ниже демонстрирует, что я хочу найти строки в Sheet2 и вставить их в выделенные точки в Sheet1. Если существует способ динамического произнесения If Text в столбце B на Sheet2 = LAW, скопируйте эту строку (из столбцов B в D) в эквивалентную строку в Sheet1. В моем примере у меня есть два случая, когда это происходит.

Sheet2toSheet1example

После того, как @SJR внес поправку в сценарий, я столкнулся с проблемой, когда в Рабочей книге было много листов. Поэтому я изменил код и использовал функцию для проверки существования листа (по умолчанию - Not)

Function SheetExists(shtName As String, Optional wb As Workbook) As Boolean
Dim sht As Worksheet

If wb Is Nothing Then Set wb = ThisWorkbook
On Error Resume Next
Set sht = wb.Sheets(sht)
On Error Resume Next
SheetExists = Not sht Is Nothing
End Function

и продублировал код следующим образом:

Dim r1 As Range
Dim r2 As Range
Dim N As Long
Set r2 = WSD1.Range("C1:C100")

With WSD2
    If Not SheetExists("Sheet1") Then
        N = .Cells(Rows.Count, "B").End(xlUp).row
                For i = 1 To N
                    If .Cells(i, "B").Value = "LAW" Then
                        Set r1 = Range(.Cells(i, "B"), .Cells(i, "D"))
                        r1.Copy WSD1.Cells(i, "C")
                    End If
                Next i
    Else
        On Error Resume Next
    End If
End With

With WSD3
    If Not SheetExists("Sheet2") Then
        N = .Cells(Rows.Count, "B").End(xlUp).row
                For i = 1 To N
                    If .Cells(i, "B").Value = "LAW" Then
                        Set r1 = Range(.Cells(i, "B"), .Cells(i, "D"))
                        r1.Copy WSD1.Cells(i, "C")
                    End If
                Next i
    Else
       On Error Resume Next
    End If
End With

Хотя это нормально работает, когда рабочая книга имеет 2 листа, она падает на второй сценарий, ссылающийся на WSD3 в N = .Cells(Rows.Count, "B").End(xlUp).row с ошибкой во время выполнения «91». Проходя по коду, я нахожу, что переменная для R1 выдает сообщение, если вы наводите курсор на Range ???? Хотя я пытался понять, почему он говорит, что переменная не установлена, я запутался.

1 Ответ

0 голосов
/ 02 мая 2018

Можете ли вы попробовать это? Думаю, у вас был ошибочный N в строке, присваивающей r1.

Sub x()

Dim WBT As Workbook
Dim WSD1 As Worksheet
Dim WSD2 As Worksheet, N As Long

Set WBT = Workbooks("Invoices.csv")
Set WSD1 = WBT.Worksheets("Sheet1")
Set WSD2 = WBT.Worksheets("Sheet2")
Set r2 = WSD1.Range("C11")

With WSD2
    N = .Cells(Rows.Count, "B").End(xlUp).Row
    For i = 1 To N
       If .Cells(i, "B").Value = "LAW" Then
            Set r1 = .Range(.Cells(i, "B"), .Cells(i, "D"))
            r1.Copy WSD1.Cells(i, "C")
       End If
    Next i
End With

End Sub
...