Standaard functie van access in een knop aanroepen?

Status
Niet open voor verdere reacties.

sikkepit3

Gebruiker
Lid geworden
11 apr 2015
Berichten
29
Beste helpmij leden,

Ik ben hier nieuw en hoop dat jullie mij een zetje in de juiste directie kunnen geven :).
ik ben een importapplicatie aan het maken en vraag mij af hoe ik een
ingebouwde functie van Access kan aanroepen in een knop.

Ik werk met Access van Office365 en in de tab 'Externe gegevens'
kan ik kiezen om op 'tekstbestand' te klikken om zo te importeren.

Weten jullie een manier dat ik het klikken op 'tekstbestand' kan aanroepen
in een button (dus met VBA of Macro's ofzo :P)? Ik wil namelijk een aantal checks uitvoeren voordat
deze functie wordt uitgevoerd.

Alvast bedankt! :D
 
Dat kan uiteraard. Welkom bij HelpMij trouwens :).
Ik zou niet (lees: nooit) naar macro's kijken, zonde van je tijd. Uiteindelijk zul je toch gaan programmeren, dus waarom niet gelijk in de wereld van VBA duiken?
In dit geval heb je de gebeurtenis TransferText nodig om je tekstbestand in te lezen. Voor uitgebreidere hulp hebben we uiteraard meer informatie nodig, en eventueel een voorbeeldje.
 
Hey @OctaFish! Dank je voor je warme welkom :)!
Wat fijn dat iemand zo snel een reactie geeft op mijn vraag!

Ik weet dat ik met TransferText een CSV bestand wil openen. Echter wil ik dit niet omdat elk bestand die ik open kan andere UTF waarden bevatten. Dit
betekent dus ook dat hier continu in moet kunnen switchen. Om dit niet te programmeren wil ik eigenlijk gewoon een standaard
import functionaliteit van Access kunnen aanroepen in een knop.

Ik heb een screenshot gemaakt waarin ik met een pijl wijs naar de functionaliteit die ik via die knop graag zou willen openen.
Uiteraard zou dit geweldig zijn als het in VBA zou kunnen!
Om even kort samen te vatten wil ik in VBA simuleren wat er gebeurd als ik op die knop druk en daarmee dat bijbehorende proces openen.
Naamloos.jpg


Alvast bedankt!
 
En dat maakt dit draadje tot een hele korte, want dat kan niet. Eerlijk gezegd zie ik die noodzaak ook niet zo; met twee klikjes zit je al in het juiste menu, dus wat is dan de winst van het programmeren van het inkorten tot één klikje? In de tijd die je nodig zou hebben om zo'n oplossing te bouwen, kun je (schat ik) zo'n 300 imports doen :).
 
Dat is jammer! Maar verder niks aan te doen. Ik zit echter met nog een probleem en aangezien u zo snel reageert ga ik daar nog even gebruik van maken !:D
Ik heb een Query gemaakt dmv het combineren van twee tabellen. Hier heb ik een 'select *' gebruikt. Deze query wordt geëxporteerd in een Excel bestand (op dit moment via een Macro).
Ik zou echter graag op de een of andere manier mijn gebruiker input willen geven zodat hij of zij kan kiezen welke velden er in de select staat en dus worden geëxporteerd
in mijn Excel bestand.

Ik denk dat ik hier twee opties heb. Eerste is de select query op een of andere manier aanpassen door mijn gebruiker of ik moet bij het exporteren kiezen welke
headers worden meegenomen in het Excel bestand?

Ik heb echter GEEN idee hoe ik dit moet realiseren. Ik hoop dat jij of een ander lid van helpmij.nl mij kan helpen!

Alvast bedankt!
 
(selectie)Queries zonder SELECT bestaan niet, dus niet verwonderlijk dat je dat woord er in terug vindt :). Je hebt (dat maakt het kiezen hopelijk wat makkelijker) geen 2 keuzes, maar 1. Een export naar Excel met of zonder headers bepaalt alleen maar of je de koppen ziet of niet. Dus dat lost niks op.

Dan hou je dus één optie, en dat is de query dynamisch opbouwen. Gelukkig voor jou heb ik dat proces al uitgebreid beschreven in de Access cursus die in de Handleidingen sectie staat. Ik weet zo uit het hoofd niet precies welk hoofdstuk, maar ik schat zo rond hoofdstuk 17.
 
Oke ik ben al een heel eind! Thanks for sticking with me trouwens.
Ik heb nu alleen een probleem, namelijk dat uit mijn keuzelijst meerdere velden moeten worden geselecteerd en in de select clause moet worden gezet.
Enig idee hoe ik dat kan toevoegen aan mijn code?
Ik heb tot nu toe dit:

