Excel-Import-Assistent im Eigenbau

Der Import-Assistent für Excel-Dateien hat einen entscheidenden Nachteil: Er erlaubt nicht, den zu importierenden Bereich des ausgewählten Tabellenblatts manuell auszuwählen. Diese Aufgabe müssen Sie vorher direkt in Excel erledigen, indem Sie einen sogenannten “benannten Bereich” definieren. Dieser ist dann im Import-Assistenten namentlich verfügbar. Unser Assistent enthält eine solche Funktion, und generell lernt man eine Menge, wenn man sich die Funktionsweise eines Excel-Imports einmal in Ruhe ansieht.

Der eingebaute Import-Assistent unterscheidet prinzipiell zwischen dem Importieren von Daten aus Excel in eine neue und in eine bestehende Tabelle. In technischer Hinsicht ist der Unterschied schnell beschrieben: Beim Erstellen einer neuen Tabelle muss zuvor eine entsprechende SQL-Aktionsabfrage ausgeführt werden, die mit den DDL-Befehlen von SQL eine passende, leere Tabelle erzeugt.

Importieren in eine bestehende Tabelle

Der Import-Assistent von Access 2007, der sich nur in Details von denen vorheriger Access-Versionen unterscheidet, gibt dem Benutzer gleich auf der ersten Dialogseite die Gelegenheit, die gewünschte Quelldatei auszuwählen und anzugeben, ob die Daten in einer bestehenden oder in einer neuen Tabelle landen sollen.

Bei einer bestehenden Tabelle reduzieren sich die folgenden Schritte darauf, die Zieltabelle auszuwählen und das als Quelle zu verwendende Tabellenblatt oder den entsprechenden benannten Bereich auszuwählen – der Rest läuft automatisch ab, und das auch nur, wenn dabei kein Fehler auftritt. Hier gibt es Nachbesserungsbedarf, den unser Assistent liefern soll: Wir möchten zumindest die Möglichkeit bieten, dass der Benutzer für jede Spalte des betroffenen Bereichs der Excel-Tabelle das entsprechende Feld der Zieltabelle zuordnen kann.

Importieren in eine neue Tabelle

Hier bietet der eingebaute Import-Assistent von Access schon deutlich mehr Möglichkeiten:

  • Auswahl des Tabellenblatts oder des benannten Bereichs der Excel-Datei als Datenherkunft
  • Festlegen, ob die erste Zeile der Tabelle Spaltenüberschriften enthält
  • Angeben der Feldnamen der Zielfelder je Spalte der Datenherkunft
  • Festlegen, ob ein Feld indiziert werden soll
  • Zuweisen von Datentypen zu Spalten der Quelltabelle
  • Abwählen von Spalten, die nicht importiert werden sollen
  • Festlegen, ob ein Feld der zu erzeugenden Tabelle als Primärschlüsselfeld definiert werden soll, und falls ja, welches verwendet werden soll

ExcelImport.mda

Der im Rahmen dieses Beitrags erstellte Assistent soll den Import in bestehende und neu erstellte Tabellen ermöglichen. Dabei soll er den Import in bestehende Tabellen insofern erweitern, dass der Benutzer zunächst den Bereich festlegt, aus dem die Daten importiert werden sollen.

Dies soll innerhalb des Formulars des Import-Assistenten geschehen, das (sichtbare) Öffnen einer Excel-Instanz soll unbedingt vermieden werden.

Diese Funktion soll auch in dem Bereich des Assistenten zur Verfügung stehen, der Excel-Daten in neue Tabellen importiert.

Für den Import in bestehende Tabellen soll der neue Assistent es außerdem erlauben, den Spalten der Quelldatei Felder der Zieltabelle zuzuweisen, damit die Daten auch dort landen, wo sie hingehören. Der Aufbau der Zieltabelle muss somit nicht identisch mit dem des Excel-Tabellenblatts sein, aus dem die Daten stammen.

Grundsätzliche Vorgehensweise

Beim neuen Import-Assistenten für Excel-Daten soll der Import in neue und bestehende Tabellen ähnlich aufgebaut sein. Der Benutzer wählt die Excel-Datei und das Tabellenblatt aus, aus dem die Daten importiert werden sollen. Der Assistent zeigt dann das komplette Tabellenblatt an und bietet dem Benutzer die Möglichkeit, den zu importierenden Bereich gleich im Assistenten auszuwählen.

