Das Notes Forum

Lotus Notes / Domino Sonstiges => OLE/COM-Programmierung => Thema gestartet von: Drehstuhlpilot am 17.01.18 - 15:46:30

Titel: Lotus-Notes-Vorlage via Excel-Makro aufrufen
Beitrag von: Drehstuhlpilot am 17.01.18 - 15:46:30
Hallo,

ich versuche seit geraumer Zeit mithilfe eines Excel-Makros, eine Mail-Vorlage in Lotus Notes (8.5.3FP6 SHF784) zu öffnen und nutze dazu folgenden Code:

Code
Sub SendMail()

Dim Maildb As Object
Dim UserName As String
Dim MailDbName As String
Dim MailDoc As Object
Dim session As Object
Dim Recipient As String
Dim attachment As String

Set session = CreateObject("Notes.NotesSession")
Set Maildb = session.currentdatabase
Set MailDoc = Maildb.CreateDocument("", "", "Vorlage")

attachment = "<Pfad zum Anhang>"

MailDoc.Form = "Memo"
Recipient = "MaxMustermann@live.com"
MailDoc.sendto = Recipient
MailDoc.Subject = "Betreff"
MailDoc.body = "Nachrichtentext"

stAttachment = ActiveWorkbook.FullName
Set AttachME = MailDoc.CREATERICHTEXTITEM("stAttachment")
Set EmbedObj = AttachME.EMBEDOBJECT(1454, "", attachment, "stAttachment")
                        
MailDoc.SAVEMESSAGEONSEND = True
MailDoc.SEND 0, Recipient
Set Maildb = Nothing
Set MailDoc = Nothing
Set AttachME = Nothing
Set session = Nothing
Set EmbedObj = Nothing

End Sub

Leider scheitere ich daran, dass Notes die Vorlage nicht aufrufen will. Habe schon diverse Lösungsansätze von Usern mit ähnlich gelagertem Problem ausprobiert, jedoch waren dort noch weitere andere Baustellen, sodass ich zu diesem konkreten Problem noch keine wirkliche Lösung finden konnte.

Muss die Vorlage (lokal im Client über "Werkzeuge->Vorlage->Neue Vorlage" erstellt) mit einem anderen Befehl angesteuert bzw. aufgerufen werden?

Btw: Agentenrechte nicht vorhanden.

Danke im Voraus.
Titel: Re: Lotus-Notes-Vorlage via Excel-Makro aufrufen
Beitrag von: Tode am 17.01.18 - 16:24:56
Ok.... Also erstmal ein paar Fragen:

- Willst Du eine NEUE Vorlage erstellen, oder eine vorhandene öffnen?
- Willst Du die Mail zum bearbeiten öffnen oder direkt versenden?
Titel: Re: Lotus-Notes-Vorlage via Excel-Makro aufrufen
Beitrag von: Drehstuhlpilot am 17.01.18 - 17:52:09
Die Vorlage existiert bereits und soll nur noch durch das Makro geöffnet werden.

Ursprünglich war geplant, die Mail direkt zu versenden. Falls umsetzbar, wäre es jedoch super, wenn sie nach Erstellung durch das Makro noch einmal überprüft und ggf. bearbeitet werden könnte.

Titel: Re: Lotus-Notes-Vorlage via Excel-Makro aufrufen
Beitrag von: jBubbleBoy am 17.01.18 - 18:26:18
Dein Code versendet die Mail, das muss ersetzt werden mit:
Code
Dim ws As Object
Set ws = CreateObject("Notes.NotesUIWorkspace")
set mailUiDoc = ws.editDocument( true, mailDoc )
Titel: Re: Lotus-Notes-Vorlage via Excel-Makro aufrufen
Beitrag von: Drehstuhlpilot am 18.01.18 - 08:07:08
Das klappt schonmal einwandfrei, top!

Jetzt bleibt nur noch das Problem mit der zu öffnenden Vorlage.
Titel: Re: Lotus-Notes-Vorlage via Excel-Makro aufrufen
Beitrag von: Tode am 18.01.18 - 08:46:33
Du holst Dir die Ansicht mit allen Vorlagen mittels NotesDatabase.getView( "Stationery" ).
Dann holst Du die entsprechende Vorlage aus dieser Ansicht über NotesView.GetDocumentByKey( "Name der Vorlage") (geht nicht, weil Ansicht nicht sortiert nach Name)
einen NotesViewNavigator und einer While- Schleife, in der Du die NotesViewEntry- Elemente prüfst, ob Sie Deinen Vorlagennamen haben.

