Frontend-Alternativen für Datenbanklösungen 1 - Preiswerte Datenbanklösungen mit Excel-Frontend

15.09.2006 von Helma  Spona
Access-Anwendungen sind für den Kunden immer verhältnismäßig teuer, weil entweder überflüssiger Overhead zum Erstellen einer Runtime-Anwendung notwendig ist oder der Kunde auf jedem Rechner, auf dem die Anwendung zum Einsatz kommen muss, über Access verfügen muss. Diese Artikelfolge zeigt, wie Sie hier Kosten sparen können, indem Sie über die Wahl des Frontends nachdenken.

Was eine Anwendungsentwicklung kostet, hängt neben den Mannstunden für die reine Entwicklung natürlich auch davon ab, welche Systemanforderungen auf den Zielrechnern zu erfüllen sind.

Günstig kommt der Kunde immer weg, wenn das genutzt werden kann, was schon vorhanden ist, und das ist leider in den seltensten Fällen Access. Access führt immer noch ein Schattendasein auf den typischen Bürorechnern, während Word und Excel zur Standardausstattung gehören.

Ohne Access auf dem Rechner bleibt eigentlich nur die Möglichkeit, eine Runtime-Anwendung zu erstellen. Nur ist hier sehr viel Aufwand für Menüs und Fehlerbehandlung sowie das Setup- Programm erforderlich, was die Entwicklungszeit deutlich verlängert und damit die Anwendung doch wieder teuer macht. Was liegt also näher, als auch einmal über Word oder Excel als Frontend nachzudenken?

Voraussetzungen

Damit die Nutzung von Word und Excel als Frontend für die Anwendung funktioniert, muss nur eine halbwegs aktuelle Word- oder Excel-Version (ab Version 2000) auf den Zielrechnern installiert sein.

Auch das Betriebssystem spielt eine Rolle, wenn auch nur eine untergeordnete. Ab Windows Me und Windows XP bringt Windows bereits die MDAC-Bibliotheken in einer brauchbaren Version mit. Sie sind notwendig, wenn Sie nicht per ODBC-Datenquelle, sondern direkt mit ADO auf die Datenbank zugreifen möchten. Bei älteren Windows-Versionen ist das jedoch auch kein Problem, da die aktuelle MDAC-Bibliothek auf der Webseite von Microsoft heruntergeladen werden kann. Suchen Sie dazu auf der Downloadseite von Microsoft nach "MDAC".

Außer den MDAC-Bibliotheken ist für den Zugriff auf die Datenbank nichts weiter nötig. Access brauchen Sie nur zum Erstellen der Datenbank, auf dem Rechner des Benutzers reichen Word beziehungsweise Excel und die MDAC-Datenbanktreiber.

Grenzen

Bei so wenigen Systemvoraussetzungen muss das Ganze natürlich auch einen Haken haben. Den gibt es auch, aber so gravierend ist er wiederum nicht: Sie können zwar problemlos auf die Daten der Datenbank zugreifen, nicht jedoch auf Berichte und Formulare. Diese lassen sich nur in Access anzeigen. Zwar ließen sie sich aufrufen, das würde dann aber wieder Access auf dem Zielrechner voraussetzen.

Die komplette Benutzeroberfläche, also Formulare zur Dateneingabe oder Anzeige sowie Berichte zur Auswertung der Daten, müssen Sie in der Anwendung definieren, die das Frontend stellt.

Bild 1: Notwendige Verweise.

Am einfachsten ist das noch in Excel, weshalb Excel Ihre erste Wahl sein sollte. Aber auch in Excel bedeutet dies eine Menge Aufwand, der sich bei sehr großen Anwendungen, die aus mehreren Dutzend Tabellen bestehen, nicht lohnt. In einem solchen Fall wäre es ratsam, die Formulare in Form von UserForms so zu programmieren, dass sie für mehr als eine Tabelle verwendet werden können.