Genau wie im eingebauten Assistenten kann er dabei festlegen, ob die Daten mit oder ohne Spaltenüberschriften importiert werden sollen. Im Anschluss legt der Benutzer für die einzelnen Spalten fest, wie der Feldname in der Zieltabelle heißt.

Beim Import in eine bestehende Tabelle kann er zwischen den vorhandenen Feldern wählen. Soll der Assistent die Daten hingegen in eine neue Tabelle schreiben, gibt der Benutzer die Namen der Felder an, wobei gegebenenfalls die Spaltenüberschriften als Standardwert dienen.

Beim Import in eine neue Tabelle muss der Benutzer außerdem den Datentyp für jedes Zielfeld festlegen und angeben, ob das Feld indiziert werden soll. Zuletzt legt der Benutzer beim Import in eine neue Tabelle noch fest, welches der Felder als Primärschlüsselfeld dienen soll.

Alternativ kann er angeben, dass er gar kein Primärschlüsselfeld wünscht oder dass der Assistent ein von den zu importierenden Daten unabhängiges Primärschlüsselfeld zur Tabelle hinzufügen soll.

Resultat des Assistenten

Ein Ergebnis des Assistenten soll natürlich der erfolgreiche Import der gewünschten Daten in die Zieltabelle sein. Technisch betrachtet steckt die Hauptarbeit auf diesem Wege aber darin, dem Benutzer folgende Arbeiten abzunehmen, die wiederum von der Importart abhängen:

  • Beim Import in eine bestehende Tabelle braucht der Assistent nur die Parameter für den Aufruf einer DoCmd.TransferSpreadsheet-Anweisung zu ermitteln.
  • Beim Import in eine neue Tabelle muss der Assistent zusätzlich zu der DoCmd.TransferSpreadsheet-Anweisung noch eine CREATE TABLE-Abfrage zusammenstellen, welche die neue Tabelle erstellt.

Aufbau des Assistenten-Formulars

Wir wollen den Excel-Import-Assistenten so wie klassische Assistenten aufbauen. Der Benutzer soll damit also mehrere Schritte durchlaufen können und dabei die benötigten Daten zusammenstellen. Um dem Benutzer das Gefühl zu geben, dass er die ganze Zeit mit einem einzigen Formular arbeitet, verwenden wir einfach ein einziges Formular – zumindest als Hauptformular.

Die einzelnen Schritte des Assistenten laufen natürlich in verschiedenen Unterformularen ab, die je nach dem Fortschritt ein- und ausgeblendet werden. Das Hauptformular sieht etwa wie in Bild 1 aus. Es enthält vier Schaltflächen namens cmdAbbrechen, cmdZurueck, cmdWeiter und cmdFertigstellen sowie ein Unterformularsteuerelement namens sfmExcelImportWizard. Die Beschriftungen beginnen jeweils mit einem Kaufmanns-Und (&), damit der erste Buchstabe unterstrichen dargestellt wird und die Schaltfläche durch die Kombination aus Alt-Schaltfläche und unterstrichenem Buchstaben über die Tastatur angesteuert werden kann.

pic001.png

Bild 1: Das Grundgerüst des Excel-Import-Assistenten

Desweiteren enthält das Formular ein Unterformular-Steuerelement namens sfmExcelImportWizard, das die eigentlichen Elemente der Benutzeroberfläche des Assistenten liefert.

Die Größe des Hauptformulars und vor allem des Unterformularsteuerelements werden wir sicher in den folgenden Schritten noch anpassen müssen, weil etwa das Formular zur Auswahl des Bereichs der zu importierenden Excel-Datei etwas mehr Platz in Anspruch nehmen wird.

Stellen Sie für alle Formulare und Unterformulare die Eigenschaften Datensatzmarkierer, Navigationsschaltflächen, Trennlinien und Bildlaufleisten grundsätzlich auf Nein ein. Außerdem soll die Eigenschaft Rahmenart des Unterformulars den Wert Transparent erhalten.

Schritt 1: Auswählen der Quelldatei

Egal, ob der Import in eine vorhandene oder eine neue Tabelle erfolgen soll, muss der Benutzer zunächst die Excel-Datei und dort das Tabellenblatt auswählen, aus dem die Daten für den Import stammen. Dateipfad und -name sollen in einem Textfeld namens txtExcelDatei landen, allerdings nicht durch eine manuelle Eingabe des Benutzers. Vielmehr soll dieser auf eine Schaltfläche rechts neben dem Textfeld mit dem Dateinamen klicken, um einen Datei öffnen-Dialog anzuzeigen und damit die Quelldatei auszuwählen.

