2017-04-16 176 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

相关问题