Makro aus Menüband starten

  • Word

Es gibt 7 Antworten in diesem Thema. Der letzte Beitrag () ist von mumpel.

    Makro aus Menüband starten

    Hallöchen,

    ich habe eine Frage: Wenn ich den Code aus dem VBA Editor heraus starte klappt alles tadellos. Aber will ich ihn auf das Menüband legen, kommt folgende Fehlermeldung (siehe Anhang).
    Ist leider nicht sehr viel sagend...kann jemand was damit anfangen? (Der Fehler kommt direkt nach der Ausführung).

    Freue mich über Rückmeldungen.

    Visual Basic-Quellcode

    1. Sub Email()
    2. Dim strUser, strDoc, strPath, strFile As String
    3. Dim oApp As New Outlook.Application
    4. Dim oMail As Outlook.MailItem
    5. Dim wDoc As Word.Document
    6. strUser = Environ("UserName")
    7. strDoc = InputBox("Bitte den gewünschten Dateinamen eintragen.")
    8. strPath = "C:\Users\" & strUser & "\Documents\"
    9. If strDoc = "" Then Exit Sub
    10. Set wDoc = ActiveDocument
    11. wDoc.ExportAsFixedFormat _
    12. OutputFilename:=strDoc, _
    13. ExportFormat:=wdExportFormatPDF, _
    14. OpenAfterExport:=False, _
    15. Range:=wdExportAllDocument
    16. Set oMail = oApp.CreateItem(olMailItem)
    17. strFile = strPath & strDoc & ".pdf"
    18. With oMail
    19. .Attachments.Add strFile
    20. .Display
    21. End With
    22. Set wDoc = Nothing
    23. Set oApp = Nothing
    24. Set oMail = Nothing
    25. Kill (strFile)
    26. End Sub

    Bilder
    • Fehler.PNG

      2,59 kB, 248×152, 76 mal angesehen

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „Sam85“ ()

    Hallo,

    wie sieht den der Callback von deinem Ribbon Objekt aus, welches den Sub aufruft?

    und setze dir doch einfach Sprungmarken in den Code und gehe Schritt für Schritt mit dem Debugger durch.

    Mit dem Error kann dir hier auch keiner helfen...

    Eine Sache aber noch:
    Spoiler anzeigen

    Visual Basic-Quellcode

    1. Dim oApp As New Outlook.Application

    ist schlechter code.
    Kein Latebinding und egal ob eine Outlook Instanz schon offen ist oder nicht, erstellst du immer eine neue.

    So eine Objekt erstellung solltest du besser mit Latebinding machen und vorher prüfen ob du nicht eine vorhandene Instanz verwenden kannst:

    Visual Basic-Quellcode

    1. Sub test()
    2. Dim olApp As Object
    3. Set olApp = getOutlook
    4. If olApp Is Nothing Then Exit Sub
    5. End Sub
    6. Private Function getOutlook() As Object
    7. Dim olApp As Object
    8. On Error Resume Next
    9. Set olApp = GetObject(, "Outlook.Application")
    10. If Err.Number <> 0 Then
    11. Set olApp = CreateObject("Outlook.Application")
    12. End If
    13. Set getOutlook = olApp
    14. End Function

    @Petersilie
    Ich weiß leider nicht was du mit Callback meinst, daher benötige ich erst dafür eine Erklärung um es dir mitzuteilen.
    Sprungmarken hab ich gesetzt, leider startet das Makro gar nicht bzw. nach der Fehlermeldung wird kein Debuggen angeboten noch der Editor geöffnet.
    Und wie gesagt, starte ich aus dem Editor alles Prima nur aus dem Menüband. Daher denke ich wäre es interessant was du mit Callback meinst.
    Ich gehe auf Menüband anpassen, wählen den Befehl Makros aus und dann das entsprechende Makro und füge es der Registerkarte hinzu.

    Danke für den Hinweis mit dem Latebinding. :) Ich hatte denselben Code auch schonmal so.
    Spoiler anzeigen

    Visual Basic-Quellcode

    1. Sub Mail()
    2. Dim user, name, pfad, pdf As String
    3. Dim olApp, olMail As Object
    4. Dim aDoc As Document
    5. user = Environ("UserName")
    6. name = InputBox("Bitte den gewünschten Dateinamen eintragen")
    7. pfad = "C:\Users\" & user & "\Documents\"
    8. If name = "" Then Exit Sub
    9. Set aDoc = ActiveDocument
    10. aDoc.ExportAsFixedFormat _
    11. OutputFilename:=name, _
    12. ExportFormat:=wdExportFormatPDF, _
    13. OpenAfterExport:=False, _
    14. Range:=wdExportAllDocument
    15. On Error GoTo Err
    16. Set olApp = CreateObject("Outlook.Application")
    17. Set olMail = olApp.CreateItem(0)
    18. pdf = pfad & name & ".pdf"
    19. With olMail
    20. .Attachments.Add pdf
    21. .Display
    22. End With
    23. Set aDoc = Nothing
    24. Set olApp = Nothing
    25. Set olMail = Nothing
    26. MsgBox ("Die Datei <" & name & "> befindet sich jetzt in dem Pfad <" & pfad & ">.")
    27. Exit Sub
    28. Err:
    29. MsgBox ("Du hast nicht Office 2016 installiert, sondern eine andere Version. Im Entwicklermodus <Entwicklertools/Visual Basic>, muss unter <Extras/Verweise>" _
    30. & " die Microsoft Outlook Library deiner Office Version eingechecken und die Fehlerhafte ausgechecken. Um den Reiter <Entwicklertools> anzuzeigen," _
    31. & " musst du den Pfeil in der oberen Leiste am Bildschirmrand auswählen <Weitere Befehle/Menüband anpassen/Hauptregisterkarten> und die Entwicklertools einchecken.")
    32. End Sub



    EDIT: An dem Early Binding muss es wohl gelegen haben, so läuft es auch aus dem Menüband. Vielen Dank Petersilie. :)
    Ich vermute das oMail muss ich dennoch auch als Obeject deklarieren, oder? (Auch wenn es in der Kombination mit Outlook.Mailitem gelaufen ist.)


    Visual Basic-Quellcode

    1. Sub Mail()
    2. Dim strUser, strDoc, strPath, strFile As String
    3. 'Dim oApp As Outlook.Application 'Early Binding
    4. 'Dim oMail As Outlook.MailItem 'Early Binding
    5. Dim oApp, oMail As Object 'Late Binding
    6. Dim wDoc As Word.Document
    7. strUser = Environ("UserName")
    8. strDoc = InputBox("Bitte den gewünschten Dateinamen eintragen.")
    9. strPath = "C:\Users\" & strUser & "\Documents\"
    10. If strDoc = "" Then Exit Sub
    11. Set wDoc = ActiveDocument
    12. wDoc.ExportAsFixedFormat _
    13. OutputFilename:=strDoc, _
    14. ExportFormat:=wdExportFormatPDF, _
    15. OpenAfterExport:=False, _
    16. Range:=wdExportAllDocument
    17. 'Set oApp = New Outlook.Application 'Early Binding
    18. Set oApp = GetOutlook 'Late Binding (cf. Function GetOutlook)
    19. If oApp Is Nothing Then Exit Sub
    20. Set oMail = oApp.CreateItem(olMailItem)
    21. strFile = strPath & strDoc & ".pdf"
    22. With oMail
    23. .Attachments.Add strFile
    24. .Display
    25. End With
    26. Set wDoc = Nothing
    27. Set oApp = Nothing
    28. Set oMail = Nothing
    29. Kill (strFile)
    30. End Sub


    Visual Basic-Quellcode

    1. Function GetOutlook() As Object
    2. Dim oApp As Object
    3. On Error Resume Next
    4. Set oApp = GetObject(, "Outlook.Application")
    5. If Err.Number <> 0 Then Set oApp = CreateObject("Outlook.Application")
    6. Set GetOutlook = oApp
    7. End Function

    Dieser Beitrag wurde bereits 8 mal editiert, zuletzt von „Sam85“ ()

    @Sam85
    Ein Callback ist eine Funktion, welche von anderen Funktionen erreicht werden kann und welche
    aufgerufen wird von einer anderen Funktion, nachdem diese erfolgreich durchgeführt wurde.

    Sagen wir du hast folgendes XML Objekt (einen Button) in deinem Ribbon:

    XML-Quellcode

    1. <group id="customGroup" label="Contoso" insertAfterMso="GroupIllustrations">
    2. <button id="customButton"
    3. label="Document ID"
    4. size="large"
    5. imageMso="ListNumVal"
    6. onAction="insertDocID" />
    7. </group>


    Dann sieht die Callback Funktion bzw. die Callback Methode wie folgt aus für dieses Objekt:

    Visual Basic-Quellcode

    1. Sub insertDocID(control As IRibbonControl)
    2. End Sub

    oder mit latebinding:

    Visual Basic-Quellcode

    1. Sub insertDocID(control As Object)
    2. End Sub


    Wie du sehen kannst, steht im XML bei onAction eben dieser Callback drinnen.

    Alle Objekte auf deinem Custom Ribbon, die etwas aktiv tun, brauchen so einen Callback.

    In dem Callback rufst du dann eine andere Methode oder Funktion auf.
    In deinem Fall eben den Sub Mail.

    Ich verwende für Office Ribbons + VBA den Custom UI Editor um die Ribbons zu erstellen
    @Petersilie
    Also hätte ich theoretisch das onAction (vom Button im Ribbon) mit dem Namen meiner Sub versehen müssen, um das Early Binding zu verwenden?
    Gibt es irgendwo einen Hint zum Verzeichnis, wo dieser Eintrag hinterlegt ist?

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „Sam85“ ()

    @Sam85
    Hallo,
    so ganz verstehe ich jetzt nicht was du mit Verzeichnis meinst?

    Wie erstellst du denn deine Ribbons?

    Es reicht eigentlich wenn du ein Modul erstellst, und dort die Callbacks reinschreibst.
    Natürlich musst du die Callbacks in der XML Datei auch zu den passenden Controls schreiben.

    Die Controls sollten ihren jeweiligen Callback dann schon von alleine finden.
    @Petersilie

    Das Ribbon erstelle ich nicht. Ich benutze das vorhandene und erstelle nur ein neues Register. (Oder Missverstehe ich jetzt den Begriff Ribbon )
    Verzeichnis ist vermutlich etwas ungünstig gewählt gewesen, eigentlich meinte ich den Ursprung wo der XML Code eingetragen steht, also die XML Datei und dessen Verzeichnis. Aber wenn das lediglich mit der Ribbonerstellung in Verbindung steht, hat sich das erstmal erübrigt.
    Hallo!

    Wenn Du das Menüband über die Excel-Optionen anpasst werden die Anpassungen in der excel.officeUI gespeichert. Diese findest Du in Deinem persönlichen Ordner unter C:\Users\Username\AppData\Local\Microsoft\Office. "AppData" ist standardmäßig ausgeblendet. In meiner Signatur findest Du einen Link zu meinem RibbonX-Workshop. Darin findest Du auch einen Teil der sich mit der Anpassung über das Office-Menü befasst.

    Ribbon ist die englische Bezeichnung für das Menüband (in Office 2007 noch Multifunktionsleiste genannt).

    Edit:
    Die excel.officeUI solltest Du übrigens nicht anpassen wenn Du Dich nicht auskennst (da solltest Du erstmal den Workshop durcharbeiten).

    Gruß, René

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „mumpel“ ()