Private Sub Knop36_Click()
'Check of TempQuery al bestaat, zo ja delete.
If Not IsNull(DLookup("Name", "MSysObjects", "Name='TempQuery'")) Then
DoCmd.RunSQL "DROP TABLE [TempQuery]"
End If

'this function will export part of the table to Excel file based on the user input from the combo list
Dim db As DAO.Database
Dim qdf As QueryDef
Dim strSQL As String

Set db = CurrentDb()
'maak select op basis van keuzelijst
strSQL = "Select " & Me.Keuzelijst46.Value & " From Query_Samenvoegen_Tabellen"
With db
'.QueryDefs.Delete ("newQuery")
Set qdf = db.CreateQueryDef("TempQuery", strSQL)
.Close
End With

'exporteer naar de volgende map.
DoCmd.TransferSpreadsheet acExport, , "TempQuery", "C:\CSV File test\xyz.xls"
MsgBox ("Data has been exported successfully")
Exit_Command4_Click:

'Check of TempQuery bestaat, zo ja delete.
If Not IsNull(DLookup("Name", "MSysObjects", "Name='TempQuery'")) Then
DoCmd.RunSQL "DROP TABLE [TempQuery]"
End If
 
Dat is niet helemaal de code uit mijn voorbeeldje :). Een keuzelijst kan meerdere waarden selecteren, maar als je dat doet, kun je ze nooit met Value uitlezen. Sowieso werkt Value alleen als de keuzelijst slechts één waarde mag bevatten. Dus daar heb je niks aan.
Zou je trouwens cod willen opmaken met de CODE knop? Houdt 'm leesbaar.
 
Mijn excuses. Ikz al er de volgende keer rekening mee houden.
Heeft u enig idee hoe ik dan wel deze lijst kan uitlezen ipv value te gebruiken?
Ik heb deze code idd niet uit uw handleiding, echter heb ik de handleiding wel gelezen.

Code:
Private Sub Knop36_Click()
'Check of TempQuery al bestaat, zo ja delete.
If Not IsNull(DLookup("Name", "MSysObjects", "Name='TempQuery'")) Then
DoCmd.RunSQL "DROP TABLE [TempQuery]"
End If

'this function will export part of the table to Excel file based on the user input from the combo list
Dim db As DAO.Database
Dim qdf As QueryDef
Dim strSQL As String

Set db = CurrentDb()
'maak select op basis van keuzelijst
strSQL = "Select " & Me.Keuzelijst46.Value & " From Query_Samenvoegen_Tabellen"
With db
'.QueryDefs.Delete ("newQuery")
Set qdf = db.CreateQueryDef("TempQuery", strSQL)
.Close
End With

'exporteer naar de volgende map.
DoCmd.TransferSpreadsheet acExport, , "TempQuery", "C:\CSV File test\xyz.xls"
MsgBox ("Data has been exported successfully")
Exit_Command4_Click:

'Check of TempQuery bestaat, zo ja delete.
If Not IsNull(DLookup("Name", "MSysObjects", "Name='TempQuery'")) Then
DoCmd.RunSQL "DROP TABLE [TempQuery]"
End If
 
Als je het hoofdstuk hebt gevonden, dan is uiteraard de tegenvraag: waarom gebruik je mijn code niet? Die werkt namelijk :).
 
Erg terechte vraag. Mijn antwoord is omdat ik nog in een lerende fase zit met VBA en hier graag mijn eigen code zou willen begrijpen. Als ik alles maar kopieër leer ik er (uit ervaring) een stuk minder van :).
Bij mij gaat het uitlezen nu wel goed ik zit echter met een probleem (alweer:P).
Ik heb een functie gezet om het uitlezen van de code en wou hem graag in een functie zetten. Echter als ik deze nu aanroep werkt het niet.

ik moet de functie dus oproepen en zo de waardes eruithalen. Ik dacht ik doe gewoon 'return waarde' waar de waarde de variabele is die ik terug wil halen.
Maar dit werkt niet en de compiler geeft dan een fout aan.

Ik ben op dit moment even aan het testen met een msgBox zodat ik uiteindelijk de waarde eruit kan halen.
Hier is mijn code
Code:
Public Function queryuitlezen() As String
'functie voor het uitlezen van de keuzelijst en de waarden eruit halen.
Dim itm As Variant
    For Each itm In Me.Keuzelijst46.ItemsSelected
        If Me.Keuzelijst46.ItemsSelected.Count > 0 Then
            sCat = sCat & "" & Me.Keuzelijst46.ItemData(itm) & ""
            iAantal = iAantal + Keuzelijst46.Column(3, itm)
            i = i + 1
            If i < Me.Keuzelijst46.ItemsSelected.Count Then sCat = sCat & ", "
        Else
           Exit Function
        End If
    Next itm