Public Const AppName = "Adressverwaltung"
'Zugangsdaten für die Datenbank
Public Const DBName = "adressen.mdb"
Public Const DBPfad = ""
Public Const Benutzer = "Admin"
Public Const Passwd = ""
'Daten zur Konfiguration der UserForm
Public Const MaxFelder = 30
Public Const DefTabelle = "tabAdressen"
Public strTabname As String
Public strDBName As String

Der daraus entstehende Code lässt sich dannjedoch problemlos für mehrere Datenbanken verwenden, da alle Informationen mit Hilfe der ADOX-Bibliothek aus der Datenbank ermittelt werden. Wie das aussieht, zeigt das nachfolgend vorgestellte Beispiel.

Andernfalls ist der Aufwand sehr viel größer, als eine Runtime-Anwendung für Access zu entwickeln. Berichte können Sie erstellen, indem Sie die Daten in ein Excel-Tabellenblatt einfügen und dort formatieren. Aber auch die Ausgabe als HTML-Seite wäre natürlich möglich und auch praxistauglich.

Diese Einschränkungen bei Nutzung von Word und Excel als Frontend werden aber durch einen großen Vorteil kompensiert. Da Sie Formulare und Berichte im Frontend definieren müssen, entfällt in der Datenbank einen Menge Code und sie bleibt immer klein und handlich. Zudem lässt sie sich sehr einfach sichern, weil die Datenbankverbindung jederzeit getrennt und die MDB-Datei der Datenbank in ein Sicherungsverzeichnis kopiert werden kann.

Function getConn() As ADODB.Connection
Dim strDBConn As String
Dim objCon As New ADODB.Connection
Dim strDBPfad As String
On Error GoTo FEHLER
If DBPfad = "" Then
strDBPfad = ThisWorkbook.Path
Else
strDBPfad = DBPfad
End If
'Prüfen, ob das letzte Zeichen ein "\" ist
If Mid(strDBPfad, Len(strDBPfad) - 1, 1) <> "\" Then
'Backslash anhängen
strDBPfad = strDBPfad & "\"
End If
'Verbindungszeichenfolge generieren
strDBConn = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & _
strDBPfad & strDBName & ";User ID=" & Benutzer & ";Password=" & Passwd
'Verbindung erstellen
objCon.ConnectionString = strDBConn
objCon.CursorLocation = adUseClient
'Verbindung öffnen
objCon.Open
Set getConn = objCon
Set objCon = Nothing
Exit Function
FEHLER:
MsgBox "Fehler bei Aufbau der Datenbankverbindung: " & _
Err.Description, vbCritical, "FEHLER"
Exit Function
End Function

Notwendige Verweise

Für den Code benötigen Sie Verweise auf zwei wichtige Bibliotheken, die Bestandteil der MDAC-Bibliotheken sind. Erstellen Sie dazu in der Excel-Datei, die den Code enthält, in der Entwicklungsumgebung über Extras/Verweise Verweise sowie auf die Datei Microsoft ADO Ext. 2.8 for DDL and Security.

Konstanten zur Konfiguration

Um den Code so flexibel wie möglich zu halten, sollten Sie in einem Modul am Modulanfang und auf Modulebene einige Konstanten deklarieren, die Sie verwenden, um die Datenbankverbindung und die UserForms zu initialisieren. Diese Konstanten müssen Sie dann nur noch an die entsprechende Datenbank anpassen.

Statt die Datenbank als Konstante zu definieren, können Sie natürlich auch mehrere Datenbanken zur Auswahl anbieten und dem Benutzer die Wahl lassen. Die ausgewählte Datenbank speichern Sie dann in der Variablen strDBName. Ob das sinnvoll ist, hängt jedoch auch von der Art der Anwendung ab. Dazu folgt in Kürze noch ein Beispiel.

Verbindung zur Datenbank herstellen

