Macro om te importeren / Access 2007

Status
Niet open voor verdere reacties.

RonPrins

Gebruiker
Lid geworden
16 okt 2017
Berichten
17
Beste Leden,

Na veel zoeken en niet vinden hoop ik dat u voor mij de oplossing heeft.

Ik wil een knop maken op een formulier die ervoor zorgt dat een folder op het netwerk wordt geopend.
Deze folder bevat Excel files, die stuk voor stuk moeten worden geimporteerd in een tabel in access.

Kortom de gebruiker moet nadat de knop de folder heeft geopend, een bestand kiezen wat vervolgens geimporteerd wordt in een bepaalde tabel.

het enige wat ik tot op heden heb kunnen vinden is dit proces, maar dan naar een 1 specifieke file, niet naar een folder waar een file in gekozen kan worden om te importeren.

Heeft iemand hier de oplossing voor?
 
Allereerst welkom bij HelpMij!
het enige wat ik tot op heden heb kunnen vinden is dit proces, maar dan naar een 1 specifieke file, niet naar een folder waar een file in gekozen kan worden om te importeren.
Is dat niet precies wat je vraagt?
Kortom de gebruiker moet nadat de knop de folder heeft geopend, een bestand kiezen wat vervolgens geimporteerd wordt in een bepaalde tabel.
Normaal gesproken gebruik je, als je een bestand wilt importeren, een FileDialog venster waarin je naar een map bladert en dan één of meer bestanden selecteert. Dat laatste (één of meer) kun je instellen. Op basis van de selectie wordt dan de import uitgevoerd. Macro's zou ik daar sowieso niet voor gebruiken, maar een knop met een VBA procedure gebruik ik regelmatig en kan ik je dus zo geven.
 
Goedemorgen Octafish,

Dank je wel :)

Wat ik bedoelde is dat ik het proces heb kunnen vinden voor het importeren van een vaste Excel file naar een vaste tabel.
Wat ik nu bedoel is importeren van een te kiezen excel file in een folder, dit is dus geen vaste excel file die je koppelt aan een tabel. Alleen de tabel is vast.

Als je mij kan voorzien van een VBA procedure, dan zou ik daar ook zeker mee geholpen zijn.
 
Die code ziet er zo uit:
Code:
Function BestandOpzoeken(Optional Pad As String) As String
Dim dlgPicker As FileDialog
Dim sType() As String, sFile As String
Dim tmp As String, sPad As String
Dim bCheck As Boolean
Dim vrtSelectedItem As Variant

    On Error GoTo Hell
''    If Pad = "" Then sPad = CurrentProject.Path Else: sPad = Pad
    If Pad = "" Then sPad = CreateObject("WScript.Shell").SpecialFolders("MyDocuments") Else: sPad = Pad
    If Right(sPad, 1) <> "\" Then sPad = sPad & "\"
    Set dlgPicker = Application.FileDialog(msoFileDialogFilePicker)
    With dlgPicker
        .Title = "Selecteer een bestand." 'De titel voor het venster
        .InitialFileName = sPad      'Waar moet het venster beginnen?
        With .Filters
            .Clear
            .Add "Alles", "*.*", 1                                  'Geen Beperkingen op bestandstype"
            .Add "Microsoft Word", "*.doc; *.docx; *.docm", 2       'Beperk de bestandstypes tot .doc
            .Add "Microsoft Excel", "*.xls; *.xlsx; *.xlsm", 3      'Beperk de bestandstypes tot .xls
            .Add "Adobe Reader", "*.pdf", 4                         'Beperk de bestandstypes tot .pdf"
            .Add "Afbeeldingen", "*.jpg; *.jpeg; *.png", 5          'Beperk de bestandstypes tot afbeeldingen
        End With
        .FilterIndex = 1
        .AllowMultiSelect = False                   'Slechts één bestand kiezen toegestaan
        .InitialView = msoFileDialogViewList        'Bepaal weergave
        If .Show = -1 Then                          'Bepaal of gebruiker op OK-knop heeft geklikt.
            sFile = .SelectedItems(1)           'String wordt gevuld met geselecteerde bestand
        Else
            MsgBox "Er is op <Annuleren> gedrukt..."
            BestandOpzoeken = "Annuleren"
            GoTo Hell
        End If
    End With
    BestandOpzoeken = sFile
    