End Function

Private Sub Knop39_Click()
Dim test

test = queryuitlezen()
MsgBox (test)
End Sub


P.S. het uitlezen gaat dus goed. Echter krijg ik het returnen van de waarde niet voor elkaar. Ik denk dat dit kan worden geclassificeerd
als een 'rookie mistake' maar hoop dat u geduld met mij heeft zodat ik hier het probleem kan oplossen!

Ik wil even erbij zeggen dat ik uw hulp tot noch toe ERG waardeer! Ik heb nu al super veel geleerd van de antwoorden die u mij
heeft gegeven!:thumb:
 
Je functie zou het prima doen als je hem ook vult. Je declareert hem als een string, wat inhoudt dat je er inhoud kunt instoppen. Probleem is: dat doe je niet. Je vult een variabele, en daar houdt het op. Je moet dus op het eind nog een regeltje toevoegen:
Code:
     QueryUitlezen = sCat
End Function
Je testknop kan overigens een stukje korter
Code:
Private Sub Knop39_Click()
     MsgBox QueryUitlezen
End Sub
En laatste tip: probeer variabelen altijd als een type te declareren. Dim Test doet dat niet. Dim Test As String wel.
 
Hartstikke bedankt!
Mijn export werkt nu hartstikke goed. Dat is inderdaad een goede tip, ik zal erop letten.

Als het niet teveel gevraagd is heb ik nog een vraag. Op dit moment gebruik ik DoCmd.TransferSpreadsheet om te exporteren. Maar in tegenstelling tot de ingebouwde Macro van Access is bijvoorbeeld de bovenste rij (kolom namen) altijd donker.
Ik zou dat ook graag willen hebben in mijn export. Ook zou ik graag de celbreedte willen aanpassen (het liefste dat er nooit tekst verdwijnt achter de cellen waardoor de gebruiker de cellen zelf breder moet maken).

Dan het tweede wat ik nog graag zou willen is dat een gebruiker een folder kan kiezen waar die het bestand kan opslaan ipv dat ik een folder voor hem/haar uitkies.
Mijn code tot nu toe staat tussen de code brackets en nogmaals HARTSTIKKE bedankt!

Code:
Private Sub Knop36_Click()
'Check of TempQuery al bestaat, zo ja delete.
If Not IsNull(DLookup("Name", "MSysObjects", "Name='TempQuery'")) Then
DoCmd.RunSQL "DROP TABLE [TempQuery]"
End If

'this function will export part of the table to Excel file based on the user input from the combo list
Dim db As DAO.Database
Dim qdf As QueryDef
Dim strSQL As String
Dim UitlezenQueryValue As String


Set db = CurrentDb()

'maak select op basis van functie 'queryuitlezen'
strSQL = "Select " & queryuitlezen & " From Query_Samenvoegen_Tabellen"
With db

Set qdf = db.CreateQueryDef("TempQuery", strSQL)
.Close
End With

'exporteer naar de volgende map.
DoCmd.TransferSpreadsheet acExport, , "TempQuery", "C:\CSV File test\xyz.xlsx", True
MsgBox ("Data has been exported successfully")
Exit_Command4_Click:

'Check of TempQuery bestaat, zo ja delete.
If Not IsNull(DLookup("Name", "MSysObjects", "Name='TempQuery'")) Then
DoCmd.RunSQL "DROP TABLE [TempQuery]"
End If

     Exit Sub
End Sub
 
Laatst bewerkt:
Ik snap je probleem niet helemaal; een exportfile is volgens mij een exportfile, en daar kun je qua opmaak niets aan veranderen. Of je dat nu met een macro doet of met VBA, het resultaat is hetzelfde. En je kunt al helemaal niets doen aan de layout van de kolommen. Wil je dat wel, dan moet je het hele Excel proces sturen vanuit Access. Dat houdt dan in: Excel sessie openen, Gegevens rij voor rij exporteren en de opmaak van het werkblad instellen.

Overigens snap ik niet waarom je de query steeds weggooit en opnieuw aanmaakt. Lijkt mij nergens voor nodig; ik gebruik altijd dezelfde tijdelijke query voor allerlei doeleinden, en pas dan steeds de SQL ervan aan.
Code:
Private Sub Knop36_Click()
Dim db As DAO.Database
Dim qdf As QueryDef
Dim strSQL As String
Dim UitlezenQueryValue As String

    On Error GoTo MaakQuery
    strSQL = "Select " & queryuitlezen & " From Query_Samenvoegen_Tabellen"
    Set qdf = CurrentDb.QueryDefs("TempQuery")
    qdf.SQL = strSQL
    DoCmd.TransferSpreadsheet acExport, , "TempQuery", "C:\CSV File test\xyz.xlsx", True
    MsgBox ("Data has been exported successfully")
    Exit Sub
    
