【笔记】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)
注意,用
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更加通用,可以利用数组之外的其他信息作为条件判断。
删除结果如下图所示:
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· 【自荐】一款简洁、开源的在线白板工具 Drawnix