Der vierte Teil dauerte nun etwas, was aber an meinem Mangel an Zeit lag.

Unsere Rechnung ist ja eigentlich schon fertig. Schön wäre es jedoch, wenn wir die Anschriften unserer Kunden direkt aus Outlook herausholen könnten und nicht erst nachschauen müssen, wie die Anschrift lautet.

Genau das beinhaltet dieser vierte und letzte Teil: Es wird eine Verbindung nach Outlook hergestellt und aus der Outlook-Kontakliste die Adresse herausgesucht und in das Adressfeld von Word geschrieben.

Dieser Teil ist für Nichtprogrammierer harter Tobak. Mein Tutorial kann leider keinen umfassenden Einblick in die Programmierung an sich geben. Der Nichtprogrammierer kann aber den Code durch Copy/Paste, wie in den anderen Teilen erklärt, einfügen und der Programmierer kann die ein oder andere Zeile vielleicht besser verstehen.

Wie auch immer wünsche ich viel Spaß mit dem Code und ordentliches Rechnungsschreiben!

 

Dokumentation
Code

 geschlossenetextmarke

 

In Teil 2 habe ich erklärt, wie eine Textmarke in Word eingefügt wird und das anstelle dieser Textmarke dann die laufende Rechnungsnummer ausgegeben wird. Es gibt noch eine zweite Variation der Textmarke: Die geschlossene Textmarke. Den Inhalt/Text einer "offenen Textmarke können Sie nicht formatieren. Eventuelle Formatierungen müssen Sie in Word vornehmen und gilt dann für die gesamte Eingabe. Mit einer geschlossenen Textmarke begrenzen Sie den Eingabebereich und können auch aus der Programmierung heraus Formatierungen vornehmen. In diesem Beispiel geht es dabei nur um Fettschrift. Der Name/Firma muss fett formatiert werden und die Anschrift in Normalschrift ausgegeben werden.

Im Adressfeld schreibe ich zwei Wörter untereinander:

  • Auftraggeber
  • Anschrift

Danach markiere ich zunächst das erste Wort - Auftraggeber - und gehe, wie bereits beschrieben, über das Word-Menüband "Einfügen" in der Gruppe "Links" auf das Icon "Textmarke" und trage dort zuerst Auftraggeber ein und wiederhole dieses anschließend mit der Anschrift. Vergessen Sie nicht das Wort "Anschrift" zu markieren, bevor Sie eine Textmarke setzen. Die Textmarken stehen nun in einer eckigen Klammer:

  • [Auftraggeber]
  • [Anschrift]

Das bedeutet, dass die Textmarken nur innerhalb dieser Klammern gültig sind. Somit kann gezielt formatiert werden, was bei einer offenen Textmarke nicht geht.

 

 Public Function funcGoOutlook(strSuche As String)
' +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
' Öffnen der Haupt-Kontakte und Suchen der Adresse in Outlook
' +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

Dim olAnw As Outlook.Application
Dim NaRa As Outlook.NameSpace
Dim KonVerz As Outlook.Folder
Dim KontaktItem As Outlook.ContactItem
Dim anschriftAuftraggeber As Range

On Error Resume Next

Set olAnw = CreateObject("Outlook.Application")
Set NaRa = olAnw.GetNamespace("MAPI")
Set KonVerz = NaRa.GetDefaultFolder(olFolderContacts)

For Each KontaktItem In KonVerz.Items
If InStr(1, LCase(KontaktItem), LCase(strSuche)) Then
Set anschriftAuftraggeber = ActiveDocument.Bookmarks("Auftraggeber").Range
ActiveDocument.Bookmarks("Auftraggeber").Range.Font.Bold = True
If KontaktItem.CompanyName = "" Then
anschriftAuftraggeber.Text = KontaktItem.FirstName & " " & KontaktItem.LastName
Else
anschriftAuftraggeber.Text = KontaktItem.CompanyName
End If
ActiveDocument.Bookmarks("AuftraggeberAnschrift").Range.Font.Bold = False
Set anschriftAuftraggeber = ActiveDocument.Bookmarks("AuftraggeberAnschrift").Range
anschriftAuftraggeber.Text = KontaktItem.BusinessAddressStreet & vbNewLine & _
KontaktItem.BusinessAddressPostalCode & " " & _
KontaktItem.BusinessAddressCity
Set anschriftAuftraggeber = ActiveDocument.Bookmarks("Anrede").Range
If KontaktItem.Title = "" Then
anschriftAuftraggeber.Text = " Damen und Herren"
ElseIf KontaktItem.Title = "Herr" Then
anschriftAuftraggeber.Text = "r Herr " & KontaktItem.LastName
ElseIf KontaktItem.Title = "Frau" Then
anschriftAuftraggeber.Text = " Frau " & KontaktItem.LastName
Else
anschriftAuftraggeber.Text = "r " & KontaktItem.Title & " " & KontaktItem.LastName
End If
End If
Next
End Function

Neues Modul in VBA für OutlookDer Code nun hat es ein wenig insich und ist leider nicht ganz so einfach nachzuvollziehen. Eingeben müssen Sie ihn in ein Modul. Legen Sie am besten ein neues Modul an. Genau so wie ich es in Teil 2 zur "laufenden Rechnungsnummer" beschrieben habe.

Set olAnw = CreateObject("Outlook.Application")
Set NaRa = olAnw.GetNamespace("MAPI")
Set KonVerz = NaRa.GetDefaultFolder(olFolderContacts)

Das Präfix "ol" steht für "Outlook". Ich arbeite mit diesen Präfixen um Variablen später sauber zuordnen zu können.

Zunächst weise ich dem Objekt olAnw das Objekt "Outlook" zu. Ich erzeuge damit eine neue Instanz, ein neues Outlook, mit dem ich nun auch konkret arbeiten kann.

