如何查找一个数组内,某个元素的index是多少?
- 如果element元素唯一,可以用match查,
- 但是 application.match 比 worksheetfunction.match() 函数更健壮
- 如果不唯一呢
- 用match 只能返回第一个查到的元素的index
- 注意 match() 查找 5 和 "5" 都不一样
- Application.Match(5, arr1, 0)
- Application.Match("5", arr1, 0)
- Application.Match 如果查不到,可以返回一个错误值,不会中断程序
- WorksheetFunction.Match 如果查不到,会直接程序中断
match反查的局限性:
- 1只能查重复元素的第1个index
- 2需要把查找内容加引号""
- 3 match作为工作表函数,index默认从1开始,即使array本身index从0开始!
Sub jackma_arrtest1()
Dim arr1
arr1 = Array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10, "5")
Debug.Print Application.Match(5, arr1, 0)
Debug.Print Application.Match("5", arr1, 0)
Debug.Print Application.Match(11, arr1, 0)
Debug.Print Application.WorksheetFunction.Match(5, arr1, 0)
Debug.Print Application.WorksheetFunction.Match("5", arr1, 0)
'Debug.Print Application.WorksheetFunction.Match(11, arr1, 0) '这句会报错
End Sub
- 序号不同于index
- 序号的定义
- index定义
取序号,index都有两种思路
- 1用循环+if判断 去取
- 用 match 去取序号,然后根据lbound() 等算出来index---前期假设 index是必须连续的
index可以为负数,整数,0,但必须连续
Sub ponygo1()
Dim arr2(3 To 15)
arr1 = Array(7, 5, 1, 2, 3, 4, 5, "6", 7, 8, 9, 0)
x1 = InputBox("请输入要查找的数字,必须是1位数")
'以后可以增加判断
'这个inputbox输入的是字符串,并且还需要判断位数,判断数字库是否落在里面?
Debug.Print "--------常规数组测试------------"
'用循环+判断 也可以取到序号和index,还更方便点
m = 1
For j = LBound(arr1) To UBound(arr1)
If arr1(j) = x1 Then
Debug.Print x1 & "在arr1中的是第" & m & "个元素"
Debug.Print x1 & "在arr1中是index是" & j
End If
m = m + 1
Next
Debug.Print
'序号是我自己定义的,总是从1开始
i1 = Application.Match(x1, arr1, 0)
'match局限性,总是从1开始
Debug.Print x1 & "在arr1中的是第" & i1 & "个元素"
y1 = i1 - (1 - LBound(arr1))
Debug.Print x1 & "在arr1中是index是" & y1
Debug.Print
Debug.Print "此时m=" & m & "所以这下面得换变量n,或者重置m=1"
Debug.Print
'---------------------不规则数组测试-----------------------------
Debug.Print "---------不规则数组测试-------------"
'所谓的不能给数组赋值
'Dim arr2(3 To 15) 这里结合是错误的
'array()函数返回的必须是变量,或变量对等的动态数组,不能赋值给静态数组
'arr2 = [{3, 4, 5, "6", 7, 0, 1, 2, 8, 9}] 也不行
'arr2() = Array(3, 4, 5, "6", 7, 0, 1, 2, 8, 9)
arr2(3) = 1
arr2(9) = "6"
arr2(15) = 15
n = 1
For j = LBound(arr2) To UBound(arr2) '这里j最好也换变量,这样是危险的,这次没出错是因为重新给j界定了起点终点
If arr2(j) = x1 Then
Debug.Print x1 & "在arr2中的是第" & n & "个元素"
Debug.Print x1 & "在arr2中是index是" & j
End If
n = n + 1
Next
Debug.Print
i2 = Application.Match(x1, arr2, 0)
Debug.Print x1 & "在arr2中的是第" & i2 & "个元素"
y2 = i2 - (1 - LBound(arr2))
Debug.Print x1 & "在arr2中是index是" & y2
Debug.Print
'if 可以exit for 不用 end if搭配?
End Sub