我有一个包含许多工作表的工作簿,其中一个基本上是一个登录表。每一行都有一个名称单元格,其中有一个数据验证下拉列表,该列表引用单独的表单列表填充程序。然后,相邻的小区使用VLOOKUP,引用名称单元格,并获取所需的值(ID,电话号码等)。这很有效。
我有一个宏将工作簿拆分为单独的工作表。简单的方法就是通过电子邮件发送整个工作簿而不是我,我只需将其拆分并通过电子邮件发送登录表。为了便于从登录表到列表填充程序的引用,我将列表填充程序表复制到新的登录表工作簿。
...
xWs.Copy
Application.ActiveWorkbook.SaveAs Filename:=xPath & "\" & xWs.Name & ".xlsm", FileFormat:=52
...
masterWB.Sheets("List Filler").Copy Before:=newWB.Sheets(1)
...
当我打开新工作簿时,List Filler和Sign In Sheet都是可见的,如预期的那样。但是,VLOOKUP引用和数据验证源引用都指向主工作簿:
数据验证来源已更改为:
='[workbookname.xlsm]List Filler'!#REF!
VLOOKUP改为:
=IFERROR(VLOOKUP(O14,'[workbookname.xlsm]List Filler'!A:M,12,FALSE),"")
因此VLOOKUP维护了它的引用,但绝对引用了主工作簿中的List Filler表。
基本上,我有两个问题。
1)VLOOKUP引用需要相对引用List Filler表,而不是在主工作簿中查找它。我可以用自定义函数解决这个问题(我在其他地方怎么做),但是这里的修复可能和(2)一样,这就是让我感到沮丧。
2)数据验证来源参考HAS指向" local"列出填充工作表,而不是主工作簿中的原始工作表。
对此的任何帮助将不胜感激。如果需要任何澄清,请告诉我,如果需要,我也很乐意提供更多代码段。
谢谢!
编辑1: 只是要添加,我想保留List Filler参考" local"因为登录表最终将被移动/复制回主工作簿。登录表将从主工作簿转到自己的工作簿,然后返回到主服务器,同时需要访问列表填充工作表,这将始终作为列表填充程序存在于任何工作簿登录工作表中。就像我们一样$ A $ 1总是参考A1,我想做' $ List Filler',如果这是有道理的。
答案 0 :(得分:0)
代表@OpiesDad
发帖而不是将范围引用为:
'List Filler'!A:M
或类似的东西,定义一个命名范围,只要引用存在于本地,如问题中所述,它将阻止引用外部工作簿。
最好有一个动态命名范围,只需在所需范围内插入一个表格,然后根据表格的参考文献命名,例如
Tablename[[SomeVar:AnotherVar]]
这允许您将条目添加到数据验证列表,而不会冒空白或遗漏数据的风险。
答案 1 :(得分:0)
一个想法是替换新工作簿中的链接。所以它可以工作,必须保存新的工作簿。如果工作簿已保存,您可以说它已保存。
masterWB.Sheets("List Filler").Copy Before:=newWB.Sheets(1)
...
newWB.Saved = True
newWB.ChangeLink Name:=masterWB.Name, NewName:=newWB.Name, Type:=xlExcelLinks
newWB.Saved = False
在Excel2013上它对我很好。