Dann benutzt Du den Code aus dem "QueryOpendocument"- Event der Ansicht (Stationary) um aus dieser Vorlage eine neue Mail zu generieren:

Code
			Dim note As New NotesDocument(db)
			Call vorlagedoc.copyallitems(note)
			Call note.ReplaceItemValue("Form",vorlagedoc.Form(0))
			Call note.RemoveItem("$VersionOpt")
			Call note.RemoveItem("$NoPurge")
			Call note.RemoveItem("ProtectFromArchive")
			Call note.RemoveItem("MailStationeryName")
			Call note.RemoveItem("IsMailStationery")
			Call note.ReplaceItemValue("tmpSkipSignature","1")
			

Dann füllst Du den Empfänger und ggf. andere Daten (wie Du es in Deinem Code schon machst) und versendest das Ding über note.Send
Titel: Re: Lotus-Notes-Vorlage via Excel-Makro aufrufen
Beitrag von: Drehstuhlpilot am 18.01.18 - 10:43:41
Okay, also mit dem NotesViewNavigator bin ich nun leicht überfordert. Wenn ich versuche, den Navigator via

Code
Set NotesViewNavigator = NotesView.CreateViewNav

festzulegen, gibt er mir den Laufzeitfehler 91 (Objektvariable oder With-Blockvariable nicht festgelegt).

Wenn ich NotesView via

Code
Set NotesView = NotesDatabase.getView("Stationary")

festlegen möchte, gibt er mir den Laufzeitfehler 438 (Objekt unterstützt diese Eigenschaft oder Methode nicht).

Irgendwie steh' ich auf dem Schlauch...  ???

Titel: Re: Lotus-Notes-Vorlage via Excel-Makro aufrufen
Beitrag von: Andrew Harder am 18.01.18 - 12:39:53
Also wenn Du die View schon nicht bekommst, wirst Du Dir von der nicht vorhandenen View auch keinen Navigator erstellen können.
Soweit logisch.
Leider fehlt der Rest vom Code, muss man dann halt raten.

Am besten mal den Testcode in einen Agent packen und den Debugger anwerfen.
sollte in etwa so etwas sein - fast zu 100% aus der Notes Designerhifle kopiert:
Code
Dim session As NotesSession
Dim db As NotesDatabase
Dim view As NotesView
Dim nav As NotesViewNavigator

set session = New NotesSession
Set db = session.CurrentDatabase
Set view = db.GetView("Stationary")
Set nav = view.CreateViewNav()
Titel: Re: Lotus-Notes-Vorlage via Excel-Makro aufrufen
Beitrag von: Tode am 18.01.18 - 12:54:40
Du kennst aber schon den Unterschied zwischen Klassen (NotesDatabase, NotesView, NotesViewNavigator) und daraus instantiierten Variablen, oder?
Weil wenn nicht, dann müssten wir Dir hier den kompletten Code runtertippen und Du müsstest ihn einsetzen ohne zu verstehen, was da passiert... Das ist nicht Sinn des Forums.

Denn: Code im Auftrag zu schreiben ist mein Job (und der von vielen anderen im Forum), das werde ich nicht kostenlos im Forum anbieten.
Hilfe zur Selbsthilfe dagegen schon.

EDIT: Nur nebenbei: Dein Set MailDB = session.CurrentDatabase funktioniert nur, wenn die Mail- Datenbank zufällig die gerade geöffnete Datenbank im Client ist... Wenn Du gerade im persönlichen Adressbuch stehst, dann wird der ganze Code knallen...

Set MailDB = Session.CreateDatabase( "", "" )
Call mailDB.OpenMail()

wäre richtig...
Titel: Re: Lotus-Notes-Vorlage via Excel-Makro aufrufen
Beitrag von: Drehstuhlpilot am 18.01.18 - 15:01:38
Also mit den Notes-Klassen kann das VBA hier leider nichts anfangen. Evtl. wurde die .dll auch noch gar nicht registriert. Aus einer Prüfung der regedit wir leider auch nichts, da keine Rechte vorhanden sind. :$

Im Folgenden dennoch mal der Code bis zur (geplanten) Erstellung des Navigators:

Code
Dim session As Object
Dim db As Object
Dim view As Object
Dim nav As Object

set session = New NotesSession
Set db = session.GetDatabase("", "")
Call db.OpenMail
Set view = db.GetView("Stationary")
Set nav = view.CreateViewNav()

In der letzten Zeile gibt er nach wie vor den Laufzeitfehler 91. Vermutlich wegen der fehlenden library...
Titel: Re: Lotus-Notes-Vorlage via Excel-Makro aufrufen
Beitrag von: Tode am 18.01.18 - 15:19:00
Dass VBA mit den Klassen nichts anfangen kann ist vollkommen egal und normal. Mache doch bitte mal nach Call db.OpenMail ein Msgbox db.Title & " - " & db.Server & " - " & db.FilePath

Ist das wirklich die Mail- Datenbank des aktuellen Benutzers?

Ach ja: Stationary ist falsch. Die Ansicht heisst Stationery
Titel: Re: Lotus-Notes-Vorlage via Excel-Makro aufrufen
Beitrag von: Drehstuhlpilot am 18.01.18 - 16:39:05
Wie's aussieht läuft der Navigator nun. Die Mail-Datenbank ist auch tatsächlich die richtige.

Allerdings scheitere ich nun bereits im Ansatz bei der While-Schleife zum Prüfen der NotesViewEntry-Einträge und werde mich wohl oder übel nach einer anderen Lösung umsehen müssen.

Dennoch nochmal vielen Dank für die Hilfe und Unterstützung.
Titel: Re: Lotus-Notes-Vorlage via Excel-Makro aufrufen
Beitrag von: Tode am 18.01.18 - 16:53:18
Nicht gleich verzweifeln... Einmal gebe ich Dir noch nen "Schubs" in die richtige Richtung:

Code
found = False
Set ve = nav.GetFirstEntry()
While found = false and not ve is Nothing
  Set vorlagedoc = ve.Document
  If vorlagedoc.GetitemValue( "MailStationeryName" )(0) = "Name Deiner Vorlage" Then
    found = True
  End If
  Set ve = nav.GetNextentry(ve)
Wend

if found = True then
  '- hier kommt der code, um eine Kopie zu erstellen
End If

Aber vermutlich wäre es wirklich das beste, jemanden zu engagieren... Denn von ErrorHandling, Reaktion wenn die Vorlage nicht existiert, Dokument zum bearbeiten öffnen, etc. haben wir ja überhaupt noch nicht gesprochen...
Titel: Re: Lotus-Notes-Vorlage via Excel-Makro aufrufen
Beitrag von: Drehstuhlpilot am 19.01.18 - 07:46:38
In der Zeile

Code
Set ve = nav.GetFirstEntry()

wird der Laufzeitfehler 438 gemeldet. Muss ve hier als was anderes als Object deklariert werden?
Titel: Re: Lotus-Notes-Vorlage via Excel-Makro aufrufen
Beitrag von: jBubbleBoy am 19.01.18 - 09:13:09
zeig doch mal deinen ganzen Code, nur eine Zeile ist da nicht ausreichend.
Titel: Re: Lotus-Notes-Vorlage via Excel-Makro aufrufen
Beitrag von: Drehstuhlpilot am 19.01.18 - 09:42:17
Code
Sub SendMail()

Dim db As Object
Dim session As Object
Dim view As Object
Dim nav As Object
Dim vorlagedoc As Object
Dim ve As Object

Set session = CreateObject("Notes.NotesSession")
Set db = session.GetDatabase("", "")
Call db.OpenMail
Set view = db.GetView("Stationery")
Set nav = view.CreateViewNav()
Set ve = nav.GetFirstEntry()

found = False
While found = False And Not ve Is Nothing
    Set vorlagedoc = ve.Document
    If vorlagedoc.GetitemValue("MailStationeryName")(0) = "<Vorlagenname>" Then
        found = True
    End If
    Set ve = nav.GetNextentry(ve)
Wend
Titel: Re: Lotus-Notes-Vorlage via Excel-Makro aufrufen
Beitrag von: jBubbleBoy am 19.01.18 - 09:57:23
OK, da eh auf das Backend-Dokument zugegriffen wird und nicht der NotesView-Index ausgewertet wird - kann man sich den NotesViewNavigator auch schenken und die Ansicht auf klassischer, einfachen Art durchlaufen, das ist bei den Mail-Vorlagen auch nicht falsch, der Code sieht dann so aus:
Code
Dim db As Object
Dim session As Object
Dim view As Object
Dim vorlagedoc As Object

