2017-04-16 206 views
1

我有一個Excel函數,它使用來自SQL拉的信息填充字典。爲了幫助可視化答案集,我將它放入了一個新的工作簿 - 雖然我不需要再將其可視化,但我仍然發現它有助於填充。工作簿。添加不添加新工作簿

答案集不會改變,除非我自己在填充數據庫中做了一些事情,所以我不需要每次都執行查詢的函數。因此,一旦字典被填充,我將繞過查詢,除非我強制它使用刷新參數初始化字典。

Option Explicit 
Option Compare Text 
Private dProducts As Scripting.Dictionary 
------ 
Function ProdLookup(sValue As Variant, sReturn As Variant, sLookupType As 
Variant, _Optional iVendor As Integer, Optional bRefresh As Boolean) As 
Variant 

    If sValue = "" Then 
     ProdLookup = "" 
     Exit Function 
    End If 

    If sLookupType = "SKU" Then 
     If (dProducts Is Nothing) Or (bRefresh = True) Then 
      Call Create_dProdsBySKU 
     End If 
     ProdLookup = dProducts(CStr(sValue.Value))(CStr(sReturn.Value)) 
     Exit Function 
    End If 

End Function 
------ 
Sub Create_dProdsBySKU() 

    Dim newBook As Workbook 
    Set newBook = Workbooks.Add 

    'Rest of code to create query, run it, retrieve results, dump onto 
    'newBook, and populate into dProducts 

    newBook.Close SaveChanges:=False 

End Sub 

如果我簡單地從編輯器中運行Create_dProdsBySKU,詞典填充到一個新的工作簿,並關閉:

該模塊的結構如下。但是,如果我在Excel中使用ProdLookup函數,它永遠不會創建一個新的工作簿 - 如果我在newBook上放置了一個監視器,它將顯示它具有ThisWorkbook的值。

試圖在Watch窗口中看到newBook的屬性會掛起Excel,我需要從任務管理器中結束任務。

我錯過了什麼?

+0

正如我所看到的,你還沒有創建一個dProducts詞典類的新實例。或者我在這裏失去了一些東西? – sktneer

+0

@sktneer不缺失任何東西,部分被剪下的代碼包括以下內容: Set dProdsBySKU = CreateObject(「Scripting.Dictionary」) – mikstravaganza

回答

3

如果我用Excel內

的ProdLookup功能如果您正在使用的功能作爲一個UDF,它不會被允許創建一個新的工作簿。 UDF僅限於將值返回給包含函數調用的單元格。

+0

嗯,就是這樣。我想我需要直接從查詢結果填充字典,然後。謝謝! – mikstravaganza

+0

對於任何未來的搜索者,這是已確認的問題。我將結果集放入一個數組,並從那裏填充字典,沒有問題。 – mikstravaganza

相關問題