【笔记】Excel VBA|(二)VBA删除数组中的一个元素、循环时删除一行、选择一列删除指定一行
VBA常用删除操作。
我的 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)
注意,用
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数组包含删除指定条件后的元素
这段代码使用LBound
和UBound
函数来获取数组的边界,并使用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。百度和各类采集站皆不可信,搜索请谨慎鉴别。技术类文章一般都有时效性,本人习惯不定期对自己的博文进行修正和更新,因此请访问出处以查看本文的最新版本。
开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!
更多推荐
所有评论(0)