Set session = CreateObject("Notes.NotesSession")
Set db = session.GetDatabase("", "")
Call db.OpenMail
Set view = db.GetView("Stationery")

Set vorlagedoc = view.getFirstDocument
Do Until vorlagedoc Is Nothing
    If vorlagedoc.getItemValue("MailStationeryName")(0) = "<Vorlage>" Then Exit Do
    Set vorlagedoc = view.getNextDocument(vorlagedoc)
Loop

If Not vorlagedoc Is Nothing Then MsgBox "Vorlage: " + vorlagedoc.getItemValue("MailStationeryName")(0)
Titel: Re: Lotus-Notes-Vorlage via Excel-Makro aufrufen
Beitrag von: Tode am 19.01.18 - 10:03:45
Ich glaube, das Problem ist ein anderes: Ich glaube, dass VBA mit dem Set nicht zurecht kommt, was man in LotusScript ja unbedingt braucht... Probiere das mal wegzulassen... Bin mir aber nicht sicher...
Titel: Re: Lotus-Notes-Vorlage via Excel-Makro aufrufen
Beitrag von: jBubbleBoy am 19.01.18 - 10:08:17
Set wird in VBA genauso benötigt wie in LotusScript.
Titel: Re: Lotus-Notes-Vorlage via Excel-Makro aufrufen
Beitrag von: jBubbleBoy am 19.01.18 - 10:15:15
Der Fehler beim NotesViewNavigator besteht in "nav.GetFirstEntry", das müsste korrekter weise "nav.GetFirst" heißen, für den Fall das ihr mit dem NotesViewNavigator weitermachen wollt ;)
Titel: Re: Lotus-Notes-Vorlage via Excel-Makro aufrufen
Beitrag von: Drehstuhlpilot am 19.01.18 - 10:59:58
Okay, also mit dem Code ohne Navigator

Code
Sub SendMail()

Dim db As Object
Dim session As Object
Dim view As Object
Dim vorlagedoc As Object
Dim doc As Object
Dim note As Object
Dim ws As Object

Set session = CreateObject("Notes.NotesSession")
Set ws = CreateObject("Notes.NotesUIWorkspace")
Set db = session.GetDatabase("", "")
Call db.OpenMail
Set view = db.GetView("Stationery")

Set vorlagedoc = view.getFirstDocument
Do Until vorlagedoc Is Nothing
    If vorlagedoc.getItemValue("MailStationeryName")(0) = "<Vorlage>" Then Exit Do
    Set vorlagedoc = view.getNextDocument(vorlagedoc)
Loop

If Not vorlagedoc Is Nothing Then MsgBox "Vorlage: " + vorlagedoc.getItemValue("MailStationeryName")(0)

Call vorlagedoc.copyallitems(doc)

Set doc = vorlagedoc

With doc
.Form = "Memo"
Recipient = "MaxMustermann@live.com"
.sendto = Recipient
.Subject = "Betreff"
.body = "Nachrichtentext"
End With

Set doc = ws.EditDocument(True, doc)
Set db = Nothing
Set doc = Nothing
Set session = Nothing

End Sub

durchläuft er sämtliche Schritte, findet durch die Do-Loop-Schleife auch anscheinend die richtige Vorlage, erstellt auch im weiteren Verlauf eine Mail, nutzt hierbei jedoch die Vorlage nicht. :$

(Den Block mit den "Call note.[...]" nach

Code
Call vorlagedoc.copyallitems(note)
musste ich rausnehmen, da er mir den Laufzeitfehler 458 ausgab).

Beim Code mit Navigator und mit "nav.GetFirst" anstatt "nav.GetFirstEntry"

Code
Dim db As Object
Dim session As Object
Dim view As Object
Dim nav As Object
Dim vorlagedoc As Object
Dim ve As Object

Set session = CreateObject("Notes.NotesSession")
Set db = session.GetDatabase("", "")
Call db.OpenMail
Set view = db.GetView("Stationery")
Set nav = view.CreateViewNav()
Set ve = nav.GetFirst

