26

我是 VBA 新手,我正在尝试编写一个可以从 Excel 单元格调用的函数,该函数可以打开一个已关闭的工作簿,查找一个单元格值并返回它。

到目前为止,我知道如何编写这样的宏:

Sub OpenWorkbook()
    Dim path As String
    path = "C:\Users\UserName\Desktop\TestSample.xlsx"

    Dim currentWb As Workbook
    Set currentWb = ThisWorkbook


    currentWb.Sheets("Sheet1").Range("A1") = OpenWorkbookToPullData(path, "B2")
End Sub


Function OpenWorkbookToPullData(path, cell)

    Dim openWb As Workbook
    Set openWb = Workbooks.Open(path, , True)

    Dim openWs As Worksheet
    Set openWs = openWb.Sheets("Sheet1")

    OpenWorkbookToPullData = openWs.Range(cell)

    openWb.Close (False)

End Function

宏 OpenWorkbook() 运行得非常好,但是当我尝试直接从 Excel 单元格调用 OpenWorkbookToPullData(...) 时,它不起作用。该声明:

    Set openWb = Workbooks.Open(path, , True)

什么都不返回。

有谁知道如何将它变成可以从 Excel 单元格调用的有效 VBA 函数?

4

3 回答 3

45

这是答案

要遵循的步骤:

  1. 打开 Visual Basic 编辑器。在 Excel 中,如果在 Windows 上点击Alt+ ,在 Mac上点击+ + 。F11FnOptionF11

  2. 插入一个新模块。从菜单中:插入 -> 模块(不要跳过这个!)。

  3. 创建一个Public函数。例子:

    Public Function findArea(ByVal width as Double, _
                             ByVal height as Double) As Double
        ' Return the area
        findArea = width * height
    End Function
    
  4. 然后在任何单元格中使用它,就像使用任何其他功能一样:=findArea(B12,C12).

于 2014-03-29T20:13:41.090 回答
1

您遇到的问题是UDFs 无法修改 Excel 环境,它们只能向调用单元格返回一个值。

有几种选择

  1. 对于给定的示例,您实际上并不需要 VBA。这个公式会起作用
    ='C:\Users\UserName\Desktop\[TestSample.xlsx]Sheet1'!$B$2

  2. 使用相当混乱的解决方法:查看此答案

  3. 您可以使用ExecuteExcel4MacroOLEDB

于 2013-10-26T02:00:07.750 回答
0

函数将不起作用,也没有必要:

Sub OpenWorkbook()
    Dim r1 As Range, r2 As Range, o As Workbook
    Set r1 = ThisWorkbook.Sheets("Sheet1").Range("A1")
    Set o = Workbooks.Open(Filename:="C:\TestFolder\ABC.xlsx")
    Set r2 = ActiveWorkbook.Sheets("Sheet1").Range("B2")
    [r1] = [r2]
    o.Close
End Sub
于 2013-10-26T14:15:44.050 回答