【笔记】Excel 2021|(二)VBA删除数组中的一个元素、循环时删除一行、选择一列删除指定一行

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

选择一列,删除指定一行

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

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更加通用,可以利用数组之外的其他信息作为条件判断。

删除结果如下图所示:

在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/qq_46106285/article/details/127351056