Outlook Ribbon - Bei Klick auf Button ...

  • VB.NET

Es gibt 26 Antworten in diesem Thema. Der letzte Beitrag () ist von MK_CGN.

    Neu

    @ErfinderDesRades: Ich habe jetzt folgendes umgesetzt:

    VB.NET-Quellcode

    1. Public Class Test_Ribbon
    2. Public Pfad_Vorlage As String
    3. Private Sub AnyButton_Click(sender As Object, e As Microsoft.Office.Tools.Ribbon.RibbonControlEventArgs) Handles btn_Test_1.Click, btn_Test_2.Click
    4. Dim frm As Form
    5. Select Case True
    6. Case sender Is btn_Test_1 : frm = New frm_Test1()
    7. Pfad_Vorlage = My.Settings.TextBox_Vorlage1
    8. msgbox(Pfad_Vorlage)
    9. Case sender Is btn_Test_2 : frm = New frm_Test1()
    10. Pfad_Vorlage = My.Settings.TextBox_Vorlage2
    11. msgbox(Pfad_Vorlage)
    12. Case Else : Throw New InvalidOperationException("unknown Ribbon-Button clicked")
    13. End Select
    14. frm.ShowDialog()
    15. End Sub


    Das funktioniert soweit auch. Das jeweilige Form, in dem Fall identisch wird aufgerufen und in der Messagebox (dient nur zum Testen) erscheint der Pfad zur Vorlage.
    Allerdings erhalte ich eine Fehlermeldung "Der Vorgang konnte nicht abgeschlossen werden. Mindestens ein Parameterwert ist ungültig"! Die kommt vom Catch Befehl am Ende der Form.
    Ich habe mir einen Haltepunkt gesetzt und in Einzelschritten ein Debugging vorgenommen. Was mir aufgefallen ist, er scheint das "Try" nicht zu durchlaufen und somit öffnet er auch kein Mailtemplate.

    Habe ich an irgendeiner Stelle was vergessen?

    Hier der Code der Form.

    VB.NET-Quellcode

    1. Imports System.Data
    2. Imports System.Data.SqlClient
    3. Imports System.Windows.Forms
    4. Public Class frm_Test1
    5. Public Property Pfad_Vorlage As String
    6. Private Sub btn_DBAbfrage_Click(sender As Object, e As EventArgs) Handles btn_DBAbfrage.Click
    7. ' Quellcode nicht dargestellt, funktioniert einwandfrei dient zur Abfrage der Datenbank und füllen der Textmarken in der Email-Vorlage.
    8. End Sub
    9. Private Sub Btn_close_Click(sender As Object, e As EventArgs) Handles btn_close.Click
    10. Close()
    11. End Sub
    12. Private Sub Btn_Vorlage_Click(sender As Object, e As EventArgs) Handles btn_Vorlage.Click
    13. Timer1.Start()
    14. Close()
    15. End Sub
    16. Private Sub Timer1_Tick(sender As Object, e As EventArgs) Handles Timer1.Tick
    17. Timer1.Stop()
    18. Dim ThisOutlookSession As Outlook.Application = New Outlook.Application
    19. Dim NS As Outlook.NameSpace = ThisOutlookSession.Session
    20. Dim myOlApp As Outlook.Application
    21. Dim myOlExp As Outlook.Explorer
    22. Dim myOlSel As Outlook.Selection
    23. Dim moft As Outlook.Application
    24. Dim mMail As Outlook.MailItem
    25. Dim strbody As String
    26. Dim objItem As Object
    27. Dim Anrede As String
    28. moft = CreateObject("Outlook.Application")
    29. Try
    30. For Each row As DataGridViewRow In DGV_Datenbankabfrage.Rows
    31. Dim isSelected As Boolean = Convert.ToBoolean(row.Cells("checkBoxColumn").Value)
    32. If isSelected Then
    33. mMail = moft.CreateItemFromTemplate(Pfad_Vorlage)
    34. mMail.Display()
    35. mMail.SentOnBehalfOfName = "xxx@xxx.xxx"
    36. objItem = ThisOutlookSession.ActiveInspector.CurrentItem()
    37. myOlApp = ThisOutlookSession.Application
    38. myOlExp = myOlApp.ActiveExplorer
    39. myOlSel = myOlExp.Selection
    40. myOlApp.GetNamespace("MAPI").Logon()
    41. ' Übergabe der E-Mail Adresse
    42. mMail.To = row.Cells(7).Value.ToString()
    43. ' Übergabe und prüfung der Anrede
    44. If row.Cells(34).Value.ToString() = "Herrn" Then
    45. Anrede = "Herr"
    46. Else Anrede = "Frau"
    47. End If
    48. ' Erstellen der Betreffzeile
    49. objItem.subject = row.Cells(148).Value.ToString() & " " & "-" & " " & objItem.Subject & row.Cells(35).Value.ToString() & ", " & row.Cells(36).Value.ToString()
    50. ' Ersetzen der Textmarken Anrede und Nachname
    51. strbody = mMail.HTMLBody
    52. strbody = Replace(strbody, "%Anrede%", Anrede)
    53. strbody = Replace(strbody, "%Nachname%", row.Cells(35).Value.ToString())
    54. 'Ersetzung von weiteren Textmarken...
    55. mMail.HTMLBody = strbody
    56. End If
    57. Next
    58. Catch ex As System.Exception
    59. MsgBox(ex.Message)
    60. End Try
    61. End Sub
    62. End Class

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

    Neu

    bitte benutz die vb.net-Tags des Forums. So uncoloriert mag ich deinen Code nicht lesen.
    Zu snippet#1 hätte ich die Frage: Was bezwecken die Zeilen #9-10, #12-13 ?

    snippet#2 guck ist mir zu lang, um da durchzusteigen - vor allem so uncoloriert.
    So oberflächlich sehe ich auch überhaupt keinenmm Zusammenhang mit dem 1.Snippet.

    Neu

    Hallo und guten Morgen,
    Habe die Zeilen im 1 Snippet angepasst. Hatte versehentlich den richtigen Namen hinterlegt und nicht den frm_Test1. Somit hat das 1 Snippet was mit dem 2 Snippet zu tun. Den Code des 2. Snippet kann ich gerade. Nicht umformatieren, da ich vom Handy schreibe und da nicht die erweiterten Möglichkeiten zur Formatierung. Vielleicht geht es ja doch mit dem schauen, ansonsten versuche ich später die Umformatierung vom PC aus zu machen.

    So, die beiden Snippets in #21 sind jetzt auch in vb.net-Tags formatiert. Sollte somit besser zu lesen sein :)

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

    Neu

    MK_CGN schrieb:

    Hatte versehentlich den richtigen Namen hinterlegt und nicht den frm_Test1.
    Diese Denke ist verkehrtrum.
    Bitte poste keinen Code, den du nachträglich noch umarbeitest warum auch immer. Da baust du nur Fehler ein, auf denen wir dann herumhacken.
    ZB so wies jetzt ist, ist die Benamung eine Katastrophe.
    Ein Form sollte so heissen wie wozu es zuständig ist. frmTest1 ist kein Name für ein Form - das war also vor deinen Manipulationen um Welten besser, und hätte man nix zu sagen müssen.
    Also bitte ändere die Benamung wieder so, dass sie verständliche Aussagen macht.
    Wir wollen und doch über die gecodeten Objekte austauschen, aber zu einem frmTest mit fast 100 Zeilen habich nix zu sagen, ausser dass ich keine Ahnung, wozu es gut sein soll.



    Warum bekomme ich keine Antwort auf meine doch ganz konkrete und ich meine einfache Frage? (post#22)

    Neu

    Ich verstehe, dass es normalerweise nicht ideal ist, frm-Namen oder sonstige Deklarationen umzubenennen, um hier Hilfe zu erbeten. Allerdings sind in meinem Quellcode Informationen enthalten, die ich so nicht schreiben kann...

    Aber nun nochmal zusammengefasst.

    VB.NET-Quellcode

    1. ​Imports Microsoft.Office.Tools.Ribbon
    2. Imports Microsoft.Office.Interop.Outlook
    3. Imports System.Net
    4. Imports System.Data
    5. Imports System.Data.SqlClient
    6. Imports System
    7. Imports System.Text.RegularExpressions
    8. Imports System.Windows.Forms
    9. Public Class Test_Ribbon
    10. Public Pfad_Vorlage As String
    11. Private Sub AnyButton_Click(sender As Object, e As Microsoft.Office.Tools.Ribbon.RibbonControlEventArgs) Handles btn_Test_1.Click, btn_Test_2.Click
    12. Dim frm As Form
    13. Select Case True
    14. Case sender Is btn_Test_1 : frm = New frm_Datenbankabfrage()
    15. Pfad_Vorlage = My.Settings.TextBox_Vorlage_1
    16. Case sender Is btn_Test_2 : frm = New frm_Datenbankabfrage()
    17. Pfad_Vorlage = My.Settings.TextBox_Vorlage_2
    18. Case Else : Throw New InvalidOperationException("unknown Ribbon-Button clicked")
    19. End Select
    20. frm.ShowDialog()
    21. End Sub


    und hier die Datei "frm_Datenbankabfrage":

    VB.NET-Quellcode

    1. Public Class frm_Datenbankabfrage
    2. Public Property Pfad_Vorlage As String
    3. ' ############################################################################################
    4. ' ########## Herstellen der DB-Verbindung und Abfrage der erforderlichen Parameter ###########
    5. Private Sub btn_DBAbfrage_Click(sender As Object, e As EventArgs) Handles btn_DBAbfrage.Click
    6. ' Herstellen der Verbindung zur MSSQL Datenbank und Abfrage nach Suchkritierum
    7. ' Quellcode nicht relevant, funktioniert 100% tig
    8. End Sub
    9. ' ############################################################################################
    10. ' ################################ Übergabe der Werte aus DB #################################
    11. Private Sub Btn_Vorlage_Click(sender As Object, e As EventArgs) Handles btn_Vorlage.Click
    12. Timer1.Start()
    13. Close()
    14. End Sub
    15. ' ############################################################################################
    16. ' ################## Öffnen der Vorlage und Ersetzen der Textmarken ##########################
    17. Private Sub Timer1_Tick(sender As Object, e As EventArgs) Handles Timer1.Tick
    18. Timer1.Stop()
    19. Dim ThisOutlookSession As Outlook.Application = New Outlook.Application
    20. Dim NS As Outlook.NameSpace = ThisOutlookSession.Session
    21. Dim myOlApp As Outlook.Application
    22. Dim myOlExp As Outlook.Explorer
    23. Dim myOlSel As Outlook.Selection
    24. Dim moft As Outlook.Application
    25. Dim mMail As Outlook.MailItem
    26. Dim strbody As String
    27. Dim objItem As Object
    28. moft = CreateObject("Outlook.Application")
    29. Try
    30. For Each row As DataGridViewRow In DGV_Datenbankabfrage.Rows
    31. Dim isSelected As Boolean = Convert.ToBoolean(row.Cells("checkBoxColumn").Value)
    32. If isSelected Then
    33. mMail = moft.CreateItemFromTemplate(Pfad_Vorlage)
    34. mMail.Display()
    35. mMail.SentOnBehalfOfName = "geheimschutz@atos.net"
    36. objItem = ThisOutlookSession.ActiveInspector.CurrentItem()
    37. myOlApp = ThisOutlookSession.Application
    38. myOlExp = myOlApp.ActiveExplorer
    39. myOlSel = myOlExp.Selection
    40. myOlApp.GetNamespace("MAPI").Logon()
    41. ' Übergabe der E-Mail Adresse
    42. mMail.To = row.Cells(7).Value.ToString()
    43. ' Erstellen der Betreffzeile
    44. objItem.subject = row.Cells(148).Value.ToString() & " " & "-" & " " & objItem.Subject & row.Cells(35).Value.ToString() & ", " & row.Cells(36).Value.ToString()
    45. ' Ersetzen der Textmarken Anrede und Nachname
    46. strbody = mMail.HTMLBody
    47. strbody = Replace(strbody, "%Anrede%", Anrede)
    48. strbody = Replace(strbody, "%Nachname%", row.Cells(35).Value.ToString())
    49. ' Ersetzen weiterer Textmarken Links
    50. mMail.HTMLBody = strbody
    51. End If
    52. Next
    53. Catch ex As System.Exception
    54. MsgBox(ex.Message)
    55. End Try
    56. End Sub
    57. End Class


    Was ich durch das Debugging mit Haltepunkt und EInzelschritt Ausführung festgestellt habe, ist dass in der Test_Ribbon die globale Variable "Pfad_Vorlage" den richtigen Pfad zur oft-Vorlage zugewiesen bekommt.

    In der frm_Datenbanabfrage habe ich einen weiteren Haltepunkt in der Zeile mit der Pfad_Vorlage gesetzt und hier wird nicht der richtige Pfad zugewiesen, sondern es erhält den Wert "Nothing".
    Da liegt derzeit mein Problem.

    Zu Deiner Frage aus #22:
    In der Zeile 9 weise ich der globalen Variablen Pfad_Vorlage den entsprechenden Pfad für die Vorlage 1 zu. In Zeile 10 habe ich die Messagebox für mich hinterlegt um zu prüfen, ob die Variable Pfad_Vorlage auch einen Wert zugewiesen bekommt. Habe ich aber jetzt aus dem Quellcode entfernt.
    In der Zeile 12 weise ich der globalen Variablen Pfad_Vorlage den entsprechenden Pfad für die Vorlage 2 zu. In Zeile 13 habe ich die Messagebox für mich hinterlegt um zu prüfen, ob die Variable Pfad_Vorlage auch einen Wert zugewiesen bekommt. Habe ich aber jetzt aus dem Quellcode entfernt.

    Ich hoffe, auch wenn der Beitrag wieder etwas länger ist, das Du mir helfen kannst.

    Neu

    MK_CGN schrieb:

    ist dass in der Test_Ribbon die globale Variable "Pfad_Vorlage" den richtigen Pfad zur oft-Vorlage zugewiesen bekommt.
    Ähm - die Variable ist Public, nicht global.

    MK_CGN schrieb:

    In der frm_Datenbanabfrage habe ich einen weiteren Haltepunkt in der Zeile mit der Pfad_Vorlage gesetzt und hier wird nicht der richtige Pfad zugewiesen, sondern es erhält den Wert "Nothing".
    Das ist eine andere Variable, mit demselben Namen: Pfad_Vorlage.
    Beachte: Nur weil zwei Variablen in verschiedenen Klassen denselben Namen haben, sind es noch nicht dieselbe Variable.

    Aber mir scheint erkennbar, dass du iwas an frm_Datenbankabfrage.Pfad_Vorlage zuweisen möchtest.
    Tatsächlich weist du aber an Test_Ribbon.Pfad_Vorlage zu, das bringt in frm_Datenbankabfrage natürlich garnix.
    Weise doch einfach dahin zu, wohin du zuweisen willst:

    VB.NET-Quellcode

    1. Private Sub AnyButton_Click(sender As Object, e As Microsoft.Office.Tools.Ribbon.RibbonControlEventArgs) Handles btn_Test_1.Click, btn_Test_2.Click
    2. Dim frm As New frm_Datenbankabfrage() ' wenns immer derselbe Form-Typ ist - nämlich frm_Datenbankabfrage - kann man den auch gleich instanzieren
    3. Select Case True
    4. Case sender Is btn_Test_1 : frm.Pfad_Vorlage = My.Settings.TextBox_Vorlage_1
    5. Case sender Is btn_Test_2 : frm.Pfad_Vorlage = My.Settings.TextBox_Vorlage_2
    6. Case Else : Throw New InvalidOperationException("unknown Ribbon-Button clicked")
    7. End Select
    8. frm.ShowDialog()
    9. End Sub

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