Zum Herstellen der Datenbankverbindung ist eine Funktion empfehlenswert, die die geöffnete Verbindung als Connection-Objekt zurückgibt.

Den Rückgabewert können Sie dann in einer global oder auch lokal deklarierten Variablen speichern und dann verwenden. Die Funktion getConn nutzt die globalen Variablen strDBName und strDBPfad, die vor Aufruf der Funktion initialisiert werden müssen.

Datenbank und Tabelle auswählen

Wenn Sie dem Benutzer die Auswahl einer Datenbank und einer Tabelle erlauben möchten, benötigen Sie dazu ein Formular mit zwei entsprechenden Auswahllisten (Bild 2). Die Auswahlliste mit den Datenbanken füllen Sie beim Laden des Formulars, falls die Konstante DBName eine leere Zeichenfolge enthält. Andernfalls schreiben Sie den dort definierten Namen in das Listenfeld und laden in diesem Fall direkt die Daten in das zweite Listenfeld mit den Tabellen.

Bild 2: Die UserForm zur Auswahl von Datenbank und Tabelle.

Bei Auswahl eines neuen Eintrags aus der Datenbankliste wird außerdem die Liste mit den Tabellen neu gefüllt. Sie benötigen daher die Prozeduren aus Listing 3 innerhalb der UserForm. Interessant ist hier vor allem die Prozedur TabListeFuellen. Sie erzeugt ein ADOX.Catalog- Objekt. Darüber haben Sie Zugriff auf die Datenbankelemente, die in Access im Datenbankfenster dargestellt werden. Damit Sie jedoch die Datenbanktabellen in einer Schleife durchlaufen können, müssen Sie festlegen, um welche Datenbank es eigentlich geht. Dazu weisen Sie der ActiveConnection-Eigenschaft des Objekts die geöffnete Datenbankverbindung zu.

In einer For-Each-Schleife lässt sich dann die Tables-Auflistung durchlaufen, die alle Tabellen der Datenbank als Table-Objekte enthält. Es können dann alle oder nur bestimmte Tabellen in die Liste aufgenommen werden. In der Beispieldatenbank wurden alle Tabellen mit dem Präfix "tab" versehen, sodass Sie anhand des Präfixes Ihre benutzerdefinierten Tabellen von den Systemtabellen unterscheiden können. Hier werden daher nur die Tabellen eingefügt, die mit "tab" beginnen.

Verwendung unterschiedlicher Präfixe

Durch geschickte Benennung der Datenbankelemente können Sie auf diese Weise auch bestimmen, welche Tabellen und Abfragen überhaupt durch den Benutzer bearbeitet werden dürfen. Verwenden Sie für Tabellen, in die der Benutzer nichts eingeben soll, ein anderes Präfix als "tab", beispielsweise "hidtab". Tabellen mit dieser Vorsilbe werden nicht in die Liste eingefügt, und der Benutzer kann deren Daten nicht ändern oder sich anzeigen lassen. Genauso können Sie auf diese Weise bestimmte Abfragen der Datenbank für den Benutzer verfügbar machen. Um sie mit in die Liste aufzunehmen, müssten sie allerdings in einer weiteren Schleife auch die Views-Auflistung des Catalog-Objekts durchlaufen. Sie enthält alle Abfragen der Datenbank.

Flexible UserForms

Was Sie nun noch brauchen ist eine UserForm, die dem Benutzer die Bearbeitung und das Durchblättern der Datensätze ermöglicht. Sie sollte so gestaltet sein, dass der Benutzer damit möglichst alle Tabellen und Abfragen, die er auswählen kann, bearbeiten kann.

