ExecuteExcel4Macro in Visual Basic 6 aufrufen

  • Excel

Es gibt 3 Antworten in diesem Thema. Der letzte Beitrag () ist von jensm.

    ExecuteExcel4Macro in Visual Basic 6 aufrufen

    Hallo zusammen,

    Ich lese aus hunderten Excel-Dateien immer jeweiles einen Wert aus. Dafür verwende ich bislang in VBA ein ExecuteExcel4Macro, das so ähnlich aufgerufen wird:

    Quellcode

    1. Private Function getValueFromFile(path As String, file As String, sheet As String, row As Integer, column As Integer) As String
    2. Dim arg As String
    3. arg = "'" & path & "[" & file & "]" & sheet & "'!" & Cells(row, column).Address(ReferenceStyle:=xlR1C1)
    4. getValueFromFile = ExecuteExcel4Macro(arg)
    5. End Function


    Es gibt zwar auch die Möglichkeit, eine Datei normal zu öffnen, den Wert auszulesen und dann wieder zu schließen. Dennoch dauert das sehr viel länger als das ExecuteExcel4Marco (zumindest bei nur einem auszulesenden Wert).

    Die größe Frage wäre für mich noch: wie rufe ich diese Funktion von Visual Basic aus auf ???? Das müsste ja eigentlich gehen. Ich im Internet folgende Methode gesehen:

    Quellcode

    1. Public Sub MyMacro()
    2. Dim myreturn As Variant
    3. myreturn = Application.ExecuteExcel4Macro("Book1!RunThis()")
    4. End Sub
    5. Public Sub RunThis()
    6. MsgBox("hello")
    7. End Sub


    Anscheinend müsste ich dann beim Pfad irgendwie doppelte Ausführungszeichen setzen. So hat es auf jeden Fall nicht funktioniert.....

    Quellcode

    1. Private Function getValueFromFile(path As String, file As String, sheet As String, row As Integer, column As Integer) As String
    2. Dim arg As String
    3. arg = ""'" & path & "[" & file & "]" & sheet & "'!" & Cells(row, column).Address(ReferenceStyle:=xlR1C1)"
    4. getValueFromFile = xlApp.ExecuteExcel4Macro(arg)
    5. End Function


    Kann mir hier jemand weiterhelfen ?

    Vielen Dank,

    Jens
    Öhm ... irgendwie komm ich nicht ganz hinterher, in welcher IDE Du grad unterwegs bist. VBA, also irgendwo in Mikrosafts Office oder in Visual Studio (kurz VS)? Wenn letzteres, dann wär's ganz einfach gewesen, die Lösung zu finden (und zwar so, wie ich es gemacht hab):
    1. funktionierenden Code in Office eintragen und nen Haltepunkt nach der Zuweisung der Formel an "arg"
    2. anzeigen lassen, was sich nun konkret in "arg" als Text befindet
    3. in VS solange basteln, bis der gewünschte String im VS-arg steht
    4. probieren, ob das funktioniert

    VB.NET-Quellcode

    1. Private Sub getValueFromFile(path As String, file As String, sheet As String, row As Integer, column As Integer)
    2. Dim arg As String = "'" & path & "[" & file & "]" & sheet & "'!" & "R" & row & "C" & column
    3. MessageBox.Show(xlApp.ExecuteExcel4Macro(arg).ToString)
    4. End Sub

    Jupp. Funktioniert.
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.
    Hallo VaporiZed,

    Den Code habe ich ihn VBA/Excel geschrieben und lagere ihn jetzt in eine ActiveX-DLL aus, die ich in Visual Basic 6 erstellt habe. Nicht in VB.net.

    Die Funktionen rufe ich dann von Excel aus aus der .dll auf. Leider bekomme ich immer wieder eine Fehlermeldung: Laufzeitfehler 1004: Method ' (Tilde; kann ich hier net reinkopieren)' of '(Tilde)' failed.

    Die betreffende Stelle im Code:



    Quellcode

    1. Dim Zeile As Integer
    2. Dim Spalte As Integer
    3. Dim Zellbezug As String
    4. Dim Pfad As String
    5. Dim Datei As String
    6. Dim JahrAZN As String
    7. Dim Abschluss As Integer
    8. Dim mayzaehler As Integer
    9. ' Variable für Excel-Instanz deklarieren
    10. Dim oXLApp As Object
    11. ' Bestehende Excel-Instanz holen
    12. On Error Resume Next
    13. Set oXLApp = GetObject(, "Excel.Application")
    14. If Err.Number <> 0 Then
    15. Set oXLApp = CreateObject("Excel.Application")
    16. End If
    17. Err.Clear
    18. On Error GoTo 0
    19. mayzaehler = 1
    20. Register = "Januar"
    21. JahrAZN = "2017"
    22. Nachname = oXLApp.Worksheets("Mitarbeiter").Cells(mayzaehler, 1).Value
    23. Vorname = oXLApp.Worksheets("Mitarbeiter").Cells(mayzaehler, 2).Value
    24. Pfad = oXLApp.Worksheets("Mitarbeiter").Range("I4").Value & Nachname & ", " & Vorname & "\"​
    25. Datei = "AZN_" & Nachname & "_" & JahrAZN & ".xlsm"
    26. Zeile = 5: Spalte = 10
    27. Zellbezug = Cells(Zeile, Spalte).Address(ReferenceStyle:=xlR1C1)
    28. Adresse = "'" & Pfad & "[" & Datei & "]" & Register & "'!" & Zellbezug
    29. Abschluss = oXLApp.ExecuteExcel4Macro(Adresse).ToString


    Aufgerufen wird die Funktion aus Excel VBA dann so:

    Quellcode

    1. Private Sub CommandButton1_Click()
    2. Dim obj As AZN.ClassAZN
    3. Set obj = New ClassAZN
    4. Call obj.MonatsabschlussAktualisierenVB(0)
    5. End Sub