In diesem Blog-Beitrag beschreibe ich, wie man mit einem VBA-Makro und ein wenig Know How sich eine Scanfunktion in Word 2016 nachrüsten kann. Die Lösung funktioniert auch in Word 2013.
Anzeige
Zuerst ein kleiner historischer Abriss. Microsoft verzichtet ja seit Word 2007 darauf, eine Scanfunktion bereitzustellen. Hier im Blog habe ich daher immer wieder Bastellösungen (siehe Linkliste am Artikelende) vorgestellt, um doch aus Word scannen zu können. In Office 2013 ließ sich wenigstens noch aus OneNote scannen. Wenn mir kein Fehler unterlaufen ist, hat Microsoft diese Funktion in OneNote 2016 auch geschlachtet.
Aber es gab von mir eine Makro-Lösung für Word 2013 (siehe Links am Artikelende), die vielen Nutzern gute Dienste leistete. Aber das Scan-Makro entstand "quick & dirty" – denn mein letzten Buch zu VBA (Microsoft Word 97, Developer's Kit – Die technische Referenz), an dem ich beteiligt war, stammt aus 1998. Und mein Microsoft Press-Buch "Microsoft Office 97 Visual Basic-Programmierung" rangiert sogar aus 1997. So drei Mann-Monate für so ein Buch ackern, um dann (bei ca. 1 Euro pro Exemplar) zwischen 4.000 und 6.000 Euro Tantiemen einzunehmen – und dann noch von Schlaumeiern unter den Lesern angemacht zu werden "das und das fehlt" – das muss ich mir nicht mehr geben. Meine letzten Werke zu Visual Basic 2005 und C# 2005 habe ich 2006-2008 zusammen mit meinem Sohn verfasst, damit dieser eine Referenz als Entwickler bekommt (hat auch geklappt und ich kann ihm da längst nicht mehr das Wasser reichen). Von daher sind die Makros so was wie Fingerübungen für mich – aber meine Ambitionen gehen nicht dahin, eine Universallösung mit diesem und jenem Balkon für die geneigte Anwenderschaft zu entwickeln – also zwecklos nach so was zu fragen. Anderseits versuche ich den Artikel etwas breiter anzulegen, um das (noch) vorhandene Know How unter die Leserschaft zu bringen.
VBA, WIA, Twain, was sollte ich wissen
Im Blog-Beitrag verwende ich einige Kürzel und Technologien, die ich kurz sortieren möchte. Das Kürzel VBA steht für Visual Basic for Application, eine auf der Basic-Syntax aufsetzende Programmiersprache, mit der man in Office-Programmen wie Word sogenannte Makros (keine Programme) erstellen kann. Das VBA objektorientiert ist, kann man auf Funktionen (Objekte) anderer Anwendungen (wie z.B. Excel aus Word benutzen) und auf Bibliotheken (man spricht von Klassen) zugreifen.
Zur Ansteuerung eines Scanners benutze ich in diesem Blog-Beitrag eine Bibliothek, die von Windows 7, 8, 8.1 und 10 bereitgestellt wird – die Microsoft Windows Image Acquisition Library v2.0. Diese stellt eine sogenannte Klassenbibliothek bereit, die sich in VBA als Objekt instanziieren lässt. Damit kann man bequem auf die bereitgestellten Methoden (Funktionen) und Eigenschaften (quasi Variablen) der Scan-Schnittstelle zugreifen.
Anzeige
Der Ansatz setzt aber voraus, dass die WIA-Schnittstelle in Windows durch geeignete Geräte – sprich Scanner oder ähnliches – unterstützt wird. Windows 7 und folgende Betriebssysteme stellen zwar die WIA-Schnittstelle bereit – aber der Scanner-Hersteller muss für die Windows-Version geeignete WIA-Treiber bereitstellen, damit die Einbindung klappt. Die von vielen Scanner-Herstellern bereitgestellte TWAIN-Schnittstelle wird von meiner Lösung nicht unterstützt. Auf die Problematik bin ich in folgenden Blog-Beiträgen eingegangen.
Scanner unter Windows 7
Scanner funktioniert unter Windows 8/8.1 nicht
Falls jemand unbedingt mit einer TWAIN-Anbindung arbeiten will bzw. muss, verweise ich mal auf diesen Kommentar zum meinem Word 2013-Scan-Beitrag. Dort gibt einen Code-Schnipsel sowie einen Link auf eine Twain-Bibliothek. Sollte auch in Word 2016 funktionieren.
Generell lässt sich feststellen, dass die Twain-/WIA-Geschichte ein Auslaufmodell ist und nur noch im Privatanwender-Umfeld Verwendung findet. Modern Multifunktionsgeräte und –Scanner lassen sich per WiFi in ein lokales Netzwerk einbinden. Die Gerät haben Intelligenz und können eine Scan als Datei auf eine konfigurierbare Netzwerkfreigabe speichern. Im Home-Office meiner Frau steht so ein Gerät – habe ich aber nicht ins Netzwerk eingebunden.
Was die Scanfunktion leistet
Die hier vorgestellte VBA-Lösung ermöglicht aus Word 2013 oder Word 2016 per Schaltfläche den Scanner über die WIA-Schnittstelle anzusprechen. Dabei zeigt Windows (sofern mehrere WIA-Geräte angeschlossen sind) als erstes das Auswahldialogfeld für die verfügbaren WIA-Geräte (hier iPad, Digicam und Scanner).
Wählt der Benutzer ein Gerät und dann die OK-Schaltfläche, soll das WIA-Dialogfeld zur Scanner-Steuerung erscheinen.
Im Dialogfeld lassen sich die Scan-Optionen wählen und ein Scan-Vorschau triggern. Über die Scannen-Schaltfläche wird das Bild erfasst und in einer temporären Datei gespeichert. Im Anschluss ist der Scan an der aktuellen Stelle im Word-Dokument einzufügen.
Nicht unterstützt wird der Mehrseiten-Scan, den manche Geräte erzeugen. Die hat einen einfachen Grund: Ich habe erstens kein solches Gerät greifbar – und zweitens kann die WIA-Schnittstelle meines Wissens auch keine Multiseiten-Scans handhaben. Wer in dieser Richtung Feldforschung betreiben möchte oder muss, sollte in dieser Diskussion einige Ansätze finden.
Aufruf der VBA-Entwicklungsumgebung
Nach diesen Präliminarien möchte ich aber einsteigen. Als erstes gilt es, in Word 2016 (klappt auch in Word 2013) die VBA-Entwicklungsumgebung zur Eingabe des VBA-Makrocodes aufzurufen. Ich habe hier noch einen Screenshot aus Word 2013, der auch für Word 2016 passt.
1. Gehen Sie zur Registerkarte Ansicht und wählen Sie die Menüschaltfläche Makros. Dann ist der Befehl Makros anzeigen anzuwählen.
2. Bei Bedarf lässt sich im Listenfeld Makros in das Dokument (z.B. Normal.dotm (globale Vorlage) einstellen, damit das neue Makro in allen Word-Dokumenten zur Verfügung steht).
3. Dann kann man einen Makronamen wie Scan im Feld Makroname eintippen und auf Erstellen klicken.
Dann sollte sich das obige Fenster der VBA-Entwicklungsumgebung öffnen, in dem bereits der Prozedurrumpf der Funktion Scan() zu sehen ist. In der linken Spalte sieht man, dass das Makro dem Projekt Normal (Normal.dotm) unter Module zugeordnet ist. Aber das erfolgt alles automatisch durch die VBA-Entwicklungsumgebung und braucht uns momentan nicht zu kümmern.
Einbinden der WIA-Bibliothek
Bevor es mit dem Makrocode los geht, ist noch ein wichtiger Zwischenschritt erforderlich. Es ist sicherzustellen, dass VBA die benötigte Klassenbibliothek zur Ansteuerung der WIA-Schnittstelle kennt.
1. Gehen Sie zum Menübefehl Extras und wählen Sie im Menü den Befehl Verweise an.
2. Im Dialogfeld Verweise suchen Sie den Eintrag Microsoft Windows Image Acquisition Library v2.0 und markieren das Kontrollkästchen.
Wenn Sie das Dialogfeld über die OK-Schaltfläche schließen, wird die Bibliothek wiaaut.dll im Projekt mit referenziert. Dann können aus VBA auf die Klassen dieser Bibliothek zugegriffen und Objektinstanzen erzeugt werden.
Den Makro-Code ergänzen
Nach diesen Vorbereitungen sind wir an dem Punkt angekommen, wo der VBA-Code im Modul Scan() eingefügt werden kann. Für die Scanfunktion habe ich folgenden VBA-Code vorgesehen.
' Scan for Word 2013/2016 ' Author: Günter Born www.borncity.de www.borncity.com/blog ' Implements a Scan function in Word 2013/2016 Sub Scan() ' ' Scan Macro, to be invoked in Word ' On Error Resume Next Dim objCommonDialog As WIA.CommonDialog Dim objImage As WIA.ImageFile Dim strDateiname ' instantiate Scan WIA objects Set objCommonDialog = New WIA.CommonDialog Set objImage = objCommonDialog.ShowAcquireImage ' set temporary file strDateiname = Environ("temp") & "\Scan.jpg" If Not objImage Is Nothing Then Kill strDateiname 'delete old file ' save into temp file objImage.SaveFile strDateiname ' insert into document Selection.InlineShapes.AddPicture strDateiname Set objImage = Nothing End If Set objCommonDialog = Nothing ' MsgBox strDateiname ' test output End Sub
Die Anweisungen erzeugen Instanzen des WIA-Dialogs, ermitteln den Pfad zum temporären Ordner im Benutzerprofil, stoßen die Scanfunktion an und fügen das zwischengespeicherte JPEG-Bild in Word ein.
Gegenüber dem Makrocode aus dem Word 2013-Beispiel habe ich eine Vereinfachung eingeführt. Der Pfad zum Temp-Ordner des Benutzerprofils wird durch die
Environ("temp")
Methode ermittelt. Diese steht in VBA zur Verfügung und vermeidet die im Word 2013-Beispiel verwendete Windows API-Funktion. Der Aufruf der API-Funktion bringt Probleme beim Wechsel zwischen 32- und 64-Bit-Betriebssystemversionen. Der Parameter "temp" weist die Methode an, den Pfad zum temporären Ordner des Benutzerprofils zurückzuliefern. Im Code wird dann dieser Pfad um den Namen der zu erzeugenden Grafikdatei "\Scan.jpg" ergänzt.
Mit diesen Schritten ist der VBA-Makrocode fertig und man kann die Speichern-Schaltfläche der VBA-Entwicklungsumgebung anwählen (siehe obiges Bild). Anschließend lässt sich deren Fenster schließen.
Bei Bedarf können Sie den Makrocode auch aus der Datei ScanV2.zip beziehen. Einfach das ZIP-Archiv herunterladen, die darin enthaltene .BAS-Datei entpacken und in der VBA-Entwicklungsumgebung über Datei/Importieren in das vorher angewählte Modul importieren lassen.
Nach diesen Vorbereitungen sollte das Makro bereits lauffähig sein.
Testen des Makrocodes
Zum Testen des Makrocodes sind ebenfalls nur wenige Schritte erforderlich, die ich hier kurz skizziere.
1. Positionieren Sie die Einfügemarke im Word-Dokument an der Stelle, an der das Bild vom Scanner einzufügen ist.
2. Gehen Sie zur Registerkarte Ansicht, wählen Sie die Menüschaltfläche Makros und klicken Sie auf den Befehl Makros anzeigen.
3. Stellen Sie sicher, dass der Scanner oder die gewünschte WIA-Quelle eingeschaltet und mit dem PC verbunden ist.
3. Klicken Sie auf das dort aufgeführte Makro Scan und wählen Sie die Schaltfläche Ausführen.
Dann sollte der im nachfolgenden Abschnitt beschriebene Scan-Ablauf ausgeführt werden.
1. Sind im System mehrere WIA-Quellen verfügbar, erscheint das obige Dialogfeld, in dem Sie die Quelle (hier den Brother DCP-115C) wählen und dann die OK-Schaltfläche bestätigen.
2. Danach wählen Sie im obigen WIA-Scan-Dialogfeld die Scan-Optionen und bestätigen die Schaltfläche Scannen.
Bei Bedarf können Sie die Schaltfläche Vorschau wählen, so dass ein Probescan im Vorschaufenster erscheint. Dann lässt sich der Scan-Ausschnitt über die vier Ziehmarken justieren. Über die Optionsfelder und den Hyperlink der linken Spalte stellen Sie die gewünschten Scan-Optionen ein. Das erfolgt alles über die WIA-Funktionen des Betriebssystems, die vom Makro genutzt werden.
Während des Scanvorgangs wird der Verlauf in der obigen Fortschrittsanzeige dargestellt. Sobald die Vorlage erfasst wurde, speichert das Makro diese als JPEG-Grafik in einer temporären Datei und fügt das Ergebnis im Word-Dokument ein.
Sie können das (verknüpfte) Bild markieren und in der Größe anpassen oder auch wieder löschen. Wenn alles bis hier hin geklappt hat, ist die Scanfunktion für Word 2013/2016 nachgerüstet. Bricht das Makro bei der Ausführung mit einem Fehler ab, haben Sie den Code falsch eingegeben oder den Verweis auf die WIA-Bibliothek nicht eingebunden. Überprüfen Sie dann die obigen Schritte auf Fehler und Abweichungen. Beliebte Fehler sind Sonderzeichen, typografische Anführungszeichen oder fehlerhafte Hochkommas (Apostrophs).
In Teil 2 schaffen wir noch ein wenig Komfort, indem eine eigene Gruppe Scannen mit einer Scan-Schaltfläche auf der Registerkarte Einfügen angelegt wird. Zudem lässt sich bei Bedarf eine Scannen-Schaltfläche in der Symbolleiste für den Schnellzugriff einrichten, damit der Zugriff auf den Scanner richtig komfortabel wird.
Artikelreihe:
Scanfunktion in Word 2013/2016 nachrüsten – Teil 1
Scanfunktion in Word 2013/2016 nachrüsten – Teil 2
Ähnliche Artikel:
Scannen unter Word 2007/2010
Scannen in Word 2013 – Teil 1
Scannen in Word 2013 – Teil 2
Scanner funktioniert unter Windows 8/8.1 nicht
Anzeige
Gibt es ne Chance auch Scanner mit ScanSnap-Schnittstelle anzusprechen?
Keine Ahnung, die ScanSnap-Schnittstelle ist mir nicht bekannt. Kann das Teil nicht die Scans auf Netzwerkfreigaben legen?
Wenn da jemand eine Klassenbibliothek in Form einer DLL bereitstellt, wird man deren Objekte in VBA instantiieren und dann die Methoden und Eigenschaften dieser Objekte verwenden können. Nur, wie gesagt, in der Richtung bin ich (auch mangels Hardware) unbeleckt. Hier hat jemand was dazu geschrieben – ist aber eine ziemliche Frickelei und abseits dessen, was ich mit meinem Makro adressiere.
Danke, schaue ich mir mal an. ;-)
vielen Dank für Ihre ausführliche Erläuterung.
Werde wohl nie verstehen warum Microsoft die Scanfunktion aus MS office gelöscht hat.
Aber zum Glück gibt es noch Leute wie Sie die anderen Helfen.
Vorsicht beim Einfügen des VBA Codes durch copy & paste, da gibts einen Fehler beim Compiliren !
' set temporary file
strDateiname = Environ("temp") & "\Scan.jpg"
SO muss es aussehen, damit klappt es bei mir unter Win 10 64Bit nebst Office 2016. Im Original waren hinter temp" und hinter \Scan.jpg" andere Anführungszeichen (rückwärtsgerichtet, vermutlich durch Formatierungsfehler oder durch copy & paste enstanden…)
Kann sein, die Blog-Software haut mir da schon mal eine andere Formatierung rein. Hab es nochmals im Codeschnipsel korrigiert.
Mir ist es auch ein Rätsel warum Microsoft bei all den Verbesserungen die sonst in deren Produkte einfließen eine so nützliche Funktion rausnimmt.
Vielen Dank für das super Workaround wo mit Sicherheit einiges an Arbeit drinsteckt.
Vielen Dank für den tollen Workaround. Hat mir sehr geholfen, wieder eine direkte Scan Funktion in Word 2016 zu haben!
Schön beschrieben mag auch in der 32 Bit Version klappen mit dem Nachrüsten bzw. VBA Modul
Ich habe eine 64 Bit Version von Windows 10 und Office 2013, da klappt es leider nicht, da ist der VBA Umgebung gleich zu Beginn eine Fehlermeldung das was fehlt bzw. nicht zu finden ist!!
Ansonsten eine wirklich gute Anleitung!!
Vielen Dank für die Beschreibung. Windows 10 Home, 64 bit, Office 2016, Drucker brother mfc neu: Der Direkt-Scan aus Word 2016 funktioniert auf Anhieb.
Super! Hat geklappt und ich kann endlich wieder unter Word 2016 scannen. DANKE.
Hallo Erfinder,
super, super, super herzlichen Dank!! Tolle Beschreibung! Super Erklärung in Schrift und Bild – einfach toll! Hat hervorragend auf Anhieb geklappt.
Bin auch froh das Scannen wieder zu haben im Word.
Das Script funktioniert super und fügt tadellos Scans ein in Word 2016 (32 bit) unter Windows 10. Aber ja leider nur jeweils einen Scan.
Hat jemand eine Erweiterung für Mehrseiten-Scans von einem ADF-Scanner ausprobiert? Das hat unter Word 2000 ganz wunderbar geklappt und fehlt hier…
Das ist imho über die WIA-Erweiterungen nicht möglich.
Perfekt. Klappt auf Anhieb und ist mit der Beschreibung einfach zu implementieren. Keine Ahnung, weshalb MS dieses so simpel anmutende Feature (wenn man VBA kann) gestrichen hat. Danke für die Arbeit!
Mehrseitige Scans brauche ich in Word nicht, das geht auch extern über die Scannersoftware prima. Aber das Einfügen von Grafiken war ein Graus. Jetzt ist es so einfach wie gewohnt.
Ganz großes Kompliment! Eine intelligente und überraschend einfache Lösung und eine perfekte Anleitung. Ich habe mir ein Bookmark für Ihren Blog gemacht.
Vielen Dank
Jörg Petersson
Hi,
Danke für die gute Erklärung die auch einen Laien wie mir gut geholfen hat.
Ein Frage habe ich noch. In Wird 2010 konnte ich noch unter "Einfügen" einen Scanner anlegen. Jetzt muss ich immer in "Ansicht" "Makros" "Makros anzeigen" und dann auf "ausführen" klicken. Geht das auch "einfacher"?
Z.B. unter "Einfügen" ein Scansymbol oder so etwas ähnliches, wie es unter Word 2010 war?
LG,
Freddy-R.
Teil 2 des Beitrags wurde gelesen? Dort beschreibe ich doch, wie man eine Schaltfläche zum Scannen einrichtet.
Vielen Dank! Klappt super. Tolle Beschreibung.
Hallo Günter, vielen Dank für die hervorragende Beschreibung. Habe nun alles wieder wie früher.
Gruß
Jürgen ( 70 )
Recht vielen Dank, hat super geklappt.
Hallo
Alles super. Es hat alles bestens funktioniert, sowohl für Word als auch für PowerPoint.
Ein dickes Dankeschön
Harald (66)
Hallo Günter,
hallo zusammen
meine Freude über das Scanscript für PowerPoint dauerte nicht lange. Nach erneutem Aufrufen von PowerPoint funktionierte der Scan nicht mehr. Es kommt folgende Fehlermeldung "Fehler beim Kompilieren, Benutzerdefinierter Typ nicht definiert objCommonDialog As WIA.CommonDialog "
Gibt es eine Lösung?
In Word funktioniert das Scannen sehr gut.
Gruß
Harald
Vielen Dank für die Hilfe mit ausführlicher Beschreibung.
Hat bei mir funktioniert
Leider funktioniert das nur für eine Seite. Ich möchte mehrere einscannen!!
Im ersten Schritt die Tastatur reparieren lassen, die prellt. Dann schlicht das Makro auf eine Taste legen – dann einfach mehrfach drücken, dann wird Seite für Seite gescannt!
Leute, ich setze mich hin und stricke eine Lösung, die die WIA-Methoden hergeben – und es fällt euch nichts ein als rumzukritteln, dass das nicht für mehrere Seiten geht? Es steht jedem frei, sich entsprechende DLLs zu schreiben und den Scanner entsprechend anzusteuern – da bin ich außen vor.
Hallo Herr Born,
der Makrocode funktioniert unter Word 2016 einwandfrei.
Vielen Dank dafür.
Leider trifft dies nicht, wie Sie ja beschrieben haben, auf den Mehrseitenscan zu.
Da ich mich in VBA nicht auskenne, meine Frage, wäre es ein großer
Programmieraufwand, den Quellcode auch auf Mehrseitenscans auszuweiten?
Für eine schnelle Antwort bedanke ich mich bereits im Voraus.
Martin
Mehrseitenscan wird von dem WIA-Objekt m.W. nicht abgedeckt – von meiner Seite ist das Thema abgehakt, da ich persönlich das nicht brauche. Die Artikelreihe war eine Fingerübung, ob ich es noch gebacken kriege.
Es gibt einen Ansatz auf GitHub, wo jemand eine Erweiterungsbibliothek zum Ansprechen des automatischen Dokumenteneinzugs per WIA 2.0 geschrieben hat. Keine Ahnung, wie einfach sich das einbinden lässt und ob bzw. wie gut das funktioniert. Ich selbst müsste mir erst einmal die Hardware mit einem Scanner samt automatischem Einzug beim Scan beschaffen und einrichten. Bei aller Liebe, das ist nicht die Baustelle, auf der ich als Blogger herumzutoben gedenke.
Vielleicht hat einer der Scanner-Hersteller, die das Zeug ja verticken, da mal ein Add-In für Word geschrieben.
Ich finde es super, passt zu 99% für jeden. Wer mehr will muss sein Gehirn eben selbst einschalten.
Vielen Dank für das Tolle Makro und besonders auch den 2. Teil mit der Einbindung in die Menüleiste.
Ich habe zwei Scanner an meinen PC angeschlossen: einen (neueren) Multifunkionsdrucker (im WLAN), der sich über WIA ansteuern lässt, und einen (älteren) Lide 100 von Canon (lokal per USB).
Mit Word 2010 bekomme ich beim Klick auf "Bild von Kamera oder Scanner einfügen" ein Auswahlmenü, mit dem ich zwischen vier Optionen auswählen kann: jeweils den WIA-Dialog bzw. die Canon-Software ScanGear, die viel mehr Einstellungsmöglichkeiten bietet.
Ich habe das im Blog verlinkte Makro zur Ansteuerung via TWAIN ausprobiert, aber dieses läuft leider nur in der 32bit-Version von Word. Gibt es ein Script für 64bit?
Dankeschön,
Schön dass dieses excellente Script auch in Word 2021 funktioniert.
Schade, dass es in Outlook 2021 nicht funktioniert. Es wird zwar das WIA-Fenster zum Scannen angezeigt, jedoch das gescannte Dokument verschwindet irgendwo.
Wenn es dafür noch eine Lösung gibt?