Private Sub bttOK_Click()
strTabname = Me.cmbTabellenliste.Text
Me.Hide
Unload Me
End Sub
Sub TabListeFuellen()
Dim objKat As ADOX.Catalog
Dim objTB As ADOX.Table
Set objKat = New ADOX.Catalog
If strDBName > "" Then
Me.cmbTabellenliste.Clear
Set objVerb = getConn()
Set objKat.ActiveConnection = objVerb
For Each objTB In objKat.Tables
If InStr(1, objTB.Name, "tab") > 0 Then
Me.cmbTabellenliste.AddItem objTB.Name
End If
Next objTB
objVerb.Close
End If
End Sub
Private Sub cmbDBListe_Change()
strDBName = Me.cmbDBListe.Text
TabListeFuellen
Me.cmbTabellenliste.Enabled = True
End Sub
Private Sub UserForm_Initialize()
Dim strTemp As String
If (DBName = "") Or (strDBName = "") Then
'Liste füllen
Me.cmbDBListe.Clear
strTemp = Dir(DBPfad & "*.mdb", vbNormal)
Do While strTemp > ""
Me.cmbDBListe.AddItem strTemp
strTemp = Dir()
Loop
strDBName = DBName
'Tabellenliste fuellen
TabListeFuellen
Me.cmbTabellenliste.Enabled = True
Else
'Auswahlliste ausblenden
Me.cmbDBListe.Text = DBName
Me.cmbDBListe.Enabled = False
strDBName = DBName
TabListeFuellen
Me.cmbTabellenliste.Enabled = True
End If
End Sub

Dazu müssen Sie ausreichend viele Eingabefelder in das Formular einfügen und beschriften (Bild 3). Die nicht benötigten blenden Sie einfach aus und fügen in die zugehörigen Labelfelder die passenden Beschriftungen ein.

Bild 3: Aufbau des Formulars zur Dateneingabe.

Im Beispiel werden 30 Eingabefelder und Beschriftungen vorgesehen, die txtFeld1 bis txtFeld30 und lblFeld1 bis lblFeld30 benannt wurden. Diese einheitliche Benennung hat den Vorteil, dass Sie die Steuerelemente anhand ihrer Namen in einer Schleife durchlaufen können. Und genau das müssen Sietun, wenn das Formular geladen wird.

Code des Datenformulars

Die Schaltflächen der Navigationsleiste heißen bttAnfang, bttEnde, bttVor, bttZurueck, bttNeu. Das Labelfeld innerhalb der Navigation nennen Sie lblNavigation. Der Speichern-Button heißt im Beispiel bttSpeichern und der Abbrechen-Button bttAbbrechen. Für diese Schaltflächen erstellen Sie Click-Ereignisprozeduren (Listing 4), in denen Sie die Variable lngDS entsprechend erhöhen oder erniedrigen und dann den entsprechenden Datensatz über die Prozedur Datensatzladen anzeigen lassen.

