Excel精英培训网

 找回密码
 注册
数据透视表40+个常用小技巧,让你一次学会!
查看: 2963|回复: 9

MATCH(B9,$B$1:$AF$1,)的作用用代码怎么实现?

[复制链接]
发表于 2020-6-8 19:01 | 显示全部楼层 |阅读模式
1学分
本帖最后由 cys888 于 2020-6-8 20:50 编辑


新建 Microsoft Office Excel 工作表.rar

117.5 KB, 下载次数: 9

最佳答案

查看完整内容

最好不要用任何方式的循环查找,直接数组定位比较快,因为都是小数值,效率很高。 1000行差不多0.03秒。
发表于 2020-6-8 19:01 | 显示全部楼层
最好不要用任何方式的循环查找,直接数组定位比较快,因为都是小数值,效率很高。
1000行差不多0.03秒。
  1. Sub test()
  2. Dim arrRule&(30), arr, i&, j&
  3. t = Timer
  4. arr = [b1:af1]
  5. For j = 1 To UBound(arr, 2)
  6.   arrRule(arr(1, j)) = j
  7. Next j
  8. arr = Range("b9:p" & Cells(Rows.Count, 2).End(3).Row)
  9. For i = 1 To UBound(arr)
  10.   For j = 1 To UBound(arr, 2)
  11.     arr(i, j) = arrRule(arr(i, j))
  12.   Next j
  13. Next i
  14. [q9].Resize(UBound(arr), UBound(arr, 2)) = arr
  15. MsgBox Format(Timer - t, "0.00s")
  16. End Sub
复制代码

评分

参与人数 1学分 +3 收起 理由
cys888 + 3 我和小伙伴都惊呆了

查看全部评分

回复

使用道具 举报

 楼主| 发表于 2020-6-8 20:49 | 显示全部楼层
大灰狼1976 发表于 2020-6-8 20:28
最好不要用任何方式的循环查找,直接数组定位比较快,因为都是小数值,效率很高。
1000行差不多0.03秒。

确实很快,版主威武多谢啦
回复

使用道具 举报

发表于 2020-6-9 21:04 | 显示全部楼层
大灰狼1976 发表于 2020-6-8 19:01
最好不要用任何方式的循环查找,直接数组定位比较快,因为都是小数值,效率很高。
1000行差不多0.03秒。

Sub test()
Dim i, j, r, l As Integer
Dim arr1, arr2
arr1 = Range("b9:p1010")
i = UBound(arr1, 1)
j = UBound(arr1, 2)
For i = 1 To i
    For j = 1 To j
              r = Application.Match(arr1(i, j), Range("b1:af28"), 0)
       arr2(i, j) = r
      Next
   Next
Range("q9").Resize(i, j) = arr2

End Sub
请问用这个程序为什么在 arr2(i, j) = r提示类型不匹配
回复

使用道具 举报

发表于 2020-6-9 21:11 | 显示全部楼层
2828466 发表于 2020-6-9 21:04
Sub test()
Dim i, j, r, l As Integer
Dim arr1, arr2

因为你的arr2声明为变体型变量,并不是数组,后面也没有redim数组大小。
回复

使用道具 举报

发表于 2020-6-9 21:21 | 显示全部楼层
大灰狼1976 发表于 2020-6-9 21:11
因为你的arr2声明为变体型变量,并不是数组,后面也没有redim数组大小。

Sub test()
Dim i, j, r, l As Integer
Dim arr1, arr2
arr1 = Range("b9:p1010")
i = UBound(arr1, 1)
j = UBound(arr1, 2)
ReDim arr2(1 To i, 1 To j)
For i = 1 To i
    For j = 1 To j
        'On Error Resume Next
        r = Application.Match(arr1(i, j), Range("b1:af28"), 0)
         arr2(i, j) = r
      Next
Next
Range("q9").Resize(i, j) = arr2
End Sub

请问为什么改了以后,只有第一个单元格显示 #N/A,其他单无格没有内容呢

回复

使用道具 举报

发表于 2020-6-9 21:40 | 显示全部楼层
1、Range("b1:af1"),不是Range("b1:af28")
2、For i = 1 To i
        For j = 1 To j
     如果单层循环这种写法虽然不规范,但尚能正常运行,前提是要声明变量类型为整数型(Integer或Long),你的声明写法Dim i, j, r, l As Integer是错误的,只把l变量声明为整型,前面都是变体型。
    双层循环的话,即使变量声明了整数型,内循环变量每次结束会增大1,外层循环第二次就会出错。
    建议改正For i = 1 To i 这种不规范的写法,这并不会给你带来任何帮助。
回复

使用道具 举报

发表于 2020-6-9 22:00 | 显示全部楼层
大灰狼1976 发表于 2020-6-9 21:40
1、Range("b1:af1"),不是Range("b1:af28")
2、For i = 1 To i
        For j = 1 To j

Sub test()
Dim i As Integer, j As Integer, r As Integer, l As Integer, M As Integer
Dim arr1, arr2
arr1 = Range("b9:p1010")
r = UBound(arr1, 1)
l = UBound(arr1, 2)
ReDim arr2(1 To r, 1 To l)
For i = 1 To r
    For j = 1 To l
        
        M = Application.Match(arr1(i, j), Range("b1:af1"), 0)
      arr2(i, j) = r
      Next
Next
Range("q9").Resize(r, l) = arr2
End Sub
请问改完以后全部是1002,是什么原因呢

回复

使用道具 举报

发表于 2020-6-9 22:18 | 显示全部楼层
arr2(i, j) = r
r换成M,其他没仔细看,你可以自己F8调试。
回复

使用道具 举报

发表于 2020-6-9 22:51 | 显示全部楼层
大灰狼1976 发表于 2020-6-9 22:18
arr2(i, j) = r
r换成M,其他没仔细看,你可以自己F8调试。

非常感谢,终于调出来了。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

小黑屋|手机版|Archiver|Excel精英培训 ( 豫ICP备11015029号 )

GMT+8, 2024-5-25 10:50 , Processed in 0.255691 second(s), 9 queries , Gzip On, Yac On.

Powered by Discuz! X3.4

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表