【问题标题】:Select variable blank cell range in column in VBA在VBA的列中选择可变的空白单元格范围
【发布时间】:2018-07-18 18:51:57
【问题描述】:

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

示例: 当它遇到这两个空白(6 和 7)时,我想连接这些行(6 和 7)的右侧两列内容,并粘贴到上面的单元格和修订/cmets/ 右侧的一列空白(然后我删除修订/cmets 的行,所以在这里,6 和 7 被删除)。这部分我已经弄清楚了,从图片12

这些空白单元格自始至终随机出现,长度可变,有时没有修订/cmets,有时是两行、五行等...

因此,与其有很多 if 语句来说明有多少行是修订/cmets,我正在寻找可以选择任何可变长度的空白单元格并将该信息全部传输到一个单元格的代码(直接在右边的那个)的原始信息行)。

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

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

提前致谢!

【问题讨论】:

    标签: vba excel


    【解决方案1】:

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

    这使用 SpecialCells 循环遍历空白区域并在删除区域(空单元格的连续块)之前连接相应的单元格。

    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
    

    之前

    之后

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-10-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-12-14
      • 1970-01-01
      • 2012-08-17
      • 1970-01-01
      相关资源
      最近更新 更多