Toon posts:

[Access] Samenvoegen meerdere Excel Files

Pagina: 1
Acties:
  • 380 views sinds 30-01-2008
  • Reageer

Verwijderd

Topicstarter
Ik begin met te vermelden dat ik uitgebreid de search heb gebruikt (Zowel GoT als Google). Ook heb ik de Help functie van Microsoft gebruikt. Ik kom er helaas niet uit.

Wat ik graag zou willen:

Ik wil meerdere excel files uitlezen en de inhoud daarvan in één database zetten. De Excel files hebben allemaal dezelfde layout (Dezelfde informatie staat dus altijd op dezelfde plek).

Hoe ik denk dat het moet:

Ik heb met het zoeken op GoT en Google al uitgevonden dat ik met VBA in Access aan de slag moet. Ik heb aardig wat programmeer ervaring in Delphi, maar VBA heb ik helaas nooit mee gewerkt.

Ik heb nu als script (Ja, dit is gecopy\paste uit dit topic) het volgende:

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
Sub Main()

Dim MyFile As String
Dim MyDir As String
Dim Sheets As Variant

MyDir = "C:\Temp2\"
MyFile = Dir(MyDir & "*.xls")

Do While MyFile <> ""
MyFile = Dir()
GoSub Lees_Excel
Loop
Exit Sub

Lees_Excel:
Workbooks.Open (MyDir & MyFile)
SheetName = ActiveSheet.Name
BeginRij = 1
EindRij = Sheets(SheetName).Range(a65535).End9xlUp.Row
Kolom = 2 'Ik ga er vanuit dat het antwoord in kolom B staat
For Rij = BeginRij To EindRij
   Antwoord = Sheets(SheetName).Cells(Rij, Kolom)
   GoSub Schrijf_Access
Next Rij
Return

Schrijf_Access:
CurrentDb.Execute ("INSERT INTO Test (een, twee, drie) VALUES (Rij, Antwoord, MyFile);")

Return

End Sub


Het eerste deel van het programma werkt (Main) Dit heb ik getest dmv een MsgBox met een counter:

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
Sub Main()

Dim MyFile As String
Dim MyDir As String
Dim Teller As Integer

teller = 1
MyDir = "C:\Temp2\"
MyFile = Dir(MyDir & "*.xls")

Do While MyFile <> ""
MsgBox (Teller)
Teller = Teller + 1
MyFile = Dir()
End Sub


Hier kreeg ik mooi: "1" en "2" uit, dus dat werkte :)

De tweede Sub werkt echter niet, en ik snap helaas ook niet waarom. Ik krijg de volgende error bij het volgende stukje code:

Run-time Error 424:
Object Required

Als ik dan op Debug klik zie ik dat het fout gaat bij het volgende stukje code:
Workbooks.Open (MyDir & MyFile)


Wat ik vraag
Mijn vraag aan jullie is of iemand weet hoe ik dit script werkend kan krijgen, of dat dat probleem misschien op een andere manier op te lossen is.

  • nescafe
  • Registratie: Januari 2001
  • Laatst online: 12:32
Als je nu in de onderbrekingen MyDir & MyFile selecteert en op Shift-F9 drukt.. Wat krijg je dan te zien?

[ Voor 13% gewijzigd door nescafe op 04-05-2004 15:45 ]

* Barca zweert ook bij fixedsys... althans bij mIRC de rest is comic sans


Verwijderd

Topicstarter
nescafe schreef op 04 mei 2004 @ 15:44:
Als je nu in de onderbrekingen MyDir & MyFile selecteert en op Shift-F9 drukt.. Wat krijg je dan te zien?
MyDir --> Value = "C:\Temp2\"
MyFile --> Value = "Test2.xls"

  • Lister
  • Registratie: September 2001
  • Laatst online: 15-02-2022
Volgens mij moet je of de haakjes weghalen of er Call voorzetten, want VB vindt een functie aanroep met alleen maar haakjes meestal niet leuk.
code:
1
Call Workbooks.Open (MyDir & MyFile)

Verwijderd

