合并具有先前值的空单元格

时间:2015-10-24 05:22:14

标签: excel excel-vba vba

我有一个包含大约100,000条记录的Excel文件。我有6+列,前五个是:

Current Data

必填格式:

enter image description here

到目前为止,我有:

Sub Main()

Dim i As Long
Dim j As Long

Dim sameRows As Boolean
sameRows = True

For i = 1 To Range("A" & Rows.Count).End(xlUp).Row
    For j = 1 To 4
        If StrComp(Cells(i, j), Cells(i + 1, j), vbTextCompare) Then
            sameRows = False
        End If
    Next j

    If sameRows Then
        Range(Cells(i, 4), Cells(i + 1, 4)).merge
    End If

    sameRows = True
Next i

End Sub

我可以通过将Range中的值从4更改为1/2/3/4并运​​行宏四次来运行宏来实现以下目标。

enter image description here

请帮助我获取所需格式的数据。我仍然需要将空字段与前一个非空字段合并。

3 个答案:

答案 0 :(得分:1)

Pratik,仔细听Jeeped。在Excel中使用大数据并不理想,在合并单元格中处理原始数据会盯着深渊 - 这是一个黑暗,黑暗的地方,DoCmd.OpenReport "JobReport", acViewPreview, WhereCondition:=strWhere 引用Range函数会向您显示你永远不知道的绝望的一个维度。

如果您使用其他格式(例如XML)将此数据导入Excel,则使用VBA以原始格式读取数据,查询数据等。如果它存在于数据库中,则再次使用VBA访问该数据库并根据需要操作记录集。如果这是您唯一的数据源,那么为什么不将它写入XML文档或VBA自己的数据存储选项(如Offset或数组)。

如果必须使用Excel,请不要将原始数据与数据显示混淆。是的,合并的单元格对于人眼来说可能更容易阅读,但我只是提出一个问题:这是您进行合并的主要目标吗?

如果你必须跨越深渊 - 你可以看到我们中至少有两个人会建议反对 - 那么至少通过从数组读取并一次合并行来加快速度:

Collection

答案 1 :(得分:0)

如何用上面的值填充空单元格,所以最右边的值与合并单元格中的值相关联。例如,如果19在单元格A2中,则可以使用= IF(A2<>“,A2,G1)重新创建从G2开始的表格,这样所有空单元格将填充上面的值,将最右边的值与完全相同的值。

答案 2 :(得分:0)

本周我自己解决了同样的问题。 Ambie的解决方案似乎过于复杂,所以我写了一些非常简单的合并行:

Sub MergeRows()

    Sheets("Sheet1").Select

    Dim lngStart As Long
    Dim lngEnd As Long
    Dim myRow As Long

    'Disable popup alerts that appear when merging rows like this
    Application.DisplayAlerts = False

    lngStart = 2
    lngEnd = 2

    For myRow = 2 To Range("A" & Rows.Count).End(xlUp).Row 'last row
        If Range("A" & (myRow + 1)).value = "" Then
            'include row below in next merge
            lngEnd = myRow + 1
        Else
            'merge if 2+ rows are included
            If lngEnd - lngStart > 0 Then
                Range("A" & lngStart & ":A" & lngEnd).Merge
                Range("B" & lngStart & ":B" & lngEnd).Merge
                Range("C" & lngStart & ":C" & lngEnd).Merge
                Range("D" & lngStart & ":D" & lngEnd).Merge
            End If

            'reset included rows
            lngStart = myRow + 1
            lngEnd = myRow + 1
        End If
    Next myRow

    Application.DisplayAlerts = True

End Sub