我的 Excel 版本:Excel 2021

省流版

主要问题循环的时候删除一行比较麻烦,因为删除了一行后,循环仍然直接访问后一行,会导致一定的异常。

选择一列,删除指定一行

以下代码是选择一列删除指定一行稳妥保险的删除方法:

Columns("G:G").Select	'选择一列
i = 1	'定义一个循环变量,来控制参与循环的元素
While (IsEmpty(Selection(i)) = False)	'用是否遇到空单元格来判断是否遍历完成
	If (InStr(1, Selection(i), "特定条件", 0) > 0) Then
		nowRow = Selection(i).Row	'获得当前行号
		Rows(nowRow).Delete	'删掉当前行
		i = i - 1	'抵消删除对循环的影响
	End If
	i = i + 1	'循环中循环变量正常地加1
Wend

删除数组中的一个元素

不过,删除数组中的一个元素却不方便这样做。因为VBA貌似没提供数组.delete(index)这种好用的函数。

方法1:利用动态数组,在循环中条件判断删除

但可以结合动态数组,将删除元素的数组赋值给新数组,如下代码。其中的b数组便是删除元素后的新数组:

arr1 = Array(1, "特定条件", 3, 999, 1, "特定条件", 3) '定义一个数组
Dim b() As String   '定义新数组
k = 0   '记录新数组的长度
For i = 0 To UBound(arr1)  '用数组长度来判断是否遍历完成
    If (InStr(1, arr1(i), "特定条件", 0) <= 0) Then
        ReDim Preserve b(0 To k)    '添加到新数组
        b(k) = arr1(i)
        k = k + 1
    End If
Next
'结果是b = Array(1, 3, 999, 1, 3)

参考:vba中怎样去掉数组中的空值-百度知道-jmeycn

注意,用UBound获取数组长度,而不是Len。在VBA中,Len是用来获取Expression的长度的,如字符串长度;UBound返回指定数组的最大下标。
注意2:当数组长度为0时,用UBound获取长度会产生“下标越界”错误。所以这里用k作为新数组的长度值。

方法2:删除数组中的指定值

当然,如果是删除数组中的指定值,更简洁的方式是用Filter,如下:

arr1 = Array(1, "特定条件", 3, 999, 1, "特定条件", 3) '定义一个数组
b = Filter(arr1, "特定条件", False)
'结果也是b = Array(1, 3, 999, 1, 3)

总结:推荐采用方法1

显然,方法1更加通用,可以利用数组之外的其他信息作为条件判断。

删除结果如下图所示:

在这里插入图片描述

详细解释版

删除指定行:循环中的稳健操作

在VBA中,当我们试图在循环中删除行时,会遇到一个常见的挑战。直接删除行会导致循环继续访问已移动的行,从而引发错误。为了稳妥地处理这个问题,我们需要采取一种特定的策略来确保循环与行的删除操作同步。

使用选择列进行删除

一种常见的方法是选择整列,然后遍历该列来查找并删除满足特定条件的行。下面是一个示例代码,展示了如何在VBA中安全地删除特定行:

Columns("G:G").Select '选择整列 Dim i As Integer '定义一个循环变量 i = 1 '初始化循环变量 While Not IsEmpty(Selection(i)) '使用非空单元格作为循环终止条件 If InStr(1, Selection(i), "特定条件", 0) > 0 Then '检查单元格是否满足条件 Dim nowRow As Integer '定义当前行号变量 nowRow = Selection(i).Row '获取当前行号 Rows(nowRow).Delete '删除当前行 i = i - 1 '调整循环变量以抵消删除行的影响 End If i = i + 1 '继续下一个循环迭代 Wend

这段代码通过选择整列并使用While循环遍历单元格来找到满足条件的行。一旦找到满足条件的行,它就会删除该行并相应地调整循环变量,以确保循环不会跳过任何行或尝试访问已删除的行。

从数组中删除元素

在VBA中,删除数组中的元素并不像删除行那样直观,因为VBA没有提供像数组.delete(index)这样的内置函数。然而,我们可以使用几种不同的方法来实现这一目标。

方法1:使用动态数组进行条件判断

一种方法是结合使用动态数组和循环遍历原始数组,将不需要删除的元素复制到一个新数组中。下面是一个示例代码:

Dim arr1() As Variant '定义原始数组
arr1 = Array(1, "特定条件", 3, 999, 1, "特定条件", 3) '初始化数组

Dim b() As Variant '定义新数组
Dim k As Integer '定义新数组的长度变量
k = 0 '初始化长度变量

Dim i As Integer '定义循环变量
For i = LBound(arr1) To UBound(arr1) '遍历原始数组
    If InStr(1, arr1(i), "特定条件", 0) <= 0 Then '检查元素是否满足条件
        ReDim Preserve b(k) '扩展新数组的大小
        b(k) = arr1(i) '将元素添加到新数组
        k = k + 1 '增加新数组的长度
    End If
Next i

'此时,b数组包含删除指定条件后的元素

这段代码使用LBoundUBound函数来获取数组的边界,并使用ReDim Preserve语句在添加新元素时保留现有数组的内容。它还使用条件判断来确定哪些元素应该被复制到新数组中。

方法2:使用Filter函数删除指定值

另一种更简洁的方法是使用VBA的Filter函数来删除数组中的指定值。下面是一个示例代码:

Dim arr1() As Variant '定义原始数组
arr1 = Array(1, "特定条件", 3, 999, 1, "特定条件", 3) '初始化数组

Dim b() As Variant '定义新数组
b = Filter(arr1, "特定条件", False) '使用Filter函数删除指定值

'此时,b数组包含删除指定条件后的元素

Filter函数接受三个参数:要过滤的数组、要排除的值以及一个布尔值,指示是否排除还是包含该值。在这个例子中,我们将布尔值设置为False`,以排除与指定值匹配的元素。

总结与推荐

在选择从数组中删除元素的方法时,方法1更加通用,因为它可以基于更复杂的条件进行判断,而不仅仅是基于特定值。然而,如果你只需要删除特定值,方法2可能更加简洁和高效。

无论选择哪种方法,重要的是要确保在删除元素时正确地管理数组的大小和索引,以避免出现下标越界或其他错误。此外,通过仔细规划循环逻辑和条件判断,可以确保在处理行或数组时实现稳健和可靠的代码。

本账号所有文章均为原创,欢迎转载,请注明文章出处:https://blog.csdn.net/qq_46106285/article/details/127351056。百度和各类采集站皆不可信,搜索请谨慎鉴别。技术类文章一般都有时效性,本人习惯不定期对自己的博文进行修正和更新,因此请访问出处以查看本文的最新版本。

Logo

开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!

更多推荐