Office: (Office 2013) [Excel] mit VBA Dokument einscannen und als PDF speichern

Helfe beim Thema [Excel] mit VBA Dokument einscannen und als PDF speichern in Microsoft Excel Hilfe um das Problem gemeinsam zu lösen; Hallo, ich bins mal wieder. Nachdem ich hier richtig gute Anschubsers bekommen habe habe ich nun ein recht gutes Programm geschrieben. Endlich habe ich... Dieses Thema im Forum "Microsoft Excel Hilfe" wurde erstellt von sronny, 30. April 2015.

  1. sronny Erfahrener User

    [Excel] mit VBA Dokument einscannen und als PDF speichern


    Hallo, ich bins mal wieder. Nachdem ich hier richtig gute Anschubsers bekommen habe habe ich nun ein recht gutes Programm geschrieben. Endlich habe ich nun auch einen tollen modernen Multifunktionsdrucker gekauft, der nun auch unter Windows 7 scannen kann (musste es bisher immer über eine Linux-VM machen).

    Jetzt möchte ich gerne über VBA auf Knopfdruck ein Dokument einscannen und als PDF abspeichern. Bei Google findet sich da hauptsächlich nur bissl was für Access. Zwischen Excel -VBA und Access - VBA scheint es ja da einige Unterschiede geben und somit wollte ich hier fragen, wie ich einen WIA-fähigen Scanner von VBA ansprechen kann und ohne den Umweg über die Scanner-Software. Warum? Ich brauche für jeden Einsatz eine Einsatzbestätigung. Diese wird unter dem Dateinamen "Einsatzbestätigung RN 2015-xx-yyyy" gespeichert, wobei xx den Monat darstellt und yyyy eine laufende Nummer. XSane zählt richtig clever bei jedem Scan-Vorgang weiter, das macht die Scanner-Software meines HPs nicht. Deshalb würde ich das gerne unter VBA realisieren, dass wir nur Knopf drücken müssen und fertig ist...

    Hat jemand von euch da Erfahrungen damit?
     
    sronny, 30. April 2015
    #1
  2. Exl121150 Erfahrener User
    Hallo,

    das geht, indem du die entsprechende Library einbindest und zwar im VBA-Menü Extras > Verweise... > Verfügbare Verweise:
    Hier suchst du nach dem Eintrag "Microsoft Windows Image Acquisition Library v2.0" und setzt ein Häkchen davor. Dann steht dir in Excel die WIA-Funktionalität zur Verfügung.
    Ein kleines Musterprogramm habe ich dir beigefügt. Da aber von meinem PC aus kein Scanner erreichbar ist, ist dieser Code, was den Scannerzugriff anbelangt, ungetestet.
    Es handelt sich um eine Funktion namens "Scannen", der als Parameter der Dateiname (samt Pfad) für die eingescannten Inhalte zu übergeben ist:
    Code:
    #Const EARLYBINDING = True ' True/False
    
    Public Function Scannen(strDateiname As String) As Boolean
     #If EARLYBINDING Then
        'Einbinden mittels VBA-Menü Extras > Verweise...
        'der Library: "Microsoft Windows Image Acquisition Library v2.0" notwendig
        Dim objCommonDialog As New WIA.CommonDialog    '(für Early-Binding)
        Dim objImage As New WIA.ImageFile
     #Else
        'Kein explizites Einbinden der WIA-Library notwendig
        Dim objCommonDialog As Object              '(für Late-Binding)
        Dim objImage As Object
        Set objCommonDialog = CreateObject("WIA.CommonDialog")
        Set objImage = CreateObject("WIA.ImageFile")
        Const ScannerDeviceType = 1
     #End If
      Scannen = False 
      On Error GoTo err_Scan
      'Wenn kein Scanner gefunden wurde, wird hier ein Fehler erzeugt
      Set objImage = objCommonDialog.ShowAcquireImage(ScannerDeviceType)
      
      If Not objImage Is Nothing Then
         objImage.SaveFile strDateiname
         Set objImage = Nothing
         Scannen = True
      End If
      Set objCommonDialog = Nothing
    exit_Scan:
      Exit Function
    err_Scan:
      If Err.Number = -2145320939 Then
         MsgBox "Es konnte kein WIA-fähiger Scanner an diesem System lokalisiert werden!", vbExclamation, "Systemhinweis"
         GoTo exit_Scan
      End If
    
      MsgBox Error$ & Err, vbExclamation, "Anwendungsfehler"
      Resume exit_Scan
       
    End Function
    
    Wie du siehst, könntest du dieses Makro auch ohne WIA-Bibliothekseinbindung über Extras>Verweise betreiben: dann allerdings müsstest in der 1. Codezeile in der Compiler-Direktive die Wertzuweisung an EARLYBINDING auf FALSE setzen. Dann wird im Makro die Variante für "Late-Binding" kompiliert. Diese Variante ist aber erst empfehlenswert, wenn das Makro fertig programmiert ist.
     
    Zuletzt bearbeitet: 30. April 2015
    Exl121150, 30. April 2015
    #2
  3. sronny Erfahrener User
    Ich danke dir ganz herzlich.

    Hab mir jetzt auch schon mal was zusammengebastelt. Nur hab ich gerade das Problem, dass ich ständig unter Verweise WIA wieder einzubinden. Wie kann man das dauerhaft speichern?

    Das Speichern als PDF hab ich jetzt so gelöst, ich füge eine neue Tabelle ein, darin das gescannte Bild, speichere diese als PDF und lösche sie im Anschluss wieder...

    Ist eine feine Sache...Also vielen lieben Dank. Hilft mir schon mal sehr weiter...Warum wird eigentlich das # vor manchen Befehlen gestellt?
     
    sronny, 30. April 2015
    #3
  4. Exl121150 Erfahrener User

    [Excel] mit VBA Dokument einscannen und als PDF speichern

    Hallo,

    Wenn du mit 'dauerhaft' meinst, dass es pro Excel-Arbeitsmappe (also pro Excel-Datei) erhalten bleibt, so brauchst du das Häkchen nur 1x setzen und mit Button "Ok" das Dialoglogfenster "Verweise - VBAProject" schließen - dann existiert die Einbindung dieser Library innerhalb dieser Datei dauerhaft (Die ganze Datei ist natürlich danach auf Platte zu speichern).

    Erstellst du aber hernach eine neue Excel-Datei, so ist in dieser das Häkchen vor dieser speziellen (Zusatz)-Library wieder entfernt. Um das zu vermeiden, also um auch in jeder neu erzeugten Excel-Datei ein gesetztes Häkchen vor dieser Library zu haben, müsstest du eine Excel-Vorlagen-Datei (engl.: template-file) mit deinen zusätzlichen Einstellungen im Verzeichnis für persönliche Vorlagen speichern. Das ist eine *.xlst-Datei (statt *.xlsx oder *.xlsm). Wo sich dieses Verzeichnis befindet, kannst du im Menüband > Reiter "DATEI" > Befehl "Optionen" > Befehl "Speichern" > Abschnitt "Arbeitsmappen speichern" > Textfeld "Standardspeicherort für persönliche Vorlagen" ersehen.

    Dieses Raute-Zeichen steht in meinem Code-Beispiel am Anfang von 4 Codezeilen. Diese 4 # dürfen auf keinen Fall entfernt werden, denn dann reagiert das Makro ganz anders und wahrscheinlich wird sogar eine Fehlermeldung produziert.
    Es handelt sich dabei um sogenannte Compiler-Anweisungen: Sie dienen dazu, den im Hintergrund laufenden Programmübersetzer zu steuern. Diese 4 Zeilen sind daher auch im fertigen Kompilat nicht enthalten und in Abhängigkeit von ihnen auch eigentliche VBA-Code-Zeilen.

    Um das Ganze im Detail zu erklären:
    1) In der Zeile mit dem 1. # steht: "#Const EARLYBINDING = True": Der Compiler selbst merkt sich eine Konstante mit dem Namen "EARLYBINDING" und weist ihr den logischen Wert "WAHR" zu.
    2) Die Zeilen mit den nächsten 3 # am Zeilenanfang sind als eine Einheit zu sehen:
    #If EARLYBINDING Then
    <Block1>
    #Else
    <Block2>
    #Endif
    Diese 3 Zeilen dienen auch wieder nur zur Fütterung des Compilers selbst und scheinen damit schlussendlich nicht im fertig kompilierten Code auf.
    Da ich unter Punkt 1) die Konstante EARLYBINDING auf TRUE gestellt habe, bedeutet das Compiler-#IF, dass die VBA-Code-Zeilen, die sich im <Block1> befinden, vom Compiler zur Code-Generierung herangezogen werden, während er die VBA-Code-Zeilen, die sich in <Block2> befinden, einfach ignoriert (so als ob sie niemals von mir hingeschrieben worden wären).
    Hätte ich hingegen unter Punkt 1) die Konstante EARLYBINDING auf FALSE gesetzt, würde der Compiler die VBA-Codezeilen, die sich in <Block1> befinden, ganz einfach ignorieren und statt dessen die Codezeilen aus <Block2> in das Kompilat hineinnehmen.

    3) Der Sinn des Ganzen ist, dass man so eine bedingte Kompilierung festlegen kann: Je nachdem wie der Schalter in Zeile 1 gestellt ist, wird ein je unterschiedlicher Programmcode erzeugt.

    4) Und der Sinn der bedingten Compilierung hier an dieser Stelle ist, dass ich 2 total verschiedene Programmiertechniken mit einer einzigen Codierung hinterlegen kann:

    4a) Ist die EARLYBINDING-Konstante auf TRUE gestellt (wie im vorliegenden Code), habe ich eine Programmiermethode vorliegen, die sich "Early-Binding" nennt: Bei dieser Methode kennt der Compiler bereits zur Compile-Time, welche Datentypen die einzelnen Variablen haben, insbesondere auf welche Objektinstanzen die Objektvariablen verweisen. Der Compiler weiß in meinem Code, dass es sich bei der Variablen "objCommonDialog" um eine Objektinstanz der Objektklasse "WIA.CommonDialog" handelt und, da noch dazu das Schlüsselwort "NEW" vorkommt, wird auch gleich diese Objektinstanz erzeugt. Alle Eigenschaften, Methoden und Ereignisse dieser Objektklasse stehen ab diesem Zeitpunkt unter dem Namen "objCommonDialog" zur Verfügung. Und das nicht nur erst zur Compile-Time, sondern auch schon zum Programmierzeitpunkt!! Durch diese Unterstützung bereits zur Programmierzeit vereinfacht sich das Programmieren enorm. Damit dieser Vorteil genutzt werden kann, muss man zuerst jedoch die Library, in der die Objektklasse enthalten ist, eingebunden haben (Nachteil gegenüber der 2. Programmiermethode).

    4b) Ist die EARLYBINDING-Konstante auf FALSE gestellt, habe ich eine Programmiermethode vorliegen, die sich "Late-Binding" nennt: Bei dieser Methode weiß der Compiler zur Compile-Time nur, dass es sich bei den vorliegenden Variablen um Objekte der (all)gemeinsten Art handelt, zB. dass es sich bei "objCommonDialog" um ein "Object" handelt. Der Compiler kennt keine spezielleren Eigenschaften etc. dieses "Objektes", da ein solches zur Compile-Time auch gar nicht erzeugt ist. Es bedarf daher im Code einer weiteren Zeile, mit der zur Run-Time dann festgelegt wird, auf was die "objCommonDialog"-Variable genau genommen verweisen soll: 'Set objCommonDialog = CreateObject("WIA.CommonDialog")'. Da dies erst zur Run-Time ausgeführt wird, gibt es infolgedessen weder zur Compile-Time noch zur Programmierzeit Kenntnis darüber, was sich hinter "objCommonDialog" eigentlich verbirgt. Es gibt somit keinerlei Unterstützung des Programmierers zur Programmierzeit (Nachteil dieser 2. Methode). Ihr Vorteil ist, dass man vor dem Programmieren bzw. vor dem Compilieren keine Libraries einbinden muss.

    4c) Daher geht man als Programmierer folgenden Weg: Man programmiert zuerst mit Methode 4a). Und wenn alles korrekt funktioniert, stellt man auf Methode 4b) um, was ich nicht gemacht habe - ich habe es bei Methode "Early-Binding" belassen, was einen weiteren Vorteil hat, dass diese Methode notgedrungen schneller sein muss als das Late-Binding.
     
    Zuletzt bearbeitet: 1. Mai 2015
    Exl121150, 1. Mai 2015
    #4
  5. sronny Erfahrener User
    Wahnsinn, danke für diese ausführliche Erklärung. Damit eröffnen sich ja interessante Möglichkeiten. Muss das zwar noch mal richtig verinnerlichen, aber es ist schon mal echt spannend. Habe vielen Dank für die Erklärung. Werde sicherlich noch einmal darauf zurück kommen, mich damit aber jetzt mal ausführlich befassen. Scannen funktioniert jetzt schon mal richtig gut und wir haben es vorhin schon mal ausprobieren können und es spart richtig gut Zeit...Finde Excel schon ein absolut geiles Programm, aber mit den Welten, die sich zusätzlich noch mit VBA eröffnen ist das einfach der Hammer. Habe jetzt in kürzester Zeit schon mit einfachen Mitteln unheimlich viel machen können, wo ich vorher nur sehr umständlich ans Ziel kam. Bin da echt gerade voll begeistert. Schade, dass ich nebenher auch noch andere Sachen machen muss und dafür immer mal nur 1-2 Stunden überbleiben...
     
    sronny, 1. Mai 2015
    #5
