删除基于空白单元格的非连续范围

Deleting Non-Contiguous Range Based on Blank Cells

我希望我的代码采用用户定义的范围并删除所有空白单元格以及空白单元格右侧的单元格。

这是我目前的情况:

Sub CleanupAccountsinYear()

Dim selectedrng As Range

Range(Selection, Selection).Select

Set selectedrng = Application.Selection


For Each Cell In selectedrng

    If Cell.Value = "" Then
    Cell.Activate
    Range(ActiveCell, Cells((ActiveCell.Row), (ActiveCell.Column) + 1)).Select
    'Missing Vital Component
    End If
         
Next Cell
End Sub

问题是每次我删除所选范围并且宏移动到下一个单元格时它都会跳过一个单元格。我的想法是我可能必须将范围存储在联合中并从那里删除它们,但事实证明这有点困难。有没有更简单的方法来解决这个问题?

Is there an easier way to solve this?

如果您处理 MS/Excel 365(参见 FILTER formula)并假设 2 列范围,您可以通过

从新的动态数组功能中获益
  • 步骤 1..2 评估 Excel 公式 FILTER (对比 MS/Excel 365),
  • 步骤 3 通过
  • 重新排列数据范围的数组值
  • 第四步覆盖原始数据

如下:

Sub ExcludeBlanks(rng As Range)
'1. build individual formula
    Dim myFormula As String: myFormula = "FILTER(ROW($),$<>0,"""")"
    myFormula = Replace(myFormula, "$", rng.Address(False, False, external:=True))
'2. get array of row numbers to maintain
    Dim rowNums: rowNums = Evaluate(myFormula)
'3. a) get data (consisting of 2 columns)
    Dim data:    data = rng.Resize(ColumnSize:=2).Value2
'   b) rearrange data (based on rowNums to maintain & first two columns)
    data = Application.Index(data, rowNums, Array(1, 2))
'4. overwrite original range by rearranged data (INDEX)
    rng.Clear
    rng.Resize(UBound(data), UBound(data, 2)) = data
End Sub

注意 MS/Excel

的早期版本

当然你也可以构建一个(垂直的)二维数组通过循环遍历原始数据隔离element/row个非空白:-)

以下是我通常如何删除第一列为空的行。 请注意,for 循环向后迭代 - 这消除了从 1 向前迭代到行计数时观察到的行跳过。

Sub RemoveRowsWithBlankFirstColumn()
  Dim rng As Range
  Set rng = Application.Selection
  Dim i As Integer
  For i = rng.Rows.Count To 1 Step -1
    If rng.Cells(i, 1).Value2 = vbNullString Then
      rng.Cells(i, 1).EntireRow.Delete
    End If
  Next i
End Sub