У меня есть лист (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. В моем примере у меня есть два случая, когда это происходит.
После того, как @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 ???? Хотя я пытался понять, почему он говорит, что переменная не установлена, я запутался.