基于2个空行将Excel工作簿拆分为电子表格

bq3bfh9z  于 2023-02-25  发布在  其他
关注(0)|答案(1)|浏览(137)

我经常从SAP导入大量的报告,包括大量的客户信息。通常超过15- 20 k行。生成的报告包括3个小报告由2个空行分开。我正在寻找一些解决方案,自动拆分成3个小的巨大的报告到3个独立的电子表格的基础上,无论是行值(每个报告都以PersNr头开始,以**Summ结束)或者空的行计数值等于2,但是我找不到它。也许一些VBA解决方案,任何类型的帮助都会有帮助。
下面是第一列的外观示例:

PersNr

3000113
3000113
3000113
* 3000113
3005040
3005040
3005040
* 3005040

** Summ

PersNr

4002119
4002119
4002119
* 4002119
4008029
4008029
4008029
* 4008029

** Summ

PersNr

798412123
798412123
798412123
* 798412123
687428901
687428901
687428901
* 687428901

** Summ

请注意,在这种情况下,正常的1空行分裂不工作,因为我有一些单一的空行,我需要分裂时,有2个空行。
在谷歌上搜索了1个多小时,没有完美的解决方案,大多数解决方案都是基于列,而不是基于行或适合1空行,我不能适应,如果为我的目的。

7z5jn7bk

7z5jn7bk1#

看看下面的代码。它有两个嵌套循环,外层循环遍历所有数据,内层循环搜索两个连续的空行。当找到这些空行时,创建一个新工作表,复制从startRow到找到的行的数据,并将startRow设置为下一个块的开始。重复此操作,直到所有数据都处理完毕。
代码将相关数据读入内存以加快处理速度,但逻辑保持不变。我还添加了一个小函数来检查整个行是否为空。

Option Explicit

Sub SplitReport(Optional ws As Worksheet = Nothing)
    Const ColCount = 5          ' Define number of rows to check/copy
    
    If ws Is Nothing Then Set ws = ActiveSheet
    Dim wb As Workbook
    Set wb = ws.Parent
    
    Dim row As Long, startRow As Long, lastRow As Long
    lastRow = ws.Cells(ws.Rows.Count, 1).End(xlUp).row
    
    ' Read into memory to speed up data (+2 to ensure that we have 2 empty lines at the end.
    Dim data
    data = ws.Cells(1, 1).Resize(lastRow + 2, ColCount).Value
    
    startRow = 1
    Do While startRow < lastRow
        row = startRow
        ' Search for 2 empty rows
        Do While Not isEmptyRow(data, row) Or Not isEmptyRow(data, row + 1)
            DoEvents
            row = row + 1
        Loop
        
        ' Copy data to new sheet
        wb.Worksheets.Add after:=wb.Sheets(wb.Sheets.Count)
        ws.Range(ws.Cells(startRow, 1), ws.Cells(row, ColCount)).Copy wb.ActiveSheet.Cells(1, 1)
        
        ' Start next Block of data
        startRow = row + 2
    Loop
End Sub

Private Function isEmptyRow(data, row As Long) As Boolean
    Dim col As Long
    For col = 1 To UBound(data, 2)
        If Not IsEmpty(data(row, col)) Then Exit Function
    Next
    isEmptyRow = True
End Function

相关问题