excel - 在 VBA 中合并多行
问题描述
我正在尝试创建一个简单的子例程,如果 A 列中的单元格包含相同的数字数据,它将合并多行。
Option Explicit
Sub MergeRows()
Application.DisplayAlerts = False
Application.ScreenUpdating = False
Dim lastRow As Long
Dim i As Long
lastRow = ThisWorkbook.Worksheets(1).Cells(Rows.Count, "A").End(xlUp).Row
For i = 1 To lastRow
If ThisWorkbook.Worksheets(1).Cells(i, 1).Value = _
ThisWorkbook.Worksheets(1).Cells(i + 1, 1).Value Then
ThisWorkbook.Worksheets(1).Range(ThisWorkbook.Worksheets(1) _
.Cells(i, 1), ThisWorkbook.Worksheets(1).Cells(i + 1, 1)).Merge
Else
End If
Next i
Application.DisplayAlerts = True
Application.ScreenUpdating = True
End Sub
上面的代码一次只合并 2 行,所以如果有 3 行具有相同的值,它将合并两行,然后将剩余的一行留给它自己。
解决方案
我添加了一个 While 循环,它继续检查相邻单元格的相同值,直到找到不同的值。我还在您的第一个 If 语句中添加了一个检查,以确保它所比较的值不是空白值。
为了使事情更容易阅读,我还将工作表引用移到了 With 块中,因此不会在整个代码中不必要地重复它。
Option Explicit
Sub MergeRows()
Application.DisplayAlerts = False
Application.ScreenUpdating = False
Dim lastRow As Long
Dim i As Long, r As Long
With ThisWorkbook.Worksheets(1)
lastRow = .Cells(.Rows.Count, "A").End(xlUp).Row
For i = 1 To lastRow
If .Cells(i, 1).Value <> "" _
And .Cells(i, 1).Value = .Cells(i + 1, 1).Value _
Then
r = 1
While .Cells(i + r, 1) = .Cells(i, 1).Value
r = r + 1
Wend
.Cells(i, 1).Resize(r).Merge
Else
End If
Next i
End With
Application.DisplayAlerts = True
Application.ScreenUpdating = True
End Sub
旁注:您可以通过i = i + r
在 之后直接添加一行.Merge
来将循环推进到下一个非合并单元格,从而节省迭代次数。
推荐阅读
- reactjs - 主对象可能未定义时的双重解构
- python - 错误:ModuleNotFoundError:没有名为“tensorflow.contrib”的模块
- flask - WTForms - 将参数传递给表单,然后在变量存在时创建字段
- reactjs - 将活动类添加到反应中的li项目
- reactjs - npm run 不打开网页,只是在元素名称错误的情况下挂起,如何处理此类问题?
- raku - 使用 rakubrew 在其他 rakudo 版本中安装模块
- discord.js - 如何检查公会中是否有人担任角色?不和谐.js
- android - 在按钮上单击打开安装在您设备上的 android studio 中的应用程序
- sql - 我可以在 SQL Server 中运行包含临时表的同一存储过程的多个实例吗
- python - 如何让你的玩家通过pygame的第一关