ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

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

[讨论] LOOKUP向量用法帮助文件的确错误(更新并上传附件:对LOOKUP向量用法的简单探讨)

  [复制链接]

TA的精华主题

TA的得分主题

发表于 2012-2-10 00:00 | 显示全部楼层
好帖,希望能为我所用            

TA的精华主题

TA的得分主题

发表于 2012-4-7 21:11 | 显示全部楼层
是啊,香老师说的好,帮助怎么教的就怎么做这样最安全保险,出了事找微软麻烦

TA的精华主题

TA的得分主题

发表于 2012-4-7 22:02 | 显示全部楼层
本帖最后由 香川群子 于 2012-4-7 22:04 编辑
hjj0451 发表于 2011-10-1 11:03
有待讨论和各位老师指正及补充。


我用VBA自编了一个反映LOOKUP二分法查找过程的函数。

结果清晰。请看附件
Lookup2.rar (25.38 KB, 下载次数: 22)


  1. Function VL(x, r, Optional k = 0)
  2.     m = r.Count:    h = m + 1:  l = 0:    t = l + (h - l) \ 2: s = " |"
  3.     If IsNumeric(x) Then x = Val(x) Else x = x.Text
  4.     Do
  5.         If IsNumeric(r.Item(t)) Then y = Val(r.Item(t)) Else y = r.Item(t).Text
  6.         
  7.         If x < y Then
  8.             s = s & "<" & y & "(" & t & ") " & ChrW(8594)
  9.             If t = 1 Then VL = 1: Exit Do
  10.             h = t:       t = l + (h - l) \ 2
  11.         Else
  12.             If x = y Then
  13.                 q = t: s = s & "=" & y & "(" & t & ") " & ChrW(8594)
  14.                 For t = t + 1 To h - 1
  15.                     If IsNumeric(r.Item(t)) Then y = Val(r.Item(t)) Else y = r.Item(t).Text
  16.                     If x = y Then q = t Else s = s & "<>" & y & "(" & t & ") " & ChrW(8594): Exit For
  17.                 Next
  18.                 VL = 2: Exit Do
  19.             End If
  20.             If t = h - 1 Then VL = 3: Exit Do
  21.             p = t: s = s & ">" & y & "(" & t & ") " & ChrW(8594)
  22.             l = t: t = l + (h - l) \ 2
  23.         End If
  24.     Loop
  25.    
  26.     If k = 0 Then
  27.         If VL = 1 Then
  28.             VL = "#N/A"
  29.         ElseIf VL = 2 Then
  30.             VL = x
  31.         Else
  32.             VL = y
  33.         End If
  34.     ElseIf k = 1 Then
  35.         If VL = 1 Then
  36.             VL = "#N/A"
  37.         ElseIf VL = 2 Then
  38.             VL = q
  39.         Else
  40.             VL = t
  41.         End If
  42.     Else
  43.         If VL = 1 Then
  44.             VL = "NA (1)" & s & "S #NA|1"
  45.         ElseIf VL = 2 Then
  46.             VL = x & " (" & q & ")" & s & "=" & x & "(" & q & ") = |2"
  47.         ElseIf VL = 3 Then
  48.             VL = y & " (" & t & ")" & s & "<" & r.Item(h).Text & "(" & h & ")>" & y & "(" & t & ") H |3"
  49.         End If
  50.     End If
  51. End Function
复制代码

点评

忘了送花,辛勤劳动^^  发表于 2012-4-7 23:43
你谢谢群子。帮我测试一下我另外一个帖子,整列模式下的"二分"的过程。  发表于 2012-4-7 22:11

评分

1

查看全部评分

TA的精华主题

TA的得分主题

发表于 2012-4-8 07:38 | 显示全部楼层
真的好贴,学习了,对lookup函数有了进一步的了解

TA的精华主题

TA的得分主题

发表于 2012-4-8 15:11 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
能研究到这个程度,不是一般人所为之,必要耐得住寂寞,确是专家了

TA的精华主题

TA的得分主题

发表于 2012-4-8 17:54 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
留个脚印,明天接着看

TA的精华主题

TA的得分主题

发表于 2012-4-8 18:39 | 显示全部楼层

TA的精华主题

TA的得分主题

发表于 2012-5-23 12:09 | 显示全部楼层

TA的精华主题

TA的得分主题

发表于 2012-6-23 19:33 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
看来我得把lookup回炉重造了,重新学习

TA的精华主题

TA的得分主题

发表于 2012-6-29 22:54 | 显示全部楼层
这是lookup的查找原理,你可以去搜搜关于lookup二分法方面的资料
简单的着这么说吧节点的位置,决定了向左还是向右查找
比如=lookup(5,{100,5,-1000})和=lookup(5,{100,5,-1000,0})
无论两头的数字是多少,永远返回5,因为中点是第一个查找的位置(偶数个数为(1+4)/2取整位置为第一个计算节点)
就你的例子=lookup(0,{-3,-4,-5,-6})第一步以-4为节点,由于0大于-4,往右查找-5和-6,两个数字节点为(1+2)/2取整=1,-5为节点,继续往右,直到最后一个小于0的数值返回。如果是=lookup(0,{-3,-4,-5,6})会返回-5,因为当判断到6为节点的时候,0小于6,会往回查找,因为第一个节点的右边存在小于等于0的数字。
因此=LOOKUP(0,{-3,4,-5,6})会返回-3,因此第一个节点4大于0,所以往左查找到-3,但是
=LOOKUP(0,{3,4,-5,6})会返回错误值,当查找到最左边的3任然找不到小于等于0的数字,会返回错误值,而不会再向右查找。
节点的位置的右边是否小于等于查找值的数值,决定了是否返回错误值,
例如
=LOOKUP(4,{9;4;1;6;5;4;2;3;1})会返回4,只要大于5的数字,均会返回1,但是小于4的数字,均会是错误值,因为第一次查找以5为节点,会在左边的9,4,1,6中找,第二次以4为节点,只剩下一个9,而小于4的数字,肯定都是小于9的,返回错误值
关于你的另外一个提问=LOOKUP(-2.5,{-1,-2,-3})为什么返回错误值,也是这个道理,-2.5<-2,向左查找,-1仍然大于-2.5,返回错误值,你把-1改成-10,就会返回-10了。
所以=LOOKUP(-2.5,{-1,-2,-3})这个公式,当中间为-2时,右边的-3,无论你填什么数字,对结果都没有影响,而左边的-1是否小于等于-2.5,决定了返回错误值,还是返回左边这个数
PS: 以上不是本人劳动成果,觉得讲得比较清楚,明了,所以就发上来共享。
您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

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

GMT+8, 2024-11-29 01:55 , Processed in 0.050900 second(s), 9 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

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

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

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