|
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用 · 内置多项VBA编程加强工具 ★ 免费下载 ★ ★ 使用手册★
本帖最后由 瓶砸 于 2018-9-17 14:27 编辑
最近一直被一个烦恼所困扰着,自己使用VLOOKUP函数所引用的数据来自生产计划8月和生产计划9月两张表格。
而我希望可以从计划单的字符串中提取出月份,从而从相对应的表格中去寻找数据。
计划单号的格式为JG20180917-1,我用FIND函数做了一个条件判断,如图。
在被查找的表格中,B列为计划单号,G列为需要引用的数据列。
基于以上这些,我一开始写了这样一个函数。
=IFERROR(VLOOKUP(N2,INDIRECT("'G:\文件夹\[生产计划"&TEXT(MID(N5,7,2),0)&"月.xlsx]"&TEXT(MID(N5,7,2),0)&"月'!$B:$G"),6,),"")
然而这么一来有个弊端是需要打开源文件才能显示出数据。
后来想着将整个文件名作为条件判断的结果是否可行,于是又写了这么个函数。
=LOOKUP(,-FIND({201808,201809},N2),{"'G:\文件夹\[生产计划8月.xlsx]8月'!$B:$G","'G:\文件夹\[生产计划9月.xlsx]9月'!$B:$G"})
结果折腾到后面发现这样写返回的公式结果是文本形式的,并不能作为VLOOKUP函数的第二参数,如果要使其生效,依然要加上INDIRECT函数,如下。
=VLOOKUP(N2,INDIRECT(LOOKUP(,-FIND({201808,201809},N2),{"'G:\文件夹\[生产计划8月.xlsx]8月'!$B:$G","'G:\文件夹\[生产计划9月.xlsx]9月'!$B:$G"})),6,)
这样一来,依然是需要打开源文件才能显示出数据。
于是,就去百度找有什么可以替代INDIRECT函数的函数,结果除了VBA,貌似没有找到其他可行的方法,也有人说用INDEX函数,不过以我目前的水平还无法让引用的表格名称变得像加了INDIRECT函数时候的那么灵活。
那么,难道剩下的方法就只有采用链接外部数据的方法创建一个副本到函数所在的工作簿了么?方法是可行,操作起来还是觉得麻烦。
后来查了VLOOKUP函数的百度百科,看看其有无其他我不知道的用法,看到这么一段话:
VLOOKUP函数的工作原理:
1.含有VLOOKUP函数的工作表,每次在保存档案时,会同时保存一份其外部连结的档案。这样即使在单独打开这个工作表时,VLOOKUP函数一样可以抓取到数值。
2.在工作表打开时,微软会提示你,是否要更新远程参照。意思是说,你要不要连接最新的外部档案,好让你的VLOOKUP函数抓到最新的值。如果你有足够的耐心,不妨试试。
3.了解到这点,我们应该知道,每次单独打开含有VLOOKUP函数的工作表时,里面抓取外部档案的数值,只是上次我们存盘时保存的值。若要连结最新的值,必须要把外部档案同时打开。
所以,我们是否可以用VLOOKUP函数创建一份档案呢?经过尝试,发现是可行的。
我先输入在本文一开始我所提到的公式,本质是一样的,详细参数会略有不同,并向下填充。截图如下。
可以看出,当源文件表格没打开的时候,整列数据行都为空白。
接下来,我们在O4输入
=IFS(ISNUMBER(FIND(201808,N4)),VLOOKUP(N4,'G:\金工车间\[金工车间生产计划8月.xlsx]8月'!$B:$G,6,),ISNUMBER(FIND(201809,N4)),VLOOKUP(N4,'G:\金工车间\[金工车间生产计划9月.xlsx]9月'!$B:$G,6,),1,"")
然后回车,所有的数据就都显示出来了,如图所示。
而且这些数据当你按F9进行重新计算或者重新打开文件时候都是存在的。
这样一来,我的问题就暂时解决了,以后如果发现这个做法有什么BUG的话,我会另外补充的,也欢迎大家和我一起讨论。
另外,有兴趣的可以尝试下INDEX+INDIRECT是否可以用这个思路解决。
最后弱弱问一句,不知,我废话了这么多,你们看得懂我想表达的意思么?
|
评分
-
1
查看全部评分
-
|