Eine Exceltabelle einbinden und mit ihr rechnen ist eine Möglichkeit. Es geht aber auch ganz ohne Excel. Eine Tabelle in Word und ein wenig Programmierung und es lässt sich damit eine individuelle Rechnung erstellen.
Es wird eine kleinere Serie zur Rechnungserstellung geben:
- Im ersten Teil wird die Tabelle eingebunden und wir rechnen in dieser Tabelle. MwSt, Spesen, Honorar und die Summe aus allem
- Im zweiten Teil wird dann die automatisch fortlaufende Rechnungsnummer erzeugt und gezeigt, wie sie eingebunden wird
- Der dritte Teil beschäftigt sich mit Variationen der Rechnung: Mal mit, mal ohne MwSt - mal mit, mal ohne Spesen - so wie wir es brauchen und alles in einer Rechnungsvorlage
- Im vierten Teil wird der Auftrag und die Rechnungsadresse automatisiert. Eine Vorlage für die wichtigsten Kunden und natürlich jederzeit völlig individualisiert - für Neukunden und die, die nicht so recht ins Schema passen...
Für Nicht-Programmierer habe ich erklärt, wie und wo der Code eingebunden werden muss, wenn Sie mit Kopie/Paste arbeiten möchten (wobei der untere Teil mit der Makroausführung entfällt):
Code direkt eingeben:
Wenn Sie Ihre Vorlage geöffnet haben, benutzen Sie folgendes Tastaturkürzel, um in den VBA-Editor zu gelangen:
ALT+F11
Links sollten Sie den Projektmanager sehen. Falls nicht, im Menü ganz oben Ansicht anklicken und Projekt-Explorer anklicken. Dort klicken Sie dann auf "ThisDocument", welches innerhalb Ihrer Vorlage liegt.
Rechts daneben ist die Codeeingabe. Dort kopieren sie einfach meinen ganzen Code hinein und drücken oben links auf Speichern.
Wenn Sie dann ein neues Dokument auf Basis Ihrer Vorlage starten, dann können Sie in Zukunft Ihre Rechnung ganz ohne Excel in Word erstellen lassen.
Wie das Makro zum laufen gebracht wird:
Solange nichts in den Tabellen steht, lässt es sich schlecht rechnen. Darum funktioniert dieses Makro erst, wenn es explizit gestartet wird.
Wechseln Sie (nachdem Sie den Code eingegben haben, da es sonst nicht funktioniert), in die Optionen (Menüband Datei) und dort in "Symbolleiste für den Schnellzugriff". Oben Links sehen Sie eine Pulldown-Auswahl, die Standardmäßig auf "Häufig verwendete Befehle" steht. Wählen Sie dort die "Makros" aus. In der Liste sollte zumindest das eben eingebene Makro stehen. Vermutlich steht dort neben einem kleinen Icon Normal.Modul1.RechnungsTabelle. Diesen Namen ankllicken und auf Hinzufügen klicken. Nun klicken Sie einmal rechts in der Liste das eben zugefügte Makro an und klicken unten auf "Ändern..." Nun können Sie zum einen ein Icon auswählen und den Text ändern, der im Tooltip zu dem Makro angezeigt wird.
Haben Sie alles eingestellt, klicken Sie auf "OK". In Ihrer Schnellzugriffsleiste steht nun Ihr neues Icon, welches nach anklicken das Makro startet und die Rechnung berechnet.
Sub RechnungsTabelle()
On Error GoTo Fehler
Dim Zahl As Word.Table
Dim Rechnung(2) As Integer
Dim Summe As String
Dim MwstHono As Integer, MwstSpes As Integer
Set Zahl = ActiveDocument.Tables(1)
'Zwischensummen auslesen
Rechnung(1) = SteuerungsZeichenWeg(Zahl.Cell(1, 2).Range.Text)
Zahl.Cell(1, 2).Range.Text = Format(Rechnung(1), "#,##0.00 \€")
Rechnung(2) = SteuerungsZeichenWeg(Zahl.Cell(4, 2).Range.Text)
Zahl.Cell(4, 2).Range.Text = Format(Rechnung(2), "#,##0.00 \€")
'MwSt berechnen
MwstHono = Rechnung(1) * 0.19
Zahl.Cell(2, 2).Range.Text = MwstHono
Zahl.Cell(2, 2).Range.Text = Format(MwstHono, "#,##0.00 \€")
MwstSpes = Rechnung(2) * 0.19
Zahl.Cell(5, 2).Range.Text = MwstSpes
Zahl.Cell(5, 2).Range.Text = Format(MwstSpes, "#,##0.00 \€")
'Gesamtsumme berechnen
Summe = Rechnung(1) + Rechnung(2) + MwstHono + MwstSpes
Zahl.Cell(8, 2).Range.Text = Summe
Zahl.Cell(8, 2).Range.Text = Format(Summe, "#,##0.00 \€")
Exit Sub
Fehler:
MsgBox Err.Description
Resume Next
End Sub
Function SteuerungsZeichenWeg(ByVal Inhalt As String) As String
SteuerungsZeichenWeg = Left(Inhalt, Len(Inhalt) - 2)
End Function
Zunächst der ganze Code im Überblick. Wer nicht so erfahren ist in der Programmierung: keine Angst, es sieht schlimmer aus, als es ist. Wer mit Programmierung gar nichts anfangen kann, dem habe ich den fertigen Code zum Download bereit gestellt. (das paassiert in auch tatsächlich in Kürze...) Beachten Sie dazu bitte den Tab "Dokumentation".
Was Sie zunächst machen müssen: ein neues Dokument anlegen. Dieses speichern Sie als Vorlage mit Makros in Word ab.
In dieser Vorlage muss eine Tabelle drin sein. In meinem Beispiel arbeite ich mit einer 2-spaltigen und 8-zeiligen Tabelle. Der Aufbau:
In Spalte 1 steht jeweils die Beschriftung und in Spalte 2 wird gerechnet, bzw. die einzelnen Summen eingegeben.
In den ersten beiden Zeilen steht die Summe plus zugehöriger MwSt., eine Zeile frei und dann die Spesen plus MwSt., zwei Zeilen frei und die Gesamtsumme aus den vier Posten.
Der Code im Detail:
Dim Zahl As Word.Table
Dim Rechnung(2) As Integer
Dim Summe As String
Dim MwstHono As Integer, MwstSpes As Integer
Set Zahl = ActiveDocument.Tables(1)
In Word können unter anderem die Tabellen eines Dokuments einzeln angesprochen werden. Damit das funktioniert deklariere ich zunächst eine Objektvariable als Word.Table
. Dieser Objektvariable weise ich dann die Tabelle zu, die in meinem Beispieldokument den Index 1 trägt ( Set Zahl = ActiveDocument.Tables(1)
). Haben Sie mehrere Tabellen in Ihrem Dokument dann müssen Sie die von oben nach unten durchzählen und übergeben den Index der Tabelle, die die Berechnungen enthält. Wie gesagt: ich habe nur eine Tabelle in meiner Vorlage und übergebe daher den index "1".
Rechnung(2) ist ein kleines Array, in dem ich dann die Summen zwischenspeichere, um leichter rechnen zu können.
Die anderen Variablen sprechen für sich, wie ich denke.
Rechnung(1) = SteuerungsZeichenWeg(Zahl.Cell(1, 2).Range.Text)
Zahl.Cell(1, 2).Range.Text = Format(Rechnung(1), "#,##0.00 \€")
Rechnung(2) = SteuerungsZeichenWeg(Zahl.Cell(4, 2).Range.Text)
Zahl.Cell(4, 2).Range.Text = Format(Rechnung(2), "#,##0.00 \€")
Meiner Array-Variablen Rechnung(1) weise ich denn auch zunächst den Wert zu, der in der Tabelle in Spalte 2 und Zeile 1 steht. Allerdings hat Word das Problem, dass in der Tabelle nicht der "reine" Wert steht, sondern ein Wert mit einem Steuerungszeichen am Ende. Das können Sie sehen, wenn Sie sich den Tabellenwert mit einer Messagebox anzeigen lassen:
MsgBox Zahl.Cell(1,2).Range.Text
ergibt diese Anzeige:
Der schwarze Punkt unter der Zahl symbolisiert das Steuerungszeichen.
Mit einem Steuerungszeichen hinter der Zahl lässt sich natürlich nicht rechnen. Also muss das entfernt werden. Leider bleibt es aber auch nach dem entfernen in der Tabelle mit dem Steuerungszeichen stehen, weshalb wir die bereinigte Zahl einer Variablen - in meinem Fall einem Array - zuweisen müssen.
Da ich die Bereinigung mehrmals benötige, habe ich mir dafür eine kleine Funktion geschrieben, die ich zunächst in dieser Zeile aufrufe:
Rechnung(1) = SteuerungsZeichenWeg(Zahl.Cell(1, 2).Range.Text)
Die Funktion erkläre ich Ihnen gleich. Die Zeile darunter macht nichts weiter, als die Tabellenzelle als Währungsfeld in Euro zu formatieren.
Aber kommen wir jetzt zur Funktion SteuerungsZeichenWeg
Function SteuerungsZeichenWeg(ByVal Inhalt As String) As String
SteuerungsZeichenWeg = Left(Inhalt, Len(Inhalt) - 2)
End Function
An diese Funktion übergebe ich den Inhalt meiner Tabellenzelle. Obwohl dort eine Zahl drin steht, wird in der Tabelle von Word diese Zahl als Zeichenkette (String) formatiert. Wobei das in diesem Fall auch gut so ist, da die Länge des Steuerungszeichen 2 einnimmt. Also reduziere ich einfach die Länge des Wertes um 2 was ich mit Left(Inhalt, Len(Inhalt) - 2)
mache und gebe den Wert der Funktionsvariablen zurück, die ihrerseits den "gesäuberten" Wert an den Aufruf zurückgibt und schließlich in unser Array Rechnung(1) schreibt.
MwstHono = Rechnung(1) * 0.19
Zahl.Cell(2, 2).Range.Text = MwstHono
Zahl.Cell(2, 2).Range.Text = Format(MwstHono, "#,##0.00 \€")
MwstSpes = Rechnung(2) * 0.19
Zahl.Cell(5, 2).Range.Text = MwstSpes
Zahl.Cell(5, 2).Range.Text = Format(MwstSpes, "#,##0.00 \€")
Nun muss noch die Mehrwertsteuer berechnet werden. Das geht jetzt ganz einfach, in dem ich den Wert im Array-Element mit 0,19 multipliziere. Das Ergebnis weise ich dann der passenden Tabellenzelle zu und formatiere die Zelle noch als Währung.
Summe = Rechnung(1) + Rechnung(2) + MwstHono + MwstSpes
Zahl.Cell(8, 2).Range.Text = Summe
Zahl.Cell(8, 2).Range.Text = Format(Summe, "#,##0.00 \€")
Zuletzt muss noch die Gesamtsumme berechnet werden. Dazu brauche ich nur meine beiden Array-Elemente plus den beiden Mehrwertsteuern addieren und in die Zelle mit passender Formatierung zu schreiben.
Fertig ist unsere Rechnung.