knop in formulier 'deze gegevens exporteren naar Excel'

Status
Niet open voor verdere reacties.
Even een oud topic nieuw leven in blazen, want ik was hiernaar ook op zoek. (Toch toevallig dat je via Google dan toch weer gewoon hiernaar verwezen wordt :cool:)

Voor mijn formulier heb ik nu een knop Export gemaakt. Vervolgens ben ik als volgt te werk gegaan:
1. In Ontwerpweergave, ga naar Eigenschappenvenster
2. Op tabblad Gebeurtenis, bij Bij klikken, klik rechts op de drie puntjes en kies Opbouwfunctie voor programmacode.
3. Microsoft Visual Basic wordt geopend en automatisch worden de regels:
Private Sub Export_Click( )

End sub

gemaakt.
4. Vervolgens heb ik onderstaande code overgenomen uit dit topic.

Private Sub Export_Click( )
Dim db As Database
Dim cn As ADODB.Connection
Dim strSQL As String
Dim pad As String

Set cn = New ADODB.Connection
Set db = CurrentDb()
pad = CurrentProject.path
If Right(pad, 1) <> "\" Then pad = pad & "\"

' Selecteer alles (*) naar tabel Temp
' vanuit tabel tblProductions
' waar geldt: ID is gelijk aan ID huidige record

strSQL = "SELECT * INTO Temp " & vbCrLf
strSQL = strSQL & "FROM [tblProductions]" & vbCrLf
strSQL = strSQL & "WHERE ([ID]=" & Me.[ID] & ");"

On Error Resume Next
Kill pad & "\Test.xls"
DoCmd.SetWarnings False
DoCmd.RunSQL strSQL
DoCmd.SetWarnings True

On Error GoTo 0
DoCmd.TransferSpreadsheet acExport, acSpreadsheetTypeExcel9, "Temp", pad & "Test.xls", True

End Sub

5. De eigenschappen voor bibliotheken heb ik aangepast naar:
33vf1oz.png


Wat gebeurt er nu?
Er wordt een nieuwe tabel Test gemaakt in Access.
Daarnaast wordt in dezelfde directory als waar het Access-bestand zich bevind een Excel bestand gemaakt.
Zowel de tabel als het Excel bestand zijn echter leeg.

Ligt één en ander aan de programma's?
Deze computer is geinstalleerd met Windows 7 Professional, Access 2007 en Excel 2007

Moet ik bijvoorbeeld per se een .xlsx bestand maken? Of klopt misschien in de laatste command regel acSpreadsheetTypeExcel9 niet?
 
Als de tabel leeg is, heb je uiteraard ook een leeg excel bestand, want dat is gebaseerd op de tijdelijke tabel. Je moet dus eerst controleren waarom je een lege tabel krijgt.
Probeer dus dit eens:

Code:
    strSQL = "SELECT * INTO Temp " & vbCrLf
    strSQL = strSQL & "FROM [tblProductions]" & vbCrLf
    strSQL = strSQL & "WHERE ([ID]=" & Me.[ID] & ");"
    [COLOR=darkslateblue][B]Dim tmp
    tmp = InputBox("", "", strSQL)
[/B][/COLOR]    On Error Resume Next

Kopieer vervolgens de code uit de inputbox, en plak die in het SQL venster van een nieuwe query. Kijk vervolgens (niet uitvoeren uiteraard, want dan maak je gelijk een tabel) of er records in de dynaset zitten. Zo niet, kijk dan in het ontwerpscherm van de query naar de structuur van de query, en pas hem zodanig aan, dat je wèl een output hebt. Je weet dan dat er iets fout is gegaan bij het maken van de tabel.
Overigens is het handiger om VBA code in de CODE tag te zetten; leest wat makkelijker!
 
Goed, ik heb die code van tmp toegevoegd. Dan krijg je deze melding:
dba4w.png

Vervolgens heb ik via Maken > Query-ontwerp > Weergave: SQL-weergave de code erin geplakt:
Code:
SELECT * INTO Temp FROM [tblProductions] WHERE ([ID]=100000-1);

Hoe kan ik vervolgens dan kijken of er records in de Dynaset zitten?
 
