我有一个包含大约100,000条记录的Excel文件。我有6+列,前五个是:
必填格式:
到目前为止,我有:
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并运行宏四次来运行宏来实现以下目标。
请帮助我获取所需格式的数据。我仍然需要将空字段与前一个非空字段合并。
答案 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