ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

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

[求助] VBA代替vlookup没有值

[复制链接]

TA的精华主题

TA的得分主题

发表于 2014-9-3 17:11 | 显示全部楼层 |阅读模式
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
本帖最后由 hetter 于 2014-9-3 17:21 编辑

附件里F列的值是我写好的vlookup,大家一看就明白,我也照别人的写了代码。
我有三个问题想问:
1.可为什么运行的时候前5行是空的,后面又是错误的值呢?代码错在哪里,想了半天没明白,大家能不能帮忙给改一下,让我知道错在哪里了。
2.我平时一张表都要写数据到几万行到十几万行,在C列输入值的时候要看到对应F列的变化,像用vlookup函数一样的实时变化,所以想到用Private Sub Worksheet_Change(ByVal Target As Range)这样的方式,性能方面会不会比vlookup要好?
3.平时工作薄里还有一张表的,要把这张表的数据全部引用到另一张表并多了两列材积的计算公式,大量引用,也就是单元格内输入"=数据输入!C4"这样方式,再下拉填充到十几万行,并且有十列左右,引用得多了就很慢,用VBA可以优化吗?

非常感谢热心人的帮助,在此先谢过了!
Test.7z (151.63 KB, 下载次数: 9)

TA的精华主题

TA的得分主题

发表于 2014-9-3 18:00 | 显示全部楼层
  1. Private Sub Worksheet_Change(ByVal Target As Range)
  2.     If Intersect(Target, [c4:c65536]) Is Nothing Then Exit Sub
  3.     Dim a&, b&, k&, n&
  4.     a = Target.Row: n = Target.Count: b = a + n - 1
  5.     For k = a To b
  6.         If Len(Cells(k, 3)) Then
  7.             Cells(k, 6) = Evaluate("=IF(C" & k & "="""","""",VLOOKUP(C" & k & ",$O$2:$P$445,2,0))")
  8.         Else
  9.             Cells(k, 6) = ""
  10.         End If
  11.     Next
  12. End Sub
复制代码

TA的精华主题

TA的得分主题

发表于 2014-9-3 18:21 | 显示全部楼层
存在两个问题:
1、数组的上、下限没搞对
2、浮点数作为关键字不是好主意

TA的精华主题

TA的得分主题

发表于 2014-9-3 18:23 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
yaozong 发表于 2014-9-3 18:00

前辈,拜托看看
http://club.excelhome.net/thread-1149822-1-1.html

TA的精华主题

TA的得分主题

发表于 2014-9-3 18:23 | 显示全部楼层
数据量大时,结果为纯数值型为妥。(公式引用/转数值)
编辑事件可适用拖拽、复制操作(C列)
参考附件

T.zip

451.91 KB, 下载次数: 12

TA的精华主题

TA的得分主题

发表于 2014-9-3 18:25 | 显示全部楼层
T.rar (315.17 KB, 下载次数: 1)

TA的精华主题

TA的得分主题

发表于 2014-9-3 18:27 | 显示全部楼层
  1. Sub test()
  2.     Dim data, temp, arr
  3.     Dim d
  4.     Dim i&, k&
  5.     Set d = CreateObject("scripting.dictionary")
  6.     data = [o1].CurrentRegion
  7.     For i = 2 To UBound(data)
  8.         d(Format(data(i, 1), "0.00")) = data(i, 2)
  9.     Next
  10.     temp = Range("C4:D" & [c10000].End(3).Row)
  11.     ReDim arr(1 To UBound(temp), 1 To 1)
  12.     For k = 1 To UBound(temp)
  13.         arr(k, 1) = d(Format(temp(k, 1), "0.00"))
  14.     Next
  15.     [f4].Resize(UBound(arr) , 1) = arr
  16.     Set d = Nothing
  17. End Sub
复制代码

TA的精华主题

TA的得分主题

发表于 2014-9-3 18:27 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
T.rar (316.63 KB, 下载次数: 12)

TA的精华主题

TA的得分主题

 楼主| 发表于 2014-9-4 07:47 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
jsxjd 发表于 2014-9-3 18:27

谢谢热心的版主,代码我还得研究一下。

TA的精华主题

TA的得分主题

发表于 2014-9-4 08:31 | 显示全部楼层
  Set Rng = Sheet1.[a:a].Find("需要查找的值", , , xlWhole)     ‘在sheet1表a:a列中查找“需要查找的值”
           If Not Rng Is Nothing Then                                        ‘如果存在则
                 x= rng.offset(0,1)                                               '把所在列的坐标向右移动一列的数据给x
          end if

这个find的属性相对于循环好用点。
您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

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

GMT+8, 2024-3-29 16:54 , Processed in 0.050444 second(s), 10 queries , Gzip On, Redis On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

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

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

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