如何将具有数据的单元格与同一列中的空白单元格合并?

时间:2016-02-17 20:14:30

标签: excel vba

我正在为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

请原谅我的代码有任何不妥之处,我对此非常陌生。我不知道我错过了什么,但任何帮助将不胜感激! 感谢

2 个答案:

答案 0 :(得分:0)

看一下你的初始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

在英语中,这表示“如果当前行不是空白,而下一行是空白,而第3行不是空白,那么......”

但是你可以看到A55和A55的细胞。 A54是空白的,在A54之后写着“Anti-Virus”。所以,你没有通过自己设定的测试,它忽略了这一部分。如果您希望它适用于此部分,则需要对其进行编码以实际计算连续非空单元格后连续的空白单元格数。这将告诉你合并多少。

答案 1 :(得分:0)

我终于明白了! 两个“if”语句都适用于某些部分,当它们应该是独占的时,所以我将第二个“if”语句更改为“else”。我还发现,当我设置“i = u”时,我忘了考虑“下一个”会比我需要的时间增加“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
相关问题