Nach Auswahl der Datei zeigt das darunter befindliche Kombinationsfeld cboTabellenblaetter alle in der ausgewählten Excel-Datei enthaltenen Tabellenblätter an. Das Unterformular für diesen ersten Schritt des Assistenten heißt sfmDateiUndBlatt und sieht bislang wie in Bild 2 aus.

pic002.png

Bild 2: Auswählen der Quelldatei und des Tabellenblatts

Die Schaltfläche zum Auswählen der Excel-Datei heißt cmdDateiAuswaehlen und ihre Ereigniseigenschaft Beim Klicken löst die Ereignisprozedur aus Listing 1 aus. Diese ruft die bereits oft in Beiträgen von Access im Unternehmen verwendete Funktion zum Anzeigen eines Datei öffnen-Dialogs auf (s. Beispieldatenbank, Modul mdlTools, Funktion OpenFileName) und schreibt das Ergebnis in das Textfeld txtExcelDatei.

Listing 1: Auswählen der Quelldatei und Füllen und Öffnen des Kombinationsfelds zur Auswahl des Tabellenblatts

Private Sub cmdDateiAuswaehlen_Click()
    Me!txtExcel-Datei = OpenFileName(CurrentProject.Path,
    "Excel-Datei auswählen€, "Excel 2002-2003 (*.xls)|
    Excel 2007 (*.xlsx)|Alle Dateien (*.*)€)
    If Len(Me!txtExcel-Date) > 0 Then
        If Len(Dir(Me!txtExcel-Date)) > 0 Then
            With Me!cboTabellenblaetter
            .RowSourceType = "Value List€
            .RowSource = _
            TabellennamenEinlesen(Me!txtExcel-Date)
            .SetFocus
            .Dropdown
            End With
        End If
    End If
    End Sub

Anschließend geschehen noch weitere Aktionen: Zunächst ruft die Prozedur eine Funktion namens TabellennamenEinlesen auf und schreibt das Ergebnis, das etwa in der Form Tabelle1;Tabelle2;Tabelle3; kommt, in die Eigenschaft RowSource des Kombinationsfelds, dessen Herkunftstyp zuvor über die Eigenschaft RowSourceType auf Wertliste eingestellt wurde.

Die vorletzte Anweisung setzt den Fokus auf das Kombinationsfeld, was lediglich eine Voraussetzung für den letzten Befehl ist – und dieser klappt das Kombinationsfeld mit der DropDown-Methode auf. So kann der Benutzer gleich mit einem Mausklick das Quelltabellenblatt festlegen.

Die Funktion TabellennamenEinlesen erwartet den Dateinamen der Excel-Datei als Parameter und liefert die oben beschriebene, durch Semikola getrennte Auflistung zurück. Den Quelltext dieser Funktion finden Sie in Listing 2. Die Funktion greift ohne Umschweife auf ein Objekt namens objWorkbook zu, obwohl dieses zuvor noch gar nicht deklariert oder instanziert und auch nicht per Parameter übergeben wurde.

Listing 2: Diese Funktion liefert eine Liste der in der angegebenen Excel-Datei enthaltenen Tabellenblätter zurück.

        Public Function TabellennamenEinlesen(strExcel-Datei As
            String) As String
            Dim objWorksheet As Excel.Worksheet
            Dim strTabellen As String
            For Each objWorksheet In objWorkbook(strExcel-Date).
                Worksheets
                strTabellen = strTabellen & objWorksheet.Name & ";€
            Next objWorksheet
            TabellennamenEinlesen = strTabellen
        End Function

Da wir im Rahmen des Assistenten möglichst nur eine Excel-Instanz erstellen und auch die Quelldatei für den Import nur einmal öffnen möchten, verwenden wir einige globale Funktionen, welche die benötigten Objekte bei Bedarf erstmalig erzeugen und diese anschließend jederzeit bereitstellen.

All diese finden Sie wie auch die Funktion TabellennamenEinlesen im Modul mdlExcel. Dort sind auch zwei Objektvariablen für die Excel-Instanz und für das Workbook deklariert:

