在Excel中想实现一个功能,将 G 列中每个合并单元格对应的 L 列数据进行求和,并将结果放在 M 列中。公式肯定是搞不定了,想着VBA应该可以。经过与 Kimi 数十个回合的交流,居然真的写成了!我没学过 VBA,但是根据一些通用编程知识,我又让 Kimi 把代码做得更通用一些,放在这里备用。
Sub CalculateSumsInMergedCells()
Dim ws As Worksheet
Dim columnLetter As String
Dim resultColumnLetter As String
Dim dataColumnLetter As String
Dim cell As Range
Dim sum As Double
Dim cellValue As Variant
Set ws = ActiveSheet
columnLetter = "G" ' 定义要处理的列,可以更改为 "A", "B", "C" 等
resultColumnLetter = "M" ' 定义结果要输出的列,可以更改为其他列
dataColumnLetter = "L" ' 定义包含数据的列,可以更改为其他列
' 清除结果列已有的数据并拆分合并的单元格
'ws.Range(resultColumnLetter & ":" & resultColumnLetter).ClearContents
ws.Range(resultColumnLetter & ":" & resultColumnLetter).UnMerge
' 遍历指定列中的所有单元格
For Each cell In ws.Range(columnLetter & "1:" & columnLetter & ws.Cells(ws.Rows.Count, columnLetter).End(xlUp).Row)
' 初始化求和变量
sum = 0
' 检查单元格是否是合并单元格的一部分
If cell.MergeCells Then
If cell.Address = cell.MergeArea.Cells(1, 1).Address Then
' 计算合并区域中数据列的数据总和
Dim mergedCell As Range
For Each mergedCell In cell.MergeArea
cellValue = ws.Cells(mergedCell.Row, Columns(dataColumnLetter).Column).Value
If IsNumeric(cellValue) Then
sum = sum + Val(cellValue)
End If
Next mergedCell
' 将计算结果放在结果列的相应位置
ws.Cells(cell.Row, Columns(resultColumnLetter).Column).Value = sum
' 合并结果列的单元格
ws.Range(ws.Cells(cell.Row, Columns(resultColumnLetter).Column), ws.Cells(cell.MergeArea.Rows(cell.MergeArea.Rows.Count).Row, Columns(resultColumnLetter).Column)).Merge
End If
Else
' 对于未合并的单元格,直接计算和赋值
cellValue = ws.Cells(cell.Row, Columns(dataColumnLetter).Column).Value
If IsNumeric(cellValue) Then
sum = Val(cellValue)
ws.Cells(cell.Row, Columns(resultColumnLetter).Column).Value = sum
End If
End If
Next cell
End Sub