Topicstarter
Lister schreef op 04 mei 2004 @ 22:02:
Volgens mij moet je of de haakjes weghalen of er Call voorzetten, want VB vindt een functie aanroep met alleen maar haakjes meestal niet leuk.
code:
1
Call Workbooks.Open (MyDir & MyFile)
Hmmm ik snap niet waarom het niet werkt :s

code:
1
DoCmd.OpenForm (MyDir & MyFile)


Dit werkt ook al niet.

als ik dit doe:

code:
1
2
3
Lees_Excel:
MsgBox (MyDir & MyFile)
Call Workbooks.Open(MyDir & MyFile)


Dan krijg ik een msgbox met daarin:
C:\Test\Test2.xls

Dus dat klopt.. Ik moet dus alleen de code om het form te openen kloppend maken.

[ Voor 25% gewijzigd door Verwijderd op 05-05-2004 08:59 ]


Verwijderd

Je moet eerst een Excel-object instantieren. Daarna kan je toegang krijgen tot de Excel-objecten met bijbehorende methoden en attributen. (OLE ?!). Zoek maar in de help of de MSDN-library voor voorbeelden.

Verwijderd

Topicstarter
Verwijderd schreef op 05 mei 2004 @ 11:00:
Je moet eerst een Excel-object instantieren. Daarna kan je toegang krijgen tot de Excel-objecten met bijbehorende methoden en attributen. (OLE ?!). Zoek maar in de help of de MSDN-library voor voorbeelden.
Hmmm sorry.. ik begrijp niet wat je met instantieren bedoeld. Wat is daar het engels woord voor zodat ik ook daadwerkelijk kan zoeken op de MSDN library?

  • Boss
  • Registratie: September 1999
  • Laatst online: 07:46

Boss

+1 Overgewaardeerd

Eerst Excel aanvinken bij de verwijzingen (menu extra -> verwijzingen of tools -> references).

Dan:
Dim xlsApp as Excel.Application
Dim xlsDoc as Excel.Document (of workbook, weet ik ff niet zeker)

Daarna kan je xlsApp een nieuwe instantie van Excel laten zijn met xlsApp = CreateObject(Excel.Application).

Maar....

Waarom niet gewoon met Docmd.Transferspreadsheet de excelsheets inlezen in de database, en daarna met een append query aan 1 tabel toevoegen?

Of zie ik niet goed wat je eigenlijk wilt doen?

The process of preparing programs for a digital computer is especially attractive, not only because it can be economically and scientifically rewarding, but also because it is an aesthetic experience much like composing poetry or music.


Verwijderd

Topicstarter
Boss schreef op 05 mei 2004 @ 12:04:
Eerst Excel aanvinken bij de verwijzingen (menu extra -> verwijzingen of tools -> references).

Dan:
Dim xlsApp as Excel.Application
Dim xlsDoc as Excel.Document (of workbook, weet ik ff niet zeker)

Daarna kan je xlsApp een nieuwe instantie van Excel laten zijn met xlsApp = CreateObject(Excel.Application).

Maar....

Waarom niet gewoon met Docmd.Transferspreadsheet de excelsheets inlezen in de database, en daarna met een append query aan 1 tabel toevoegen?

Of zie ik niet goed wat je eigenlijk wilt doen?
Wat ik wil is de inhoud van meerdere Excel files in een access database stoppen.

Dus ik heb een mapje: C:\temp
met daarin: Test1.xls , Test2.xls, Test3.xls

Ik probeer dus een script te maken dat alle xls files uit een map leest en de inhoud naar een database schrijft.

[edit]
Eerst Excel aanvinken bij de verwijzingen (menu extra -> verwijzingen of tools -> references).

Nu werkt Workbooks.open tenminste _/-\o_ _/-\o_

[ Voor 9% gewijzigd door Verwijderd op 05-05-2004 12:58 ]


  • Boss
  • Registratie: September 1999
  • Laatst online: 07:46

Boss

+1 Overgewaardeerd

Dan heb je in princiepe de hele Excel library niet nodig, en kan je het doen op de manier die ik hierboven beschreef, met Docmd.Transferspreadsheet

Lijkt mij een makkelijkere oplossing in ieder geval.

The process of preparing programs for a digital computer is especially attractive, not only because it can be economically and scientifically rewarding, but also because it is an aesthetic experience much like composing poetry or music.


