Rechnung in Word - ohne Excel

Mit etwas einfacher Makroprogrammierung lässt sich in Word auch ohne Excel rechnen und somit eine Rechnung erstellen. Das Tutorial zeigt in mehreren Teilen, wie sich eine Rechnung mit allem Drum und Dran erstellen lässt.
Rechnung in Word - ohne Excel
Filter in zwei oder mehr Spalten zu setzen, die nicht voneinander abhängig sind, ist mit den Filtermöglichkeiten, die Excel bietet, nicht möglich. Angenommen Sie haben eine Tabelle mit ein paar Städten, zwei verschiedene Kategorien und zugehörigen Umsätzen. Aktivieren Sie über das Menüband Daten in der Gruppe Sortieren und Filtern den
Zwei Filter setzen mit ODER(...)
Mir gefiehlen die guten alten Weblinks von Joomla nicht, als ich diese Site relaunchte. Beispielsweise war es nicht möglich die Sprache der verlinkten Site per Landesfahne zu kennzeichnen. Auch waren
SEBLOD: Weblinks mit automatisierten Screenshots

Excel-Lösungen

  • Tutorials zu Fragen rund um Excel
  • Teilweise mit Makroprogrammierungen.
  • Fertige Excel-Sheets mit Teillösungen zum Download
