Lies diesen Artikel und viele weitere mit einem kostenlosen, einwöchigen Testzugang.
Da einige Zeitgenossen immer noch an das papierlose Büro glauben, will Access im Unternehmen zumindest einen kleinen Teil zu diesem Traum beitragen. Dazu liefern wir Ihnen Know-how rund um das Scannen von Dokumenten per VBA – natürlich mit automatischer Konvertierung in den gewünschten Dateityp und Speicherung der Datei am von Ihnen vorgegebenen Ort.
Voraussetzungen
Das Scannen von Dokumenten und das Handling der so entstehenden Dateien erfolgt unter modernen Betriebssystemen (Windows XP SP1 und höher) mit der kostenlosen Windows Image Acquisition Automation Library v2.0 (WIA), die Sie unter [1] herunterladen können.
Diese Bibliothek setzt einen modernen Scanner mit WIA-Schnittstelle voraus. Informationen zu entsprechenden Techniken für ältere Betriebssysteme und Scanner finden Sie im Kasten Scannen mit älteren Betriebssystemen. Die WIA-Bibliothek offeriert noch weitere Möglichkeiten wie etwa das Einlesen von Bildern einer Digitalkamera. Dieser Beitrag beschränkt sich jedoch auf die Steuerung von Scannern.Nach dem Herunterladen müssen Sie die im Paket enthaltene DLL mit dem Befehl Regsvr32 <Dateiname> registrieren. Für den Einsatz in VBA richten Sie außerdem einen passenden Verweis auf diese Bibliothek ein (siehe Bild 1).
Bild 1: Das Steuern eines Scanners per VBA erfordert einen Verweis auf die WIA-Bibliothek.
Scannen auf die Schnelle
Wer will schon in die Tiefen einer Objektbibliothek einsteigen, wenn man auch mit einer kleinen Routine den ersten Scan von Access initiieren kann Wenn Sie obige Vorbereitungen getroffen haben und ein funktionstüchtiger Scanner an Ihrem Rechner hängt, können Sie sofort mit der Routine aus Listing 1 loslegen.
Listing 1: Dokument scannen und speichern
Public Function ScannenUndSpeichern(strDateiname As String) Dim objCommonDialog As WIA.CommonDialog Dim objImage As WIA.ImageFile Set objCommonDialog = New WIA.CommonDialog Set objImage = objCommonDialog.ShowAcquireImage If Not objImage Is Nothing Then objImage.SaveFile strDateiname Set objImage = Nothing End If Set objCommonDialog = Nothing End Function
Dabei lernen Sie auch direkt das Objekt kennen, von dem aus Sie alle notwendigen (und weniger notwendigen) Dialoge öffnen können. Der Dialog, den die Routine mit der Methode ShowAcquireImage anzeigt, sieht etwa wie in Bild 2 aus.
Bild 2: Der per VBA geöffnete Dialog zum Steuern des Scanners
Dieser Dialog erlaubt die grundsätzlichen Einstellungen wie die Auswahl des Bildtyps und des zu scannenden Bereichs, wobei der Dialog bereits eine sinnvolle Vorauswahl trifft. Weitere Details stellen Sie mit dem Dialog aus Bild 3 ein, den Sie über den Link Qualität des gescannten Bildes verbessern öffnen. Die Routine aus Listing 1 erwartet den Dateinamen der zu speichernden Datei als Parameter. Der Aufruf könnte dann etwa folgendermaßen lauten:
ScannenUndSpeichern "c:\Scan.bmp"
Bild 3: Feineinstellungen für das Scannen
Die wichtigste Eigenschaft dieses Dialogs ist, dass er ein Objekt des Typs ImageFile zurückgibt, das Sie anschließend per VBA weiterbearbeiten können – etwa, um es wie in diesem Fall zu speichern.
Dialoge über Dialoge
Neben diesem Dialog bietet WIA noch einige Dialoge mehr. Die Methode ShowDeviceProperties etwa öffnet den Dialog mit den Eigenschaften des ausgewählten Scanners (ist nur ein Scanner vorhanden, entfällt der Auswahldialog, den die Methode ShowAcquireImage in der gleichen Routine aufruft). Listing 2 zeigt eine Beispielroutine zum Aufrufen dieses Dialogs. Die Funktionen der übrigen Methoden des CommonDialog-Objekts sind in der Online-Hilfe dokumentiert.
Listing 2: Beispiel für die Anzeige der
Scanner-Eigenschaften
Public Function Scannereigenschaften() Dim objCommonDialog As WIA.CommonDialog Dim objDevice As WIA.Device Set objCommonDialog = New WIA.CommonDialog Set objDevice = objCommonDialog. _
ShowSelectDevice With objCommonDialog .ShowDeviceProperties objDevice End With End Function
Komfortabel scannen
Für Access-Anwendungen wie etwa Rechnungs- oder Vertragsverwaltungen kann der Aufruf des Scanvorgangs von einem Formular aus und das anschließende Speichern des Scanergebnisses und des dazugehörenden Pfades sehr viel Arbeit sparen. In diesem Beitrag lernen Sie ein Formular kennen, mit dem Sie den Scanner auswählen, einen Dateinamen festlegen und den Scanvorgang starten können. Das fertige Formular sieht wie in Bild 4 aus.
Viel interessanter ist jedoch das Modul, das für die vom Formular aus aufgerufenen Scanvorgänge verantwortlich ist. Dieses Modul heißt mdlScannen und enthält alle für das Scannen erforderlichen Routinen – welche das im Einzelnen sind, erfahren Sie in den folgenden Abschnitten.
Scanner auswählen
Das Kombinationsfeld zum Auswählen des Scanners wird mit der Funktion ScannerErmitteln (s. Listing 3) gespeist, und zwar beim öffnen des Formulars. Die Routine erzeugt zunächst ein Objekt des Typs DeviceManager, der das Erzeugen einer Connection auf die enthaltenen Scanner ermöglicht. Die einzelnen Geräte kann man über die Auflistung DeviceInfos ansprechen, die eindeutige ID und die Bezeichnung erhält man über die passenden Properties eines Elements dieser Auflistung. Die Funktion ScannerErmitteln liefert eine Liste mit den durch Semikola getrennten IDs und den Bezeichnungen der Geräte. Damit das Kombinationsfeld cboScanner diesen Ausdruck vernünftig auswerten kann, stellen Sie die Eigenschaft Herkunftsart auf Wertliste, Spaltenanzahl auf 2 und Spaltenbreite auf 0cm ein.
Listing 3: Erstellen einer Liste der vorhandenen Scanner
Public Function ScannerErmitteln() As String Dim objDeviceManager As WIA.DeviceManager Dim i As Integer Dim strScannerliste As String Set objDeviceManager = New WIA.DeviceManager For i = 1 To objDeviceManager.DeviceInfos.Count Debug.Print objDeviceManager.DeviceInfos.Item(i).DeviceID strScannerliste = strScannerliste _
& objDeviceManager.DeviceInfos.Item(i).DeviceID & ";" & objDeviceManager.DeviceInfos. _
Item(i).Properties("Name") & ";" Next i ScannerErmitteln = strScannerliste End Function
über die ID kann das Formular eine Verbindung zum ausgewählten Scanner herstellen – das funktioniert prinzipiell so wie in Listing 4. Nun bringt das Formular aus Bild 4 es mit sich, dass zum aktuell ausgewählten Scanner mehrere Informationen ermittelt werden müssen – die Farbeinstellung, die Auflösung sowie die Helligkeit und der Kontrast. Außerdem erfordert auch das Starten des Scanvorgangs eine Referenz auf eine aktive Verbindung zum Scanner. Um die Funktionen der WIA-Bibliothek möglichst in einem Standardmodul zu versammeln, sollen die Zugriffe auf den jeweiligen Scanner allein über die ID als Parameter erfolgen – diese können Sie ganz einfach als String übergeben.
Listing 4: Initialisieren des Formulars frmScanner
Private Sub Form_Open(Cancel As Integer) Dim strDevice As String Me!cboScanner.RowSource = ScannerErmitteln If Len(Me!cboScanner.RowSource) > 0 Then Me!cboScanner = Nz(DLookup("Wert", "tblParameter", _
"Parameter = 'AktuellerScanner'"), _
Me!cboScanner.ItemData(0)) strDevice = Me!cboScanner SteuerelementeAktualisieren strDevice Else MsgBox "Es ist kein Scanner an diesen Rechner angeschlossen." Cancel = True End If End Sub Private Sub SteuerelementeAktualisieren(strDevice As String) Me!cboAufloesung.RowSource = AufloesungenErmitteln(strDevice) Me!cboAufloesung.Value = AktuelleAufloesungErmitteln(strDevice) Me!txtHelligkeit = AktuelleHelligkeitErmitteln(strDevice) Me!txtKontrast = AktuellenKontrastErmitteln(strDevice) End Sub
Bild 4: Das Formular zum Eingeben der Parameter und zum Starten des Scanvorgangs
Legen Sie also zunächst die benötigten Funktionen fest, indem Sie die Ereignisprozedur Beim öffnen des Formulars frmScannen wie in Listing 2 anlegen. Die Routine liest zunächst die Liste der vorhandenen Scanner ein und weist diese der Eigenschaft RowSource des passenden Kombinationsfeldes zu – vorausgesetzt, sie findet einen Scanner. Ist das der Fall, prüft die Routine den in der Tabelle tblParameter gespeicherten Wert des Parameters AktuellerScanner und wählt im Kombinationsfeld entweder diesen Wert oder den ersten vorhandenen Eintrag aus.
Anschließend weist sie der Variablen strDevice die ID des ausgewählten Scanners hinzu. Die Routine SteuerelementeAktualisieren füllt die vier Steuerelemente mit den passenden Eigenschaften; diese Anweisungen sind deshalb in einer eigenen Routine enthalten, weil diese auch noch nach dem Aktualisieren des Kombinationsfeldes cboScanner aufgerufen wird.
Ende des frei verfügbaren Teil. Wenn Du mehr lesen möchtest, hole Dir ...
Testzugang
eine Woche kostenlosen Zugriff auf diesen und mehr als 1.000 weitere Artikel
diesen und alle anderen Artikel mit dem Jahresabo