Exportálás excelbe ADO nélkül

Exportálás excelbe ADO nélkül
2011-01-12T23:44:49+01:00
2011-01-13T12:17:43+01:00
2022-11-20T11:45:40+01:00
_KGR_
Sziasztok,

Access-ből szeretnék exportálni adatokat egy létező excel file-be oly módon, hogy nem írja felül a már létező adatokat a munkalapon, hanem megkeresi az utolsó még feltöltött sort és utána rakja ki az adatokat. Ezt egyenlőre ADO-val sikerült megoldanom, viszont olyan problémám van, hogy az adatbázis olyan embereknek készül, akik nem fogják tudni bekapcsolni az ADO-t. Van erre esetleg más megoldás?

Dim C As ADODB.Connection
Dim R As New ADODB.Recordset
Dim F As String
Dim M As Object
Dim n As Integer
Dim i As Integer


F = Application.CurrentProject.Path + "\Kivonatok.xls"
Set M = CreateObject("Excel.Sheet")
M.Application.workbooks.Open F
Set C = Application.CurrentProject.Connection
M.Application.Visible = True
R.Open "Kivonat_feltolto", C, adopenkeyset, adlockoptimistic

n = 1
Do
n = n + 1
Loop While M.Application.cells(n, 1) <> ""
n = n - 1

i = n + 1

Do While Not R.EOF

M.Application.cells(i, 1).Value = R![Bank neve]
M.Application.cells(i, 2).Value = R!Számlaszám
M.Application.cells(i, 3).Value = R!Dátum
M.Application.cells(i, 4).Value = R!Nyitó
M.Application.cells(i, 5).Value = R!Jóváírás
M.Application.cells(i, 6).Value = R!Terhelés
M.Application.cells(i, 7).Value = R!Záró
M.Application.cells(i, 8).Value = R!Deviza
M.Application.cells(i, 9).Value = R!Számlatípus
M.Application.cells(i, 10).Value = R!Bank


R.MoveNext
i = i + 1
Loop
R.Close
C.Close
Mutasd a teljes hozzászólást!
DAO-t használj

Dim R As recordset Dim F As String Dim M As Object Dim n As Integer Dim i As Integer, j as integer F = currentdb.name + "\..\Kivonatok.xls" Set M = CreateObject("Excel.Application") M.workbooks.Open F M.Visible = True set R= currentdb.Openrecordset("Kivonat_feltolto") ' Kicsit bonyis a megoldásod: n = 1 Do n = n + 1 Loop While M.activesheet.cells(n, 1) <> "" ' Minek vonod le, ha hozzáadod n = n - 1 i = n + 1 ' Szerintem helyette ' n=range("a1").end(xldown)+1 with M.activesheet Do until R.EOF ' While not helyett .cells(i, 1).Value = R.fields("Bank neve") ' Bár szerintem a te mezőhivatkozásod is jó .cells(i, 2).Value = R!Számlaszám .cells(i, 3).Value = R!Dátum .cells(i, 4).Value = R!Nyitó .cells(i, 5).Value = R!Jóváírás .cells(i, 6).Value = R!Terhelés .cells(i, 7).Value = R!Záró .cells(i, 8).Value = R!Deviza .cells(i, 9).Value = R!Számlatípus .cells(i, 10).Value = R!Bank ' Ha egymás utáni mezők, akkor lehetne: for i=j to fields.count .cells(i,j)=r.fields(j-1) next ' És 3 sorban letudtad R.MoveNext i = i + 1 Loop end with R.Close ' Munkafüzet mentés?