Excel-Lösungen
Dieses Tutorial steht im Downloadcenter (http://www.time4mambo.de/downloads/viewcategory/3.html) als PDF zur Verfügung Einfache Rechnung Einzelpostenauflistung, Zwischensumme, Gesamtsumme und Mehrwertsteuer – für den Geschäftsmann
Rechnungserstellung mit Word und Excel
Seit Joomla 3 ist das CSS-Framework Bootstrap fester Bestandteil in Joomla und kann für eigene Templates somit einfach benutzt werden. Auf time4jaoomla erfahren Sie, wie es geht.
Bootstrap mit Joomla
Original-Auszug aus dem Buch Die Überlegung: Wir haben eine Kulturredaktion, der eine Kategorie zugeordnet ist. Und wir haben eine Politikredaktion, die in zwei Kategorien schreibt. Beide Redaktionen sollen nur ihre eigenen Beiträge bearbeiten, veröffentlichen und löschen können. Außerdem bekommen beide Redaktionen noch einen Chefreakteur zur Seite, der in allen
Fallbeispiel: Redaktionssystem
Schaut man sich das erste Mal einen CSS-Befehl an, führt das meistens zu einem panischen Weiterklicken, weil das alles sehr kompliziert ausschaut. Aber eigentlich ist es das nicht. Bei genauer Betrachtung ist CSS eigentlich sogar selbsterklärend und wenn man eine Weile damit umgegangen ist, geht es schon beinahe wie von
Wie funktioniert CSS
Das Tutorial steht auf time4mambo zum Download bereit: http://www.time4mambo.de/das-unternehmen/downloads/category/11-joomla-1-5.html (http://www.time4mambo.de/das-unternehmen/downloads/category/11-joomla-1-5.html) Dieses Tutorial ist ursprünglich für Joomla! 1.5 geschrieben worden. So ich es derzeit überblicke hat das Tutorial aber auch in Joomla!
Community Builder
Grafische Rollovers mit dem JCE zu machen ist ja recht einfach, weil der JCE hier schon fertige Einstellmöglichkeiten sehr einfach mitbringt.Aber wie wird ein Rollover-Effekt bei einer Textmarke erzielt? Eigentlich genauso wie ein grafischer Rollover-Effekt - nur mit einem klitzekleinen Trick: Zunächst schreiben wir den Text: Lass uns was schreiben und mittendrin einen
Text-Rollover mit dem JCE
Dieses Tutorial steht als PDF-Download im http://www.time4mambo.de/webdesign/referenz.html (http://www.time4mambo.de/webdesign/referenz.html)
SEBLOD: Einführung am Beispiel eines selbsterstellten Portfolios

Joomla Toplist

Nonverbale und paraverbale Kommunikation

KörperspracheDamit ist zum einen die Körpersprache gemeint und zum anderen die Art, wie wir kommunizieren. Zu letzterem gehören der Tonfall, Sprachmelodie, Artikulation, Sprechtempo und auch die Pausen zwischen den Wörtern.

Das reine Wort, der Inhalt, machen 7% unserer Kommunikation aus. Die para- und nonverbale Kommunikation zusammen 93%. Wie Sie 93% mehr Erfolg haben können, erfahren Sie auf dieser Website:

https://koerpersprache.time4mambo.de

 

Selbst geschrieben:


Deutschsprachige Seblod-Community

Zu dritt haben wir die deutschsprachige SEBLOD™-Community gegründet. Neben Ressourcen und Webseiten , die mit SEBLOD™ gemacht sind, bieten wir ein Supportforum zu Fragen rund um SEBLOD™ an.

https://seblod.time4mambo.de


Selbst geschrieben:



Newsletter

captcha 

Schulungen

Langjährige Erfahrung als Dozent zu verschiedenen Themen.
Ich komme zu Ihnen in die Firma oder organisiere Räume vor Ort. Dazu steht mir ein Netzwerk aus vielen Jahren Tätigkeit als freier Dozent zur Verfügung.
Weitere Informationen, sowie Referenzen finden Sie auf der Firmenseite time4mambo

    MS-Excel
    2003 / 2007/ 2010
    MS-Project
    2003 / 2007
    MS-Word
    2003 / 2007 / 2010
    MS-PowerPoint 2010
    Joomla! 1.5 / 2.5
    Körpersprache für Präsentation und zur verkaufsfördernen Motivation

    Weitere Themen auf Anfrage

Interesse? Lust? Zeit? Dann freue ich mich über eine eMail oder Anruf.
Kontaktdaten im Impressum


Newsletter

Nach Bestätigung des Buttons wird eine Bestätigungs-eMail versendet, die Sie bitte durch anklicken bestätigen. So kann Missbrauch mit Ihrer eMail-Adresse ausgeschlossen werden

out2word.jpg

Rechnungserstellung - Teil 4: Verbindung nach Outlook und Adresse in Word einfügen

Word
2013

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 beeinhaltet 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 ansich geben. Der Nichtprogrammierer kann aber den Code durch Copy/Paste, wie in den anderne 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!

 

geschlossene Textmarke erzeugen

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.

 

Option Explicit

Const olFolderContacts As Integer = 10
Const olContact As Integer = 40
Dim olAnw As Object
Dim olOrdner As Object
Dim olKontakt As Object
Dim olItem As Object
Dim olItemFilter As Object

Dim anschriftAuftraggeber As Range
Dim bOutlookNeuGestartet As Boolean

Public Function funcGoOutlook(strSuche As String)

Set olAnw = GetObject(, "Outlook.Application")
On Error Resume Next
If (olAnw Is Nothing) Then
bOutlookNeuGestartet = True
Set olAnw = CreateObject("Outlook.Application")
End If

'Kontakte-Ordner setzen und sortieren
Set olOrdner = olAnw.Session.GetDefaultFolder(olFolderContacts)
Set olItem = olOrdner.Items
olItem.Sort "[FileAs]"

'Kontaktdaten suchen und zuordnen
For Each olKontakt In olItem
With olKontakt
If olKontakt.Class = olContact Then 'nur Kontakte
If strSuche = .FileAs Or strSuche = .CompanyName Or strSuche = .LastName Then
Set anschriftAuftraggeber = ActiveDocument.Bookmarks("Auftraggeber").Range
ActiveDocument.Bookmarks("Auftraggeber").Range.Font.Bold = True
If olKontakt.CompanyName = "" Then
anschriftAuftraggeber.Text = olKontakt.FirstName & " " & olKontakt.LastName
Else
anschriftAuftraggeber.Text = olKontakt.CompanyName
End If
ActiveDocument.Bookmarks("AuftraggeberAnschrift").Range.Font.Bold = False
Set anschriftAuftraggeber = ActiveDocument.Bookmarks("AuftraggeberAnschrift").Range
anschriftAuftraggeber.Text = olKontakt.BusinessAddressStreet & vbNewLine & _
olKontakt.BusinessAddressPostalCode & " " & _
olKontakt.BusinessAddressCity
Set anschriftAuftraggeber = ActiveDocument.Bookmarks("Anrede").Range
If olKontakt.Title = "" Then
anschriftAuftraggeber.Text = " Damen und Herren"
ElseIf olKontakt.Title = "Herr" Then
anschriftAuftraggeber.Text = "r Herr " & .LastName
ElseIf olKontakt.Title = "Frau" Then
anschriftAuftraggeber.Text = " Frau " & .LastName
Else
anschriftAuftraggeber.Text = "r " & olKontakt.Title & " " & .LastName
End If
End If
Else
'Bei allen anderen nichts machen
End If
End With
Next olKontakt

System.Cursor = wdCursorNormal

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.

Der erste Teil zwischen "Option Explicit" und "Public Function funcGoOutlook(strSuche As String)" sind einige Variablendefinitionen, die ausserhalb der Funktionen definiert sind, da sie in mehreren Funktionen benötigt werden.

Richtig losgehen tut es in der Function, wo ich Ihnen auch die obigen Variablen erkläre:

Set olAnw = GetObject(, "Outlook.Application")
On Error Resume Next
If (olAnw Is Nothing) Then
  bOutlookNeuGestartet = True
  Set olAnw = CreateObject("Outlook.Application")
End If

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

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

On Error Resume Next - falls ein Fehler auftaucht, ignoriere den einfach und mach mit der nächsten Zeile weiter.

Mit dem IF-Block frage ich ab, ob Outlook bereits offen ist oder, falls nicht, wird ein neues Outlook quasi gestartet. Da ich ja nur an die Kontaktliste heran muss, reicht es völlig, das Objekt "Outlook" zu übergeben - es muss nicht zwingend auch offen und sichtbar sein.

Set olOrdner = olAnw.Session.GetDefaultFolder(olFolderContacts)
Set olItem = olOrdner.Items
olItem.Sort "[FileAs]"

An dieser Stelle öffne ich quasi den Kontaktordner in Outlook und weise die Kontaktliste der Objektvariablen olItem zu. Anschließend sortiere ich meine Kontakte in der Reihenfolge, wie ich sie in Outlook abgespeichert habe (FileAs).

Nun kommt der große For Each Block:

Die gesamte Kontaktliste steht in olItem. Mit der For Each Schleife kann ich die einzelnen Kontakte durchsuchen, in dem ich den einzelnen Kontakt der Objektvariablen olKontakt zuweise. Die Schleife läuft solange, bis alle Kontakte durchlaufen sind und in jedem einzelnen Durchgang wird ein Kontakt in olKontakt gespeichert. Damit können wir überprüfen, ob der jeweilige Kontakt unserem Suchkriterium entspricht.

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 strSuche = .FileAs Or strSuche = .CompanyName Or strSuche = .LastName Then

Leider habe ich meine Kontakte nicht nach immer gleichen AUfbau eingepflegt und manchmal habe ich mit Fiormen zu tun und ein andermal mit Einzelpersonen. Deswegen benötige ich eine etwas größere Abprüfung. Zerlegen wir diese Zeile ein wenig:

FileAs, CompanyName und LastName finden Sie in Outlook wider. Wechseln Sie nach Outlook und geben Sie einen neuen Kontakt ein. Sie können auf das Feld "Name..." klicken und erhalten dann ein kleines Fenster, wo Sie Detailangeaben zum Namen machen können. Sie können all diese Eingaben in Word abfragen. Im Screenshot sehen Sie ein paar Angaben zu den englischen Bezeichnungen der Felder, mit denen wir die einzelnen Felder ansprechen können:

Die einzelne Adresse und ihre Feldnamen

 

Ich frage also meine aktuelle Adresse ab, ob entweder im Feld "Speichern unter" oder im Feld "Firma" oder im Feld "Nachname" das gesuchte Wort steht. Wenn nein, mach nichts, andernfalls muss nun die Adresse in meiner Wordrechnung eingefügt werden.

ActiveDocument.Bookmarks("Auftraggeber").Range.Font.Bold = True

Mit dieser Zeile schreibe ich fest, dass der Aufraggeber, der Kundenname, in Fettschrift ausgegeben wird.

Die Zeile davor gehört zu dem If-Block, wo ich nun abfragen muss, ob es eine Firma oder eine Einzelperson ist, für die ich die Rechnung schreibe.

Set anschriftAuftraggeber = ActiveDocument.Bookmarks("Auftraggeber").Range
If olKontakt.CompanyName = "" Then
     anschriftAuftraggeber.Text = olKontakt.FirstName & " " & olKontakt.LastName
Else
     anschriftAuftraggeber.Text = olKontakt.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. Allerings 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.

 

 

Public Function funcOL_Beenden()
If bOutlookNeuGestartet Then
olAnw.Quit
End If

Set olItemFilter = Nothing
Set olItem = Nothing
Set olKontakt = Nothing
Set olOrdner = Nothing
Set olAnw = Nothing
End Function

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.

Kunde = InputBox("Kunde auswählen" & vbNewLine & "1 = xxxxx" & vbNewLine & "2 = yyyyyy" & vbNewLine & "3 = yxyxyx" & 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 3
modOutlook.funcGoOutlook ("yxyxyx")
ufAndere.Show
Case Else
modOutlook.funcGoOutlook (Kunde)
ufAndere.Show
End Select
End If

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.

Ganz am Ende dieser Sub - also bevor Sie die Subroutine beenden - fügen Sie bitte nich diese kleine unscheinbare Zeile ein:

funcOL_Beenden

Damit rufen Sie die Function zum beenden der Lebensdauer der ganzen Objekte auf.

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

Mit dieser Zeile können Sie übrigends das aktuelle Datum einfügen. Vorausgesetzt Sie haben eine Textmartke Namens "Datum" zuvor angelegt (wie auch in Teil 2 beschrieben). Den Code können Sie sehr gut vor der Inputbox zur Kundenauswahl einfügen.


webdesign von time4mambo

www.time4joomla.de is not affiliated with or endorsed by the Joomla! Project or Open Source Matters. The Joomla! name and logo is used under a limited license granted by Open Source Matters the trademark holder in the United States and other countries.