PDF-ből adatok Excel munkalapra másolása.

PDF-ből adatok Excel munkalapra másolása.
2021-04-21T15:25:57+02:00
2021-04-29T14:27:04+02:00
2022-10-15T21:25:39+02:00
Pados
Sziasztok!

Szeretnék pdf-ből adatokat kiszedni, hogy ne kézzel kelljen felvinni a megrendeléseket(olykor sajna előfordulhatnak elütések).

Az alábbi kód majdnem működik is:

Sub Shell_Copy_Paste() Dim o As Variant Dim wkSheet As Worksheet Set wkSheet = ActiveSheet o = Shell("C:\Program Files (x86)\Foxit Software\Foxit Reader\FoxitReader.exe E:\Egyéb\PDF beolvasás\Bosch rendelés\RENDELÉS4501732744.pdf", vbNormalFocus) Application.Wait (Now + TimeSerial(0, 0, 2)) 'Wait for Acrobat to load SendKeys "^a" 'Select All SendKeys "^c" 'Copy SendKeys "%{F4}" 'Close shell application wkSheet.Range("B5").Select SendKeys "^v" 'Paste End Sub

csupán se az Acrobat, se a Foxit nem tudja megnyitni a fájlt.
Nem ismerik fel a fájl formátumát. Már kinyomtattam újra mindkettőben megnyitva pdf-ként, kézzel ki is tudom másolni belőle az adatokat, de sehogy sem jön össze, hogy munkalapra rakjam, vagy bármi más módon kiszedjem VBA-val az adatokat belőle.
Próbálkoztam egyéb más, bonyolultabb kódokkal is, de azokkal is kb ennyi a siker.
PowerQuerry-vel be tudom importálni, de azt meg nem nagyon értem, hogy mit és hogyan csinál, úgyhogy nem biztos, hogy azt kéne erőltetnem(macro-rögzítő adta).
Office 2016 és win10
Mutasd a teljes hozzászólást!
Szia!
Közben észrevettem, hogy a te kódodban a PDF fájl elérési útjában szóköz van, ezért addig értelmezi első paraméterként vagyis fájlnévnek a Shell().
Az hiszem, hogy dupla idézőjel kell, hogy a paraméter "útvonal\filenév" formátumú legyen.
Elsőként próbáld meg a mappát átnevezni, hogy ne legyen benne szóköz vagy a teszthez tedd egyszerűbb útvonalra a pdf-et.
Mutasd a teljes hozzászólást!

  • Szerintem a PDF formátummal soha nem fogsz boldogulni, és szerintem nem is szabad arra alapozni, hogy abból szöveges adatot nyerj ki. Én azt csinálnám, hogy valamilyem OCR szoftverrel (ami nekem bevált, az az ABBYY FineReader) szépen berajzolnám a táblázatot, majd azt felolvastatnám vele. Excellel pedig viszonylag értelmes időn belül CSV-t lehet belőle csinálni. Persze ez nagyban függ a dokumentum felépítésétől is.

    Nincs arra lehetőség, hogy ne PDF-et kapj kézhez?
    Mutasd a teljes hozzászólást!
  • Szia!
    Nálam ez működött:

    Sub Shell_Copy_Paste() Dim o As Variant Dim wkSheet As Worksheet Set wkSheet = ActiveSheet o = Shell("C:\Program Files (x86)\Adobe\Acrobat Reader DC\Reader\AcroRd32.exe D:\teszt\RENDELÉS123.pdf", vbNormalFocus) Application.Wait (Now + TimeSerial(0, 0, 2)) 'Wait for Acrobat to load SendKeys "^a" 'Select All SendKeys "^c" 'Copy Application.Wait (Now + TimeSerial(0, 0, 2)) 'Wait for copy SendKeys "%{F4}" 'Close shell application wkSheet.Range("B5").Select wkSheet.Paste End Sub
    Ha a PDF fájl megnyitása sem jó, akkor más probléma van, mert az eredeti kódod is megnyitotta a fájlt, csak a cellába nem másolta be a szöveget. Manuálisan, a Beillesztés menüponttal a bemásolás is jó volt (vagyis a vágólapon volt a szöveg). A kódod javítás után működött.
    Lehet, hogy az volt a baj, hogy a Copy-ra is várni kell és talán a wkSheet.Paste is jobb, mint a SendKeys.
    Mutasd a teljes hozzászólást!
  • Szia!
    Közben észrevettem, hogy a te kódodban a PDF fájl elérési útjában szóköz van, ezért addig értelmezi első paraméterként vagyis fájlnévnek a Shell().
    Az hiszem, hogy dupla idézőjel kell, hogy a paraméter "útvonal\filenév" formátumú legyen.
    Elsőként próbáld meg a mappát átnevezni, hogy ne legyen benne szóköz vagy a teszthez tedd egyszerűbb útvonalra a pdf-et.
    Mutasd a teljes hozzászólást!
  • Szia!

    Sajna nincs rá mód, hogy ne PDF-et kapjak, külső cégtől jön a rendelés.
    Viszont a jó, hogy egységes a bemásolt PDF, azaz ha nem is egyszerűen, de tudok benne keresni, mert szerencsére azért van benne rendszer, Csak a rendelt tételek számától függően változik a sorok száma.

    Az egyéb pdf-konverterek meg nem igazán népszerűek céges szinten, úgyhogy szerintem olyat nem nagyon fogok tudni használni, max corporatefree offline-t....
    De köszi a segítséget.
    Mutasd a teljes hozzászólást!
  • Szia!

    Köszi, tényleg a pdf elérési útjában és nevében sem lehet szóköz, attól nem ment.
    (meg persze mikor F8-al lekocogtam megnyitás után visszalépett a modul-lapra, ás arra küldte a sendkeys-copyt, azt viszont remekül másolta is)

    Viszont a dupla idézőjelet hiába próbálgattam, nem jöttem rá, hogy hogy kell megadni neki itt.
    (szóval lehet, hogy mégiscsak lehet benne szóköz, csak én nem tudom, hogyan kell azt megadni neki)

    Illetve még annyi, hogy nekem a Foxittal nem ment, csak az Adobe-val működik. A Foxit továbbra sem nyitja meg. Viszont akkor használom az Adobe-val.
    Mutasd a teljes hozzászólást!
  • Szia!
    Hátha mégis kell majd szóköz az útvonalba vagy a fájl nevébe:

    pdf_file = """D:\teszt mappa\RENDELÉS 1 2 3.pdf""" o = Shell("C:\Program Files (x86)\Adobe\Acrobat Reader DC\Reader\AcroRd32.exe " & pdf_file, vbNormalFocus)
    inkább kitettem egy új változóba, mert így egyszerűbb átlátni. A pdf_file értékadásnál az első és a legutolsó idézőjel a szöveghatároló, azon belül pedig duplán kell idézőjelet írnod, hogy a szövegbe is belekerüljön egy-egy idézőjel, mert ha csak egy idézőjelet írsz, akkor az a szöveg végét jelentené a VBA-ban.

    Ha nincs külön változó, akkor így néz ki a Shell-es sor:

    o = Shell("C:\Program Files (x86)\Adobe\Acrobat Reader DC\Reader\AcroRd32.exe ""D:\teszt mappa\RENDELÉS 1 2 3.pdf""", vbNormalFocus)
    Úgy tűnik a Foxit Readernél a sor végén kell egy /A paraméter, utána jöhetnek opcionális paraméterek, de én úgy látom, hogy a /A kötelező. A Foxit oldalán néztem, írják így is, úgy is, kipróbálni nem tudtam, mert nincs telepítve Foxit a gépemen.

    üdv.: Péter
    Mutasd a teljes hozzászólást!
  • ok, köszi, megint zseni voltam tegnap
    A végére 3db "-jel kell, mivel  a Shell után már van egy nyitó......
    A Foxit-tel viszont nekem a /A-val sem megy(sanszos, hogy ezt sem jól adtam meg), de mindegy is, mert ADOBE-val simán működik, és amire nekem most kell, arra pont jó.
    Köszi mégegyszer!

    így megadom, melyik pdf-et akarom, és beolvassa. A PDF egy sora egy cellatartalom lesz, de mivel a lényeges adatok ugyan olyan elrendezésben szerepelnek, így már a szövegben tudok keresni, nem kell kézzel (el)írogatni.

    Sub Shell_Copy_Paste3() Dim o As Variant Dim wkSheet As Worksheet Dim fajl As Variant fajl = Application.GetOpenFilename(FileFilter:="PDF fájlok, *.pdf; *.PDF") If fajl = False Then 'Cancel gombot nyomták meg Exit Sub End If Set wkSheet = ActiveSheet wkSheet.Range("A1:M500").ClearContents 'o = Shell("C:\Program Files (x86)\Foxit Software\Foxit Reader\FoxitReader.exe /A ""E:\Egyéb\PDF beolvasás\RENDELÉS716775.pdf""", vbNormalFocus) o = Shell("C:\Program Files (x86)\Adobe\Acrobat Reader DC\Reader\AcroRd32.exe " & Chr(34) & fajl & Chr(34), vbNormalFocus) Application.Wait (Now + TimeSerial(0, 0, 2)) 'Wait for Acrobat to load SendKeys "^a" 'Select All SendKeys "^c" 'Copy Application.Wait (Now + TimeSerial(0, 0, 2)) 'Wait for copy SendKeys "%{F4}" 'Close shell application wkSheet.Range("B5").Select SendKeys "^v" wkSheet.Paste End Sub
    Ezt már csak formázni meg beillesztenem kell.
    Mutasd a teljes hozzászólást!
  • Szia!

    Az normális, hogy a

    SendKeys "^a"
    kikapcsolja a NumLock-ot?
    Nem lehet valamivel visszakapcsolni?
    Mutasd a teljes hozzászólást!
  • Szia!

    Kipróbáltam, tényleg kikapcsolja a NumLock-ot.
    Találtam ilyet, nálam működik, bekapcsolja a NumLock-ot a makró végén:

    SendKeys "{NUMLOCK}"
    De, lehet, hogy utána meg kezdődik az a probléma, hogy akinél nincs bekapcsolva a NumLock, a makró annak is visszakapcsolja.
    Találtam egy megoldást, ami lekérdezi a billentyű állapotát és annak megfelelően kapcsolja vissza a NumLock-ot (ezt nem próbáltam ki):
    Turning NUMLOCK on at the end of a macro run

    üdv.: Péter

    Közben kipróbáltam, ez a komplett Copy/Paste makró (64 bites Excel-ben jó, 32 bitesnél az első sorban a Private Declare sort valószínűleg módosítani kell):

    Private Declare PtrSafe Function GetKeyState Lib "user32" (ByVal nVirtKey As Long) As Integer Private Const VK_NUMLOCK = &H90 Sub Shell_Copy_Paste() Dim o As Variant Dim wkSheet As Worksheet Set wkSheet = ActiveSheet NumLock = GetKeyState(VK_NUMLOCK) pdf_file = """D:\teszt mappa\RENDELÉS 1 2 3.pdf""" o = Shell("C:\Program Files (x86)\Adobe\Acrobat Reader DC\Reader\AcroRd32.exe " & pdf_file, vbNormalFocus) Application.Wait (Now + TimeSerial(0, 0, 2)) 'Wait for Acrobat to load SendKeys "^a" 'Select All SendKeys "^c" 'Copy Application.Wait (Now + TimeSerial(0, 0, 2)) 'Wait for copy SendKeys "%{F4}" 'Close shell application wkSheet.Range("B5").Select wkSheet.Paste If NumLock = 1 Then SendKeys "{NUMLOCK}", True End Sub
    Mutasd a teljes hozzászólást!
  • Hú, nagyon köszi, ez pont jó lesz, ezt kerestem.
    Mutasd a teljes hozzászólást!
Tetszett amit olvastál? Szeretnél a jövőben is értesülni a hasonló érdekességekről?
abcd