【问题标题】:Excel VBA Can't access sheet on external workbookExcel VBA 无法访问外部工作簿上的工作表
【发布时间】:2015-02-25 02:59:51
【问题描述】:

我使用 VBA 在 Excel 中创建了一个自定义函数。我正在尝试使用 Workbooks.Open(path) 命令从不同的工作簿中获取数据。这是我的代码:

Option Explicit

Function TestFunction() As String
  mySub
  TestFunction = "Success."
End Function


Sub mySub()

  Dim path As String
  Dim wk As Workbook

  path = "C:\Users\jg\Desktop\machine_data.xlsm"
  Set wk = Workbooks.Open(path)

  Dim ws As Worksheet
  Set ws = wk.Sheets(1)
  Debug.Print ws.Range("A2")
End Sub


Sub Test()
  Debug.Print (TestFunction())
End Sub

现在我的问题如下:

当我在 Excel 的 VBA 环境中运行 Sub Test() 时,一切都按计划进行。 machine_data.xlsm 被打开,A2 字段出现在调试中。

一旦我转到定义此模块的工作簿并在单元格中输入=TestFunction(),我会得到一个#VALUE!。文件也打不开。

如果我评论这两行:

  Set ws = wk.Sheets(1)
  Debug.Print ws.Range("A2")

单元格将显示Success!,但文件仍未打开。

我做错了什么?两个工作簿都是.xlsm 文件。我正在使用 Microsoft Office Excel 2007。

【问题讨论】:

  • UDF 只能返回一个值 - 请查看 This
  • @DaveU 我已经读过这个是的,但是是不是打开一个外部工作簿并且只从它读取并且取决于读取值返回一个不同的值允许?因为这似乎是不可能的。我不会更改 machine_data.xlsm 文件中的任何值。
  • @DaveU 没关系我选择了不同的解决方法(请参阅下面我自己的答案)

标签: vba function excel


【解决方案1】:

只需将 mySub 中的所有内容都放入测试函数中,如果一切成功,则让测试函数返回单元格的值。所以 testFunc = ws.Range("A2").

【讨论】:

  • mySub 复制到TestFunction() 时仍然得到#VALUE!
【解决方案2】:

正如 DaveU 已经说过的那样,UDF 只能返回值。我发现了一种不同的解决方法,只需从 VBA 环境中调用该函数,它可以让我在任何我想要的地方修改单元格内容。

【讨论】:

    猜你喜欢
    • 2018-01-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-01-04
    • 1970-01-01
    相关资源
    最近更新 更多