Scannen in Word 2013 – Teil 2

[English article]In Teil 1 wurde ja festgestellt, dass das neue Word 2013 keine Scan-Funktion hat. Also habe ich nach einem Weg gesonnen, diese Funktion nachzurüsten. In Teil 1 habe ich die Funktionalität der Scan-Funktion vorgestellt und die Funktionen zum Aufrufen der VBA-Entwicklungsumgebung beleuchtet Nun liefere ich den VBA-Code nach und zeige, wie das Ganze als Schaltfläche im Word implementiert wird.


Anzeige

VBA-Code zum Zugriff auf die WIA-Schnittstelle

Nachdem ich die Typ-Bibliothek für die WIA-Schnittstelle gefunden hatte, brachte eine kurze Recherche VBA-Code-Fragemente zum Zugriff auf die WIA-Schnittstelle zum Vorschein [1,2], zum Löschen einer Datei [3] und zum Ermitteln des Temp-Ordners [4]. Der Temp-Ordner dient zur Zwischenspeicherung der Scan-Datei. Hier nun der gesamte Quellcode des VBA-Makros.

' Scan for Word 2013
' Author: Günter Born www.borncity.de blog.borncity.com
' Implements a Scan function in Word 2013

Private Declare Function GetTempPath Lib "kernel32" Alias "GetTempPathA" (ByVal nBufferLength As Long, ByVal lpBuffer As String) As Long

Private Function TempPath() As String
Const MaxPathLen = 256 ' Max path length
Dim FolderName As String ' Folder name
Dim ReturnVar As Long ' Return Value
FolderName = String(MaxPathLen, 0)
ReturnVar = GetTempPath(MaxPathLen, FolderName)
If ReturnVar <> 0 Then
TempPath = Left(FolderName, InStr(FolderName, Chr(0)) – 1)
Else
TempPath = vbNullString
End If
End Function


Anzeige

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
strDateiname = TempPath & "Scan.jpg"  ' set temporary file
If Not objImage Is Nothing Then
Kill strDateiname
objImage.SaveFile strDateiname ' save into temp file
Selection.InlineShapes.AddPicture strDateiname ' insert in doc
Set objImage = Nothing
End If
Set objCommonDialog = Nothing
' MsgBox strDateiname  ' test output
End Sub

Der VBA-Code instantiiert ein WIA.CommonDialog-Objekt und ruft dann die ShowAcquireImage-Methode dieses Objekts auf. Diese gibt ein Bild als Objekt zurück, welches dann in einer Datei im Temp-Ordner des Benutzers abgelegt und dann im der AddPicture-Methode in Word eingefügt wird. Der obige Makro-Code lässt sich im Visual Basic-Editor-Fenster eingeben und dann speichern.

Die Schaltfläche Scannen einfügen

Als letzter Schritt im Dreiklang gilt es nun die Schaltfläche Scannen einzurichten. Idealerweise sollte diese in der eigenen Gruppe Scan auf der Registerkarte Einfügen zu finden und mit dem obigen Makro verbunden sein.

1. Klicken Sie mit der rechten Maustaste auf das Menüband und wählen den Kontextmenübefehl Menüleiste anpassen.

2. Wählen Sie im Dialogfeld Word-Optionen in der linken Liste Befehle auswählen den Wert "Makros".

3. Anschließend wählen Sie in der rechten Spalte "Menüband anpassen" den Eintrag Einfügen und expandieren diesen.

4. Dann fügen Sie über die Schaltfläche Neue Gruppe eine Gruppe ein und benennen diese mit "Scan".

5. Fügen Sie mittels der Schaltfläche Hinzufügen den Eintrag Normal.NewMacros.Scan zur rechten Liste im Zweig Scan hinzu.

6. Benennen Sie den Eintrag mit Scannen und weisen Sie im geöffneten Dialogfeld ein Schaltflächensymbol hinzu.

Sobald Sie das Dialogfeld über die OK-Schaltfläche schließen, sollte das VBA-Makro durch Anwahl der Schaltfläche Scannen aufrufbar sein. Dann sollten die in Teil 1 gezeigten Scan-Dialogfelder erscheinen und Sie können den Scan vornehmen und in Word im Dokument einfügen.

Damit möchte ich den Artikel schließen und hoffe mit den Ausführungen genügend Know-How geliefert zu haben, um aus Word 2013 zu scannen. Hier findet sich noch eine Download-Datei Scan1.zip, in dem sowohl eine Word *.docm-Datei sowie der Makro-Code als .bas-Datei mit der fertigen Lösung finden. Den Makro-Code können Sie bei Bedarf unter Word im Dialogfeld Organisieren in die Normal.dot kopieren.

Artikel
a: Scannen in Word 2013 – Teil 1
b: Scannen in Word 2013 – Teil 2
c: Scannen unter Word 2007/2010

Links:
1: Technet-Artikel
2: Scan in Access
3: Datei in VBA-Löschen
4: Temp-Ordner ermitteln


Anzeige

Dieser Beitrag wurde unter Allgemein abgelegt und mit , , , verschlagwortet. Setze ein Lesezeichen auf den Permalink.

