您如何 运行 一个 VBA 循环来格式化每个工作表,并创建一个摘要选项卡

How do you run a VBA loop to format each worksheet, and create a summary tab

我有一个 spreadsheet 有 20 多个工作sheets 列表服务器。我正在尝试格式化每个 sheet 以仅提取前四列数据,同时保留原始数据。我在左侧插入 6 列,创建列标题,复制前四行数据(起始名称为 "SERV-"),然后将作品名称sheet 放入第 5 列。如果 运行 在一个 sheet 中,我得到的代码可以正常工作。我想把它放在一个循环中,但它不起作用。它仅在第一个作品 sheet 中插入列和 headers。

让这个循环工作后,我想创建一个摘要选项卡,它将每个 sheet 的前五行中的数据提取到摘要选项卡中。这应该很容易,但我还没有在代码中做到这一点。

这是我目前的代码:

'PhaseOne of test code

Sub PhaseOne()
Dim ws As Worksheet
 Dim lngRow As Long
 Dim lngCount As Long
 lngRow = 8

 For Each ws In Worksheets


    '(2) Remove blank rows (WORKS)
        Dim x As Long
        With ws
            For x = .Cells.SpecialCells(xlCellTypeLastCell).Row To 1 Step -1
                If WorksheetFunction.CountA(.Rows(x)) = 0 Then
                ws.Rows(x).Delete
                End If
            Next
        End With

    '(3) Insert 5 columns (WORKS)
        Columns("A:F").Insert Shift:=xlToRight

    '(4) Label columns (WORKS)
        Range("$A").Value = "ServLabel"
        Range("$B").Value = "Primary IP"
        Range("$C").Value = "DC"
        Range("$D").Value = "Service ID"
        Range("$E").Value = "Sheet"

    '(5) Find and Copy Range (WORKS)
        Dim lastRow As Long
        With ws
            lastRow = .Cells(.Rows.Count, "J").End(xlUp).Row
        End With
        Dim rFound As Range
        On Error Resume Next
        Set rFound = Cells.Find(What:="SERV-", _
                    After:=Cells(Rows.Count, Columns.Count), _
                    LookAt:=xlPart, _
                    LookIn:=xlFormulas, _
                    SearchOrder:=xlByRows, _
                    SearchDirection:=xlNext, _
                    MatchCase:=False)
        On Error GoTo 0
        If rFound Is Nothing Then
        Else
            rFound.Select
            Selection.Resize(lastRow, numcolumns + 4).Select
            Selection.Copy
            Range("A2").Select
            ws.Paste
        End If

    '(8) Enter active sheet name in Column E (WORKS)
        If ws.Range("A2") = "" Then
        Else
            Dim lastRow2 As Long
            With ws
                lastRow2 = .Cells(.Rows.Count, "d").End(xlUp).Row
            End With
            Range("E2").Select
            Selection.Resize(lastRow2 - 1).Select
            Selection = ws.Name
        End If

    Next ws
End Sub

除非您有其他原因,否则扫描表格并将数据复制到摘要中可能更容易。

Option Explicit
Sub summary()

    Const SUM_SHEET = "Summary" ' name of smmary sheet
    Const PREFIX = "SERV-*"

    Dim wb As Workbook, ws As Worksheet, wsSum As Worksheet
    Dim iRow As Long, iSumRow As Long
    Dim iStartrow As Long, iLastRow As Long, rng As Range, cell As Range

    Set wb = ActiveWorkbook
    Set wsSum = wb.Sheets(SUM_SHEET)

    wsSum.Range("A1:E1") = Array("ServLabel", "Primary IP", "DC", "Service ID", "Sheet")
    iSumRow = 1

    For Each ws In wb.Sheets
        If ws.Name <> SUM_SHEET Then

            ' find column SERV-
            On Error Resume Next
            Set rng = ws.Cells.Find(PREFIX)
            On Error GoTo 0

            ' set scan start/end row
            If rng Is Nothing Then
                MsgBox "Can't find " & PREFIX & " on " & ws.Name, vbCritical
                GoTo SkipSheet
            Else
               iLastRow = ws.Cells(Rows.Count, rng.Column).End(xlUp).Row
               iStartrow = rng.Row + 1
            End If
            Debug.Print ws.Name, "Col=", rng.Column, "iStartRow=", iStartrow, "iLastRow=", iLastRow

            ' scan the sheet and write to summary
            For iRow = iStartrow To iLastRow
                Set cell = ws.Cells(iRow, rng.Column)

                ' skip blank line
                If Len(cell) > 0 Then
                    iSumRow = iSumRow + 1
                    cell.Resize(1, 4).Copy wsSum.Cells(iSumRow, 1)
                    wsSum.Cells(iSumRow, 5) = ws.Name
                End If                  
            Next
        End If
 SkipSheet:
    Next
    MsgBox iSumRow - 1 & " rows copied to " & wsSum.Name, vbInformation

End Sub