如何从Excel单元格调用VBA函数?

use*_*069 19 excel vba excel-vba

我是一个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
Run Code Online (Sandbox Code Playgroud)

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

    Set openWb = Workbooks.Open(path, , True)
Run Code Online (Sandbox Code Playgroud)

什么也没有.

有谁知道如何将其转换为可以从Excel单元格调用的工作VBA函数?

Flo*_*ock 34

这是答案

要遵循的步骤:

  1. 打开Visual Basic编辑器.在Excel中,命中Alt+ F11如果在Windows上,Fn+ Option+ F11如果在Mac上.

  2. 插入一个新模块.从菜单中:插入 - >模块.

  3. 创建一个Public功能.例:

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

  • 通常我认为我可以做得更好,而不仅仅是按照说明.第2步很重要! (7认同)

chr*_*sen 1

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

有几种选择

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

  2. 使用相当混乱的解决方法:请参阅此答案

  3. 您可以使用ExecuteExcel4MacroOLEDB