Private m_Excel As Excel.Application
Private m_Workbook As Excel.Workbook

Für den einfachen Zugriff auf das Objektmodell von Excel benötigen wir zunächst einen Verweis auf die entsprechende Objektbibliothek (siehe Bild 3).

pic010.png

Bild 3: Festlegen eines Verweises auf die Excel-Objektbibliothek

Die Deklaration der Variablen m_Excel und m_Workbook erfolgt privat, weil der Zugriff nur über entsprechende Funktionen möglich sein soll, die gleichzeitig prüfen, ob bereits Instanzen von Excel und der Importdatei bestehen. Die Excel-Instanz liefert die folgende Funktion:

Public Property Get objExcel() _
As Excel.Application
If m_Excel Is Nothing Then
 Set m_Excel = New Excel.Application
End If
Set objExcel = m_Excel
End Property

Sie prüft zunächst, ob die private Variable m_Excel bereits einmal mit einer Excel-Instanz gefüllt wurde und holt dies gegebenenfalls nach. Die vorhandene oder neu erstellte Instanz wird dann als Funktionswert zurückgegeben.

ähnlich arbeitet die Funktion objWorkbook. Sie füllt die zuständige Variable m_Workbook jedoch in zwei Fällen neu – erstens, wenn diese noch komplett leer ist, und zweitens, wenn diese eine andere Datei als die im Parameter angegebene enthält (s. Listing 3).

Listing 3: Die Funktion objWorkbook prüft, ob schon ein Workbook geöffnet ist. Falls nein oder falls dieses nicht das richtige ist, öffnet sie die gewünschte Datei und liefert einen Verweis darauf zurück.

Public Function objWorkbook(strExcel-Datei As String) As Excel.Workbook
    If m_Workbook Is Nothing Then
        Set m_Workbook = objExcel.Workbooks.Open(strExcel-Date)
    Else
        If Not m_Workbook.Path & "\€ & m_Workbook.Name = strExcel-Datei Then
            Set m_Workbook = objExcel.Workbooks.Open(strExcel-Date)
        End If
    End If
    Set objWorkbook = m_Workbook
End Function

Auf diese Weise haben wir gleich mehrere Dinge erledigt: Wir haben eine Excel-Instanz erzeugt und den Verweis darauf gespeichert, und außerdem das Gleiche mit einer potenziellen Importdatei erledigt. Wann immer wir später auf diese beiden Objekte zugreifen wollen – sie sind stets parat.

Nun geht es an die nächste Aufgabe: Das Anzeigen der Tabellenblätter der ausgewählten Excel-Datei.

Hierzu müssen Sie wissen, dass es etwas unbequem ist, mit einer in ein Formular eingebundenen Excel-Instanz umzugehen.

Beim Laden eines Dokuments flackert es ordentlich und auch danach wirkt das Excel-Dokument nicht wirklich integriert.

Eine Alternative ist das Spreadsheet-Steuerelement der Office Web Components, die mit Office bis zur Version 2003 ausgeliefert wurden, für spätere Versionen jedoch ebenfalls zusätzlich heruntergeladen werden können (schlagen Sie zu – wer weiß, wie lange noch!).

Wir widmen diesem Steuerelement einen eigenen, kleinen Beitrag namens Tabellen wie unter Excel (Shortlink 694), in dem Sie weitere Informationen finden.

Falls die Komponente nicht auf Ihrem Rechner installiert ist, können Sie diese unter http://www.microsoft.com/downloads/details.aspxFamilyId=7287252C-402E-4F72-97A5-E0FD290D4B76&displaylang=en herunterladen (hier in der Version für Office 2003).

Die Komponente fügen Sie nun über den Dialog zum Einfügen von ActiveX-Steuerelementen in das Formular sfmDateiUndBlatt ein, sodass dieses wie in Bild 4 aussieht. Weisen Sie der Komponente den Namen ctlSpreadsheet zu.

pic003.png

Bild 4: Das Spreadsheet-Steuerelement im Unterformular für den ersten Schritt des Assistenten

Fügen Sie dann dem Formular sfmDateiUndBlatt eine Ereignisprozedur für das Ereignis Beim Laden hinzu, die wie folgt aussieht:

Private Sub Form_Load()
    Set objSpreadsheet = _
    Me!ctlSpreadsheet.Object
    End Sub