42 Antworten zu Scannen in Word 2013 – Teil 2

  1. Günter Born sagt:

    Blog-Leser Wolfgang hat versucht, die obige Lösung auf einer 64-Bit-Office-Plattform auszuführen und hat einige Probleme gefunden. Hier ein kurzer Brush-Up für einige Klippen.

    Makro-Sicherheit verhindert VBA-Ausführung?

    Falls bei Euch das Makro wegen Sicherheitseinstellungen nicht ausgeführt wird, öffnet über die Registerkarte DATEI die Backstage-Ansicht und wählt den Befehl Optionen.

    In den Word-Optionen lässt sich in der Kategorie Trust Center die Schaltfläche Einstellungen für Trust Center wählen. Im Dialogfeld "Trust Center" könnt ihr dann die Optionsfelder "Makroeinstellungen" der gleichnamigen Kategorie auf "Alle Makros mit Benachrichtung deaktivieren" oder testweise auf "Alle Makros aktivieren" setzen, um das Makro ausführen zu lassen. Obwohl das eigentlich in einer Umgebung mit selbst erstellten Makros nicht zutreffen sollte.

    Windows Image Acquisition Library referenzieren

    Tritt beim Übersetzen des Makros ein Fehler auf, dass die WIA-Komponenten unbekannt seien? Standardmäßig kennt das Word-Objektmodell diese Typ-Bibliothek natürlich nicht. Es ist im Artikel an Hand eines Screenshots dokumentiert, welche Verweise erforderlich sind.

    Wichtig: Achtet daher auch darauf, dass in der VBA-Entwicklungsumgebung unter "Extras -> Verweise" die "Windows Image Acquisition Library 2.0" (WIA-Bibliothek) einbezogen ist (das Kontrollkästchen muss markiert sein, siehe letztes Bild in Teil 1).

    Hier schaue ich ggf. bei Gelegenheit mal, wie eine späte Bindung zur Laufzeit (siehe hier) im Code eingefügt werden kann, so dass die obigen expliziten Verweise überflüssig werden.

    Windows 64 Bit

    Ein Blog-Leser hat mich darauf aufmerksam gemacht, dass das Makro unter einem 64-Bit-Windows nicht läuft. Es kommt folgende Fehlermeldung.

    Ich habe es in einer virtuellen Maschine unter einem 32-Bit-Windows 8 mit Office 2013 entwickelt und getestet. Offenbar schlägt da in der 64-Bit-Umgebung der API-Funktionsaufruf zur Ermittlung des Pfads zum temporären Ordners fehl. Hier reicht die Änderung der API-Deklaration (gemäß [a3]) von:

    Private Declare Function GetTempPath Lib "kernel32" _
    Alias "GetTempPathA" (ByVal nBufferLength As Long, _
    ByVal lpBuffer As String) As Long

    in:

    Private Declare PtrSafe Function GetTempPath Lib "kernel32" _
    Alias "GetTempPathA" (ByVal nBufferLength As longptr, _
    ByVal lpbuffer As String) As Long

    Dann sollte der Aufruf auch in einer 64-Bit-Umgebung funktionieren. Ich habe es gerade in einer 64-Bit-Word-Version unter Windows 8 Enterprise 64 Bit getestet.

    Sofern das das Problem nicht löst: Als schneller Workaround schlage ich vor, den Makrocode folgendermaßen zu modifizieren.

    ' Scan for Word 2013
    ' Author: Günter Born http://www.borncity.de blog.borncity.com
    ' Implements a Scan function in Word 2013

    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
    strDateiname = "C:UsersPublicPictures" & "Scan.jpg" ' temp
    If Not objImage Is Nothing Then
    Kill strDateiname ' delete old file
    objImage.SaveFile strDateiname ' save into temp file
    Selection.InlineShapes.AddPicture strDateiname ' insert in doc
    Set objImage = Nothing
    End If
    Set objCommonDialog = Nothing
    ' MsgBox strDateiname ' test output
    End Sub

    Ich habe in obigem Code die Funktion zum Aufrufen des Pfads zum TEMP-Ordner rausgeworfen und lasse die Grafikdatei des Scans im Ordner C:UsersPublicPictures speichern. Das setzt voraus, dass Windows auf dem logischen Laufwerk C: installiert ist. Die betreffenden Informationen finden sich unter [a2].

    Links:
    a1: Walkthrough: Calling Windows APIs (Visual Basic)
    a2: Kompatibilität 32-/64-Bit-Version von Office 2010
    a3: Declaring API Functions In 64 Bit Office
    a4: Office 64bit VBA und Windows API
    a5: A Graphic Discussion about the Windows Image Acquisition Component
    a6: Shared Samples (Windows)

  2. Günter Born sagt:

    Nachtrag mit der Bitte, das wirklich zu lesen

    Es schlagen immer wieder Leute mit Kommentaren hier im Blog ein "es geht nicht" – das ist in Ordnung, solange sich das "es geht nicht" nicht auf Sachen bezieht, die ich mindestens 3 Mal hier in Kommentaren beantwortet habe!

    Es treffen hier auch E-Mail-Anfragen (empfinde ich als drängeln) und/oder (weil auf E-Mail-Anfragen nicht binnen Sekunden reagiert wird) Anrufe zu unmöglichen Zeiten bei mir ein (das empfinde ich ganz einfach als dreist), die Probleme mit den Makros thematisieren.

    Daher ein paar ziemlich direkte Anmerkungen meinerseits.

    a) Ich bitte von direkten Anrufen der Art "das Makro funktioniert nicht, was könnte das sein" abzusehen. Ich bin nicht der Supporter der Nation und habe nebenbei auch noch einen Broterwerb, der schwierig genug ist. Daher stehe ich längst nicht mehr mit meiner privaten Telefonnummer im Telefonbuch – und gebe auch k e i n e n privaten Support für das Makro. Das Zeugs habe ich vor Jahren mal als Service zusammen geklöppelt, um zu zeigen das es funktioniert (und es funktioniert)! und wie es funktioniert. Aber ich sitze nicht stündlich hier und mache mir Gedanken "was könnte es sein, wie funktioniert denn das, schau dir nochmals den Code an und erkläre."

    Ich verstehe, dass es für Leute schwierig mit VBA-Makros ist. Aber, die andere Seite der Medaillie: Es hätte vor vielen Jahren VBA-Bücher und Scripting-Titel aus meiner Feder zu so was gegeben. Da habe ich viel Zeit investiert. Hat keine Sau interessiert (damals habe ich gehört: Braucht kein Mensch, findet man doch in diesem Internetz). Also habe ich diese Projekte beerdigt, meine Investition abgeschrieben und einen Schlussstrich gezeogen. Daher sehe ich auch keine Möglichkeit, das nun fehlende Wissen bei der Anwenderschaft in gratis Privatvorlesungen und -Konsultationen nachzuschulen! Das ist schlicht nicht mein Bier – und zudem findet ihr das alles ja in diesem Internetz (wird zumindest immer von Leuten behauptet, die Computerbücher für nutzloses Zeugs halten) …

    b) Es ist doppelt schade, wenn hier Leute einschlagen "es gibt ein Problem – Fehler in 'Dim objCommonDialog As WIA.CommonDialog' beim Übersetzen", weil sie die Hinweise und Anleitungen nicht lesen. In Teil 1 ist dediziert beschrieben, wie man vorgehen und das Häkchen beim Einbinden der Bibliotheken setzen muss, damit die Referenzen überhaupt aufgelöst werden können. Hätte man zwar mit dynamischer Bindung machen können (aber ich habe mich für eine andere Implementierung entschieden). Daher nochmals der betreffende Screenshot, in dem die WIA-Bibliothek durch ein Häkchen im Kontrollkästchen einzubinden ist!

    c) Offenbar haben Leute mit Copy & Paste beim Code Probleme – ich habe daher den Quellcode zusätzlich als ZIP-Datei bereitgestellt. Man könnte den also von dort übernehmen und einfügen. Um mögliche Fallstricke zu entschärfen, hier eine anonymisierte Zuschrift eines solchen Falls:

    ich versuche gerade, Ihre Anleitung "Scannen in Word 2013" umzusetzen
    Ich habe den Macro aus Ihrem Beitrag kopiert und als "Scan" eingefügt. Wenn ich den Macro "Scan" dann ausführe, bekomme ich für die Zeile "Dim objCommonDialog as WIA.CommonDialog" die Fehlermeldung "Fehler beim Compilieren: Benutzerdefinierter Typ nicht definiert".
    Was kann ich tun?

    Wäre Antwort b gewesen …

    Übrigens trägt in der Zeile
    Private Declare Function GetTempPath Lib "kernel32″ Alias "GetTempPathA" (ByVal nBufferLength As Long, ByVal lpBuffer As String) As Long
    der Ausdruck "kernel32" das falsche unquote Zeichen.

    Auch da stelle ich fest, dass die Anweisungen im Blog das richtige unquote Zeichen " tragen! Es gab dann auch noch einen Anruf, weil ich nicht pronto auf die Mail geantwortet habe – kommt besonders gut, wenn Du gerade versuchst, ein paar zeitkritische Sachen zu erledigen. Mit dem Verweis, den Text mal wirklich zu lesen und dann den Code durchzugehen und ggf. zu recherchieren habe ich den Anruf beendet. Immerhin war der Leser so höflich, die Rückmeldung zu geben, was bei ihm falsch gelaufen ist.

    Neben der vergessenen (und in Teil 1 beschriebenen) Einbindung der WIA-Klassenbibliothek gab es beim Anwender schlicht Fehler im Code. Hier seine Rückmeldung:

    ich habe das Problem gelöst, dass das eingescannte Bild anschließend nicht sichtbar war. In der Zeile
    strDateiname = TempPath %26 "Scan.jpg" ' set temporary file
    hatte ich die falschen quote unquote Zeichen verwendet. Richtig ist "Scan.jpg", falsch ist "Scan.jpg".

    Das ist beim Kopieren aus Ihrem Blog so passiert.

    Nochmals vielen Dank.

    Nur ähm, im Blog stehen die korrekten Zeichen ( " ) für die Strings im Code. Ich tippe darauf, dass da eine Word-Autokorrektur zugeschlagen und alles in typographische Anführungszeichen umgewandelt hat. Oder der Browser rendert die Zeichen der Schriftart so, dass diese wie typografische Zeichen ausschauen (kann ich nicht beeinflussen). Falsche Zeichen sollten aber in der Syntaxanzeige des VBA-Codes sichtbar sein. Und wer Codeausschnitte hier per Markieren, Kopieren und Einfügen per Zwischenablage in den Windows-Editor überträgt, sieht die richtigen Zeichen (gerade nochmals probiert).

    Klingt für euch möglicherweise alles Großkotz und unhöflich – aber ich bin über so was momentan eigentlich nur noch genervt. Ich klingele ja auch nicht Sonntags um 23:00 Uhr bei meinen Blog-Lesern und merke an: ich bräuchte mal ne Rohrzange, müsste die Zündkerzen meines Autos tunen – und wo wir gleich mal dabei sind, Sie könnten mir dabei helfen, die Dinger im Auto zu suchen – ich habe nämlich keine Ahnung von so was – und übrigens, die Räder müssten auch noch gewechselt werden, könnten Sie bei der Gelegenheit gleich mitmachen – danke. Wenn so etwas so dringlich ist: Es gibt Fachwerkstätten, die das gegen Geld und gute Worte zu den üblichen Arbeitszeiten erledigen. Warum meint nur alle Welt, dass das bei Rechnertechnik zu jeder Tageszeit und für lau sein muss?

    … einfach drüber nachdenken, bevor jemand mal wieder die Telefonnummer im Impressum anwählt, aber den Text des Impressums nicht bis zu Ende liest.

    Im übrigen: Kommentare sind hier im Blog immer gerne gesehen, wenn nicht zum 5ten Mal etwas gefragt wird, was drei Kommentare vorher bereits beantwortet wurde. Ich kann zwar nachvollziehen, dass einiges als Einsteiger schwierig ist. Das mindeste, was man aber verlangen kann, ist Lesen und Recherche. Ich hoffe, ihr versteht das. Falls nicht, kann ich das auch nicht ändern. Bin eigentlich ein umgänglicher Mensch, aber an dieser Stelle muss ich einfach einen Cut machen.

  3. Tom sagt:

    Danke für den Blog,
    habe Word 2013 auf win 7 64bit, schaffe es trotz der guten Anleitung nicht. Der Scanner Button usw. ist alles da. Dann aber die Felmeldung:
    "Fehler beim Kompilieren:
    Erwartet: Anweisungsende"
    Gibts noch eine Möglichkeit?
    Danke für die Mühen
    Thomas B.

    • Günter Born sagt:

      Dann hast Du einen Syntax-Fehler im VBA-Code. Da hilft imho nur, den Code durchforsten.

      Beachte: Die Declare-Anweisung Private Declare Function GetTempPath wird von der Blog-Software in mehrere Zeilen umbrochen – muss aber als eine Zeile in der VBA-Umgebung auftauchen! Das könnte schon die Ursache sein.

  4. Tom sagt:

    Merci vielmals für die prompte Antwort,
    die Declare-Anweisung ist in einer durchgehenden Zeile, bin ein "VBA" Amateur, da sind mehr Zeilen auf "rot" ich denke, dass hier die "Fehler" stecken.
    Ich habe das Ganze mit "copy & paste" eingefügt.
    Die "Trust" und "Add In" Einstellung sollten auch passen, ebenso ist "Windows Image Acquisition Library 2.0″ aktiviert.
    Hmm…?

    Wäre schön gewesen soll eben so nicht sein.

    Trotzdem Danke, wäre schön wenn es mehr solch kompetente Ratgeber im Netz gäbe.

    Grüße

    Tom B.

  5. Günter Born sagt:

    Ich hatte hinter den Kulissen genau so was mit einem anderen Leser. Ich habe dir mal die Dateien per E-Mail zukommen lassen. Wäre interessant, ob es damit läuft.

    Nachtrag: Da manche Leser Probleme mit dem obigen Makrocode haben, hier nochmals ein ZIP-Archiv scanBas.zip, welches zwei .BAS-Module enthält (dort sind zwei Varianten des Makros implementiert – suche dir eine heraus, die funktioniert).

    Im VBA-Editor kann man über Datei -> Datei importieren den Inhalt der Datei importieren. Standardmäßig dürfen nur grün, blau und schwarz eingefärbte Zeilen auftreten. Wie mir jetzt von zwei Lesern bestätigt wurde, funktionieren die importierten VBA-Module.

    Viel Erfolg

  6. bobfox sagt:

    > Da manche Leser Probleme mit dem obigen Makrocode haben,
    > hier nochmals ein ZIP-Archiv scanBas.zip, welches zwei .BAS-Module
    > (verwenden zwei Varianten des Makros).

    Und welche Varainte verwende ich?
    Was ist der Unterschied?

    Danke im voraus!

  7. Günter Born sagt:

    @bobfox: Du kannst aber Fragen stellen ;-). Ich musste jetzt selbst schauen, was ich da unterschiedliches implementiert habe. Hatte angenommen, der Nutzer probiert, welches Makro tut und gut ist.

    Makro 1 enthält die überarbeitete Fassung mit dem PtrSafe-Bezeichner aus obigem Listing im Kommentarnachtrag.

    Makro 2 implementiert die Instantiierung des Objekts über "late binding" und verwendet darüber hinaus einen festen Pfad zum Speichern der temporären Bilddatei.

    Funktional sollten beide es tun und das Ergebnis – Scannen in Word ist auch gleich – nur der Weg dahin ist unterschiedlich.

    HTH

  8. Uli Wirth sagt:

    Danke für das hilfreiche Makro. Da bei mir die API-Function nicht funzte habe ich es anders versucht:
    Es geht auch ganz ohne API (Word 2010 und Win7 64Bit). Die Methode GetSpecialFolder(2) des Filesystems führt zum Standard-temp-Ordner. Außerdem lösche ich die temporäre Datei sofort nach Gebrauch aus diesem Verzeichnis und nicht erst beim nächsten Aufruf. Aber das ist Geschmackssache.
    Hier die geänderte Sub.

    Gruß

    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
    Dim TempPath As String
    Dim fs As Object
    Const TemporaryFolder = 2

    'Erzeugt ein Filesystem Object
    Set fs = CreateObject("Scripting.FileSystemObject")
    TempPath = fs.GetSpecialFolder(TemporaryFolder) & "\"
    ' instantiate Scan WIA objects
    Set objCommonDialog = New WIA.CommonDialog
    Set objImage = objCommonDialog.ShowAcquireImage
    strDateiname = TempPath & "Scan.bmp" ' set temporary file
    If Not objImage Is Nothing Then
    objImage.SaveFile strDateiname ' save into temp file
    Selection.InlineShapes.AddPicture strDateiname ' insert in doc
    Set objImage = Nothing
    Kill strDateiname
    End If
    Set objCommonDialog = Nothing
    ' MsgBox strDateiname test output
    End Sub

  9. martin sagt:

    Hallo,
    als Laie habe ich das Makro in die normal.dotm einbinden können.
    Der Scanner kann in Word 2013 (win7 + win8) auch angesprochen werden und scannt die Seite auch. Am Ende des Scanvorgangs gibt es dann die folgende Fehlermeldung:

    Ein Fehler ist aufgetreten.Möglicherweise ist kein WIA-fähiges Gedrät angeschlossen…..

    Mein Drucker HP psc 2110 ist aber über die WIa Schnittstelle ansprechbar.
    Gibt es für die Fehlermeldung eine Erklärung, bzw. noch besser eine Lösung?

    Gruß
    Martin

  10. Günter Born sagt:

    @Martin: Zur Fehlermeldung kann ich wenig sagen – erfahrungsgemäß hängt es aber am WIA-Treiber, der von den Geräten bereitgestellt wird. Wenn der muckt, kann das Makro (welches auf die WIA-Schnittstelle aufsetzt) natürlich nicht mehr funktionieren. Die Frage wäre, ob Du irgendwo die Chance hast, ein anderes WIA-Gerät zu testen.

    Hier gibt es noch eine ähnliche Diskussion – möglicherweise hilft das noch weiter.

  11. U. Richter sagt:

    Sehr geehrter Herr Born,
    ich war sehr enttäuscht, als ich Word 2013 das erste Mal öffnete und vergeblich eine Scanfunktion suchte – unglaublich, das man sehr viel Geld verlangt und eine solche wichtige Funktion einfach nicht vorhanden ist.
    Um so erfreulicher war es, das ich im Internet fündig wurde. Nach stundenlangen Fehlschlägen ist es mir nun endlich gelungen – Dank der ScanBas.zip Dateien (die ursprüngliche Datei funktionierte nicht, da 64 bit System) – nun doch die Scannerfunktion in Word zu plazieren, die auch ausgezeichnet funktioniert.
    Recht herzlichen Dank – für Sie 2 Daumen nach oben – für Bill beide Daumen nach unten.
    MfG Richter, J.U.

  12. Thorsten Lehmkuhle sagt:

    Hallo erstmal,

    auch ich gehöre hier zu den Geschädigten und brauche eine Lösung.

    Aber: Es macht mich etwas ärgerlich, dass hier eine angeboten wird, aber nicht Schritt für Schritt erklärt wird, wie vorgegangen werden muss, damit jeder der vielen Geschädigten es nachvollziehen kann.

    Ich habe Office 2013 gerade installiert. Kenne mich in der Umgebung also nicht aus. Wenn im Text steht "Den Makro-Code können Sie bei Bedarf unter Word im Dialogfeld Organisieren in die Normal.dot kopieren." dann hakt es schon da. Wenn ich diesen Weg nutze, komme ich in ein Dialogfeld, in dem ich Makros von einer Vorlage in die andere kopieren kann. Eine .bas-Datei kann ich dort nicht öffnen. Was möglich ist, ist das erstellen eines Makros Scan. In dem Visual Basic Dialogfeld was sich dann öffnet kann ich über "Datei importieren" dann .bas-Dateien importieren.
    Wenn ich das mache, dann das VB-Dialogfeld schließe und das Makro ausführe, passiert gar nichts. Und wenn ich mich richtig an die Zeit erinnere, in der ich selbst unter Word 98 Makros programmiert habe, sollte das Makro auch so laufen. Irgendwo im Text wurde erwähnt, es muss noch irgend etwas mit der WIA-Schnittstelle eingerichtet werden, aber was.

    Also meine Bitte: Bitte Schritt für Schritt erläutern, wie vorgegangen werden muss. Ich denke ich bin nicht blöd, aber so ist die Anleitung nicht brauchbar.

    • Günter Born sagt:

      @Thorsten: verstehe ich alles, kann ich aber momentan nicht leisten – sorry. Andere haben es doch auch geschafft. Du schlägst hier deutlich den falschen Hund. Zudem standen solche Info in meinen zahlreichen Word/Makro-Büchern die aber niemand zu brauchen glaubte weshalb die Projekte vor Jahren eingestellt wurden …

  13. Erich W. Scherer sagt:

    Hallo,
    jetzt habe ich ein wenig Zeit um Ihnen/Euch meine Erfahrungen mit den im Netz vorhandenen Makros "Scannen mit Office 2007/2010/2013" mitzuteilen :
    Unter Win XP/Vista/Win 7 HP/ Win 8 Pro/ Win 8.1 Pro je 32 bit keine Probleme mit den vorhanden Makros bis auf Word 2013, hier funktioniert keine! Vorlage – aber wenn ich mir ein eigenes Marko nach der Anweisung hier mit der bas2 Datei erstelle funktioniert es einwandfrei !! Ich benutze Office 2013 365 Home Premium, vielleicht liegt es am Speicherort des STARTUP Ordners der hier auf c:/Programme/Microsoft Office 15/root/office15/STARTUP liegt ?.
    Hier noch ein Danke an Herrn Born für den Blog.

    Nachtrag: verwendet wird ein Canon Pixma 5100 MG als Scanner und Drucker mit dem Canontreiber.

    MfG

    Scherer

  14. Günter Born sagt:

    @Erich: Danke für die Rückmeldung. Und nicht wundern – ich habe deine zwei Kommentare zusammengefasst.

  15. Oswald sagt:

    Hallo,

    möchte mich nur kurz für die tolle Lösung bedanken.
    Hab Win 8.1 64Bit, hat alles ohne Probleme geklappt.

    Super gemacht.

    Gruß aus dem Allgäu
    Ossi

  16. Bernhard sagt:

    Hallo,

    Danke auch für die Lösung. Mein Problem ist nun, dass wenn ein Sheet-Feeder Scanner verwendet wird, dann bricht es nach der ersten Seite ab und der Scanner muss frisch gestartet werden, da er mit dem zweiten Blatt "im Mund" stehen bleibt und der Vorgang nicht abgebrochen werden kann. Gibt es da vielleicht eine Lösung dafür? (der WIA-Aufruf holt vermutlich nur die erste Seite und der Scanner-Treiber liest aber die nächste Seite ein, dia aber nicht abgeholt wird)

    Grüsse aus der Schweiz

  17. Micha sagt:

    vielen Dank für die Hilfe …

    Hat alles funktioniert, bei Win 8 & 64-bit, auch wenn ich bissel "fummeln" musste …

    1000-Dank

  18. Peter sagt:

    Das hat leider bei mir nicht funktioniert, da für meinen Canon Lide 35 nur ein TWAIN Treiber vom Lide 60 existiert. Wird nicht als WIA Gerät erkannt. Mit dem Modul mdlTwain aus http://www.freevbcode.com/ShowCode.asp?ID=6041 klappt es aber:

    Option Explicit

    Private Declare Function GetTempPath Lib "kernel32" Alias "GetTempPathA" _
    (ByVal nBufferLength As Long, ByVal lpBuffer As String) As Long

    Private Declare Function GetTempFileName Lib "kernel32" Alias "GetTempFileNameA" _
    (ByVal lpszPath As String, ByVal lpPrefixString As String, ByVal wUnique As Long, ByVal lpTempFileName As String) As Long

    Private Function GetTempFile(sPrefix As String) As String
    Dim sTmpPath As String * 512
    Dim sTmpName As String * 576
    Dim nRet As Long

    nRet = GetTempPath(512, sTmpPath)
    If (nRet > 0 And nRet < 512) Then
    nRet = GetTempFileName(sTmpPath, sPrefix, 0, sTmpName)
    If nRet 0 Then
    GetTempFile = Left$(sTmpName, _
    InStr(sTmpName, vbNullChar) – 1)
    End If
    End If
    End Function

    Public Sub InsertFromScanner()
    Dim strDateiname
    strDateiname = GetTempFile("") ' set temporary file
    If TransferWithUI(strDateiname) = 0 Then
    Selection.InlineShapes.AddPicture strDateiname ' insert in doc
    Kill strDateiname
    End If
    End Sub

    • Matthais sagt:

      Danke für den richtungsweisenden Code. Ich habe damit das Makro unter Win10-Office 2016 zum laufen gebracht.
      Folgenden vbs-code habe ich verwendet:

      Public Sub InsertFromScanner()
      Dim strDateiname
      strDateiname = Environ("temp") & "\Scan.jpg"
      If TransferWithUI(strDateiname) = 0 Then
      Selection.InlineShapes.AddPicture strDateiname ' insert in doc
      Kill strDateiname
      End If
      End Sub
      und dazu noch die in der .zip enthaltene .bas datei über "Datei importieren" dem Makro hinzufügen.

      Beachte insbesondere, dass ich hier Herr Born's code für den temporären Ordner verwende, anstatt deinen recht komplexen (und auch nicht kompilierbaren) code zu verwenden.

  19. Günter Born sagt:

    @Peter: Danke für die Anregung und das Code-Fragment. Ich habe dir eine E-Mail geschickt, um den Link zum gesamten Beispiel nachtragen zu können (mein SPAM-Filter haut so etwas leider raus).

    Nachtrag aus einer Mail von Peter:


    Hallo Günter,
    den VBA-Code zum Twain-Scannen habe ich von http://lmik.sweb.cz/mdlTwain.zip
    Beschreibung siehe http://lmik.sweb.cz/

    Das komplette Beispiel habe ich geladen nach:
    InsertFromScanner.zip (46kB)
    https://anonfiles.com/file/02d39531f772420a1ea995746c9c149e

    Es reicht sicher, den Link im Kommentar zu platzieren.
    Aktuelle Scanner nutzen eh die WIA Schnittstelle.

    Kurze Anleitung:
    Start Ordner "c:Program Files (x86)Microsoft OfficeOffice15STARTUP" im Trustcenter zu den vertrauenswürdigen Speicherorten hinzufügen.

    InsertFromScanner.dotm in den Start Ordner legen.

    In Word im Menüband bzw. Schnellzugriffsleiste hinzufügen: Projekt.Modul1.InsertFromScanner

    Dann kommt der Twain-Dialog, wie auch in Word2010 WordBasic.InsertImagerScan
    Bzw OneNote 2013 unter Einfügen/Gescanntes Bild/Einfügen anpassen

    Fall jemand mehrere Twain Scanner hat, muss wie in http://lmik.sweb.cz/ beschrieben der aktive ausgewählt werden mit:

    mdlTwain.PopupSelectSourceDialog()

  20. Alpha-Sigma sagt:

    Hallo,

    vielen Dank für die tolle Arbeit.
    Ich hatte mich bereits schon seit Word 2010 über das "Entfernen" dieser Funktion geärgert. Zum Glück geht es jetzt wieder auch unter 2013.
    Ich hatte zwar Anfangs meine Schwiriegkeiten dies einzubauen, da ich von VBA/Makros keine Ahnung habe. Nach genauem Lesen klappt es auch bei mir.

    Gruß
    Alpha

  21. Harald Budwig sagt:

    Hallo Günter,
    Ich habe Deinen Beitrag "Scannen in Word 2013" eher zufällig gefunden. Vielen Dank dafür, hat in Word super geklappt. Ich benutze Windows 8.1 64 bit und Office 365. In Excel bekomme ich das Ergebnis leider nicht zurück. Vorschau geht, Scannen geht, aber das Arbeitsblatt bleibt leer.?

    Gruß
    Harald

  22. Stephan sagt:

    Hallo,
    folgende Konstellation: Windows 7 Pro 64 bit, Word 2013, Epson Dokumentenscanner

    Soweit funktioniert auch alles, aber es wird immer nur das 1. Blatt des Dokumentenstapels angezeigt in Word. Habe ich die Möglichkeit in der Voraus des Scanmenüs (Farbe, GrauSufe, SW, Benutzerdefiniert) eine Option als Standard zu definieren? Im Papierformat wird immer das 1. der Liste "Legal" angezeigt. Gibt es dort auch Möglichkeiten?

    • Günter Born sagt:

      @Stephan: Ich kann momentan schlecht reagieren (bin aktuell in Urlaub und habe auch weder die Zeit noch die Installationsumgebung, um da was zu testen oder zu evaluieren). Schau dir die API-Beschreibung der verwendeten Methoden und Eigenschaften an. Möglicherweise gibt es da was.

  23. Manuel sagt:

    Danke für die Anleitung! Habe mich echt geärgert, als ich festgestellt habe, dass mein frisch gekauftes Word keine Scan-Funktion hat. Aber mit Hilfe deines Artikels und ein bisschen "rumprobieren" habe ich es am Ende hinbekommen!

  24. Jens Fankhänel sagt:

    Hallo Herr Born,

    die Word-Variante mit
    "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
    strDateiname = "C:\Users\Public\Pictures\" & "Scan.jpg" ' temp
    If Not objImage Is Nothing Then
    Kill strDateiname ' delete old file
    objImage.SaveFile strDateiname ' save into temp file
    Selection.InlineShapes.AddPicture strDateiname ' insert in doc
    Set objImage = Nothing
    End If
    Set objCommonDialog = Nothing
    ' MsgBox strDateiname ' test output
    End Sub"

    klappt super.
    Sobald ich diese Programmierung in Excel bzw. Powerpoint durchführe, meldet das Programm beim Debuggen einen Fehler bei:
    "Dim objCommonDialog As WIA.CommonDialog"

    Gibt es da hier auch eine Lösung?
    Es wäre nett, wenn Sie sich den Problem annehmen würden,
    da ich nicht ganz so mit der Programmierung bewandert bin :-).
    Vielen Dank.

    Mit freundlichen Grüßen
    Fankhänel

  25. steffen sagt:

    vielen Dank für diese supi ausführliche Information.
    Nach dem dritten versuch hats jetzt auch endlich bei mir geklappt ;-)
    Finde es wirklich supi dass sich Leutz wie Sie so Hilfsbereit verhalten und weniger bewanderten usern so super helfen.

    MFG Steffen Schmidt

  26. Martin Schubert sagt:

    Also erstmal vielen Dank für die nützlichen Informationen und den Code.
    Da ich auch den selben Komfort in Excel haben wollte habe ich hier eine Kurzbeschreibung zusammengestellt:

    Im Makro muss man die Zeile:
    Selection.InlineShapes.AddPicture strDateiname
    ersetzen durch:
    ActiveSheet.Pictures.Insert (strDateiname)

    Verweis auf die Image Library nicht vergessen!

    Das Makro baut man dann in eine "persönliche Makroarbeitsmappe" (Google hilft) ein.
    Die Erstellung der Schaltfläche erfolgt gelich wie unter Word.

    LG

  27. Timothy Kesten sagt:

    Sehr geehrter Herr Born,

    vielen Dank für die Bereitstellung der Makros.
    Funktioniert wunderbar.

    Mit freundlichen Grüßen

    Timothy Kesten

  28. Bernhard Heuschkel sagt:

    Lieber Günter,
    ich bin mit dem Makro unter Word 2016 (x86) sehr erfolgreich unterwegs.
    Wie müsste aber folgende Zeile unter Word 2016 (x64) aussehen?
    "Private Declare Function GetTempPath Lib „kernel32" Alias „GetTempPathA" (ByVal nBufferLength As Long, ByVal lpBuffer As String) As Long"

    Vielen Dank Bernhard

    • Ich hatte vor – wenn die Zeit reicht – das Makro eh in überarbeiteter Form in den kommenden Tagen zu veröffentlichen.

      Nachtrag: Vorab der revidierte VBA-Code, der unter Word 2013/2016 unter 32/64-Bit laufen müsste:

      ' 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 = TempPath & "Scan.jpg" 
           strDateiname = Environ("temp") & "\Scan.jpg" 
           
           If Not objImage Is Nothing Then
             Kill strDateiname
             ' 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
      
  29. Andreas sagt:

    Hallo,

    möchte gern über Twain (ScanGear) scannen. Habe einen Canon MG6250 und Word 2016 und Windows 10, jeweils 64bit.
    Wie müsste das Macro lauten?

    Andreas

    • Günter Born sagt:

      Kann ich nicht weiter helfen – TWAIN ist formal eine gänzlich andere Baustelle. Es gibt im wilden weiten Web zwar eine Bibliothek, die man versuchsweise einbinden kann.

      Im übrigen: Weiter oben veröffentlichte ein andere Leser einen Lösungsansatz ….

      Für diese Baustelle "mundgerecht" aufzubereiten, weil Nutzer das nicht selbst recherchieren, habe ich momentan wirklich keine Zeit. Bitte da um Verständnis.

  30. Thorsten sagt:

    Hallo,

    hat es jmd. geschaft, dass die beidseitige Scanfunktion funktioniert?
    Obwohl ich beidseitig auswähle, kommt immer nur die erste Seite.
    Jemand eine Idee?

    VG

    • Günter Born sagt:

      Das lässt sich imho über WIA nicht aktivieren, mag mich aber täuschen. Relevant wären die Methoden, die in VBA bereitgestellt werden. Falls da inzwischen eine Option als Parameter beim Methodenaufruf bereitgestellt wird, könnte es klappen. Das Thema ist hier aber aus dem Scope und ich kann auch nichts testen. Vermutlich wird man auf TWAIN setzen müssen.

  31. Walter Cassar sagt:

    Guten Tag,
    der Code für die Scanfunktion (WIA) in Word 2016 ist super. Hab den Code probiert und funktionierte auf Anhieb. Wollte noch fragen, ob es eine Möglichkeit gäbe, dass die DPI Auflösung für alle 4 Bildtypen, "Farbbild", "Graustufenbild", "Schwarzweißfoto oder Text" und "Benutzerdefinierte Einstellungen", dauerhaft, z.B. auf 300 DPI, gespeichert bleibt. Ich habe unter "Geräte und Drucker" – "Scanprofile" für alle 4 Bildtypen Scanprofile mit 300 DPI erstellt und gespeichert. Schließe ich Word und starte die Scanfunktion erneut, ist die DPI Auflösung wieder auf 100 DPI eingestellt. Danke.

  32. Günter Born sagt:

    Kann aktuell nicht schnell mal testen (müsste die Infrastruktur erst aufsetzen). Schau dir mal folgendes zur ShowAcquireImage-Methode an.

    https://msdn.microsoft.com/de-de/library/windows/desktop/ms630772(v=vs.85).aspx

    https://entwickler-forum.de/showthread.php/69959-WIA-Voreinstellungen-f%C3%BCr-Scanner-(Windows-7)
    https://stackoverflow.com/questions/2245675/set-page-size-using-wia-with-scanner

    Da sind die Codebestandteile, die ggf. die Eigenschaften, die dem Methodenaufruf übergeben werden müssen, beschrieben.

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert

Hinweis: Bitte beachtet die Regeln zum Kommentieren im Blog (Erstkommentare und Verlinktes landet in der Moderation, gebe ich alle paar Stunden frei, SEO-Posts/SPAM lösche ich rigoros). Kommentare abseits des Themas bitte unter Diskussion.

Du findest den Blog gut, hast aber Werbung geblockt? Du kannst diesen Blog auch durch eine Spende unterstützen.