Hell:
    Set dlgPicker = Nothing

End Function
Deze code is bedoeld voor het selecteren van één bestand. Wil je in één keer meerdere bestanden inlezen, dan moet .AllowMultiSelect = False op True worden gezet, maar dan moet ook de string waarmee je de bestanden inleest worden veranderd. Ik hoor wel of je die code ook nodig hebt.
 
Hi Octafish,

Bedankt, ik ga ermee aan de slag om te kijken of ik het hiermee wel voor elkaar krijg.
 
Hi Octafish,

Ik ben bang dat ik er niet helemaal uitkom.
De gegevens die ik wil importeren zijn .xls files die men moet selecteren in de folder: "K:\Group\ACCOUNTS\BP Shell\BP\BP Import map"
Deze moeten in een tabel genaamd "Brandstofrapport BP" geimporteerd worden

wanneer ik de code aanpas met deze gegevens krijg ik het niet voor elkaar (dus ongetwijfeld maak ik ergens een fout)
Zou je mij nog 1x te hulp willen schieten?
 
Nog wel twee keer ook :). Wat lukt er niet? De functie is generiek, dus als je die aanroept vanuit een knop moet je in ieder geval de bestandsnaam kunnen uitlezen met deze opdracht:
Code:
     Msgbox BestandOpzoeken
Dat moet dan de naam van het gekozen bestand laten zien. Uiteraard kan je die bestandsnaam (met pad) ook gebruiken in een variabele en de verder gebruikte routine om het bestand te importeren. Welke verdere code heb je nu?
 
Hi Octafish,

Deze reactie is wat aan de late kant omdat ik het liefst de dingen zelf probeer te doorgronden wanneer ik op weg geholpen ben.
Dat is wat ik gisteren en vandaag heb geprobeerd te doen.

Helaas in dit geval is het voor mij echt tijd om een cursus VBA te gaan volgen want ik kan de basis van de code al niet volgen. :(
Tot op heden heb ik in access alleen macro en wizards gebruikt, VBA is voor mij vrijwel onontdekt terrein.

Dus ik loop tegen de volgende dingen aan:
- Waar vul ik het pad naar de folder in met de te selecteren bestanden? K:\Group\ACCOUNTS\BP Shell\BP\BP Import map
- Waar geef ik aan in welke tabel het moet worden geimporteerd? Brandstofrapport BP

Om een beeld te geven wat ik tot nu toe heb gemaakt....

Bekijk bijlage Brandstof voor Dummies Testexemplaar.zip
 
Om welk formulier gaat het? Ik heb wel even zitten kijken naar het formulier <Toevoegen Brandstofpassen> waar je een knop op hebt staan (inderdaad, met een macro) die volslagen overbodig is, want als je records wilt opslaan kun je gewoon op de Tab toets drukken. Kom je gelijk in een nieuw record, en kun je de volgende pas invoeren. Persoonlijk vind ik knoppen die niks toevoegen dus overbodig :). Ik zie wel dat je de functie op het hoofdformulier hebt gezet; zou ik zelf niet doen (gebruik een aparte module) want nu kun je de procedure alleen vanaf dat formulier gebruiken. Maar ik snap de bedoeling dus nog niet helemaal.
 
Hi Octafish,

Het idee achter het formulier (HOOFDMENU) is dat een gebruiker niet zelf in access hoeft te werken, maar alle acties direct vanaf het formulier kan doen.
De brandstofpassen toevoegen is simpelweg als formulier gemaakt zodat het voor mijn collega eenvoudig is aangegeven wat er nodig is om het record toe te voegen.