Listing 4: Code des Datenformulars
Dim lngDS As Long
Dim bytID As Byte
Private Sub bttAbbrechen_Click()
Me.Hide
Unload Me
End Sub
Private Sub bttAnfang_Click()
lngDS = 1
Datensatzladen lngDS
End Sub
Private Sub bttEnde_Click()
Dim bytPos As Byte
Dim lngDSMax As Long
'Maximale Datensatzanzahl ermitteln
bytPos = InStr(1, Me.lblNavigation.Caption, "/")
If bytPos > 0 Then
lngDSMax = CLng(Mid(Me.lblNavigation.Caption, bytPos + 1))
End If
lngDS = lngDSMax
Datensatzladen lngDS
End Sub
Private Sub bttNeu_Click()
Dim bytPos As Byte
Dim lngDSMax As Long
'Maximale Datensatzanzahl ermitteln
bytPos = InStr(1, Me.lblNavigation.Caption, "/")
If bytPos > 0 Then
lngDSMax = CLng(Mid(Me.lblNavigation.Caption, bytPos + 1))
End If
lngDS = lngDSMax
Datensatzladen lngDS + 1
End Sub
Private Sub bttLoeschen_Click()
If Me.Controls("txtFeld" & bytID).Value > "" Then
DatenLoeschen
'lngDS = lngDS + 1
End If
Datensatzladen lngDS
End Sub
Private Sub bttSpeichern_Click()
If Me.Controls("txtFeld" & bytID).Value = "" Then
Dateneinfuegen
Else
Datenaendern
End If
Datensatzladen lngDS
End Sub
Private Sub bttVor_Click()
lngDS = lngDS + 1
Datensatzladen lngDS
End Sub
Private Sub bttZurueck_Click()
lngDS = lngDS - 1
If lngDS < 1 Then lngDS = 1
Datensatzladen lngDS
End Sub
Private Sub UserForm_Initialize()
Dim strSQL As String
Dim objFeld As ADODB.Field
Dim objRS As ADODB.Recordset
Dim bytI As Byte
If strTabname = "" Then strTabname = DefTabelle
If (strTabname = "") Or (strDBName = "") Then
'Keine Tabelle definiert
'Keine Tabelle ausgewählt
'Dialog zur Auswahl anzeigen
frmTabauswahl.Show vbModal
End If
strSQL = "SELECT * FROM " & strTabname
Set objRS = New ADODB.Recordset
Set objVerb = getConn()
objRS.Open strSQL, objVerb
'Steuerelemente beschriften
bytI = 1
On Error Resume Next
For Each objFeld In objRS.Fields
Me.Controls("lblFeld" & bytI).Caption = objFeld.Name
If (objFeld.Type = adDate) Or _
(objFeld.Type = adDBDate) Or _
(objFeld.Type = adDBTime) Or _
(objFeld.Type = adDBTimeStamp) Then
Me.Controls("txtFeld" & bytI).Tag = "Datum"
ElseIf (objFeld.Type = adVarWChar) Or _
(objFeld.Type = adVarChar) Or _
(objFeld.Type = adChar) Or _
(objFeld.Type = adBSTR) Or _
(objFeld.Type = adLongVarChar) Or _
(objFeld.Type = adLongVarWChar) Then
Me.Controls("txtFeld" & bytI).Tag = "Text"
ElseIf ((objFeld.Type = 3) = True) And _
((UCase(objFeld.Name) = "ID") Or _
(UCase(objFeld.Name) = "KEY")) Then
Me.Controls("txtFeld" & bytI).Tag = "Autowert"
bytID = bytI
Me.Controls("txtFeld" & bytI).Enabled = False
Else
Me.Controls("txtFeld" & bytI).Tag = ""
End If
bytI = bytI + 1
Next objFeld
'Nicht benötigte Felder ausblenden
For bytI = objRS.Fields.Count + 1 To MaxFelder
Me.Controls("lblFeld" & bytI).Visible = False
Me.Controls("txtFeld" & bytI).Visible = False
Next bytI
On Error GoTo 0
objRS.Close
objVerb.Close
Set objRS = Nothing
Set objVerb = Nothing
Me.Caption = Me.Caption & ": " & strTabname
'1. Datensatz laden
Datensatzladen 1
End Sub
Sub Datensatzladen(lngI As Long)
Dim strSQL As String
Dim objFeld As Field
Dim objRS As ADODB.Recordset
Dim bytI As Byte
strSQL = "SELECT * FROM " & strTabname
Set objRS = New ADODB.Recordset
Set objVerb = getConn()
objRS.Open strSQL, objVerb, adOpenStatic
bytI = 1
If objRS.RecordCount >= lngI Then
objRS.MoveFirst
objRS.Move lngI - 1
For Each objFeld In objRS.Fields
Me.Controls("txtFeld" & bytI _
).Value = objFeld.Value
bytI = bytI + 1
Next objFeld
Else
'Felder leeren
For bytI = 1 To MaxFelder
Me.Controls("txtFeld" & bytI).Value = ""
Next
End If
Me.lblNavigation.Caption = lngI & "/" & objRS.RecordCount
lngDS = lngI
objRS.Close
objVerb.Close
Set objRS = Nothing
Set objVerb = Nothing
End Sub
Sub Datenleer(lngI As Long)
Dim strSQL As String
Dim objFeld As Field
Dim objRS As ADODB.Recordset
Dim bytI As Byte
'strSQL = "SELECT * FROM tabAdressen"
Set objRS = New ADODB.Recordset
Set objVerb = getConn()
objRS.Close
objVerb.Close
Set objRS = Nothing
Set objVerb = Nothing
End Sub
Private Sub UserForm_Terminate()
strTabname = ""
End Sub