Die hier verwendete Objektvariable objSpreadsheet deklarieren Sie im Kopf des gleichen Moduls:

Dim objSpreadsheet As OWC11.Spreadsheet

Und jetzt kommt€Ëœs: Das Unterformular soll nun nach der Auswahl einer Excel-Datei und des gewünschten Tabellenblatts den Inhalt genau dieses Tabellenblatts im Spreadsheet-Steuerelement anzeigen.

Dies geschieht genau nach der Auswahl eines Eintrags im Kombinationsfeld, wodurch das Ereignis Nach Aktualisierung dieses Steuerelements ausgelöst wird.

Die passende Ereignisprozedur finden Sie in Listing 4. Sie prüft zunächst, ob das Kombinationsfeld überhaupt einen Wert enthält. Falls ja, füllt sie das Objekt objWorksheet mit einem Verweis auf das angegebene Tabellenblatt der Importdatei. Dazu referenziert sie wiederum die weiter oben beschriebene Funktion objWorkbook mit dem angegebenen Dateinamen als Parameter und verwendet die Auflistung Worksheets, um an das gewünschte Tabellenblatt heranzukommen. Sie sehen hier bereits einen der Vorteile der Funktion objWorkbook: Sie brauchen (und sollen) das Ergebnis nicht erst einer Variablen zuzuweisen, sondern greifen gleich über die Punkt-Syntax auf die Eigenschaften und Methoden des zurückgelieferten Objekts zu.

Listing 4: Füllen des Spreadsheet-Steuerelements mit dem ausgewählten Tabellenblatt

Private Sub cboTabellenblaetter_AfterUpdate()
    Dim objWorksheet As Excel.Worksheet
    If Not IsNull(Me!cboTabellenblaetter) Then
        Set objWorksheet = _
        objWorkbook(Me!txtExcel-Date). _
        Worksheets(CStr(Me!cboTabellenblaetter))
        objWorksheet.Cells.Copy
        objSpreadsheet.Cells.Paste
    End If
    End Sub

Ist das Tabellenblatt erst einmal in Form der Objektvariablen objWorksheet referenziert, geht der Rest ganz schnell: Wir kopieren den kompletten Inhalt, den wir mit der Cells-Eigenschaft erfassen, mit der Copy-Methode und schreiben alles mit der Paste-Methode in unser Spreadsheet-Steuerelement. Das Ergebnis kann sich sehen lassen: Die Kopie des Excel-Tabellenblatts wird im Formular des Assistenten angezeigt und Sie können mit der Maus Bereiche markieren, ohne dass es wie bei einer per OLE eingeblendeten Excel-Instanz flackert (siehe Bild 5).

pic004.png

Bild 5: Der erste Schritt des Assistenten ist vollendet.

Schritt für Schritt

Nach diesem Schritt widmen wir uns ein wenig dem Ablauf des Assistenten und seiner Steuerung. Im aktuellen Zustand sind beispielsweise alle Schaltflächen beim Anzeigen des ersten Schritts aktiviert, was zumindest für die Zurück-Schaltfläche keinen Sinn macht, aber auch nicht für die Fertigstellen-Schaltfläche.

Betrachten wir zunächst, wie viele und welche Schritte wir überhaupt benötigen:

  • Schritt 1: Auswählen der Datei und des Tabellenblatts (bereits erledigt)
  • Schritt 2: Auswählen des zu importierenden Bereichs aus diesem Tabellenblatt
  • Schritt 3: Festlegen, ob der Bereich in eine neue oder eine bestehende Tabelle importiert werden soll
  • Schritt 4a: Falls in Schritt 3 der Import in eine neue Tabelle ausgewählt wurde, werden hier die Felder der Tabelle definiert.
  • Schritt 4b: Falls in Schritt 3 der Import in eine bestehende Tabelle ausgewählt wurde, werden hier die zu importierenden Spalten den Feldern zugewiesen.
  • Schritt 5: Festlegen, ob ein Primärschlüsselfeld verwendet werden soll und welches dies ist beziehungsweise ob ein neues Primärschlüsselfeld angelegt werden soll. Dies ist gleichzeitig der letzte Schritt.