de database laat hem nu met het aanklikken van de knoppen achtereenvolgens:

- tabellen leegmaken die alleen noodzakelijk zijn om externe data in excel format te importeren
- btw te summen en als 1 record toe te voegen
- idem voor kaartbijdrage
- uiteindelijk een query die geexporteerd kan worden in het juiste formaat om direct het finacieel systeem in te gaan

Eigenlijk werkt het precies zoals ik het voor ogen had, behalve dus dat ik hem nog niet met 1 knop de excel rapporten kan laten inladen in de tabellen brandstofrapporten BP en brandstofrapporten Shell (allemaal vanaf formulier Hoofdmenu)

Daarom heb ik een hele grote paarse knop op het hoofdformulier gezet, die moet bij aanklikken de map op de K schijf openen waarin hij klikt op het juiste Excel rapport en dit direct kan importeren in de tabel brandstofrapport BP (of brandstofrapport Shell)
 
Het idee achter het formulier (HOOFDMENU) is dat een gebruiker niet zelf in access hoeft te werken, maar alle acties direct vanaf het formulier kan doen.
Je bedoelt natuurlijk te zeggen dat een gebruiker niet in een tabel hoeft te werken. Hij/zij zal heus wel in Access blijven :).
Waarom al die losse knoppen? Als een proces uit meerdere, verplicht uit te voeren, stappen bestaat, dan kun je alles toch onder één knop hangen? Of mis ik iets in het verhaal?

Je kunt de functie prima uittesten met deze code:
Code:
Private Sub Command142_Click()
    MsgBox BestandOpzoeken
End Sub
Er moeten wel twee dingen worden aangepast:
1. Je moet in het VBA venster bij <Extra>, <Verwijzingen> de Microsoft Office library aanzetten
2. Je moet deze regel gebruiken: .Add "Microsoft Excel", "*.xls; *.xlsx; *.xlsm", 1 ( 3 = 1 dus)

Je kunt nog een regelaanpassing doen als je altijd vanuit hetzelfde pad wilt werken: .InitialFileName = "K:\Group\accounts\bp shell\bp\bp import map\"
 
Niet onbelangrijk detail idd ;)..... (uiteraard heeft hij wel access nodig)

Ik neem je informatie weer even ter hand om te kijken of ik het nu wel voor elkaar krijg.
Wat betreft de knop en meerdere functies eronder plaatsen, tja..... eigenlijk niet bij stil gestaan.

Gekke vraag misschien, maar als ik alle functies onder 1 knop hang..... worden deze stappen dan wel in volgorde uitgevoerd van Click bovenin tot Click onderin het VBA scherm?
Dus dat eerst de functie leeghalen wordt toegepast en daarna de tabel gevuld etc?

Wederom dank voor je reactie. :D
 
Overigens gebruik ik de engelstalige versie van Access2013, dus ik zal even moeten zoeken naar het menu Extra en Verwijzingen, maar hier kom ik vast wel uit.
 
Jawel ik ben eruit.
Maar nu wordt idd de folder geopende met de bestanden erin, echter kan ik niet deze selecteren dat ze gelijk in de juiste tabel worden geimporteerd.
zodra ik dubbeklik op een bestand dan wordt deze geopend en krijg ik een foutmelding
 
Gekke vraag misschien, maar als ik alle functies onder 1 knop hang..... worden deze stappen dan wel in volgorde uitgevoerd van Click bovenin tot Click onderin het VBA scherm?
Je schrijft één procedure (die hangt dan onder de Click event van een knop en die procedure wordt altijd van boven naar beneden uitgevoerd. Dus alle code staat in die ene procedure. Kan nooit fout gaan. Zeker niet als je alle opdrachten ook nog eens vanuit VBA aanstuurt. Jij hebt nu queries gemaakt die je opent, ik geef de voorkeur aan de SQL in de procedure te maken, en vanuit de applicatie te starten met RunSQL.
 
Goedemorgen Octafish,

Ik heb alle tips die je hebt gegeven doorgevoerd.
Oke, met het samenvoegen van knoppen heb ik de comments alleen onder elkaar gezet, maar de werking voor de gebruiker is hetzelfde. :)