Die UserForm laden und anzeigen

In der Ereignisprozedur Initialize stellen Sie die Datenbankverbindung her und rufen die Daten aus der definierten Tabelle oder Abfrage ab. Danach initialisieren Sie das Formular. Das heißt, Sie durchlaufen die Felder der Datensatzgruppe und schreiben den Feldnamen in das Labelfeld und den Datentyp in die Tag-Eigenschaft des Eingabefeldes. Mit dieser Info können Sie später korrekte SQL-Anweisungen erzeugen. Sind alle benötigten Felder initialisiert, blenden Sie die nicht benötigten in einer weiteren Schleife aus. Durch Aufruf der Prozedur Datensatzladen wird dann der erste Datensatz geladen.

SQL-Anweisungen generieren

Wichtig für korrekte SQL-Anweisungen ist, dass Sie Texte in Anführungszeichen setzen, Datumswerte korrekt formatieren und vor allem das Primärschlüsselfeld der Tabelle kennen. Dessen Index wird beim Initialisieren des Formulars in der Variablen bytID gespeichert, sodass das Feld in der WHERE-Bedingung der Update- Anweisung verwendet werden kann. Ansonsten verfahren beide Prozeduren ganz ähnlich. Die Prozedur Dateneinfuegen erzeugt eine INSERTINTO- Anweisung, die den Datensatz mit den eingegebenen Werten einfügt und ausführt. Die Prozedur Datenaendern generiert hingegen eine UPDATE-Anweisung und führt diese aus.

Mit der Prozedur DatenLoeschen wird der Datensatz gelöscht, wobei als Primärschlüssel wiederum der Wert des Primärschlüsselfeldes verwendet wird, das in der WHERE-Bedingung der DELETE-Anweisung angegeben wird.

Datenimport nach Excel

Damit sind die Möglichkeiten der Dateneingabe gegeben. Fehlt nur noch eine Alternative zu den Berichten von Access. Die lassen sich in Excel am einfachsten nachbilden, wenn Sie die Daten in ein Excel-Tabellenblatt importieren.

Viele Berichte sind einfache Listen, die sich auf diese Weise erstellen lassen. Sortierfolgen, Gruppierungen und Berechnungen können Sie erreichen, indem Sie als Grundlage des Berichts eine entsprechende Abfrage erstellen und nutzen. In der Beispielanwendung erhält der Benutzer jedoch auch hier die Möglichkeit, Datenbank und Tabelle oder Abfrage zu wählen, deren Daten aufgelistet (Listing 6) zeigt zunächst bei Bedarf den Dialog zur Auswahl von Datenbank und Tabelle an und löscht dann das Tabellenblatt mit dem Namen der gewählten Tabelle, die im Anschluss neu erstellt wird. In die neu erstellte Tabelle werden nun die Daten importiert.

