您说得对,将"新序号"列插入到最左侧确实更容易实现。以下是修改后的VBA代码:
Sub MergeHouseholdHeads()
Application.DisplayAlerts = False ' 关闭Excel警告提示
Application.ScreenUpdating = False ' 关闭屏幕更新以提高性能
Dim ws As Worksheet
Set ws = ActiveSheet
Dim lastRow As Long
lastRow = ws.Cells(ws.Rows.Count, "B").End(xlUp).Row
' 在A列插入新列(原A列及之后的所有列右移)
ws.Columns("A:A").Insert Shift:=xlToRight
ws.Cells(1, 1).Value = "新序" ' 设置新列标题
' 记录户主顺序和数量
Dim householdCount As Long
householdCount = 0
Dim householdOrder As Object
Set householdOrder = CreateObject("Scripting.Dictionary")
' 第一遍遍历:确定户主顺序并填充新序列
Dim i As Long
For i = 2 To lastRow
' 注意:现在B列变成了C列(因为插入了新列A)
Dim currentHead As String
currentHead = ws.Cells(i, 3).Value ' C列是原来的B列(户主列)
If Not householdOrder.Exists(currentHead) Then
householdCount = householdCount + 1
householdOrder.Add currentHead, householdCount
End If
' 设置新序值(插入到A列)
ws.Cells(i, 1).Value = householdOrder(currentHead)
Next i
' 第二遍遍历:合并户主列单元格(现在是C列)
Dim startMergeRow As Long
startMergeRow = 2
Dim currentOwner As String
currentOwner = ws.Cells(startMergeRow, 3).Value ' C列是户主列
For i = 3 To lastRow + 1
' 检查是否到达最后一行或户主发生变化
If i > lastRow Or ws.Cells(i, 3).Value <> currentOwner Then
' 合并单元格(C列,保留户主姓名)
If i - 1 > startMergeRow Then
With ws.Range(ws.Cells(startMergeRow, 3), ws.Cells(i - 1, 3))
.Merge
.HorizontalAlignment = xlCenter
.VerticalAlignment = xlCenter
End With
Else
' 单行也设置居中
ws.Cells(startMergeRow, 3).HorizontalAlignment = xlCenter
ws.Cells(startMergeRow, 3).VerticalAlignment = xlCenter
End If
If i <= lastRow Then
currentOwner = ws.Cells(i, 3).Value
startMergeRow = i
End If
End If
Next i
' 恢复设置
Application.DisplayAlerts = True
Application.ScreenUpdating = True
' 显示户主数量
MsgBox "共有 " & householdCount & " 位户主。"
End Sub
代码改进说明:
1. 现在会在最左侧(A列)插入"新序"列,原表格所有列向右移动一列
2. 原来的B列(户主列)现在变成了C列
3. 合并操作针对的是C列(原来的B列)
4. 新序号添加在A列,不会影响原有的户主姓名
运行后效果:
- A列:新增的"新序"列,显示每户的顺序编号
- B列:原来的A列数据
- C列:原来的B列(户主列),相同户主的单元格已合并并居中
- 其他列:依次向右移动一列
- 最后弹出消息框显示户主总数
这样实现确实更加清晰,不容易出错。
以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。