Alleen het stukje importeren wil nog niet lukken.
Als ik op de knop klik dan wordt de folder met de bestanden geopend, keurig bovenin de tekst "selecteer een bestand" maar wanneer ik dubbelklik op 1 van de bestanden dan krijg ik een venster met alleen het pad van het bestand vermeld.
Mijn logica zegt dat in de code nog ontbreekt in welke tabel er geimporteerd moet worden. (maar waar doe ik dat?)

Hierbij nog even de huidige versie

Bekijk bijlage Brandstof voor Dummies Testexemplaar 2.0.rar
 
Laatst bewerkt:
Ik heb een voorbeeld gemaakt waarmee je kunt zien dat er een bestand is geselecteerd (vandaar de MsgBox), verder nog niks. Met DoCmd.TransferSpreadsheet kun je de tabel inlezen. Krijg je zoiets, met dus alles in één knop.
Code:
Private Sub Command152_Click()
    DoCmd.OpenQuery "Leegmaken rapport Bp"
    DoCmd.OpenQuery "Leegmaken rapport Shell"
    DoCmd.OpenQuery "Leegmaken BTW BP Tabel"
    DoCmd.OpenQuery "Leegmaken BTW Shell Tabel"
    DoCmd.OpenQuery "Leegmaken Kaartbijdrage BP"
    DoCmd.TransferSpreadsheet acImport, acSpreadsheetTypeExcel12, "Brandstofrapport BP", BestandOpzoeken
End Sub
 
Hi Octafish,

Jawel, ook dit doet het.
Nog 1 laatste issue (althans dat hoop ik)... wanneer ik importeer krijg ik de melding

Run-time error '2391':

Field 'F1' doesn't exist in destination table 'Brandstofrapport BP'


Nu heb ik deze import handmatig gedaan via external data-->import excel.... dit werkt goed, zonder meldingen
Verder heb ik het bestand geimporteerd in een nieuwe tabel en hiervan het design view vergeleken met het brandstofrapport BP tabel...... geen verschillen te vinden.

Grote vraag is dus waar verder nog die foutmelding vandaan kan komen, want het is naar mijn idee sowieso gek dat het wel foutloos werkt via het external data menu, maar het mis gaat via de knop.

Overigens zou het ook wel mooi zijn als ik met de aangepast code de hele rij met excel bestanden tegelijk kan inladen. (scheelt ook weer een paar klikken)
 
Laatst bewerkt:
Ik ben een stap verder.
Wanneer ik velden toevoeg aan brandstofrapport BP, F1 t/m F39.... dan wordt de data in de tabel geplakt, alleen niet zoals het moet.

Hij gooit dan alle data in de F kolommen, maar houdt geen rekening met de headings, die moeten namelijk niet in tabel komen te staan.
Maar om dit te voorkomen zal ik waarschijnlijk iets moeten wijzigen aan de VBA code.... correct?
zo ja, wat zou ik dan moeten wijzigen?
 
Jawel, gevonden waar het probleem zat.

DoCmd.TransferSpreadsheet acImport, acSpreadsheetTypeExcel12, "Brandstofrapport BP", BestandOpzoeken, TRUE
Nu werkt het feilloos.

Alleen zou het helemaal top zijn als ik ook nog eens meerdere bestanden in 1x zou kunnen importeren.
 
Status
Niet open voor verdere reacties.
Steun Ons

Nieuwste berichten

Terug
Bovenaan Onderaan