Exporteren in 'overwrite-modus'

Status
Niet open voor verdere reacties.

embetwee

Gebruiker
Lid geworden
14 sep 2007
Berichten
42
Hallo allen,

Ik maak gebruik van de functie DoCmd.TransferSpreadsheet ac Export etc om dagelijks een groot aantal regels uit Access 2003 naar Excel2003 te exporteren. Als het doelbestand al bestaat is de standaard optie dat die regels toegevoegd worden aan dat bestand. Om die verwijder ik het doelbestand middels de functie Kill eerst, maar dat is natuurlijk geen elegante oplossing. Is er geen manier om in de opdrachtregel van TransferSpreadsheet aan te geven dat overschreven ipv toegevoegd moet worden? En kun je dat mogelijk ook naar een tabblad met een naam naar keuze? Alvast dank voor de response,

embetwee
 
Je kan je recordset eenvoudig exporteren met onderstaande code
Code:
Public Sub CreateSpreadsheetFromRS(rst As Recordset, blnVisible As Boolean, Optional blnHeader As Boolean = True)
'Recordset exporteren naar excel.

    Dim appExcel  As Excel.Application
    Dim wbExcel   As Workbook
    Dim wsExcel   As Worksheet
    Dim qdf       As QueryDef
    Dim intRij    As Integer
    Dim intVelden As Integer
    Dim intTeller As Integer
        
    If Not rst.EOF Then
        Set appExcel = New Excel.Application
        With appExcel
            .Visible = blnVisible
            Set wbExcel = .Workbooks.Add
            Set wsExcel = wbExcel.Worksheets(1)
        End With
    Else
        MsgBox "Geen records gevonden voor " & rst.Name, vbExclamation, GetAppTitle()
        Exit Sub
    End If
    
    intVelden = rst.Fields.Count - 1
        
    intRij = 0
        
    If blnHeader Then 'Default worden de veldnamen geprint
        'Eerst de veldnamen
        intRij = intRij + 1
        For intTeller = 0 To intVelden
            wsExcel.Cells(intRij, intTeller + 1) = rst.Fields(intTeller).Name
        Next intTeller
    End If
                
    Do While Not rst.EOF
        intRij = intRij + 1
        For intTeller = 0 To intVelden
            wsExcel.Cells(intRij, intTeller + 1) = rst.Fields(intTeller)
        Next intTeller
        rst.MoveNext
    Loop
        
    wsExcel.Columns.AutoFit
    wsExcel.Rows.AutoFit
    appExcel.Visible = True
    appExcel.WindowState = xlMinimized
    
    Set rst = Nothing
    Set qdf = Nothing

End Sub
Als je foutmeldingen krijgt omdat het niet compleet is hoor ik het wel.
 
Dag Guus, Allereerst dank voor je reactie.

Ik denk uit je code te begrijpen dat in plaats van appExcel, wbExcel, wsExcel, qdf etcetera exacte data ingevoerd moet worden?

Stel concreet dat ik de eerste 350 regels van query 'Uitgaven' naar Excelbestand 'woonkosten.xls' in de subdir c:\export (liefst naar tabblad 'hoofdverblijf') moet exporteren. Eventuele bestaande data in dat tabblad moet overschreven worden. Hoe moet ik dan exact te werk gaan?

Sorry voor de eventuele overlast, maar ik wil de code niet alleen toepassen, maar voor de toekomst ook leren begrijpen.

Vriendelijke groet, embetwee.
 
Hier wordt een Excel object aangemaakt zonder naam. Hij krijg pas een naam als je die saved.
Je kan een bestaande Excel spreadsheet openen door de code een beetje aan te passen
Code:
    If Not rst.EOF Then
        Set appExcel = New Excel.Application
        With appExcel
            .Visible = blnVisible
            Set wbExcel = .Workbooks.open("JouwSpreadsheet.xls")
            Set wsExcel = wbExcel.Worksheets("Jouwsheetnaam")
        End With
    Else
        MsgBox "Geen records gevonden voor " & rst.Name, vbExclamation, GetAppTitle()
        Exit Sub
    End If
Succes!
 
Laatst bewerkt:
Dag Guus, :o

Normaal kopieer en plak ik een stukje code naar de module 'Functies' in de database. Vervolgens geef ik dat bijvoorbeeld de naam 'Function Exporteren()' mee en tenslotte roep ik het e.e.a. dan aan via een macro. In dit geval blijkt die vlieger echter niet op te gaan. Zonder twijfel zal ik wel iets fout doen, maar ik ben vastbesloten me die kennis eigen te maken. Zou je nogmaals even op weg willen helpen?

Bvd, embetwee
 
Dag Guus, :o

Normaal kopieer en plak ik een stukje code naar de module 'Functies' in de database. Vervolgens geef ik dat bijvoorbeeld de naam 'Function Exporteren()' mee en tenslotte roep ik het e.e.a. dan aan via een macro. In dit geval blijkt die vlieger echter niet op te gaan. Zonder twijfel zal ik wel iets fout doen, maar ik ben vastbesloten me die kennis eigen te maken. Zou je nogmaals even op weg willen helpen?

