2016-04-22 74 views
0

我有一个包含许多工作表的工作簿,其中一个实质上是一个登录表。每一行都有一个名称单元格,其中有一个数据有效性下拉列表,引用一个单独的工作表List Filler。相邻的单元然后使用VLOOKUP,引用Name单元格,并获取所需的值(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表单。

基本上,我有2个问题。

1)VLOOKUP参考需要相对引用列表填充表,而不是在主工作簿中查找它。我可以用一个自定义函数来解决这个问题(我在别处怎么做),但这里的解决方法可能与(2)相同,这是使我瘫痪的原因。

2)数据有效性源引用HAS被定向到“本地”列表填充页,而不是主工作簿中的原始页。

任何帮助,将不胜感激。如果需要澄清,请告诉我,如果需要,我也很乐意提供更多的代码片段。

谢谢!

编辑1: 只是要添加,我想保持列表填充引用“本地”,因为登录表最终将被移动/复制回主工作簿。登录表将从主工作簿转移到自己的工作簿,然后返回到主工作簿,同时需要访问列表填充工作表,该工作表在任何工作簿登录表中都会以列表填充符的形式存在。就像我们一样$ A $ 1总是引用A1,我想做'$ List Filler',如果这是有道理的。

+0

对于第二个问题,您可以对“[workbookname.xlsm]”进行查找替换并将其替换为“” – OpiesDad

+0

对于第一个问题,我会在主工作簿中命名范围,然后删除新工作簿中的命名范围,并在新工作簿中添加一个具有相同名称的新范围。然后在数据验证中使用命名范围,而不是列出单元格。我不知道这是否可行,但值得一试。 – OpiesDad

+0

这可能会导致在执行副本时发出警告......类似于“您是否想使用初始工作簿中指定的范围”,但您可能会禁止此警告并进行处理。 – OpiesDad

回答

0

发布代表@OpiesDad

代替引用范围为:

'List Filler'!A:M 

或类似的东西,定义一个命名范围,这将防止外部工作簿的引用,只要该参考按照问题中的解释在本地存在。

这可能是最好有一个动态命名范围,这简直就是在需要的范围内插入一个表格,然后将其命名为基于表的引用,如

Tablename[[SomeVar:AnotherVar]] 

这允许您添加条目到数据验证列表,而不会有空白空间或丢失数据的风险。

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上适合我。