Verwijderd

Topicstarter
Boss schreef op 05 mei 2004 @ 13:13:
Dan heb je in princiepe de hele Excel library niet nodig, en kan je het doen op de manier die ik hierboven beschreef, met Docmd.Transferspreadsheet

Lijkt mij een makkelijkere oplossing in ieder geval.
Ok dankjewel, ik ga er even mee klooien.

Eerst even de help lezen nu :P

ok de nieuwe code:

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
Sub Test()

Dim MyFile As String
Dim MyDir As String

MyDir = "C:\Temp2\"
MyFile = Dir(MyDir & "*.xls")

Do While MyFile <> ""
     GoSub Lees_Excel
MyFile = Dir()
Loop
Exit Sub

Lees_Excel:
Workbooks.Open (MyDir & MyFile)
Sheetname = ActiveSheet.Name
DoCmd.TransferSpreadsheet acImport, , "test", MyDir & MyFile

Return
End Sub


Dit werkt!

Nu kan ik dus alle data in een database zetten, alleen begin ik me af te vragen of dat wel is wat ik wil. Ik heb meerdere bestanden die er kwa layout hetzelfde uitzien, maar waar andere informatie in staat. (Het is van meerdere personen).
De naam van de persoon staat ook in het bestand.

Strax moet ik een formulier maken waar ik per gebruiker de gegevens kan laten zien. Ik denk dat ik dan de tabel anders moet inrichten, omdat ik nu geen queries kan runnen omdat de data in één tabel komt te staan. Of denk ik nu verkeerd?

[ Voor 96% gewijzigd door Verwijderd op 05-05-2004 13:58 ]


Verwijderd

Topicstarter
Het probleem met deze methode is eigenlijk dat de gehele inhoud van de excel file in één datase komt te staan, terwijl bijvoorbeeld de 1e rij in de excel file de kolom-naam is. Deze zou dan ook in de database komen te staan.

Ik zal even uitleggen wat ik precies wil met dit script.

Situatie:
Ik heb meerdere excel files met gegevens erin. Ergens in deze gegevens staat bijvoorbeeld ook de naam van de medewerker van wie de excel file toebehoord.

voorbeeld:

Bestand 1:
code:
1
2
3
4
5
6
7
A                 B          C           D
                                      Naam: Peter
Aantal uren:    Lokatie:   Tijdstip:
2               3.22       12:00
3               3.22       12:30
2               3.25       10:15
4               3.45       14:40


Bestand 2:
code:
1
2
3
4
5
6
7
A                 B          C           D
                                      Naam: Jan
Aantal uren:    Lokatie:   Tijdstip:
3               3.12       11:00
2               3.42       15:30
4               3.18       9:15
3               3.45       16:00


Nu wil ik bijvoorbeeld de naam wel hebben (Peter, Jan) en de andere data wil ik gekoppeld aan de naam. Ik wil strax een query doen zodat ik alle data van Jan dus in een formulier kan zetten. (dus eigenlijk zoals het was in het oorspronkelijke excel bestand).

Kort en bondig: Ik wil de inhoud van meerdere excel files snel en per gebruiker kunnen sorteren.

Misschien dat dit ook wel op een hele andere manier kan, ik tast op het moment echt in het duister :(

  • Boss
  • Registratie: September 1999
  • Laatst online: 07:46

Boss

+1 Overgewaardeerd

Ah, op die manier.

Dat wordt een rottig werkje. Dit is niet meer met DoCmd.Transferspreadsheet te doen.
Je zal via VBA de cellen moeten openen, en ze dan een voor een kopieren naar een Access tabel.
Niet moeilijk, als je het eenmaal doorhebt.

Dus: per sheet eerst uitlezen op welke naam de velden moeten komen, dan de sheet cel voor cel, regel voor regel inlezen en in de tabel zetten. Bij iedere regel vermelden welke naam erbij hoort, en dan kan je later op basis van die ene tabel een formulier maken.

The process of preparing programs for a digital computer is especially attractive, not only because it can be economically and scientifically rewarding, but also because it is an aesthetic experience much like composing poetry or music.

Pagina: 1