Excel精英培训网

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

[已解决]求助 ~~ VBA中引用VLOOKUP函数不成功 求解

[复制链接]
发表于 2012-2-8 11:24 | 显示全部楼层 |阅读模式
find过程.rar (55.96 KB, 下载次数: 44)
发表于 2012-2-8 11:33 | 显示全部楼层
Sub find()
    For i = 1 To Sheet2.Range("a65536").End(xlUp).Row
        If Sheet2.Cells(i, 3) = "项目" Then
            Set t = Sheet3.Range("a1:c135").find(Sheet2.Cells(i, 1), , , xlWhole)
            If t Is Nothing Then Sheet2.Cells(i, 4) = "未设定" Else Sheet2.Cells(i, 4) = t.Offset(0, 3)
        End If
    Next i
End Sub
回复

使用道具 举报

 楼主| 发表于 2012-2-8 12:37 | 显示全部楼层
Zipall 发表于 2012-2-8 11:33
Sub find()
    For i = 1 To Sheet2.Range("a65536").End(xlUp).Row
        If Sheet2.Cells(i, 3) = " ...

谢谢 但能告诉我 我那么写为什么不对么?
回复

使用道具 举报

发表于 2012-2-8 13:19 | 显示全部楼层    本楼为最佳答案   
liheng_0116 发表于 2012-2-8 12:37
谢谢 但能告诉我 我那么写为什么不对么?

类似于优先级的问题,就是说谁先捕获到错误值。

看这个例子
Sub test()
    'On Error Resume Next
    a = Application.WorksheetFunction.IfError(1 / 0, 2)
    MsgBox a
End Sub

除数为0的错误还没有传递给iferror之前,就已经引起了程序错误。


你可以搜一下“vba 错误捕获 和 处理”看看如何处理错误值。
回复

使用道具 举报

发表于 2012-2-9 14:43 | 显示全部楼层
本帖最后由 cbg2008 于 2012-2-9 14:44 编辑

由于我也遇到过这个问题,所以印象深刻,这个问题有两个方面导致引用VLOOKUP错误
第一是SHEET2第一列的数据类型是String,而SHEET3第一列的数据类型是Double,所以肯定是查不到的,用下面两个命令在立即窗口就可以验证这个错误:
? typename(cells(81,1).value)
String
? typename(sheet3.cells(1,1).value)
Double
数据类型不同,所以要把SHEET3第一列的数据类型改成String,方法是
1.选中所有需要处理的数字单元格。
2.选择[数据]菜单[分列]功能。
3.直接跳过前两步,也就是说直接点击“下一步”直到步骤3。
4.在步骤3中将“列数据格式”设置为“文本”,点击完成。
大功告成,所有被选中的数据单元格的左上角都出现了绿色的三角标识,提醒您所有的数据都是文本形式存储的。
这样设置好后,再运行,还是错误,因为第SHEET2.CELLS(106,1)的值117102在SHEET3第1列中没有,VLOOKUP查找不到,所以出错,一个办法是完善SHEET3的数据,另外一个办法就是在过程开始添加一行代码:
On Error Resume Next
这样,当VLOOLUP出错时,就会继续执行下一句代码,而不会中断了。
这样,这个过程应该可以顺利执行了。
希望我的经验对你有帮助。
回复

使用道具 举报

发表于 2012-2-14 02:51 | 显示全部楼层
Zipall 发表于 2012-2-8 11:33
Sub find()
    For i = 1 To Sheet2.Range("a65536").End(xlUp).Row
        If Sheet2.Cells(i, 3) = " ...

您好学长,您的方法是正确的,但结果是错误的。
错在下面这行代码:
If t Is Nothing Then Sheet2.Cells(i, 4) = "未设定" Else Sheet2.Cells(i, 4) = t.Offset(0, 3)
应该是:
If t Is Nothing Then Sheet2.Cells(i, 4) = "未设定" Else Sheet2.Cells(i, 4) = t.Offset(0, 2)
回复

使用道具 举报

发表于 2012-2-14 02:54 | 显示全部楼层
楼主的要求还有另一种解决方法,代码如下:
  1. Sub find()
  2. For i = 1 To Sheet2.Range("a65536").End(xlUp).Row
  3. If Sheet2.Cells(i, 3) = "项目" Then
  4. Sheet2.Cells(i, 4).Formula = "=if(iserror(VLOOKUP(RC[-3]*1,Sheet2!R1C1:R135C3,3,FALSE)),""未设定"", VLOOKUP(RC[-3]*1,Sheet2!R1C1:R135C3,3,FALSE))"
  5. End If
  6. Next i
  7. End Sub
复制代码

可以试一下。
回复

使用道具 举报

发表于 2012-7-10 15:41 | 显示全部楼层
没看到最佳答案哈
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-5-18 02:32 , Processed in 0.153235 second(s), 14 queries , Gzip On, Yac On.

Powered by Discuz! X3.4

Copyright © 2001-2020, Tencent Cloud.

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