我是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函数?
答案 0 :(得分:31)
要遵循的步骤:
打开Visual Basic编辑器。在Excel中,如果在Windows上,请按 Alt + F11 , Fn + 选项 + F11 如果在Mac上。
插入新模块。从菜单中:插入 - >模块(不要跳过这个!)。
创建Public
功能。例如:
Public Function findArea(ByVal width as Double, _
ByVal height as Double) As Double
' Return the area
findArea = width * height
End Function
然后在任何单元格中使用它,就像使用任何其他函数一样:=findArea(B12,C12)
。
答案 1 :(得分:1)
您遇到的问题是UDF
无法修改Excel环境,它们只能将值返回给调用单元格。
有几种选择
对于给出的样本,您实际上并不需要VBA。这个公式将起作用
='C:\Users\UserName\Desktop\[TestSample.xlsx]Sheet1'!$B$2
使用相当混乱的工作:See this answer
您可以使用ExecuteExcel4Macro
或OLEDB
答案 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