Bvd, embetwee
Misschien omdat je argumenten op moet geven? Ik heb geen idee want ik gebruik op twee uitzonderingen na, geen macro's. De enige die ik gebruik zijn AutoExec en AutoKeys en niet eens altijd.

Mijn advies is daarom: gebruik eens geen macro's. Het wordt ineens een stuk simpeler.
Rechtsklik op een knop en kies om code toe te voegen. Je krijgt dan bijvoorbeeld dit:
Code:
Private Sub cmdSomeButton_Click()
    msgbox "Hallo wereld" 'Dit moet je wel even zelf tikken.
end Sub
Op het moment dat je nu op die knop drukt wordt de code (in dit geval je hallo message) uitgevoerd. Je krijgt nu veel meer controle over wat er gebeurt.

Enjoy!
 
Hoi Guus,

Ok. Ga ik proberen. Maar hoe start je jouw code dan vanuit de Windows taakplanner?Binnen de macromodule verwees ik altijd naar een uit te voeren procedure die ik op het gewenste tijdstip liet starten.

Embetwee
 
Hoi Guus! De door mij tot dusverre gevolgde werkwijze is als volgt:

Allereerst maak je via ‘Modules’ en ‘Functies’ de benodigde code aan. In mijn geval bv:

Function Exporteren()
DoCmd.TransferSpreadsheet acExport, acSpreadsheetTypeExcel8, "qry uitgaven", "c:\export\woonkosten.xls"
End Function

Vervolgens maak je een nieuwe macro (met b.v. de naam ‘vv’ (van volautomatisch verwerken)) aan via actie ‘ProcedureUitvoeren’. Je verwijst daarbij uitsluitend naar de code die de naam ‘Exporteren’ (zie boven) heeft meegekregen.

Tenslotte laat je middels de Windows taakplanner een batchbestand runnen wat de volgende opdrachtregel bevat: "C:\Program Files\Microsoft Office\Office11\Msaccess.exe" "c:\databases\financien.mdb" /Excl /X vv (de macronaam dus).

De functie wordt uitgevoerd. Echter wordt in mijn geval het doelbestand c:\export\woonkosten.xls niet overschreven zoals gewenst, maar de regels uit de selectiequery worden eraan toegevoegd. Bovendien zou het heel prettig zijn als je aan het aantal te exporteren regels een maximum kunt stellen.

Ik hoop hiermee mijn vraag maximaal duidelijk geformuleerd te hebben.
Vriendelijke groet en dank, embetwee.
 
Als je
Code:
"C:\Program Files\Microsoft Office\OFFICE11\MSACCESS.EXE" /cmd "FromShortcut" c:\temp\somedatabase.mdb
gebruikt dan hoef je geen macro meer aan te roepen. Je parameters komen dan je database binnen als je COMMAND uitvraagt. De volgende code neem je op in Somedatabase.mdb:
Code:
Public Function InitApp()

    If IsNull(Command) Or Command <> "FromShortcut" Then
       MsgBox "Deze database moet worden geopend met de shortcut!", vbCritical, "SomeDatabase.mdb"
       DoCmd.Quit acQuitSaveNone
    End If

End sub
Je snapt. Dit is maar een voorbeeldje van wat er mogelijk is.

Tenslotte laat je middels de Windows taakplanner een batchbestand runnen wat de volgende opdrachtregel bevat: "C:\Program Files\Microsoft Office\Office11\Msaccess.exe" "c:\databases\financiën.mdb" /Excl /X vv (de macronaam dus).
Wat jij een taakplanner noemt en een batch bestand is in wezen een opdracht en een macro. Als je in bovenstaand voorbeeld "FromShortcut" verandert in het aantal regels dat geëxporteerd mag worden
Code:
Option Compare Database
Option Explicit

dim gintX as integer ' Globale integer X

Public Function InitApp()

    If IsNull(Command) Or not IsNumeric(Command) Then
       MsgBox "De parameter moet een getal zijn!", vbCritical, "SomeDatabase.mdb"
       DoCmd.Quit acQuitSaveNone
    End If
    gintX = val(Command)

End sub
dan kan je in onderstaande code ervoor zorgen (onderdeel CreateSpreadsheetFromRS) dat er niet meer dan X regels geëxporteerd mogen worden.
Code:
    intLaatsteRegel = intRij + gintX ' Global integer X 
    Do While Not rst.EOF and intRij <= intLaatsteRegel
        intRij = intRij + 1
        For intTeller = 0 To intVelden
            wsExcel.Cells(intRij, intTeller + 1) = rst.Fields(intTeller)
        Next intTeller
        rst.MoveNext
    Loop
Deze code is niet getest.

HTH:D
 
Hoi Guus!

Sorry voor de late reactie. Ik ben laten we maar zeggen even 'koppie onder' geweest, maar het gaat al weer. Ik begrijp in ieder geval waar je met je code naar toe wil. Wel even anders dan ik gewend ben, maar ik ga ermee stoeien. Nogmaals dank vooe je hulp en waarschijnlijk tot later!

Embetwee
 
Status
Niet open voor verdere reacties.
Terug
Bovenaan Onderaan