Sub ListeAusgeben()
Dim objBL As Worksheet
Dim lngZeile As Long
Dim lngSpalte As Long
If (strTabname = "") Or (strDBName = "") Then
frmTabauswahl.Show
End If
On Error Resume Next
ThisWorkbook.Worksheets(strTabname).Delete
'Neues Blatt anlegen
Set objBL = ThisWorkbook.Worksheets.Add()
lngZeile = 1
lngSpalte = 1
objBL.Name = strTabname
'Abfrage ausführen und Daten importieren
Dim strSQL As String
Dim objFeld As ADODB.Field
Dim objRS As ADODB.Recordset
Dim bytI As Byte
If strTabname = "" Then strTabname = DefTabelle
If (strTabname = "") Or (strDBName = "") Then
'Keine Tabelle definiert
'Keine Tabelle ausgewählt
'Dialog zur Auswahl anzeigen
frmTabauswahl.Show vbModal
End If
strSQL = "SELECT * FROM " & strTabname
Set objRS = New ADODB.Recordset
Set objVerb = getConn()
objRS.Open strSQL, objVerb
'Spalten beschriften
bytI = 1
On Error Resume Next
For Each objFeld In objRS.Fields
objBL.Cells(lngZeile, lngSpalte) = objFeld.Name
lngSpalte = lngSpalte + 1
Next objFeld
'Daten ausgeben
lngSpalte = 1
objBL.Rows(lngZeile).Interior.Color = RGB(200, 200, 200)
objBL.Rows(lngZeile).Font.Bold = True
objRS.MoveFirst
lngZeile = lngZeile + 1
Do While objRS.EOF = False
For Each objFeld In objRS.Fields
objBL.Cells(lngZeile, lngSpalte) = objFeld.Value
lngSpalte = lngSpalte + 1
Next objFeld
If (lngZeile Mod 2) = 0 Then
objBL.Rows(lngZeile).Interior.Color = RGB(255, 255, 255)
Else
objBL.Rows(lngZeile).Interior.Color = RGB(200, 255, 200)
End If
lngZeile = lngZeile + 1
lngSpalte = 1
objRS.MoveNext
Loop
On Error GoTo 0
objRS.Close
objVerb.Close
Set objRS = Nothing
Set objVerb = Nothing
ThisWorkbook.Worksheets(strTabname).Activate
End Sub

In einer ersten Schleife, die alle Felder der Datensatzgruppe durchläuft, werden die Spaltenbeschriftungen eingefügt. Im Anschluss werden die einzelnen Datensätze ausgegeben.

Die Benutzeroberfläche gestalten

Damit der Benutzer die Anwendung starten kann, müssen Sie ihm natürlich auch die Möglichkeit bieten, die Dialoge aufzurufen. Dazu erstellen Sie am besten eine Symbolleiste, der Sie Start aus Listing 7 zuweisen. Über die beiden Prozeduren können dann die Ausgabe der Berichte und die Eingabe und Verwaltung der Datensätze gestartet werden. Als Alternative ist natürlich auch eine UserForm denkbar, über die beispielsweise auch eine Benutzeranmeldung realisiert werden könnte.

Sub Start()
'Startet die Dateneingabe
If (strTabname = "") Or (strDBName = "") Then
frmTabauswahl.Show
End If
If strTabname > "" Then
frmDaten.Show
End If
End Sub

Zusammenfassung

Die Beispielanwendung stellt schon mit verhältnismäßig wenig Code alle grundlegenden Funktionen einer Datenbankanwendung zur Verfügung. Das zeigt, dass es mit Excel mit recht wenig Aufwand möglich ist, Datenbankanwendungen mit Access-Backend zu realisieren, die so für den Kunden sehr viel preiswerter sind und dank ADOX-Bibliothek auch so flexibel gestaltet werden können, dass die gleiche Codebasis für verschieden Datenbanken verwendet werden kann.

Bild 4: Die erzeugte Liste.

Wie geht es weiter?

Aber es gibt noch Alternativen. Wie eine Lösung aussieht, die noch weniger Anforderungen an das System stellt und bei der eine Anwendung vom Internet Explorer als HTA-Datei ausgeführt werden kann, erfahren Sie im zweiten Teil der Artikelserie. Im dritten und letzten Teil wird dann eine PHP-Lösung vorgestellt, die vor allem für Intranet-Anwendungen interessant ist.