У меня есть вкладки ввода и вывода.
На вкладке «Вход» у меня есть заголовки в столбце B и подзаголовки в столбце C, как показано ниже:
A B C D
HDR1
SB1.1 Data1
SB2.1 Data2
HDR2
SB2.1 Data3
SB2.2 Data4
SB2.3 Data5
И на вкладке «Вывод» у меня есть полный список, как показано ниже:
A B C D
HDR1 SB1.1
HDR1 SB2.1
HDR2 SB2.1
HDR2 SB2.2
HDR2 SB2.3
Мне нужно найти заголовок и все его подзаголовки соответственно.
Например: поиск входного HDR1 в выходном столбце B, но также поиск входного SB1.1 в том же самомстолбец номера строки C. Если найдено, скопируйте столбец Входные данные в Выходные данные. Если нет, ищите второй подзаголовок (который является SB2.1) в столбце C в этом примере.
Дело в том, что я не знаю, сколько подзаголовков имеет какой-либо заголовок. Это может быть 1 или 5. Это все в порядке, я создал свои циклы для этого. Мой вопрос: как я могу добавить несколько условий поиска в этом цикле.
Sub Macro1()
'Call screenupdatingfalse
Dim wsO As Worksheet, wsI As Worksheet
Set wsI = Sheet2 'wsI is Input Sheet
Set wsO = Sheet1 'wsO is Output sheet
Dim RowLastB As Long, rowlastC As Long, FirstBcellRow As Long, FirstBcellText As String, OutputNewRowQty As Long, i As Long, x As Long, beginBcol As Long
'Ниже я нахожу последние строки таблицы ввода для определения конца моих петель.
RowLastB = wsI.Cells(Rows.Count, "B").End(xlUp).Row
rowlastC = wsI.Cells(Rows.Count, "C").End(xlUp).Row
' Ниже яначиная мои циклы с первого заголовка в столбце B. Затем находим следующий заголовок, затем ищем, сколько подзаголовков имеет каждый заголовок.
beginBcol = 1
For i = beginBcol To RowLastB
wsI.Activate
FirstBcellRow = wsI.Range("B" & i).End(xlDown).Row
FirstBcellText = wsI.Range("B" & i).End(xlDown).Text
'FirstCcellRow = wsI.Range("C" & i).End(xlDown).Row
StartCopyRow = FirstBcellRow
i = FirstBcellRow
If i = RowLastB Then
OutputNewRowQty = (rowlastC - RowLastB)
Exit For
Else
SecondBcellRow = wsI.Range("B" & i).End(xlDown).Row
OutputNewRowQty = (SecondBcellRow - FirstBcellRow) - 1
'that amount of row to be added to Output
wsO.Activate
wsO.AutoFilter.ShowAllData
On Error GoTo below
Мой вопрос состоит в следующем: какМогу ли я создать правильный цикл поиска. Эта часть съедает мой мозг, и я нигде не мог найти правильный ответ в Интернете, даже в ТАК !!
Set Brange = wsO.Range("F").Find(FirstBcellText, , xlValues, xlWhole)
Set cRange = wsO.Range("G").Find(wsI.Range(", , xlValues, xlWhole)
OutputRowNo = ActiveCell.Row
x = 1
Do Until x = OutputNewRowQty + 1
ActiveCell.Offset(1).EntireRow.Insert Shift:=xlDown, CopyOrigin:=xlFormatFromRightOrAbove
ActiveCell.EntireRow.Copy
ActiveCell.Offset(1).EntireRow.PasteSpecial xlPasteFormats
x = x + 1
Application.CutCopyMode = False
Loop
copyloop = 1
Do Until copyloop = OutputNewRowQty + 1
InputCopyCell = (StartCopyRow + 1)
wsI.Range("A" & InputCopyCell).Copy
wsO.Range("I" & (OutputRowNo + 1)).PasteSpecial Paste:=xlPasteValues
wsI.Range("C" & InputCopyCell).Copy
wsO.Range("J" & (OutputRowNo + 1)).PasteSpecial Paste:=xlPasteValues
wsI.Range("L" & InputCopyCell).Copy
wsO.Range("K" & (OutputRowNo + 1)).PasteSpecial Paste:=xlPasteValues
wsO.Range("K" & (OutputRowNo + 1)).NumberFormat = "$#,##0.00"
copyloop = copyloop + 1
StartCopyRow = StartCopyRow + 1
OutputRowNo = OutputRowNo + 1
Application.CutCopyMode = False
Loop
beginBcol = FirstBcellRow
End If
below:
Next
'Call screenupdatingon
End Sub