ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

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

[已解决] 关于VBA自定义函数需要从某个工作表中获取数据

[复制链接]

TA的精华主题

TA的得分主题

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

因为本人经常用到vlookup函数根据身份证号码匹配籍贯,所以想要自定义一个函数一劳永逸,我的思路是自定义函数里只有一个参数,就是需要提供的身份证号码的单元格,需要匹配的数据(就是对应的号码和籍贯)因为不会变化,所以就不当作参数,直接在自定义函数里去打开,写入字典里。但是发现在function自定义函数引用别的工作表时失败,请问在自定义函数的时候不能这种跨工作表操作吗?但是后面我又照着这个自定应函数写了一个sub过程,运行可以得到想要的结果,但是变成function就不行,麻烦大神帮忙看一下
自定义函数代码如下:
Function JG(r As Range)
    Dim dic As Object
    Dim wb As Workbook
    Dim arr
    Dim k$
    Dim i%
'
    Set dic = CreateObject("scripting.dictionary")
    Set wb = Workbooks.Open(ThisWorkbook.Path & "\籍贯对照表.xlsx")
    With wb.Sheets("籍贯")
        arr = .Range("a1:b6000")
    End With
    wb.Close , 0
    For i = 1 To UBound(arr)
        k = arr(i, 1)
        If Not dic.exists(k) Then
            dic(k) = arr(i, 2)
        End If
    Next
   
   
    k = Left(r.Value, 6)
    If dic.exists(k) Then
        JG = dic(k)
    Else
        JG = Null
    End If
   
End Function
1.PNG

但是我写了一个JGJG的程序,运行都可以得到结果,代码的思路和自定义函数是一样的,代码如下:
Sub JGJG()
    Dim dic As Object
    Dim wb As Workbook
    Dim arr
    Dim k$
    Dim i%
'
    Set dic = CreateObject("scripting.dictionary")
    Set wb = Workbooks.Open(ThisWorkbook.Path & "\.xlsx")
    With wb.Sheets("籍贯")
        arr = .Range("a1:b6000")
    End With
    wb.Close , 0
    For i = 1 To UBound(arr)
        k = arr(i, 1)
        If Not dic.exists(k) Then
            dic(k) = arr(i, 2)
        End If
    Next
   
   
    k = Left(Range("b2").Value, 6)
    If dic.exists(k) Then
        Range("c2") = dic(k)
    Else
        Range("c2") = Null
    End If
   
End Sub
所以到底问题在哪里
C:\Users\Laptop\Desktop\1.png

人员信息.rar

138.76 KB, 下载次数: 27

TA的精华主题

TA的得分主题

发表于 2019-3-11 20:56 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
可以跨工作表。关键在于你传入什么样的参数

TA的精华主题

TA的得分主题

发表于 2019-3-11 20:58 | 显示全部楼层

TA的精华主题

TA的得分主题

 楼主| 发表于 2019-3-11 21:03 | 显示全部楼层
chentonny 发表于 2019-3-11 20:56
可以跨工作表。关键在于你传入什么样的参数

传入的是六位数字编码和对应的籍贯地区,麻烦帮忙看一下附件吧

TA的精华主题

TA的得分主题

 楼主| 发表于 2019-3-11 21:04 | 显示全部楼层
jiangxiaoyun 发表于 2019-3-11 20:58
用vlookup能花多长时间呢?

因为要在近6000行的数据里去找,而且这个工作的频率很高,所以就像自定义一个函数,能节约时间

TA的精华主题

TA的得分主题

发表于 2019-3-11 21:07 | 显示全部楼层
lyliuyouyang 发表于 2019-3-11 21:04
因为要在近6000行的数据里去找,而且这个工作的频率很高,所以就像自定义一个函数,能节约时间

6000行,用函数去找,这不是好方法。

TA的精华主题

TA的得分主题

发表于 2019-3-11 21:08 | 显示全部楼层
chentonny 发表于 2019-3-11 21:07
6000行,用函数去找,这不是好方法。

你的附件看过了,没看到你调用函数的过程,也没看到你传入什么参数。估计是你传入的参数不是一个RANGE的问题。

TA的精华主题

TA的得分主题

 楼主| 发表于 2019-3-11 21:15 | 显示全部楼层
chentonny 发表于 2019-3-11 21:08
你的附件看过了,没看到你调用函数的过程,也没看到你传入什么参数。估计是你传入的参数不是一个RANGE的 ...

我是直接把需要的数据传到一个数组arr里,然后写入字典,函数只传递了一个单元格,对于函数我想的是只需要通过这个单元格参数在字典里去比对就行了,不知道思路是不是有问题

TA的精华主题

TA的得分主题

发表于 2019-3-11 21:26 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
放一个工作簿里面有什么困难吗?非要用两个工作簿?

TA的精华主题

TA的得分主题

 楼主| 发表于 2019-3-11 21:31 | 显示全部楼层
mhps159357 发表于 2019-3-11 21:26
放一个工作簿里面有什么困难吗?非要用两个工作簿?

因为想把这个自定义函数做成打开excel就自动加载的函数,在任何一个工作表中都可以调用,如果只是在某个工作表中用一下,确实没必要这么麻烦
您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

关闭

最新热点上一条 /1 下一条

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

GMT+8, 2024-4-20 11:21 , Processed in 0.046402 second(s), 12 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

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

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

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