如何将具有数据的单元格与同一列中的空白单元格合并?
Posted
技术标签:
【中文标题】如何将具有数据的单元格与同一列中的空白单元格合并?【英文标题】:How do I merge cells that have data with blank cells in the same column? 【发布时间】:2016-02-17 20:14:29 【问题描述】:我正在为 Excel 编写一个宏,它将合并“A”列中的单元格,其中包含标题和其下方的空白单元格。
这是我正在处理的一个示例:Actual Before
这是想要的结果:Actual After
到目前为止,我已经设法让我的代码正常工作,但我注意到它总是会跳过“防病毒”部分。
这是我目前得到的:
'loop to merge titles with blank cells and add borders
LR = Sheets(DataSheet).Cells(Rows.Count, "B").End(xlUp).Row
For i = 1 To LR
If Sheets(DataSheet).Cells(i, 1).Value <> "" And Sheets(DataSheet).Cells(i + 1, 1).Value = "" And Sheets(DataSheet).Cells(i + 1, 2).Value <> "" Then
u = i + 1
Do While Sheets(DataSheet).Cells(u, 1).Value = "" And Sheets(DataSheet).Cells(u, 2) <> ""
u = u + 1
Loop
Sheets(DataSheet).Range("A" & i & ":A" & (u - 1)).Select
With Selection
.Merge
.BorderAround Weight:=xlMedium
.WrapText = True
'.VerticalAlignment = x1VAlignTop
'.HorizontalAlignment = xlLeft
End With
Sheets(DataSheet).Range("B" & i & ":B" & (u - 1)).BorderAround Weight:=xlMedium
i = u + 1
End If
If Sheets(DataSheet).Cells(i, 1).Value <> "" Then
Sheets(DataSheet).Cells(i, 1).BorderAround Weight:=xlMedium
Sheets(DataSheet).Cells(i, 1).WrapText = True
Sheets(DataSheet).Cells(i, 2).BorderAround Weight:=xlMedium
Sheets(DataSheet).Cells(i, 2).WrapText = True
End If
Next i
请原谅我的代码有任何草率,我对此很陌生。我不知道我错过了什么,但任何帮助将不胜感激! 谢谢
【问题讨论】:
您需要提供具体示例,说明您的数据在工作时和不工作时的样子。 “有时它会跳过单元格或不起作用”没有帮助,基本上意味着要回答您的问题,有人需要从头开始调试它,包括将代码放在工作表中并尝试编写一些数据来重新创建您的问题。 好的,感谢您的快速反馈。我将尝试从我的实际数据中删除任何个人数据,并提供一个真实的前后示例。 太好了 - 当您回复某人的评论时,您应该始终输入“@”,然后输入他们的用户名。这会 ping 那个人,让他们知道你对他们说了些什么。在你编辑完你的问题后,如果你想让我看一下,请发表评论,包括@Grade,然后按 Tab 让网站输入我的整个用户名。 @Grade'Eh'Bacon - 谢谢!我刚刚用更好的前后图片完成了编辑,以更好地显示问题。 【参考方案1】:看看你最初的 If 语句,如下:
If Sheets(DataSheet).Cells(i, 1).Value <> "" And Sheets(DataSheet).Cells(i + 1, 1).Value = "" And Sheets(DataSheet).Cells(i + 1, 2).Value <> "" Then
在英文中,这表示“如果当前行不为空,下一行为空,第三行不为空,则...”
但是您可以看到 A55 和 A56 两个单元格都是空白的,在 A54 后面是“Anti-Virus”。所以,你没有通过你为自己设置的测试,它忽略了这个部分。如果您希望它适用于本节,则需要对其进行编码以实际计算一行中有多少个空白单元格,跟在一个非空白单元格之后。这会告诉你有多少要合并在一起。
【讨论】:
嗯,我将看一下循环的开头“If”语句。我的目标是检查下面的单元格是否为空,以及 B 列中下一行的单元格是否有数据。这样,一旦到达A列中的最后一个单元格,循环就会自然停止。也许我完全错了?不管怎样,谢谢你的帮助! 我阅读您的工作簿的方式,它已经知道最后一行,基于您如何定义 LR。因此,您可以检查一下您是否低于该点。即:如果 LR 为 70,并且您的循环位于 A69,并且您想查看您是否低于数据循环的底部,则可以停止检查 A69 + 1 多行。【参考方案2】:我终于明白了! 两个“if”语句在它们应该是排他的时候都适用于某些部分,所以我将第二个“if”语句更改为“else”。我还发现,当我设置“i = u”时,我忘记考虑到“下一个 i”会比我需要的多一次增加“i”,所以我将其更改为“i = u - 1”以进行补偿。
代码如下:
'This is the section that I'm having trouble with!
'loop to merge titles with blank cells and add borders
LR = Sheets(DataSheet).Cells(Rows.Count, "B").End(xlUp).Row
For i = 1 To LR
If Sheets(DataSheet).Cells(i, 1).Value <> "" And Sheets(DataSheet).Cells(i + 1, 1).Value = "" And i <> LR Then
u = i + 1
Do While Sheets(DataSheet).Cells(u, 1).Value = "" And Sheets(DataSheet).Cells(u, 2) <> ""
u = u + 1
Loop
Sheets(DataSheet).Range("A" & i & ":A" & (u - 1)).Select
With Selection
.Merge
.BorderAround Weight:=xlMedium
.WrapText = True
'.VerticalAlignment = x1VAlignTop
'.HorizontalAlignment = xlLeft
End With
Sheets(DataSheet).Range("B" & i & ":B" & (u - 1)).BorderAround Weight:=xlMedium
i = u - 1
Else
Sheets(DataSheet).Cells(i, 1).BorderAround Weight:=xlMedium
Sheets(DataSheet).Cells(i, 1).WrapText = True
Sheets(DataSheet).Cells(i, 2).BorderAround Weight:=xlMedium
Sheets(DataSheet).Cells(i, 2).WrapText = True
End If
Next i
【讨论】:
以上是关于如何将具有数据的单元格与同一列中的空白单元格合并?的主要内容,如果未能解决你的问题,请参考以下文章
在Google表格中将具有相同值的多个单元格与一个单元格合并以求平均值
当必须使用同一列中的不同值填充单元格时,如何填写该列中的空白单元格?