报表拆分-Excel VBA不会复制所有行并不精确地运行

报表拆分-Excel VBA不会复制所有行并不精确地运行,vba,excel,Vba,Excel,我编写了以下Excel VBA宏,它的工作是基于CountryCode拆分报表。它创建一个新工作簿,将相关行复制到新工作簿,并按国家代码保存工作簿 我遇到的问题是缺少行,对于一个工作表,它继续在空行上运行基本上,它不会停止并复制空行 单元格格式与此有关吗 另一个宏只运行一次,它首先创建工作簿。在第一个工作表上只运行一次,不再运行 Sub RUN2_ReportSplitterOptimized() Application.DisplayAlerts = False Application.En

我编写了以下Excel VBA宏,它的工作是基于CountryCode拆分报表。它创建一个新工作簿,将相关行复制到新工作簿,并按国家代码保存工作簿

我遇到的问题是缺少行,对于一个工作表,它继续在空行上运行基本上,它不会停止并复制空行

单元格格式与此有关吗

另一个宏只运行一次,它首先创建工作簿。在第一个工作表上只运行一次,不再运行

Sub RUN2_ReportSplitterOptimized()

Application.DisplayAlerts = False
Application.EnableEvents = False
' Current Workbook
    Dim cW As Workbook
    Dim cWL As String
    Dim cWN As String

    Set cW = ThisWorkbook
    cWL = cW.Path
    cWN = cW.Name

' Current Worksheet
    Dim cS As Worksheet
    Set cS = ActiveSheet

    Do Until IsEmpty(ActiveCell)

' Current Active Cell
        Dim aC As Range
        Set aC = ActiveCell

' Split input string
        Dim CC As String
        CC = splitCC(aC.Text)

        Dim wb As Workbook
        Dim ws As Worksheet

        On Error Resume Next
        Set wb = Workbooks(CC & ".xlsx")
        If Err.Number <> 0 Then
            Set wb = Workbooks.Open(cWL & "\" & CC & ".xlsx")
            ' Create the worksheet
            Set ws = wb.Sheets.Add
            ' Copy the row to the worksheet
            ws.Rows(1).Value = cS.Rows(1).Value
            ws.Rows(2).Value = aC.EntireRow.Value

            With ws
                .Name = cS.Name
            End With
        Else
            wb.Activate
            On Error Resume Next
            Set ws = wb.Sheets(cS.Name)
            If Err.Number <> 0 Then
                Set ws = wb.Sheets.Add
                ' Copy the row to the worksheet
                ws.Rows(1).Value = cS.Rows(1).Value
                ws.Rows(2).Value = aC.EntireRow.Value
                With ws
                    .Name = cS.Name
                End With
            Else
            LastRow = ws.Cells(ws.Rows.Count, "A").End(xlUp).Row
            ws.Rows(LastRow + 1).Value = aC.EntireRow.Value
            End If
        End If
    wb.Save
    cW.Activate
    aC.Offset(1, 0).Select
    Loop
Dim wbk As Workbook
For Each wbk In Workbooks
    If Len(wbk.Name) = 7 Then
        wbk.Close
    End If
Next
End Sub

Function splitCC(countrycode As String) As String
If Len(countrycode) < 3 Then
    splitCC = countrycode
Else
    splitCC = Mid(countrycode, InStr(countrycode, "(") + 1, 2)
End If
End Function
解决了

我使用了@sous2817推荐的过滤器 它不是运行几个小时,而是在2分钟内完成整个工作:D

谢谢你的帮助


问题已经在这里解决了:

您不能只按国家名称或代码过滤并复制可见的行,而不是循环遍历每一行吗?只需建立一个独特的县名列表,并循环使用即可。这样做,你就不必担心空行,而且速度会快得多。下一步拿出你的错误简历,看看它是否会消除错误。我的猜测是,它正在这样做,并跳过循环结束语句。狡猾的。您的代码看起来不错,但是为什么不使用范围变量替换使用ActiveCell在循环之前设置为ActiveCell,然后使用偏移量调整范围变量,就像您现在稍后所做的那样。通过这种方式,您可以更确定活动单元格不会意外更改。。