Thema:

[Excel] mit VBA Dokument einscannen und als PDF speichern

Die Seite wird geladen...
  1. [Excel] mit VBA Dokument einscannen und als PDF speichern - Similar Threads - Excel VBA Dokument

  2. VBA: Spalten auf anderen Worksheeds in der Mappe ausblenden.

    in Microsoft Excel Hilfe
    VBA: Spalten auf anderen Worksheeds in der Mappe ausblenden.: Hallo zusammen, Eine Tabelle mit 9 Worksheets, Datenblatt, Studien, Studie_1 ...Studie_7. Auf dem Deckblatt werden in Zelle B4-B10 die Namen der Studien eingetragen. Davon abhängig ob ein Name...
  3. Excel VBA Spalten mit Ordnerinhalt vergleichen

    in Microsoft Excel Hilfe
    Excel VBA Spalten mit Ordnerinhalt vergleichen: Hallo, Bin ehr Excel VBA Neuling, Würde aber gerne in einer bestehender Tabelle die Auflistung der Ordner mit dem eigentlichen Stand in den besagten Ordner kontrollieren. Also in der Spalte Q10...
  4. Array aus Excel Tabelle einlesen Word VBA

    in Microsoft Excel Hilfe
    Array aus Excel Tabelle einlesen Word VBA: Hallo, ich benötige in einer Word Datei die Werte einer Excel Datei. Ich würde gerne eine Spalte als Array einlesen. Wie das Array ein lesen in Excel geht weiß ich, aber wie schaffe ich den...
  5. Dynamische Tabellen mit automatischer Aktualisierung

    in Microsoft Excel Hilfe
    Dynamische Tabellen mit automatischer Aktualisierung: Hallo in die Runde! Vorab schon mal vielen Dank für alle Mühen und die Hilfe! Ich habe folgendes Anliegen: Ich habe eine Geräteliste als Excel Datei mit einigen verschiedenen Tabellenblättern...
  6. VBA-Wenn Bedingung erfüllt dann bestimmte Zellen in anderes Excel Dokument kopieren

    in Microsoft Excel Hilfe
    VBA-Wenn Bedingung erfüllt dann bestimmte Zellen in anderes Excel Dokument kopieren: Hey Leute, bin erst seit gestern am VBA-Programmieren und bin mit meinem Projekt schon gut voran gekommen. Aber nun hänge ich irgendwie. Da mir das Forum gestern schon mega weitergeholfen hat,...
  7. Bericht via VBA als Excel Dokument exportieren

    in Microsoft Access Hilfe
    Bericht via VBA als Excel Dokument exportieren: Hallo Zusammen, Ich benutze foglenden Code, um meinen dynamisch erzeugten Bericht in eine Excel Datei zu exportieren: Code: DoCmd.OutputTo acOutputReport, "b_Report_1", acFormatXLS, , True Der...
  8. VBA Dokumente auslesen

    in Microsoft Excel Hilfe
    VBA Dokumente auslesen: Hallo zusammen, ich bin neu in der VBA Welt. Ich möchte ein Programm schreiben, wenn man auf einen Button drückt dann soll er aus einem bestimmten Ordner alle Dateien auslesen die einen...

Users found this page by searching for:

  1. scannen mit vba

  1. Diese Seite verwendet Cookies, um Inhalte zu personalisieren, diese deiner Erfahrung anzupassen und dich nach der Registrierung angemeldet zu halten.
    Auf dieser Website werden Cookies für die Zugriffsanalyse und Anzeigenmessung verwendet.
    Wenn du dich weiterhin auf dieser Seite aufhältst, akzeptierst du unseren Einsatz von Cookies.
    Information ausblenden