ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

搜索
EH技术汇-专业的职场技能充电站 妙哉!函数段子手趣味讲函数 Excel服务器-会Excel,做管理系统 效率神器,一键搞定繁琐工作
HR薪酬管理数字化实战 Excel 2021函数公式学习大典 Excel数据透视表实战秘技 打造核心竞争力的职场宝典
让更多数据处理,一键完成 数据工作者的案头书 免费直播课集锦 ExcelHome出品 - VBA代码宝免费下载
用ChatGPT与VBA一键搞定Excel WPS表格从入门到精通 Excel VBA经典代码实践指南
查看: 422|回复: 8

[求助] [代码优化]最接近值查询返回,类似于函数FREQUENCY套路

[复制链接]

TA的精华主题

TA的得分主题

发表于 2023-2-7 18:11 | 显示全部楼层 |阅读模式
本帖最后由 lizhipei78 于 2023-2-7 19:07 编辑

有时候我们在查询匹配的时候,会遇到近似查找,且是最接近那个数,在Excel函数中,我们一般会用到=LOOKUP(1,0/FREQUENCY(0,ABS(A$2:A$6-E2)),B$2:B$6)这类的套路。但是在VBA中是怎么实现的呢?我下午想了一下,是能实现了,但是觉得应该能优化,希望大佬看一下。

微信截图_20230207180714.png
如图所示,A、B两列是对照表,根据对照表,我们要求最接近的评分F列
我自己写了以下的代码
222.png
大家看看能不能优化一下,如果是sheet2中的多条件,又如何写代码?
12.png
sheet2这种我不会了

查找区间最接近的值.rar (20.33 KB, 下载次数: 2)



TA的精华主题

TA的得分主题

发表于 2023-2-7 18:57 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
Sub 最接近的值查询()
    Dim Arr, Brr, Temp, K
    Arr = Range("A1").CurrentRegion
    [F2:F6] = ""
    Brr = Range("D1").CurrentRegion
    ReDim Crr(UBound(Arr) * UBound(Brr))
    For i = 2 To UBound(Brr)
        x = Arr(2, 2)
        y = Abs(Arr(2, 1) - Brr(i, 2))
        For j = 3 To UBound(Arr)
            If Abs(Arr(j, 1) - Brr(i, 2)) < y Then
                y = Abs(Arr(j, 1) - Brr(i, 2))
                x = Arr(j, 2)
            End If
        Next
        Brr(i, 3) = x
    Next
    Range("D1").Resize(UBound(Brr), 3) = Brr
End Sub

TA的精华主题

TA的得分主题

发表于 2023-2-7 18:58 | 显示全部楼层
供参考。。。。。

查找区间最接近的值.zip

19.32 KB, 下载次数: 6

TA的精华主题

TA的得分主题

 楼主| 发表于 2023-2-7 19:13 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
liulang0808 发表于 2023-2-7 18:58
供参考。。。。。

非常感谢版主大大的指教,这个比我那个简单一点,像sheet2那种加了品名、规格这种多条件的又怎么弄呢?平时的话应该是这种多条件的正常
我更新了附件及附图,麻烦版主再指点一下,谢谢。

TA的精华主题

TA的得分主题

 楼主| 发表于 2023-2-7 19:28 | 显示全部楼层
对于sheet2的多条件查询,参考了版主的代码,不知道是否正确
  1. Sub 最接近的值查询()
  2.     Sheet2.Activate
  3.     Dim Arr, Brr, Str1$, Str2$, x, y
  4.     Arr = Range("A1").CurrentRegion
  5.     [I2:I10] = ""
  6.     Brr = Range("F1").CurrentRegion
  7.     For i = 2 To UBound(Brr)
  8.         x = Arr(2, 4)
  9.         y = Abs(Arr(2, 3) - Brr(i, 3))
  10.         For j = 3 To UBound(Arr)
  11.             Str1 = Brr(i, 1) & Brr(i, 2)
  12.             Str2 = Arr(j, 1) & Arr(j, 2)
  13.             If Str1 = Str2 Then
  14.                 If Abs(Arr(j, 3) - Brr(i, 3)) < y Then
  15.                     y = Abs(Arr(j, 3) - Brr(i, 3))
  16.                     x = Arr(j, 4)
  17.                 End If
  18.             End If
  19.         Next
  20.         Brr(i, 4) = x
  21.     Next
  22.     Range("F1").Resize(UBound(Brr), 4) = Brr
  23. End Sub
复制代码


TA的精华主题

TA的得分主题

 楼主| 发表于 2023-2-7 19:56 | 显示全部楼层
针对于sheet2,完善了一下代码,发觉有点啰嗦,看哪个大神能优化一下



Sub 最接近的值查询()
    Sheet2.Activate
    Dim Arr, Brr, Str1$, Str2$, x, y
    Dim dic As Object
    Set dic = CreateObject("scripting.dictionary")
    Arr = Range("A1").CurrentRegion
    [I2:I10] = ""
    Brr = Range("F1").CurrentRegion
    For i = 2 To UBound(Brr)
        For j = 2 To UBound(Arr)
            Str1 = Brr(i, 1) & Brr(i, 2)
            Str2 = Arr(j, 1) & Arr(j, 2)
            If Str1 = Str2 Then
                dic(Str1) = dic(Str1) + 1
                If dic(Str1) = 1 Then
                    x = Arr(j, 4)
                    y = Abs(Arr(j, 3) - Brr(i, 3))
                End If
                If Abs(Brr(i, 3) - Arr(j, 3)) < y Then
                    y = Abs(Arr(j, 3) - Brr(i, 3))
                    x = Arr(j, 4)
                End If
            End If
        Next
        Brr(i, 4) = x
        x = Empty
    Next
    Range("F1").Resize(UBound(Brr), 4) = Brr
End Sub



TA的精华主题

TA的得分主题

发表于 2023-2-7 22:46 | 显示全部楼层
介于中間均等...取哪個?
日期早于最小日期, 怎取?


TA的精华主题

TA的得分主题

 楼主| 发表于 2023-2-7 22:55 | 显示全部楼层
准提部林 发表于 2023-2-7 22:46
介于中間均等...取哪個?
日期早于最小日期, 怎取?

这个还没有考虑那么多,先按照绝对值最小的来就好了

TA的精华主题

TA的得分主题

 楼主| 发表于 2023-2-7 22:58 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
再写了一个sheet2的代码

23.png
您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

手机版|关于我们|联系我们|ExcelHome

GMT+8, 2024-11-19 10:42 , Processed in 0.044622 second(s), 9 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

沪公网安备 31011702000001号 沪ICP备11019229号-2

本论坛言论纯属发表者个人意见,任何违反国家相关法律的言论,本站将协助国家相关部门追究发言者责任!     本站特聘法律顾问:李志群律师

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