Раскрыть ряды
Код настроен для копирования результата на другой лист. Попробуйте сначала так, и, если вы удовлетворены результатом, измените Имя целевой таблицы (cTarget
) на то же имя, что и Имя рабочей таблицы источника (cSource
) , Вы должны будете написать остальные заголовки вручную.
Option Explicit
Sub ExpandRows()
Const cSource As String = "Sheet1" ' Source Worksheet Name
Const cCols1 As String = "A:I" ' Source 1st Column Range Address
Const cCols2 As String = "A:J" ' Source 2nd Column Range Address
Const cCrit As String = "ER" ' Source Criteria
Const cFR As Long = 2 ' Source First Row Number
Const cTarget As String = "Sheet2" ' Target Worksheet Name
Const cTgtCell As String = "A2" ' Target First Cell Address
Dim vntS As Variant ' Source Array
Dim vntT As Variant ' Target Array
Dim Nor As Long ' Source Number of Rows
Dim Lr As Long ' Source Last Row Number
Dim Cols1 As Long ' Source 1st Number of Columns
Dim Cols2 As Long ' Source 2nd Number of Columns
Dim Cols As Long ' Target Number of Columns
Dim i As Long ' Source Array Row Counter
Dim j As Long ' Source/Target Array Column Counter
Dim k As Long ' Target Number of Rows,
' Target Array Row Counter
' In Source Worksheet (2nd Column Range)
With ThisWorkbook.Worksheets(cSource).Columns(cCols2)
' Calculate Source Last Row Number.
Lr = .Resize(.Rows.Count, 1) _
.Find("*", , xlFormulas, , , xlPrevious).Row
' Copy Source Range to Source Array
vntS = .Rows(cFR).Resize(Lr - cFR + 1)
' Calculate Source 1st Number of Columns.
Cols1 = .Columns(cCols1).Columns.Count
' Calculate Source 2nd Number of Columns.
Cols2 = .Columns(cCols2).Columns.Count
End With
' Calculate Target Number of Columns.
Cols = Cols1 + Cols2
' Calculate Source Number of Rows.
Nor = UBound(vntS)
' Loop through rows of Source Array.
For i = 1 To Nor
' Check value in current row and first column for Criteria.
If Left(vntS(i, 1), 2) = cCrit Then
' Count Target Number of Columns.
k = k + 1
End If
Next
' Resize Target Array.
ReDim vntT(1 To k, 1 To Cols)
' Reset Target Row Counter.
k = 0
' Loop through rows of Source Array.
For i = 1 To Nor
' Check value in current row and first column for Criteria.
If Left(vntS(i, 1), 2) = cCrit Then
' Count Target Number of Columns.
k = k + 1
' Loop through Source 1st Number of Columns.
For j = 1 To Cols1
' Write from Source to Target Array.
vntT(k, j) = vntS(i, j)
Next
i = i + 1
' Loop through Source 2nd Number of Columns.
For j = 1 To Cols2
' Write from Source to Target Array.
vntT(k, j + Cols1) = vntS(i, j)
Next
End If
Next
' In Target Worksheet (First Cell Address)
With ThisWorkbook.Worksheets(cTarget).Range(cTgtCell)
' Clear Contents of range from Target First Cell Range to bottom row
' and Target Number of Columns wide.
.Resize(.Worksheet.Rows.Count - .Row + 1, Cols).ClearContents
' Calculate Target Range.
' Copy Target Array to Target Range.
.Resize(UBound(vntT), Cols) = vntT
End With
End Sub