- Thema
- VB6
- SDK-Mitglieder
- ActualDeliveryDate_102 AddPaymentMeans() AddProduct_Comfort() AddTradePaymentTerms() AddTradeTax() BuyerAddressLine1 BuyerCity BuyerCountry BuyerName BuyerPostCode
- Business Terms
- BT-1 Rechnungsnummer BT-2 Rechnungsdatum BT-3 Code für den Rechnungstyp BT-5 Code für die Rechnungswährung BT-31 Umsatzsteuer-Identifikationsnummer des Verkäufers BT-72 Tatsächliches Lieferdatum BG-25 Rechnungsposition BG-23 Umsatzsteueraufschlüsselung
- Codebeispiele
- Kommandozeile, VB6 / VBScript (COM)
- Veröffentlicht
Kurz: Anwendungen in Visual Basic 6, Visual Basic 5 und VBA (Access, Excel, Word) erzeugen E-Rechnungen nach EN 16931 (ZUGFeRD 2.x, Factur-X, XRechnung) über die COM-Schnittstelle des Aloaha ZUGFeRD SDK. Eine Migration nach .NET ist dafür nicht nötig. Es gibt zwei Wege: Late Binding mit CreateObject("Aloaha_ZUGFeRD.XML") ohne Verweis, oder Early Binding mit einem Verweis auf die Typbibliothek „Aloaha ZUGFeRD Toolkit“. Ihr Programm erzeugt die PDF-Rechnung wie bisher; das SDK schreibt das XML und bettet es in das PDF ein (hybride ZUGFeRD-Rechnung, PDF/A-3).
Late oder Early Binding?
| Late Binding | Early Binding | |
|---|---|---|
| Objekt anlegen | Set alo = CreateObject("Aloaha_ZUGFeRD.XML") | Set alo = New Aloaha_ZUGFeRD.XML |
| Verweis im Projekt | nein | ja, „Aloaha ZUGFeRD Toolkit“ |
| IntelliSense in der IDE | nein | ja |
| Prüfung von Namen und Parametern | zur Laufzeit | beim Kompilieren |
| Optionale Parameter | am Ende weglassen | |
| Registrierung der DLL | in beiden Fällen nötig – übernimmt das SDK-Setup | |
Late Binding ist robust bei der Verteilung auf viele Rechner und funktioniert genauso in VBScript. Early Binding ist bequemer beim Programmieren. Beide Varianten nutzen dieselben Methoden.
Voraussetzungen
- Windows mit .NET Framework 4.7.2 oder neuer.
- Aloaha ZUGFeRD SDK von der Download-Seite. Das SDK-Setup (MSI) registriert die COM-Schnittstelle für 32 und 64 Bit.
- Bitbreite beachten: VB5- und VB6-Programme sind immer 32 Bit. VBA läuft mit der Bitbreite von Office – ein 64-Bit-Office braucht die 64-Bit-Registrierung.
- Manuelle Verteilung ohne Setup: die DLL als Administrator mit dem Regasm passender Bitbreite registrieren – für 32 Bit aus
C:\Windows\Microsoft.NET\Framework\v4.0.30319\, für 64 Bit ausFramework64:
Welche Dateien dazugehören, beschreibt Bibliotheken registrieren.regasm /codebase Aloaha_ZUGFeRD.dll - COM-Selbsttest: Das Paket
zugferdbinaries.zipenthält das Skriptzugferd_com_test.vbs. Es prüft Registrierung und Bitbreite und legt das Objekt testweise an. Für den 32-Bit-Test auf 64-Bit-Windows:C:\Windows\SysWOW64\cscript.exe //nologo zugferd_com_test.vbs - Lizenzschlüssel: Eine kostenlose Testlizenz mit vollem Funktionsumfang erhalten Sie per Mail an info@aloaha.com.
Schritt für Schritt
- SDK installieren (oder die DLL registrieren, siehe oben).
- Objekt anlegen, Lizenzschlüssel und Profil setzen.
- Rechnungskopf, Verkäufer, Käufer und Zahlungsangaben setzen.
- Positionen in einer Schleife hinzufügen (
AddProduct_Comfort). - Umsatzsteuer-Aufschlüsselung je Steuersatz (
AddTradeTax) und Summen (WriteTotals) setzen. - XML speichern (
SaveXML) und in die vorhandene PDF-Rechnung einbetten (MergeXMLIntoPDF). - Die erste Rechnung mit einem Validator prüfen – siehe Wie prüfe ich meine XRechnung vor dem Versand?
Beträge immer mit Dezimalpunkt
Das SDK erwartet Beträge als Text mit Punkt als Dezimaltrennzeichen ("59.50"). Format$ schreibt bei deutscher Windows-Einstellung ein Komma. Diese Hilfsfunktion funktioniert in VB5, VB6 und VBA (VB5 kennt noch kein Replace):
Public Function Betrag(ByVal Wert As Double) As String
Dim s As String, p As Integer
s = Format$(Wert, "0.00")
p = InStr(s, ",")
If p > 0 Then Mid$(s, p, 1) = "."
Betrag = s
End Function
Variante 1: Late Binding mit CreateObject
Public Sub ErzeugeERechnung_LateBinding()
Dim alo As Object
Set alo = CreateObject("Aloaha_ZUGFeRD.XML")
alo.Licensekey = "IHR-LIZENZSCHLUESSEL"
alo.ZUGFeRD_Profile = 1 ' 0 = BASIC, 1 = EN 16931 (COMFORT), 2 = EXTENDED
' Rechnungskopf: Nummer (BT-1), Text, Datum (BT-2), Datumsformat, Name, Sprache, Währung (BT-5)
Call alo.CreateInvoiceObject("RE-2027-0001", "Rechnung gemäß Bestellung", _
"20270104", "102", "", "DE", "EUR")
alo.Document_TypeINT = 380 ' BT-3: 380 = Rechnung, 381 = Gutschrift
alo.ActualDeliveryDate_102 = "20270104" ' BT-72: Leistungsdatum
' Verkäufer mit USt-ID (BT-31)
alo.WriteSeller "Muster GmbH", "20095", "Hamburg", "Hauptstr. 1", "", "DE", "DE123456789"
' Käufer
alo.BuyerName = "Kunde AG"
alo.BuyerAddressLine1 = "Marktplatz 5"
alo.BuyerPostCode = "80331"
alo.BuyerCity = "München"
alo.BuyerCountry = "DE"
' Zahlung: 58 = SEPA-Überweisung (BT-81)
alo.AddPaymentMeans 58, "SEPA-Überweisung", "DE02120300000000202051", _
"Muster GmbH", "", "BYLADEM1001"
alo.AddTradePaymentTerms "Zahlbar innerhalb 30 Tagen netto"
' Position (BG-25): 10 Stück à 5,00 EUR, 19 %
Call alo.AddProduct_Comfort(1, "", "ART-100", "10.00", "C62", "Papier A4", "500 Blatt", _
"", "EUR", "", "C62", False, "", "", "", Betrag(5), "EUR", "1.00", _
"C62", "VAT", "S", "19.00", "", Betrag(50), "EUR", "", "")
' Umsatzsteuer-Aufschlüsselung (BG-23): Steuer, Währung, Basis, Währung, Art, Kategorie, Satz
alo.AddTradeTax Betrag(9.5), "EUR", Betrag(50), "EUR", "VAT", "S", "19.00"
' Summen (BG-22): Positionen, Brutto, Zahlbetrag, Netto, Steuer
alo.WriteTotals Betrag(50), Betrag(59.5), Betrag(59.5), Betrag(50), Betrag(9.5)
' XML speichern und in die vorhandene PDF-Rechnung einbetten
If alo.SaveXML("C:\Rechnungen\RE-2027-0001.xml") Then
Call alo.MergeXMLIntoPDF("C:\Rechnungen\RE-2027-0001.xml", _
"C:\Rechnungen\RE-2027-0001.pdf", _
"C:\Rechnungen\RE-2027-0001_zugferd.pdf", _
True, "", "IHR-LIZENZSCHLUESSEL")
Else
MsgBox alo.Last_Error
End If
Set alo = Nothing
End Sub
In der Praxis ersetzen Sie die festen Werte durch die Felder Ihres Recordsets und rufen AddProduct_Comfort in einer Schleife über die Positionen auf. Für eine XRechnung an Behörden setzen Sie zusätzlich alo.isKOSIT = True und alo.LeitwegID.
Variante 2: Early Binding mit Verweis
- In VB6: Projekt > Verweise; in VBA: Extras > Verweise.
- „Aloaha ZUGFeRD Toolkit“ anhaken. Steht der Eintrag nicht in der Liste, über Durchsuchen die Datei
Aloaha_ZUGFeRD.tlbwählen; sie liegt dem SDK bei. - Die Variable mit dem Klassentyp deklarieren. Die Aufrufe bleiben dieselben wie bei Late Binding:
Dim alo As Aloaha_ZUGFeRD.XML
Set alo = New Aloaha_ZUGFeRD.XML
alo.Licensekey = "IHR-LIZENZSCHLUESSEL"
alo.ZUGFeRD_Profile = 1
' ... weiter wie in Variante 1
Mit dem Verweis zeigt die IDE alle Methoden und Parameter an (IntelliSense), und der Objektkatalog (F2) listet die komplette Schnittstelle. Die Reihenfolge der Methoden in der COM-Schnittstelle bleibt seit Version 10 unverändert; neue Funktionen kommen nur am Ende hinzu. Kompilierte Programme mit Verweis laufen daher auch mit neueren SDK-Versionen weiter.
Überladene Methoden heißen in COM anders
COM kennt keine Überladungen. Gibt es eine Methode in .NET mehrfach, erhält die zweite Variante in VB6 und VBA das Suffix _2:
| Name in VB6/VBA | Parameter |
|---|---|
WriteTotals | Beträge als Text ("59.50") |
WriteTotals_2 | Beträge als Double |
AddProduct_Comfort | Positionsnummer als Zahl |
AddProduct_Comfort_2 | Positionsnummer als Text (z. B. "1.1") |
AddPaymentMeans | Zahlungsart als Zahl (UNTDID 4461, z. B. 58) |
AddPaymentMeans_2 | Zahlungsart als Text ("58") |
Aufzählungen wie das Profil oder die Zahlungsart übergeben Sie als Zahl. Für die Rechnungsart (BT-3) gibt es dafür eigens Document_TypeINT, siehe Rechnung anlegen und Rechnungstyp (BT-3).
VB5, VBA und VBScript
- Visual Basic 5: Der Code oben läuft unverändert. Die Hilfsfunktion
Betragnutzt bewusst nur Funktionen, die es schon in VB5 gibt. - VBA in Access, Excel und Word: Derselbe Code in einem Standardmodul. Bei 64-Bit-Office muss die 64-Bit-Registrierung vorhanden sein (das SDK-Setup erledigt beides). Rechnungen lesen und Positionswerte auswerten zeigt Positionswerte in VBA und Access auslesen.
- VBScript: Variablen ohne Typ deklarieren (
Dim alo) und nur Late Binding verwenden; sonst gleich.
Typische Fehler
| Meldung | Ursache | Lösung |
|---|---|---|
| Laufzeitfehler 429: „ActiveX-Komponente kann kein Objekt erstellen“ | Die COM-Klasse ist nicht registriert, nur für die andere Bitbreite registriert (z. B. 32 Bit bei 64-Bit-Office) oder .NET Framework fehlt. | SDK-Setup ausführen oder mit dem passenden Regasm registrieren; zugferd_com_test.vbs zeigt die Ursache. |
| Laufzeitfehler 438: „Objekt unterstützt diese Eigenschaft oder Methode nicht“ | Tippfehler oder die überladene Variante heißt anders (_2). | Namen prüfen; mit Verweis zeigt der Objektkatalog (F2) alle Namen. |
| Laufzeitfehler 13: „Typen unverträglich“ | Text, wo das SDK eine Zahl erwartet (oder umgekehrt). | Parametertyp der Variante prüfen, siehe Tabelle oben. |
| Laufzeitfehler 450: „Falsche Anzahl an Argumenten“ | Zu viele Parameter oder ein Pflichtparameter fehlt. | Parameterliste mit der API-Referenz vergleichen. |
| Automatisierungsfehler „Datei nicht gefunden“ | Registriert ohne /codebase, die DLL liegt nicht im GAC. | Mit regasm /codebase neu registrieren. |
| Validator: BR-CO-10, BR-S-08, BR-CO-17 | Summen passen nicht zu den Positionen oder zur Steuerbasis. | Steuerbasis = Netto nach Rabatt, siehe BR-S-08, BR-S-09 und BR-CO-17. |
Liefert SaveXML False, steht der Grund in Last_Error.
Alternative ohne COM: zugcmd
Soll der VB-Code möglichst unverändert bleiben, schreibt Ihr Programm die Rechnungsdaten als CSV-Datei und ruft das Kommandozeilenwerkzeug zugcmd auf, zum Beispiel per Shell. zugcmd erzeugt daraus ZUGFeRD, Factur-X oder XRechnung und bettet das XML in Ihr PDF ein.
Schritt für Schritt mit getesteten Beispieldateien, Aufruf aus der eigenen Anwendung und Dateinamen: E-Rechnungen per CSV und zugcmd aus der eigenen Anwendung erstellen.
Alle Aufrufe im Detail: Schnellstart mit VB.NET – die Methoden und Parameter sind in VB6 dieselben. Für Delphi gibt es eine eigene Anleitung: ZUGFeRD und XRechnung mit Delphi erstellen.
Häufige Fragen
Kann ich mit Visual Basic 6 ZUGFeRD-Rechnungen und XRechnungen erstellen?
Ja. Das Aloaha ZUGFeRD SDK hat eine COM-Schnittstelle, die VB6 per CreateObject("Aloaha_ZUGFeRD.XML") oder über einen Verweis auf „Aloaha ZUGFeRD Toolkit“ nutzt. Eine Migration nach .NET ist nicht nötig.
Funktioniert das auch mit Visual Basic 5?
Ja. VB5 nutzt dieselbe COM-Schnittstelle. Nur Funktionen wie Replace gibt es dort noch nicht; die Hilfsfunktion für den Dezimalpunkt in diesem Artikel kommt ohne sie aus.
Geht das auch in Access oder Excel mit VBA?
Ja, mit demselben Code in einem Standardmodul. Bei 64-Bit-Office muss die DLL auch für 64 Bit registriert sein; das SDK-Setup erledigt das.
Brauche ich einen Verweis auf die Typbibliothek?
Nein, nicht für Late Binding mit CreateObject. Der Verweis (Early Binding) bringt IntelliSense und Prüfung beim Kompilieren. Registriert werden muss die DLL in beiden Fällen.
Was bedeutet Laufzeitfehler 429 beim CreateObject?
Die COM-Klasse ist auf diesem Rechner nicht oder nur für die andere Bitbreite registriert. Führen Sie das SDK-Setup aus oder registrieren Sie die DLL mit dem passenden Regasm; das Skript zugferd_com_test.vbs zeigt die Ursache.
Warum heißt eine Methode in VB6 WriteTotals_2?
COM kennt keine Überladungen. Die zweite .NET-Variante einer Methode erhält das Suffix _2. WriteTotals erwartet Beträge als Text, WriteTotals_2 als Double.
Business Terms in diesem Artikel: BT-1 BT-2 BT-3 BT-5 BT-31 BT-72 BG-25 BG-23 BG-22 BT-81 BT-106 BT-109 BT-110 BT-112 BT-115 BT-116