Door dus niet op de knop <Uitvoeren> te klikken, maar op de knop <Beeld>, <Gegevensbladweergave>
 
Bon, dat heb ik nu maar gedaan, was niet zo heel moeilijk;)
Heb de fout echter al gevonden:
Ik vermoed dat je veld Naam een tekstveld is, en geen numeriek veld.
In dat geval wordt de code:

strSQL = strSQL & "WHERE ([naam]='" & Me.naam] & "');"

Beetje lastig te zien, maar er zijn enkele quootjes (') bijgekomen...
Meestal gebruik je een sleutel(getal)veld om te filteren, werkt vaak beter...

Ik zal hieronder nog even de volledige code opsommen voor als mensen het nog ooit nodig hebben.
Code:
Private Sub Export_Click()
    Dim db As Database
    Dim cn As ADODB.Connection
    Dim strSQL As String
    Dim pad As String
    
    Set cn = New ADODB.Connection
    Set db = CurrentDb()
    pad = CurrentProject.path
    If Right(pad, 1) <> "\" Then pad = pad & "\"
    
    ' Selecteer alles (*) naar tabel Temp
    ' vanuit tabel tblProductions
    ' waar geldt: ID is gelijk aan ID huidige record
    strSQL = "SELECT * INTO Temp "
    strSQL = strSQL & "FROM tblProductions "
    strSQL = strSQL & "WHERE (((tblProductions.[ID])='" & Me.[ID] & "'));"
            
    On Error Resume Next
    Kill pad & "\Test.xls"
    DoCmd.SetWarnings False
    DoCmd.RunSQL strSQL
    DoCmd.SetWarnings True
    
    On Error GoTo 0
    DoCmd.TransferSpreadsheet acExport, acSpreadsheetTypeExcel9, "Temp", pad & "Test.xls", True
    
End Sub

Vraag me nog wel af waarom in eerste instantie vbCrLf achter de strSQL regels stond?
En in principe kan er bij die laatste strSQL regels een koppel haakjes weg, toch?
 
Soms zet ik er een vbcrlf in voor de leesbaarheid van de code die je daarmee opbouwt in het SQL venster. Nodi is het echter niet. Wil je het helemaal kort maken, dan kan hij ook zo:
Code:
    strSQL = "SELECT * INTO Temp FROM tblProductions " _
    & "WHERE ([ID]='" & Me.[ID] & "');"
 
De code heeft het gedaan maar ik krijg nu een foutmelding bij
Code:
Dim cn As ADODB.Connection

Visual Basic zegt namelijk:
"Compileerfout:
Een door de gebruiker gedefinieerd gegevenstype is niet gedefinieerd."

Hoe kan ik dit verhelpen? Ik neem aan dat ik ADODB.Connection niet zelf hoef te definieren?

Edit: volgens mij ligt het aan de bibliotheken. Die moet ik weer instellen.
 
Laatst bewerkt:
Dat moet inderdaad als je ADO wilt gebruiken. Volgens mij maakt het niet zoveel welke versie je neemt, al neem ik zelf altijd 2.8, de laatste. Tevens zorg ik er altijd voor dat ADO vóór DAO 3.6 geladen wordt. De meningen wisselen daar overigens over, maar ik constateer zelf regelmatig dat Access fouten genereert als DAO boven ADO staat, dus daarom staat in mijn lijst met Verwijzingen ADO altijd boven DAO. En ik heb eigenlijk nooit meer problemen gekend met de bibliotheken.
 
Het werkt nu inderdaad. Echter, ik zou ook graag de waardes uit het subformulier meenemen naar mijn Excel file. Bovendien zou ik graag niet het ID meenemen, maar de naam van het bedrijf en de persoon.

Dus niet ContactID maar ContactName en i.p.v. CompanyID de CompanyName


P.S. In de bijlage zit een voorbeelddatabase met enkele fictieve namen.
 

Bijlagen

Is simpel op te lossen door een query te maken waarin je de records uit de verschillende tabellen samenvoegt tot je alle gewenste gegevens hebt. Vervolgens gebruik je deze query om te exporteren, niet de tabel.
 
Status
Niet open voor verdere reacties.
Terug
Bovenaan Onderaan