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

我是一个VBA新手,我试图写一个函数,我可以从Excel单元格中调用,可以打开closures的工作簿,查找单元格值并返回它。

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

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 

macrosOpenWorkbook()运行完全正常,但是当我试图直接从Excel单元格调用OpenWorkbookToPullData(…),它不起作用。 该声明:

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

没有返回。

有谁知道如何把它变成一个可以从Excel单元格中调用的工作VBA函数?

这是答案

遵循的步骤:

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

  2. 插入一个新的模块。 从菜单:插入 – >模块。

  3. 创build一个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)

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

有几个select

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

  2. 使用一个相当凌乱的工作: 看到这个答案

  3. 您可以使用ExecuteExcel4MacroOLEDB

function将不起作用,也不是必需的:

 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