2013-10-15 49 views
1

我有两个工作簿,“测试”和“Screen_Reference_Data_Sheet”。我试图通过使用命名范围和“Screen_Reference_Data_Sheet”工作簿中的数据在“Test”中创建下拉列表。从引用另一个工作簿的命名范围的下拉验证

以下是我正在使用的代码,并且它在“.Add Type:...”行上抛出错误“运行时错误1004”。

我只能使用一个工作簿中的数据就能完成此任务,但是当我从另一个工作簿中获取数据时,我收到了此错误。

Sub GetScreenNames() 
Path = Application.ActiveWorkbook.Path 
RefFilePath = Path & "\Screen_Reference_Data_Sheet.xls" 
Set objExcel = CreateObject("Excel.Application") 
Set objWorkbook = objExcel.Workbooks.Open(RefFilePath) 

Dim rng1 As Range 
Set rng1 = objWorkbook.Sheets("Keywords_Action_Screen").Range("B2:B4") 
ThisWorkbook.Names.Add Name:="screenslistdata", RefersTo:=rng1 

With ThisWorkbook.Sheets("Sheet1").Range("A1:A3").Validation 
    .Delete 
    .Add Type:=xlValidateList, AlertStyle:=xlValidAlertStop, Operator:=xlBetween, Formula1:="=screenslistdata" 
End With 

objExcel.ActiveWorkbook.Close 
objExcel.Application.Quit 
End Sub 

任何想法,我在做什么错在这里?

回答

0

您不得将对其他工作簿的引用用于数据验证条件。

如果试图手动执行此操作,将出现错误/警告:

enter image description here

下一个最好的解决方案,我认为是对范围内的值转换为一个变量数组,并使用数组分配列表公式:

With ThisWorkbook.Sheets("Sheet1").Range("A1:A3").Validation 
    .Delete 
    .Add Type:=xlValidateList, AlertStyle:=xlValidAlertStop, _ 
     Operator:=xlBetween, 
     Formula1:=Join(Application.Transpose(rng1.Value), ",") 
End With 
+0

谢谢。那么下一个最佳解决方案是什么?是否将其他工作簿的单元格区域复制到我的活动工作簿中,并从新移动的数据创建命名范围? – jeffpm

+0

你的问题是“我做错了什么”。我相信我已经回答了这个问题,但我会考虑后续问题。但请考虑将此答案标记为已接受,因为我已经回答了。您可以将一个范围的值分配给一个数组,并且您可以将一个数组分配给验证公式,所以可以这样做(参见上面的修订版):) –

+0

完美工作,感谢您的帮助。 – jeffpm

相关问题