Für die so definierten Schritte brauchen wir zunächst einige Unterformulare, die Sie gleich in Form von Kopien des ersten Unterformulars sfmDateiUndBlatt erstellen können – wir sparen uns so das wiederholte Hinzufügen des Spreadsheet-Steuerelements, das wir noch in weiteren Unterformularen benötigen. Die neuen Unterformulare sollen die folgenden Bezeichnungen erhalten:

  • sfmBereichAuswaehlen
  • sfmZieltabelleFestlegen
  • sfmFelderDefinieren
  • sfmFelderZuweisen
  • sfmFertigstellen

Danach wenden wir uns wieder dem Hauptformular zu, mit dessen Schaltflächen der Benutzer schließlich die Anzeige der jeweiligen Unterformulare steuern soll. Zunächst deklarieren wir im Klassenformular des Formulars (Form_frmExcelImportWizard) eine Variable, welche die Nummer des aktuellen Schritts speichert:

Dim intStep As Integer

Danach füllen wir die vier Schaltflächen mit Leben. Am einfachsten ist dies bei der Schaltfläche cmdAbbrechen, die einfach nur das Formular schließt:

Private Sub cmdAbbrechen_Click()
    Call Restarbeiten
    DoCmd.Close acForm, Me.Name
    End Sub

Die Prozedur Restarbeiten löscht die Zwischenablage, leert Objektvariablen und beendet die verwendete Excel-Instanz, damit diese nicht unsichtbar in den Untiefen des Task Managers umherirrt und unnötig Ressourcen belegt:

Public Function Restarbeiten()
    ZwischenablageLeeren
    Set m_Workbook = Nothing
    If Not m_Excel Is Nothing Then
        m_Excel.Quit
        Set m_Excel = Nothing
    End If
End Function

Die beiden Schaltflächen mit den Beschriftungen Weiter und Zurück, die Sie von jedem Assistenten kennen, enthalten nur minimal viel Code, nämlich jeweils zwei Anweisungen. Die Weiter-Schaltfläche erhöht intStep um eins und ruft dann die Funktion DoStep auf:

Private Sub cmdWeiter_Click()
    intStep = intStep + 1
    DoStep
        End Sub

Was die Zurück-Schaltfläche erledigt, können Sie sich vermutlich schon denken:

    Private Sub cmdZurueck_Click()
        intStep = intStep - 1
        DoStep
            End Sub

Die Hauptfunktion bezüglich der Steuerung des Assistenten befindet sich in der Prozedur DoStep (s. Listing 5). Diese wird ja, wie oben gesehen, nach jedem Klick auf eine der beiden Schaltflächen cmdZurueck und cmdWeiter je einmal aufgerufen, wobei sich jeweils der Wert von intStep ändert und somit ein anderer Zweig der in DoStep enthaltenen Select Case-Anweisung ausgeführt wird.

Listing 5: Diese Prozedur steuert den Ablauf des Assistenten und lädt die Unterformulare für die einzelnen Schritte.

Private Sub DoStep()
    Select Case intStep
    Case 1 €ËœDatei und Tabelle festlegen
    Me!sfmExcelImportWizard.SourceObject = "sfmDateiUndBlatt€
    Me!cmdAbbrechen.Enabled = True
    Me!cmdWeiter.SetFocus
    Me!cmdZurueck.Enabled = False
    Me!cmdWeiter.Enabled = True
    Me!cmdFertigstellen.Enabled = False
    Case 2 €ËœBereich auswählen
    Me!sfmExcelImportWizard.SourceObject = "sfmBereichAuswaehlen€
    Me!cmdAbbrechen.Enabled = True
    Me!cmdZurueck.Enabled = True
    Me!cmdWeiter.Enabled = True
    Me!cmdFertigstellen.Enabled = False
    Case 3 €ËœZieltabelle festlegen
    Me!sfmExcelImportWizard.SourceObject = "sfmZieltabelleFestlegen€
    Me!cmdAbbrechen.Enabled = True
    Me!cmdZurueck.Enabled = True
    Me!cmdWeiter.Enabled = True
    Me!cmdFertigstellen.Enabled = False
    Case 4 €ËœFelder zuweisen (bei bestehender Tabelle) oder Felder definieren (bei neuer Tabelle)
    Select Case bolNeueTabelle
    Case True
    Me!sfmExcelImportWizard.SourceObject = "sfmFelderDefinieren€
    Case False
    Me!sfmExcelImportWizard.SourceObject = "sfmFelderZuweisen€
    End Select
    Me!cmdAbbrechen.Enabled = True
    Me!cmdZurueck.Enabled = True
    Me!cmdWeiter.Enabled = True
    Me!cmdFertigstellen.Enabled = False
    Case 5 €ËœPrimärschlüssel festlegen, Importieren/Fertigstellen
    Me!sfmExcelImportWizard.SourceObject = "sfmFertigstellen€
    Me!cmdAbbrechen.Enabled = True
    Me!cmdZurueck.Enabled = True
    Me!cmdFertigstellen.Enabled = True
    Me!cmdFertigstellen.SetFocus
    Me!cmdWeiter.Enabled = False
    End Select
    End Sub

