在VBA

时间:2018-07-18 18:51:58

标签: excel vba excel-vba

我有一个代码,其中某些列中包含空白单元格。我希望能够选择仅空白单元格的未知长度(偏移2列)。我目前有多个if语句,它们是根据多少个空格过滤的,但是可变数目的空格可能会使它变得太复杂了。

示例: 当它遇到这两个空白(6和7)时,我想将这些行(6和7)的内容(在右边的两列)连接起来,然后粘贴在修订/注释/上面的单元格和右边的一列中空格(然后删除修订/注释行,因此在这里删除6和7)。我已经找出了这部分,如图12所示。

这些空白单元格始终随机出现并且长度可变,有时没有修订/注释,有时两行,五行,等等...

因此,我寻找的代码不是可以选择多少可变长度的空白单元格,而是将所有信息都转移到一个单元格(直接在右边的那个单元格)中,而不是拥有用于修订/注释多少行的许多if语句。原始信息行)。

到目前为止,这是我的代码中执行此操作的部分:

Sub BlankCell()

'Delete all header rows (except top row)
Dim i, LastRow As Integer
i = 2
LastRow = Cells.SpecialCells(xlCellTypeLastCell).Row
Do While i <= LastRow
    If Cells(i, 2).Value = "Line" Then
        Rows(i).EntireRow.Delete
    End If
    i = i + 1
Loop

'Select first cell
Range("C2").Select

'Loop through column C to find empty cells
'Copy and paste column E contents (concatenated) to column F and delete row(s) of clarifications
Do While Not IsEmpty("C")

    'If there are three rows of comments
    If IsEmpty(ActiveCell.Offset(1, 0)) And IsEmpty(ActiveCell.Offset(2, 0)) Then
        Range(ActiveCell.Offset(0, 2), Range(ActiveCell.Offset(1, 2), ActiveCell.Offset(2, 2))).Select
        ActiveCell.Offset(-1, 1) = ActiveCell.Offset(0, 0).Value & Chr(10) & ActiveCell.Offset(1, 0).Value & Chr(10) & ActiveCell.Offset(2, 0).Value
        Selection.EntireRow.Delete
    'If there are two rows of comments
    ElseIf IsEmpty(ActiveCell.Offset(1, 0)) Then
        Range(ActiveCell.Offset(0, 2), ActiveCell.Offset(1, 2)).Select
        ActiveCell.Offset(-1, 1) = ActiveCell.Offset(0, 0).Value & Chr(10) & ActiveCell.Offset(1, 0).Value
        Selection.EntireRow.Delete
    'If there is one row of comments
    Else
        ActiveCell.Offset(0, 2).Select
        ActiveCell.Offset(-1, 1) = ActiveCell.Offset(0, 0).Value
        Selection.EntireRow.Delete
End If

'Find next blank in column C
NextBlank = Range("C1:C" & Rows.Count).Cells.SpecialCells(xlCellTypeBlanks).Row
Range("C" & NextBlank).Select

'Exit loop once to the end of the table
If IsEmpty(ActiveCell.Offset(0, -1)) And IsEmpty(ActiveCell.Offset(1, -1)) Then
    Exit Do
End If

Loop

End Sub

谢谢!

1 个答案:

答案 0 :(得分:0)

尝试一下。图片显示了前后,因此您可以检查它是否正确。您可能需要调整详细信息以进行精确设置。

这将使用SpecialCells循环遍历空白区域并连接相应的单元格,然后再删除Area(一个连续的空单元格块)。

Sub BlankCell()

Dim j As Long, s As String, r As Range

With Columns("C").SpecialCells(xlCellTypeBlanks)
    For j = .Areas.Count To 1 Step -1
        For Each r In .Areas(j)
            s = s & r.Offset(, 1) & vblf
        Next r
        .Areas(j)(1).Offset(-1, 2) = Trim(s)
        s = vbNullString
        .Areas(j).EntireRow.Delete
    Next j
End With

End Sub

之前

enter image description here

之后

enter image description here