webentwicklung-frage-antwort-db.com.de

Wie rufe ich die VBA-Funktion aus Excel-Zellen auf?

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?

13
user780069

Hier ist die Antwort

Folgende Schritte sind auszuführen:

  1. Öffnen Sie den Visual Basic-Editor. In Excel drücken Sie Alt+F11 wenn unter Windows, Fn+Option+F11 wenn auf einem Mac.

  2. Fügen Sie ein neues Modul ein. Aus dem Menü: Einfügen -> Modul.

  3. 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
    
  4. Verwenden Sie es dann in jeder Zelle wie in jeder anderen Funktion: =findArea(B12,C12).

28
FloatingRock

Das Problem, auf das Sie gestoßen sind, ist, dass UDFs die Excel-Umgebung nicht ändern kann. Sie können nur einen Wert an die aufrufende Zelle zurückgeben.

Es gibt verschiedene Alternativen

  1. Für das angegebene Beispiel benötigen Sie eigentlich keine VBA. Diese Formel wird funktionieren
    ='C:\Users\UserName\Desktop\[TestSample.xlsx]Sheet1'!$B$2 

  2. Verwende eine ziemlich chaotische Arbeit: Diese Antwort sehen

  3. Sie können ExecuteExcel4Macro oder OLEDB verwenden. 

1
chris neilsen

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
0
Gary's Student