MaakQuery:
    Set qdf = CurrentDb.CreateQueryDef("TempQuery", strSQL)
    Resume Next
End Sub
 
Een map kiezen kun je met de volgende functie doen:
Code:
Function PickFolder() As String
Dim frm As Object
Dim varFile As Variant
    
    Set frm = Application.FileDialog(4)
    With frm
        .AllowMultiSelect = False
        .Show
        For Each varFile In .SelectedItems
            PickFolder = varFile
        Next
    End With
End Function
 
Toen ik in het begin van het maken van deze applicatie exporteerde via een Macro was de bovenste rij iets donkerder wat het contrast tussen de kolommen en de informatie in de kolommen wat duidelijker maakte. Dit doet die dus wel met de macro maar niet met de VBA code die ik nu gebruik.

Jou code ziet er inderdaad een stuk beter uit. Ik heb het geprobeerd en het werkt totdat ik nog een keer op de knop druk. Dan krijg ik de error 'TempQuery' bestaat al.

Het kiezen van een map werkt ook erg goed! Weet jij echter ook nog een manier dat ik kan opgeven onder wat voor een naam het moet worden opgeslagen?
 
Foutje in de code.... moet ook niet alles uit het hoofd proberen :).

Code:
     On Error GoTo GeenTemp
     Set qTemp = CurrentDb.QueryDefs("TempQuery")
     qTemp.SQL = strSQL
     ....
     Exit Function


GeenTemp:
     On Error Resume Next
     Set qTemp = db.CreateQueryDef("TempQuery", strSQL)
     Return
 
haha geen probleem! Ik heb nu de code aangepast door wat ik denk wat jij bedoelde. Ik snap niet helemaal waar je opeens qTemp vandaan haalde dus heb ik die veranderd naar qdf.
Echter krijg ik hierdoor de error:
'fout 91 tijdens uitvoering:
Objectvariable of blokvariable With is niet ingesteld'.

Ik snap alleen niet waar de error vandaan komt want als ik een msgBox om mijn query doe klopt de query wel gewoon die eruit komt.
Ik denk dat ik een fout heb gemaakt in de VBA code(zoals al vaak de afgelopen paar dagen). Ik moet wel zeggen dat ik steeds meer begin te begrijpen en daarvoor wil ik je nogmaals erg bedanken!

Code:
Private Sub ExporteerKnop_Click()
Dim db As DAO.Database
Dim qdf As QueryDef
Dim strSQL As String
Dim UitlezenQueryValue As String

   On Error GoTo GeenTemp
    strSQL = "Select " & KeuzeLijstUitlezen & " From Query_Samenvoegen_Tabellen"
    MsgBox (strSQL)
    Set qdf = CurrentDb.QueryDefs("TempQuery")
    qdf.SQL = strSQL
    DoCmd.TransferSpreadsheet acExport, , "TempQuery", "C:\CSV File test\xyz.xlsx", True
    MsgBox ("Data has been exported successfully")
    Exit Sub

GeenTemp:
     On Error Resume Next
     Set qdf = db.CreateQueryDef("TempQuery", strSQL)
     Return
    Resume Next
End Sub

Public Function KeuzeLijstUitlezen() As String
'functie voor het uitlezen van de keuzelijst en de waarden eruit halen.
Dim itm As Variant
    For Each itm In Me.Keuzelijst46.ItemsSelected
        If Me.Keuzelijst46.ItemsSelected.Count > 0 Then
            sCat = sCat & "" & Me.Keuzelijst46.ItemData(itm) & ""
            iAantal = iAantal + Keuzelijst46.Column(3, itm)
            i = i + 1
            If i < Me.Keuzelijst46.ItemsSelected.Count Then sCat = sCat & ", "
        Else
           Exit Function
        End If
    Next itm
    KeuzeLijstUitlezen = sCat
End Function
 
Gooi de db declaratie eens weg, want die heb je toch niet nodig. In het eerste deel van je code gebruik je immers ook Currentdb.Querydefs.
 
Bedoel je 'Dim db As DAO.Database'?

Nu krijg ik
'Fout 424 tijdens uitvoering
object vereist'

Deze error krijg ik echter alleen als ik meerdere velden of '*' selecteer?
Wel apart dat die het met een keuze wel bij alles doet maar zodra die meerdere
moet exporteren niet meer. Echter is de query wel goed opgebouwd voor zover ik weet
heb het namelijk gecheckt dmv MsgBox.
 
Status
Niet open voor verdere reacties.
Terug
Bovenaan Onderaan