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

时间:2013-10-26 00:54:41

标签: 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

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

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

返回Nothing。

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

3 个答案:

答案 0 :(得分:31)

Here's the answer

要遵循的步骤:

  1. 打开Visual Basic编辑器。在Excel中,如果在Windows上,请按 Alt + F11 Fn + 选项 + 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
    
  4. 然后在任何单元格中使用它,就像使用任何其他函数一样:=findArea(B12,C12)

答案 1 :(得分:1)

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

有几种选择

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

  2. 使用相当混乱的工作:See this answer

  3. 您可以使用ExecuteExcel4MacroOLEDB

答案 2 :(得分: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