【原创】VBA学习笔记(314)VBA 数组基础知识3,空值问题,index停留在+1的地方,

1 数组里中有空值,会一直存在着

  • 数组不能直接删除其中的方式
  • 数组里中有空值,会一直存在着,可以把数组某个值置空

 

  • 可以利用这一点只用数组前一截
  • 数组的后面多一些空值,不咋影响,因为截断用前面的,没啥影响,可以利用这一点,只用数组前一截
  • 但是数组中间有空值还是挺恶心的
  • 这样redim 去重数组时可以随意大一点了
Sub test_arr1()
arr1 = Array(1, 3, 5, 7, 9, "", "")

arr1(1) = ""
arr1(2) = ""
'arr1(5) = ""   '数组适合整体操作,或循环操作,不能这样随便增加内容
'arr1(6) = ""
'arr1(7) = ""

For I = LBound(arr1) To UBound(arr1)
    Debug.Print arr1(I) & ","
Next
Debug.Print

End Su

 

1.1 对应数组大小的利用:数组可以考虑设置得大一些

  • 数组可以考虑设置得大一些
  • 因为数组的某些element为空是没问题的,所以不要太在于数组里的空值,尤其是数组末尾的空值
  • 数组末尾的空值完全可以截掉,或不管嘛
  • 数组中间的空值还是有点讨厌的

 

1.2 对于 动态数组redim的几种思路

  • 首先,如果先声明为了动态数组,那么使用这个动态数组前,必须先redim 
  • dim arr1()
  • redim arr1(4,5)
  • 数组redim时,如果需要用到循环,可以在循环外进行redim 为静态的,这样比较简单
  • 技巧是,可以选择一个较大的值,比如取另外一个数组的 ubound() 或者就是写一个足够大的值。(足够的标准你自己把握)
  • 毕竟数组可以只用前面那部分,后面空着一片 "" 就空着呗,一般问题不大。至少我这种新手是这么认为的。
  • 还一种我这种新手比较取巧不在乎效率的方法
  • 就是把数组index设置的比较大
  • 比如redim arr1(9999)

 

  • 数组也可以redim大小为变量
  • 数组redim时,如果需要用到循环,如果非要在循环内redim,要特别小心
  • for  i  1 to 5 这种循环,因为循环体重置到min值的时候,导致数组内容被抹掉!!!

 

1.3 redim   容易出错的几个问题总结

  • 特别注意下面这几个常见问题
  • 边界问题:起始index 是0 还是1,是需要+1 还是-1
  • 大小问题:redim preserve 如果选了保留之前的数组内容,一定要记得让后redim 的数组大小包含之前数组范围!不能更小!
  • 越界问题:数组的维数是否正确

 

2 数组的index经过一个“完整循环”,一定会停留在 ubound()+1上

2.1 例子1

Sub test_arr2()
'数组的指针循环完了还会继续往后1?
'循环的末尾,数组会继续index+1 虽然不往后了,但index停留在Ubound()+1上

arr1 = Array(1, 2, 3, 4, 5, 6, 7)

For I = LBound(arr1) To UBound(arr1)
   Debug.Print "index= " & I & "  and element= " & arr1(I)
Next
   Debug.Print "index= " & I
   Debug.Print "index= " & I
End Sub

 

2.2 例子2

Sub test_arr4()
'证明了array完整循环一遍最后index一定停留在index+1上?
Dim arr2()

arr1 = Array(1, 2, 3, 4, 5, 5, 5)
ReDim arr2(UBound(arr1))

For I = LBound(arr1) To UBound(arr1)
    For J = LBound(arr2) To K
        If arr1(I) = arr2(J) Then
           Exit For         '为了配合后面得index选择性的停在ubound+1上,否则都停在ubound+1上没法区分
        End If
    Next
    If J = K + 1 Then       'array的index指针停在ubound+1就证明内部循环完整走完没有exit for,证明无重复
       arr2(K) = arr1(I)
       K = K + 1
    End If
Next

Debug.Print "arr1"
For Each I In arr1
    Debug.Print I
Next
Debug.Print

Debug.Print "arr2"
For Each I In arr2
    Debug.Print I
Next
Debug.Print

End Sub

 

3 数组使用match这种工作表函数时

  •    注意 index默认起点和 match函数默认index起点不同导致
Sub test_arr3()
'利用字典的数组为啥要-1?
Dim dict1 As Object
Set dict1 = CreateObject("scripting.dictionary")

arr1 = Array(1, 2, 3, 4, 5, 6, 7)
arr2 = Array(11, 22, 33, 44, 55, 66, 77)

For I = LBound(arr1) To UBound(arr1)
   dict1(arr1(I)) = arr2(I)
Next

For Each J In dict1.Keys()
    Debug.Print J & "," & dict1(J)
Next
Debug.Print

target1 = 77
arr1 = dict1.Keys()
arr2 = dict1.Items()

'不减1就越界,是因为index多往后移位的原因?--不是,这个是因为match函数默认从1开始排列,而原数组是0开始的
Debug.Print target1 & "对应的key= " & arr1(Application.Match(target1, arr2, 0) - 1)

End Sub

 

VBA(Visual Basic for Applications)中,数组是一种数据结构,用于存储一系列相同类型的元素。如果你想要从数组中去除所有空值(例如,空字符串、零值或Null),可以采取几种方法: 1. 使用`Filter`函数:这个函数可以根据指定的条件过滤数组。你可以创建一个新的数组,只包含非空元素。 ```vba Sub RemoveEmptyEntries() Dim originalArray() As Variant '假设这是你的原始数组 Dim newArray() As Variant Dim i As Long For i = LBound(originalArray) To UBound(originalArray) If Not IsEmpty(originalArray(i)) Then '检查是否为空 ReDim Preserve newArray(LBound(newArray) To UBound(newArray) + 1) '添加元素到新数组 newArray(UBound(newArray)) = originalArray(i) '将非空元素添加进去 End If Next i '现在 newArray 包含了原数组中的非空元素 End Sub ``` 2. 循环遍历并条件判断:直接在循环中检查每个元素,如果非空则复制到新的数组。 ```vba Sub RemoveEmptyEntriesAlternative() Dim originalArray() As Variant Dim newArray() As Variant Dim i As Long ReDim newArray(0 To 0) '预先分配空间防止动态扩容时的效率损失 For i = LBound(originalArray) To UBound(originalArray) If Not IsEmpty(originalArray(i)) Then ReDim Preserve newArray(LBound(newArray) To UBound(newArray) + 1) '每次找到非空元素就扩大容量 newArray(UBound(newArray)) = originalArray(i) End If Next i 'newArray 现在也包含了非空元素 End Sub ``` 完成以上操作后,`newArray` 就是你去除了空值后的数组
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值