2011-10-07 256 views
2

首先:我正在使用Excel 2007,但代码也必须适用于Excel 2003。Excel VBA无法打开工作簿

我的问题如下:我需要访问不同工作簿中的单元格,这可能会被关闭。下面的代码可以在整个网络上找到:

Function Foo() 
    Dim cell As Range 
    Dim wbk As Workbook 
    Set wbk = Workbooks.Open("correct absolute path") 
    ' wbk is Nothing here so the next statement fails. 
    Set cell = wbk.Worksheets("Sheet1").Range("A1") 
    Foo = cell.Value 
    wbk.Close 
End Function 

可悲的是,WBK是开放的语句之后没有什么(我很乐意提供更好的错误消息,但不知道我怎么会做什么;什么我会给一个真正的IDE和一个有用的语言:/)。绝对路径是正确的并且指向一个有效的excel xlsx文件。

另外我假设这样做的最好方法是“缓存”工作簿,而不是每次调用函数时打开/关闭它?任何可能出现的问题(除了在工作簿已经打开时必须处理这种情况)?

图像,同时通过加强: debugging info

+0

您不会收到错误消息,并且“Open”语句只返回Nothing?我试过重试你的问题失败了。你将不得不给我们更多的细节和上下文。 –

+0

@ Jean-FrançoisCorbett要说“不”,错误信息就是说,excel只是继续执行。我看了一下,但找不到任何'GetLastError()'或类似的'On Error Goto'没有指定任何异常对象?引用的东西基本上是整个功能,但我将其改为完整的功能,可能有帮助。 – Voo

+0

立即窗口中的“?Err.Number”和“?Err.Description”将为您提供有关运行时错误的信息。您需要为On Error Goto提供错误处理程序。当你说“下一个语句失败”时,你的意思是你在那里得到一个运行时错误?如果是这样,什么?如果不是,Cell是否也等于没有?您是否尝试过一个非常简单的路径,例如,“我的文档”中的文件? –

回答

5

我可以重现此问题。它只发生在我尝试将这些代码粘贴到用户定义的函数中。

我相信这是由设计(报价是2003 XL,但同样的事情发生在我身上的2010 XL)

使用VBA的关键字,自定义函数

VBA的关键字数量您可以在自定义函数中使用比在宏中可以使用的数量更小的值。除了向工作表中的公式或另一个VBA宏或函数中使用的表达式返回值之外,自定义函数不允许执行任何操作。例如,自定义函数无法调整窗口大小,编辑单元格中的公式,或更改单元格中文本的字体,颜色或图案选项。如果在一个函数过程中包含这种“动作”代码,函数将返回#VALUE!错误。

http://office.microsoft.com/en-us/excel-help/creating-custom-functions-HA001111701.aspx

我发现的唯一的解决方法是通过正常的宏调用这种代码。就像选择单元格来应用它,然后循环选择或类似的东西。

+0

谢谢你,是的,这就是我也在做的事情,只是没有认为它很重要(当然,我并没有意识到自己在做一些不同的事情)。 – Voo

1

若要从工作簿中获取数据,而无需打开时,您可以使用this,用ADO连接。

要在Excel 2007中改变使用

Microsoft.Jet.OLEDB.4.0 

Provider=Microsoft.ACE.OLEDB.12.0 

Extended Properties=\"Excel 8.0;HDR=Yes;\ 

Extended Properties=\"Excel 12.0;HDR=Yes;\ 

[]的

0

你不必“设置”一个单元格,它是工作簿类的一部分(据我所知)。只需使用以下...

foo = wbk.Worksheets("Sheet1").Range("A1").Value 
+0

单元不是任何类的一部分。这是一个被声明为范围的变量,所以它必须被设置。也许你正在考虑作为Worksheet对象属性的“单元格”。您的建议确实缩短了代码,但并未解决问题。 -1 –

+0

是的,我可以重写所有东西以适合一行 - 如果我开始用1个字符来命名变量,我甚至可能进入Perl程序员俱乐部,但是,这实际上不是总体目标;) – Voo

+0

你是对的,我忽略了我的答案。但回头再试一试现在就可以运行。嗯,也许发布我们你的(“正确的绝对路径”)?如果可能的话。因为否则你的代码工作正常.. – TheFuzzyGiggler

0

我建议您在打开调用工作簿时在worbook_open事件中为您打开新工作簿。

然后,您将新工作簿参考存储在全局变量中。

然后,您的单元调用的函数使用上述全局变量而不是尝试打开新的工作簿。这样你可以绕过这个限制。 PS:当然要避免全局变量,某种容器比直接的全局变量要好。

1

将我的例程放入工作簿模块中的单独宏并从Workbook_BeforeSave代码中调用该宏的解决方法似乎已经完成。

我有类似的问题,但在我的情况下,它是一个“Workbooks.Open(文件名)”命令在嵌入Workbook_BeforeSave的小例程开始。 VBA只是跳过代码行,就好像它不在那里,它甚至不报告Err.Code或Err.Description。

对我来说唯一的线索是它是Workbook_BeforeSave例程的一部分,上面的函数的限制似乎表明可能是一个可能的原因。所以我进一步挖掘以找到更多细节。

Workbook_BeforeSave似乎禁止Excel打开更多文件,我猜这样做很好,因为文件>打开选项在文件菜单中仍然可见,但无法单击。奇怪的是,打开工具栏图标/按钮仍然有效,所以虽然我可以从那里手动打开文件,但是我不知道是不是因为从VBA代码调用这个动作是不可能的,这就是为什么他们允许它?

1

你可以使用这个(类似于布鲁诺·雷特提出,但要简单得多写):

Dim excelApp As New Excel.Application 
excelApp.Visible = False 
Set WB = excelApp.Workbooks.Open(FileName, xlUpdateLinksNever, True) 

由于UDF是一再呼吁,应该确保做一个excelApp.Quit退出函数之前(以及之前的WB.close(False)),以避免在您的盒子上运行无数Excel实例。

我花了一些想法,并得出结论,您不能在执行UDF时混淆当前Excel实例的工作簿。另一方面,打开excel的第二个例子将在不受干扰的情况下完成工作。

+0

但是...如果您必须重复使用UDF,速度非常慢。 – Javi

相关问题