Innerhalb der Select Case-Zweige legt die Prozedur jeweils das Unterformular für den aktuellen Schritt fest und lädt dieses in das Hauptformular. Außerdem aktiviert beziehungsweise deaktiviert sie die vier Schaltflächen des Hauptformulars in Abhängigkeit von intStep.

Eine Besonderheit gibt es bei Schritt 4: Hier wird noch der Wert der Variablen bolNeueTabelle geprüft, die im Unterformular von Schritt 3 gefüllt wird. Abhängig vom Wert wird entweder das Unterformular zum Anlegen einer neuen Tabelle oder das zum Füllen einer bestehenden Tabelle angezeigt.

Bereich auswählen

Das Unterformular zum Auswählen eines Bereichs sieht wie in Bild 6 aus. Es enthält ein Kontrollkästchen namens chkSpaltenueberschriften, mit dem der Benutzer angeben kann, ob der ausgewählte Bereich Spaltenüberschriften enthält oder nicht.

pic005.png

Bild 6: Das Unterformular zum Definieren des zu importierenden Bereichs in der Entwurfsansicht

Hier stellt sich eine erste Design-Frage: Wir haben ja bereits im ersten Unterformular des Assistenten ein Spreadsheet-Steuerelement eingebaut. Ein solches befindet sich nun auch im zweiten Unterformular. Im ersten Formular soll das Spreadsheet-Steuerelement nur die Daten im ausgewählten Tabellenblatt anzeigen, damit der Benutzer sichergehen kann, dass er die richtigen Daten importiert. Im zweiten Schritt des Assistenten soll er im Spreadsheet-Steuerelement den Bereich des Tabellenblatts festlegen, der importiert werden soll. Nun müssen wir irgendwie dafür sorgen, dass das Spreadsheet-Steuerelements des Unterformulars im zweiten Schritt mit dem Inhalt des Spreadsheet-Steuerelements des ersten Unterformulars gefüllt wird. Wir könnten dies erledigen, indem wir die Daten aus dem ersten Unterformular kopieren und im zweiten Unterformular einfügen, aber das dauert fast genauso lange wie das Füllen des Spreadsheets im ersten Unterformular – bei größeren Datenmengen also durchaus mehrere Sekunden.

Die Alternative wäre, doch nicht mit verschiedenen Unterformularen zu arbeiten, sondern die Steuerelemente je nach aktuellem Schritt ein- und auszublenden. Dazu ist jedoch anzumerken, dass bei vielen Steuerelementen ein ziemliches Durcheinander im Entwurfsmodus herrscht.

Vielleicht funktioniert eine Mischlösung – eine, bei der zwar alle übrigen Steuerelemente in separaten Unterformularen stecken, aber nicht das Spreadsheet-Steuerelement Wir müssen dann nur sicherstellen, dass das Spreadsheet-Steuerelement in der Z-Reihenfolge über dem Unterformular liegt und zu den richtigen Zeitpunkten ein- und ausgeblendet wird.

Schneiden wir also das Steuerelement ctlSpreadsheet aus dem Unterformular sfmDateiUndTabelle aus und fügen diese im Hauptformular frmExcelImportWizard ein. Möglicherweise verschwindet das Steuerelement gleich hinter dem Unterformularsteuerelement sfmExcelImportWizard, was Sie leicht beheben können: Dazu markieren Sie einfach das Unterformularsteuerelement und wählen aus seinem Kontextmenü den Eintrag Position|In den Vordergrund aus (siehe Bild 7).

pic006.png

Ende des frei verfügbaren Teil. Wenn Du mehr lesen möchtest, hole Dir ...

den kompletten Artikel im PDF-Format mit Beispieldatenbank

diesen und alle anderen Artikel mit dem Jahresabo

Schreibe einen Kommentar