Ebből a
Dim R As recordset ' Lehet object
set R= currentdb.Openrecordset("Kivonat_feltolto")
tartozik a kérdésedhez, a többi csak TIT alapon
Mutasd a teljes hozzászólást!

  • CSV fájl nem megoldás? Az excel nagyon szépen megnyitja.
    (Nálunk is így megy az exportálás, és még senki nem panaszkodott rá.)
    Mutasd a teljes hozzászólást!
  • DAO-t használj

    Dim R As recordset Dim F As String Dim M As Object Dim n As Integer Dim i As Integer, j as integer F = currentdb.name + "\..\Kivonatok.xls" Set M = CreateObject("Excel.Application") M.workbooks.Open F M.Visible = True set R= currentdb.Openrecordset("Kivonat_feltolto") ' Kicsit bonyis a megoldásod: n = 1 Do n = n + 1 Loop While M.activesheet.cells(n, 1) <> "" ' Minek vonod le, ha hozzáadod n = n - 1 i = n + 1 ' Szerintem helyette ' n=range("a1").end(xldown)+1 with M.activesheet Do until R.EOF ' While not helyett .cells(i, 1).Value = R.fields("Bank neve") ' Bár szerintem a te mezőhivatkozásod is jó .cells(i, 2).Value = R!Számlaszám .cells(i, 3).Value = R!Dátum .cells(i, 4).Value = R!Nyitó .cells(i, 5).Value = R!Jóváírás .cells(i, 6).Value = R!Terhelés .cells(i, 7).Value = R!Záró .cells(i, 8).Value = R!Deviza .cells(i, 9).Value = R!Számlatípus .cells(i, 10).Value = R!Bank ' Ha egymás utáni mezők, akkor lehetne: for i=j to fields.count .cells(i,j)=r.fields(j-1) next ' És 3 sorban letudtad R.MoveNext i = i + 1 Loop end with R.Close ' Munkafüzet mentés?

    Ebből a
    Dim R As recordset ' Lehet object
    set R= currentdb.Openrecordset("Kivonat_feltolto")
    tartozik a kérdésedhez, a többi csak TIT alapon
    Mutasd a teljes hozzászólást!
  • Dim R As Objet Set R = CreateObject("ADODB.Recordset")
    Mutasd a teljes hozzászólást!
  • Szia,

    Köszönöm! Sokat tanultam az általad leírt kódból. Leginkább az egyszerűsítésből.

    Megjegyzéseidre válasz:
    ' Kicsit bonyis a megoldásod:
    n = 1
    Do
    n = n + 1
    Loop While M.activesheet.cells(n, 1) <> ""
    ' Minek vonod le, ha hozzáadod
    n = n - 1
    i = n + 1

    Az n-hez ciklusban adok hozzá 1-et. amint látod kilépek a ciklusból és csak utána a "végső" n értékből vonok ki 1-et. Ez azért volt szükséges, mert a Loop while <>"" az első üres sorban lép ki a ciklusból. Nekem ide kell beírnom az első exportált értéket, viszont az i = n + 1 ciklus pedig ismét hozzáad 1-et, így keletkezik egy üres sor.

    Persze a te megoldásod egyszerűbb és gyorsabb, viszont nekem Access-ben hibára fut,mert nem ismeri fel a range kifejezést.


    for i=j to fields.count
    .cells(i,j)=r.fields(j-1)
    next

    Megoldás nagyon tetszene, de hibára fut (Object required). A j-nek nem tud értéket adni.



    Az M.close parancsot nem hajtja vége.. egyszerűen nem tudom bezárni azt a drága excelt! :(
    Mutasd a teljes hozzászólást!
  • n = n - 1
    i = n + 1

    Mivel az "n"-et nem használod helyettesíthető egy
    i=n
    sorral (bár akkor minek a 2 változó )
    ---
    viszont nekem Access-ben hibára fut,mert nem ismeri fel a range


    Akkor add meg neki, hogy minek a range-e
    M.activeworkbook.activesheet.range(....)....

    (A rövidítést már rád bízom, de tippkánt en a M.visible után énazonnal
    with m
    sort teszek.
    Akkor a "."-al kezdődő "hivatkozások" az Excelre mutatnak.
    Ott meg az aktívmunkafüzet és az aktív lapja általában alapértelmezés)

    ---
    de hibára fut (Object required). A j-nek nem tud értéket adni.

    Bocs
    for i=j to R.fields.count
    --



    M.close

    Nem bezárni kell, hanem kilépni
    M.quit
    set m=nothing

    Elötte lehet pl.
    activeworkbook.close true ' hogy mentse is.
    Mutasd a teljes hozzászólást!
  • 1. Nem kell DAO-t használnod, lásd stl hozzászólását. A DAO-val nem lesz gyorsabb, vagy jobb a programod.
    2. Az access-ben szvsz alapból be van kapcsolva az ADO.
    3.
    Megoldás nagyon tetszene, de hibára fut (Object required). A j-nek nem tud értéket adni.


    Ezért utálok én is copy-paste kódot adni, mert ha kicsi hiba is van benne, a kérdezők sose tudják kijavítani.

    for i=j to R.fields.count
    helyett

    for j=1 to fields.count

    4.
    Az M.close parancsot nem hajtja vége.. egyszerűen nem tudom bezárni azt a drága excelt! :(

    Ua. mint eggyel feljebb

    M.ActiveWorkBook.Close
    M.Quit

    legyen.
    Mutasd a teljes hozzászólást!
  • Szia,

    Szerintem a copy-paste kóddal nincs gond. Nem azért mert így a kérdést feltevőnek könnyebb megoldani a problémát, hanem azért, mert én pl személy szerint ebből tanulok a legtöbbet. Vizuális típus vagyok. Megtanulom, hogy hogyan kell használni az egyes eljárásokat. Speciel Micu megoldásának a menetét is teljesen megértettem. Az más kérdés, hogy ha egy hiba van benne, azt nem tudom magamtól megoldani, mivel az Access súgója nem tud minden eljárásra mintát vagy megoldást adni.

    Az M.quit nem működik, viszont az
    M.activeworkbook.Save

    M.activeworkbook.Close

    parancs most már be is zárja az excelt.
    Mutasd a teljes hozzászólást!
  • 1. Jogos, de Copy/paste programozóknak egy kis javítás:
    Dim R As Object

    2. Tudok olyan változatot (bár elég régi), ahol nem.



    Mutasd a teljes hozzászólást!
  • Speciel Micu megoldásának a menetét is teljesen megértettem. Az más kérdés, hogy ha egy hiba van benne, azt nem tudom magamtól megoldani, mivel az Access súgója nem tud minden eljárásra mintát vagy megoldást adni.


    Tehát nem értetted meg a menetét...

    Az M.quit nem működik

    Akkor elég különleges excel-ed lehet.

    M.activeworkbook.Close parancs most már be is zárja az excelt.


    Egyrészt nem parancs, hanem metódus, másrészt a munkafüzetet és nem az excel-t zárja be. Ha utána megnézed a futó process-ek listáját, akkor látni fogod az excel.exe-t. A az excel.application quit metódusa zárja le az excel folyamatot.

    @Micu: Access 2003-ban már alapértelmezetten be van kapcsolva - legalábbis azoknál a telepítéskenél, amiket én láttam...
    Mutasd a teljes hozzászólást!
  • Ahogy emlékszem a xp/2002 és a 2003 SP nélküliben nem volt.
    (Bár aki ezeket használja az meg is érdemli )

    _KGR_:
    Set M = CreateObject("Excel.Application")
    esetén
    M.quit
    Mutasd a teljes hozzászólást!
  • Köszönöm a segítséget!
    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