NaRa speichert den Namensraum. In Outlook gibt es nur den Namensraum "MAPI". Über diesen Namensraum kann ich direkt auf den Ordner mit den Kontakten zugreifen (olFolderContacts), den ich in KonVerz speichere. In KonVerz stehen also alle Kontakte drinnen. Mit der For Each Schleife durchsuche ich diese Kontakte und kann den einzelnen Kontakt in jedem Schritt der Schleife in der Variablen KontaktItem abfragen.

Ganz am Anfang haben wir unserer Funktion einen Parameter übergeben: strSuche. In dieser Variablen wird das Suchwort stehen, dass wir eingeben. Also unser Kunde. Nun brauche ich nur noch zu überprüfen, ob der gesuchte Kunde in unserem einzelnen Kontakt steht.Und genau das mache ich mit dieser Zeile:

If InStr(1, LCase(KontaktItem), LCase(strSuche)) Then

LCase wandelt alle Buchstaben in kleine Buchstaben um. Damit kann ich problemlos überprüfen, ob die gesuchte Zeichenkette Bestandteil eines längeren Wortes ist. Wenn ich Beispielsweise nach der Firma "Steinabbau GmbH und Co KG" suche, reicht es völlig aus "Abbau" zu übergeben. Wenn ich im Beispiel das Suchwort"Abbau" übergebe, würde der Kunde "Steinabbau" nicht gefunden, weil dort das Wort "Abbau" mit einem kleinen "a" geschrieben wird. Damit das nicht passiert, wandel ich vor dem Suchen alle Buchstaben in Kleinbuchstaben um. Damit wird sowohl die Firma "Steinabbau" als auch die Firma "Stein-ABBAU" gefunden.

Mit InStr durchsuche ich das gesamte KontaktItem und weise danach die einzelnen Bestandteile meines Kontaktes den einzelnen Zeilen zu. Die Adresse übergebe ich an die Textmarke "Auftraggeber".

Mit ActiveDocument.Bookmarks("Auftraggeber").Range.Font.Bold = True lege ich fest, dass der Auftraggeber, der Kundenname, in Fettschrift ausgegeben wird.

Set anschriftAuftraggeber = ActiveDocument.Bookmarks("Auftraggeber").Range
ActiveDocument.Bookmarks("Auftraggeber").Range.Font.Bold = True
If KontaktItem.CompanyName = "" Then
  anschriftAuftraggeber.Text = KontaktItem.FirstName & " " & KontaktItem.LastName
Else
  anschriftAuftraggeber.Text = KontaktItem.CompanyName
End If

Neben der Frage, ob Einzelperson oder Firma, muss ich auch den Inhalt der geschlossenen Textmarke ersetzen. Also das Wort "Auftraggeber" muss weg und anstelle dessen der Kundenname. Damit das sauber funktioniert, weise ich meine Textmarke (Bookmarks) der Objektvariablen anschriftAuftraggeber zu und kann danach den Text der Textmarke ansprechen - also das Wort "Auftraggeber" mit meinem Kundennamen ersetzen. Was ich denn auch im IF-Block tue. Wenn kein Firmenname (CompanyName) vorhanden ist, muss es eine Einzelperson sein, andernfalls eine Firma.
Erst durch das Zuweisen an eine Objektvariable, kann ich einzelne Methoden und Eigenschaften meiner Textmarke ansprechen, was ich andernfalls nicht könnte.

Der ganze Rest ist nun eigentlich das gleiche, wie zuvor, lediglich mit anderen Feldnamen. Ich übergebe die Anschrift, die Sie in Outlook bei einem Kontakt im unteren "Geschäftlich..."-Feld finden:

Details der Geschäftsfelder in Outlook

Die anderen Felder in Outlook können Sie natürlich auch direkt ansprechen. Allerdings muss ich Sie in diesem Fall an eine Suchmaschine Ihrer Wahl verweisen, wo Sie die einzelnen Benamsungen finden werden.

Weiter unten frage ich noch den Titel ab. Also "Herr", "Frau", "Doktor", "Professor" oder ... und trage auch das automatisiert in meiner Rechnung ein und ergänze das dann auch mit dem Nachnamen des Kunden.

outAdresse

Kunde = InputBox("Kunde auswählen" & vbNewLine & "1 = xxxxx" & vbNewLine & "2 = yyyyyy" & vbNewLine & "ODER Direkteingabe", "Kunde")
If Kunde <> "" Then
Select Case Kunde
Case 1
modOutlook.funcGoOutlook ("xxxxx")
ufAlfatraining.Show
Case 2
modOutlook.funcGoOutlook ("yyyyy")
ufMedienreich.Show
Case Else
modOutlook.funcGoOutlook (Kunde)
ufAndere.Show
End Select
End If

 Wenn alles fertig ist, dann macht es Sinn die ganzen Objekte zu schließen und den zur Verfügung gestellten Speicher wieder freizugeben. Wenn Outlook neu gestartet wurde für die Suche nach dem Kunden, wird die Anwendung komplett geschlossen.

ActiveDocument.Bookmarks("Datum").Range.InsertBefore Date

Dieser Block muss in die bereits vorhandene Private Sub Document_New() eingefügt werden, bzw. der bisherige Block, der die Anschrift in die Rechnung einträgt" hiermit ersetzt werden. Damit rufen Sie die oben angelegte Funktion auf. Dazu wird zunächst eine Inputbox aufgerufen, wo Sie nun entweder zwischen regelmäßigen Auftraggebern auswählen können oder einen Kundennamen in das Textfeld eintragen. Danach wird entweder die Direktauswahl mit Übergabe des Kundennamen aufgerufen oder die Funktion mit dem Kundennamen, den Sie angegeben haben.