found = False
While found = False And Not ve Is Nothing
    Set vorlagedoc = ve.Document
    If vorlagedoc.GetitemValue("MailStationeryName")(0) = "<Vorlagenname>" Then
        found = True
    End If
    Set ve = nav.GetNextentry(ve)
Wend

gibt er mir in der Zeile
Code
If vorlagedoc.GetitemValue("MailStationeryName")(0) = "<Vorlagenname>" Then
wieder den Laufzeitfehler 91.  ???
Titel: Re: Lotus-Notes-Vorlage via Excel-Makro aufrufen
Beitrag von: Tode am 19.01.18 - 11:57:01
Das war es was ich meinte: Du VERSTEHST den Code nicht, den Du einsetzt.

Im ersten Beispiel z.B. erstellst Du KEIN neues Dokument doc, sondern verweist auf das vorlagedoc... Und die Reihenfolge ist ausserdem falsch rum, weshalb natürlich ein CopyAllItems fehlschlägt...

Statt
Code
Call vorlagedoc.copyallitems(doc)
Set doc = vorlagedoc
müsstest Du schreiben:
Code
Set doc = db.CreateDocument()
Call vorlagedoc.copyallitems(doc)

Im zweiten Beispiel ist es so, dass die Ansicht auch Kategorien enthält. Und diese bekommst Du mit getfirst... Diese Kategorien haben kein Dokument, es müsste also ein If ve.IsDocument then vor das Set vorlagedoc =...

Aber mir wird das Ganze jetzt hier zu aufwändig, ich bin raus.
Viel Glück weiterhin.
Titel: Re: Lotus-Notes-Vorlage via Excel-Makro aufrufen
Beitrag von: jBubbleBoy am 19.01.18 - 12:28:08
@torsten: man fängt immer klein an ;)
@drehstuhl: du hast es fast geschafft:
Code
Dim db As Object
Dim session As Object
Dim view As Object
Dim vorlagedoc As Object
Dim docMail As Object
Dim note As Object
Dim ws As Object

Const vorlage = "<<Vorlage>>"

Set session = CreateObject("Notes.NotesSession")
Set ws = CreateObject("Notes.NotesUIWorkspace")
Set db = session.GetDatabase("", "")
Call db.OpenMail
Set view = db.GetView("Stationery")

Set vorlagedoc = view.getFirstDocument
Do Until vorlagedoc Is Nothing
    If vorlagedoc.getItemValue("MailStationeryName")(0) = vorlage Then Exit Do
    Set vorlagedoc = view.getNextDocument(vorlagedoc)
Loop

If vorlagedoc Is Nothing Then MsgBox "Vorlage ''" + vorlage + "'' wurde nicht gefunden": Exit Sub

Set docMail = db.createDocument
Call vorlagedoc.copyallitems(docMail)
docMail.Save True, False
Call ws.EditDocument(True, docMail)
Titel: Re: Lotus-Notes-Vorlage via Excel-Makro aufrufen
Beitrag von: Drehstuhlpilot am 22.01.18 - 07:27:18
Perfekt, so funktioniert's! Vielen Dank!
Titel: Re: Lotus-Notes-Vorlage via Excel-Makro aufrufen
Beitrag von: Tode am 22.01.18 - 09:41:05
Nein, so funktioniert es nur teilweise... Du musst unbedingt nach dem CopyAllItems die Vorlagen- spezifischen Felder entfernen, sonst hast Du sehr seltsame Nebenwirkungen, entweder beim Absender oder beim Empfänger (z.B. die neuen Mails werden alle als Vorlage angezeigt, diese Mails können nicht archiviert werden, etc.)...

Bitte ergänze nach dem CopyAllitems noch unbedingt die von mir geposteten Zeilen:
Code
			Call note.RemoveItem("$VersionOpt")
			Call note.RemoveItem("$NoPurge")
			Call note.RemoveItem("ProtectFromArchive")
			Call note.RemoveItem("MailStationeryName")
			Call note.RemoveItem("IsMailStationery")
			'- diese Zeile kannst Du weglassen, wenn Du die Signatur angängen willst und nicht "Skippen"
			Call note.ReplaceItemValue("tmpSkipSignature","1")
Titel: Re: Lotus-Notes-Vorlage via Excel-Makro aufrufen
Beitrag von: Drehstuhlpilot am 22.01.18 - 09:54:36
Alles klar. Danke nochmal für den Hinweis!