2016-04-22 30 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上適合我。