Ich bin ein VBA-Neuling und versuche, eine Funktion zu schreiben, die ich von Excel-Zellen aus aufrufen kann. Diese kann eine geschlossene Arbeitsmappe öffnen, einen Zellenwert nachschlagen und zurückgeben.
Bisher weiß ich, wie man ein Makro wie folgt schreibt:
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
Das Makro OpenWorkbook () läuft einwandfrei, aber wenn ich versuche, OpenWorkbookToPullData (...) direkt aus einer Excel-Zelle aufzurufen, funktioniert es nicht. Die Aussage:
Set openWb = Workbooks.Open(path, , True)
gibt nichts zurück
Weiß jemand, wie man es in eine funktionierende VBA-Funktion umwandelt, die von einer Excel-Zelle aus aufgerufen werden kann?
Folgende Schritte sind auszuführen:
Öffnen Sie den Visual Basic-Editor. In Excel drücken Sie Alt+F11 wenn unter Windows, Fn+Option+F11 wenn auf einem Mac.
Fügen Sie ein neues Modul ein. Aus dem Menü: Einfügen -> Modul.
Erstellen Sie eine Public
Funktion. Beispiel:
Public Function findArea(ByVal width as Double, _
ByVal height as Double) As Double
' Return the area
findArea = width * height
End Function
Verwenden Sie es dann in jeder Zelle wie in jeder anderen Funktion: =findArea(B12,C12)
.
Das Problem, auf das Sie gestoßen sind, ist, dass UDF
s die Excel-Umgebung nicht ändern kann. Sie können nur einen Wert an die aufrufende Zelle zurückgeben.
Es gibt verschiedene Alternativen
Für das angegebene Beispiel benötigen Sie eigentlich keine VBA. Diese Formel wird funktionieren='C:\Users\UserName\Desktop\[TestSample.xlsx]Sheet1'!$B$2
Verwende eine ziemlich chaotische Arbeit: Diese Antwort sehen
Sie können ExecuteExcel4Macro
oder OLEDB
verwenden.
Eine Funktion funktioniert nicht und ist auch nicht notwendig:
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