Olifantje Retecool Reaguurder

Aantal posts: 17
Aantal reacties: 1063
Nog een kneus hier. Ik heb 200 excel files (elk 1 blad met data, 4 kolommen) en die wil ik samenvoegen naar 1 file (xls, txt, csv, wat dan ook). Daarbij is het ook nodig dat op elke regel de filenaam van de oorspronkelijke xls file wordt bijgevoegd. Ik heb al even zitten zoeken, maar ik kom tot nu toe geen programma's tegen die dat voor me doen en programmeren kan ik niet.

Heeft iemand een idee hoe je dat automagisch kan doen? Ik wil/moet dit weekend met die data gaan rekenen, dus hulp wordt zeer op prijs gesteld!

Dnak & drank voor de beste en tijdige oplossing!


07-10-2011 om 05:57 | 42 reacties | 0 | Zuigt! Heerst!
 
Zelf ook zeiken
Gezeik van anderen
Olifantje Retecool Reaguurder

Aantal posts: 17
Aantal reacties: 1063
gratis drank!


/fps
07-10-2011 06:00:19 | # | 0 | Zuigt! Heerst!
eikeltje Retecool Goldmember

Aantal posts: 31
Aantal reacties: 946
dat werkt het makkelijkste in visual basic (wat zit ingebouwd in office), google

Sub Merge2MultiSheets()
Dim wbDst As Workbook
Dim wbSrc As Workbook
Dim wsSrc As Worksheet
Dim MyPath As String
Dim strFilename As String

Application.DisplayAlerts = False
Application.EnableEvents = False
Application.ScreenUpdating = False
MyPath = "C:\MyPath" ' change to suit
Set wbDst = Workbooks.Add(xlWBATWorksheet)
strFilename = Dir(MyPath & "\*.xls", vbNormal)

If Len(strFilename) = 0 Then Exit Sub

Do Until strFilename = ""

Set wbSrc = Workbooks.Open(Filename:=MyPath & "\" & strFilename)

Set wsSrc = wbSrc.Worksheets(1)

wsSrc.Copy After:=wbDst.Worksheets(wbDst.Worksheets.Count)

wbSrc.Close False

strFilename = Dir()

Loop
wbDst.Worksheets(1).Delete

Application.DisplayAlerts = True
Application.EnableEvents = True
Application.ScreenUpdating = True

End Sub
07-10-2011 06:52:38 | # | 1 | Zuigt! Heerst!
Olifantje Retecool Reaguurder

Aantal posts: 17
Aantal reacties: 1063
ik heb zo'n visual basic ding geopend in excel en de code geplakt (en het pad aangepast, verder hoef ik niks te veranderen toch?) en er lijkt wat te gebeuren. Cool!

Ik krijg nog een foutmelding, maar volgens mij snap ik waar dat aan ligt.

Nu even slapen want het is het hier 6 uur vroeger. Straks laat ik even weten hoe het verder gegaan is.
07-10-2011 07:46:26 | # | 0 | Zuigt! Heerst!
eikeltje Retecool Goldmember

Aantal posts: 31
Aantal reacties: 946
Dit kopieert alle worksheets naar één nieuwe. Op zich zou het redelijk makkelijk moeten zijn om na het kopieren een extra rij in te voegen en daar de bestandsnaam in te zetten. Na
wsSrc.Copy After:=wbDst.Worksheets(wbDst.Worksheets.Count)

zet je dan iets van
wbDst.Worksheets(wbDst.Worksheets(wbDst.Worksheets.Count)+1).Cells("A1").insertRow
Cell(A1). Value=strFilename

Dit werkt niet maar op deze manier zou het moeten werken....
07-10-2011 08:01:24 | # | 1 | Zuigt! Heerst!
El Toro, geboeid op het web Retecool Reaguurder

Aantal posts: 26
Aantal reacties: 2606
Uitprinten en een nietje erdoor
07-10-2011 09:09:32 | # | 4 | Zuigt! Heerst!
Weerman Rapsel Retecool Goldmember

Aantal posts: 21
Aantal reacties: 12998
Retecool bestaat uit kneuzen.

hoe gaat het stoppen met roken, Fantje?
07-10-2011 10:14:17 | # | 0 | Zuigt! Heerst!
Geenszins Joling Retecool Goldmember

Aantal posts: 18
Aantal reacties: 25929
O, is Fantje ook gestopt dan?
07-10-2011 11:00:48 | # | 0 | Zuigt! Heerst!
Weerman Rapsel Retecool Goldmember

Aantal posts: 21
Aantal reacties: 12998
Toen ik op dag twee zat, was zij al in week drie maar wel een keer gezondigd.
07-10-2011 11:35:48 | # | 0 | Zuigt! Heerst!
Olifantje Retecool Reaguurder

Aantal posts: 17
Aantal reacties: 1063
Godver, dat ding werkt nu, maar zet het op allemaal verschillende werkbladen en ik wil het gewoon op 1 werkblad hebben!


Op zich goed, maar wel ongelooflijke zin in een peuk, het duurt nog wel even voordat ik een niet-roker ben in plaats van een niet-rokende roker...
07-10-2011 14:54:52 | # | 0 | Zuigt! Heerst!
Tralala Retecool Reaguurder

Aantal posts: 1
Aantal reacties: 1351
07-10-2011 15:12:36 | # | 1 | Zuigt! Heerst!
Olifantje Retecool Reaguurder

Aantal posts: 17
Aantal reacties: 1063
Ja, nu heb ik een werkblad met alles samen! Nu alleen nog die fucking file namen (of nu dus werkbladnamen) erbij zien te krijgen!
07-10-2011 15:30:10 | # | 0 | Zuigt! Heerst!
Ketsman Retecool Goldmember

Aantal posts: 356
Aantal reacties: 20050
07-10-2011 15:33:52 | # | 1 | Zuigt! Heerst!
Olifantje Retecool Reaguurder

Aantal posts: 17
Aantal reacties: 1063
Dank je, Kets. Virtueel is beter dan niks.
07-10-2011 15:40:09 | # | 1 | Zuigt! Heerst!
eikeltje Retecool Goldmember

Aantal posts: 31
Aantal reacties: 946
Even een paar minuutjes gespeeld, verandert ook je sheetnaam naar de bestandsnaam.... Have fun....

Sub samen2()
Dim wbDst As Workbook
Dim wbSrc As Workbook
Dim wsSrc As Worksheet
Dim MyPath As String
Dim strFilename As String

Application.DisplayAlerts = False
Application.EnableEvents = False
Application.ScreenUpdating = False
MyPath = "C:\test" ' directory met excelbestanden
Set wbDst = Workbooks.Add(xlWBATWorksheet)
strFilename = Dir(MyPath & "\*.xls", vbNormal)

If Len(strFilename) = 0 Then Exit Sub

Do Until strFilename = ""

Set wbSrc = Workbooks.Open(Filename:=MyPath & "\" & strFilename)

' op welk blad in het bestand staat de data?
Set wsSrc = wbSrc.Worksheets("Blad3")

' toevoegen
wsSrc.Copy After:=wbDst.Worksheets(wbDst.Worksheets.Count)

' naam van worksheet wijzigen in bestandsnaam van orgineel bestand
wbDst.Worksheets(wbDst.Worksheets.Count).Name = strFilename

'selecteer eerste cel in laatste worksheet
Set wbSht = wbDst.Worksheets(wbDst.Worksheets.Count).Select
wbSht.Range("A1").Select

' voeg lege rij in
ActiveCell.EntireRow.Insert

' bestandsnaam in cel A1
wbSht.Range("A1").Value = strFilename

wbSrc.Close False

strFilename = Dir()

Loop
wbDst.Worksheets(1).Delete

Application.DisplayAlerts = True
Application.EnableEvents = True
Application.ScreenUpdating = True
End Sub
07-10-2011 17:33:34 | # | 2 | Zuigt! Heerst!
Olifantje Retecool Reaguurder

Aantal posts: 17
Aantal reacties: 1063
Cool, ik ga het uitproberen!
07-10-2011 18:42:01 | # | 0 | Zuigt! Heerst!
eikeltje Retecool Goldmember

Aantal posts: 31
Aantal reacties: 946
Nee, heb niet goed gelezen. Nu komt alles in aparte sheets met in de eerste rij de naam. Ben bijna zover...
07-10-2011 18:43:07 | # | 0 | Zuigt! Heerst!
Olifantje Retecool Reaguurder

Aantal posts: 17
Aantal reacties: 1063
OK, superbedankt voor je hulp!
07-10-2011 18:44:50 | # | 0 | Zuigt! Heerst!
Robbie! Retecool Reaguurder

Aantal posts: 103
Aantal reacties: 4639
Maar als het nu teveel data is voor één sheet, vangt de volgende het op?
Kan me in het verleden nog zoiets herinneren dat dat niet werkte.
07-10-2011 18:55:21 | # | 0 | Zuigt! Heerst!
Olifantje Retecool Reaguurder

Aantal posts: 17
Aantal reacties: 1063
Niet nodig, voor Excel 2007 had je nog een limiet van 65000 regels, vanaf 2007 is het een miljoen ofzo, ik heb hier 2010, dus dat komt goed.

Ik vermoed dat het zo'n 140000 regels zijn, dus dat komt goed. Als het niet werkt om die reden kan ik het in 4 stukken samenvoegen en dan die 4 files importeren in Stata.
07-10-2011 19:05:16 | # | 0 | Zuigt! Heerst!
sjemmol Retecool Reaguurder

Aantal posts: 7
Aantal reacties: 1359
COPY *.* NIEUWBESTAND

easy peasy, lemon squeezy
07-10-2011 19:47:45 | # | 0 | Zuigt! Heerst!
Olifantje Retecool Reaguurder

Aantal posts: 17
Aantal reacties: 1063
@sjemmol ja, dat zou werken als het text files zouden zijn en niet op elke regel ook de filename nodig had...
07-10-2011 19:50:35 | # | 0 | Zuigt! Heerst!
eikeltje Retecool Goldmember

Aantal posts: 31
Aantal reacties: 946
Ok, werkt... Alleen de laatste rij na het samenvoegen zou je even weg moeten halen... Succes dit weekend:

Sub samen3()
Dim wbDst As Workbook
Dim wbSrc As Workbook
Dim wsSrc As Worksheet
Dim MyPath As String
Dim strFilename As String
Dim wbStart As Integer
Dim wbEind As Integer


Application.DisplayAlerts = False
Application.EnableEvents = False
Application.ScreenUpdating = False
MyPath = "C:\test" ' change to suit
Set wbDst = Workbooks.Add(xlWBATWorksheet)
Set wsDst = wbDst.Worksheets.Add
wsDst.Activate
strFilename = Dir(MyPath & "\*.xls", vbNormal)

If Len(strFilename) = 0 Then Exit Sub

Do Until strFilename = ""

Set wbSrc = Workbooks.Open(Filename:=MyPath & "\" & strFilename)
Set wsSrc = wbSrc.Worksheets("Blad3")

Set rngMaster = wsDst.Range("A65536").End(xlUp)

Aa = wsDst.UsedRange.Rows.Count
Bb = wsSrc.UsedRange.Rows.Count

' get all data cells
Set rngData = wsSrc.UsedRange
' copy data across
rngData.Copy rngMaster
wsDst.Activate
Range(Cells(Aa, 1), Cells(Bb + Aa, 1)).Select
Range(Cells(Aa, 1), Cells(Bb + Aa, 1)).Insert
Range(Cells(Aa, 1), Cells(Bb + Aa, 1)).Value = strFilename



wbSrc.Close False

strFilename = Dir()

Loop
wbDst.Worksheets(1).Delete

Application.DisplayAlerts = True
Application.EnableEvents = True
Application.ScreenUpdating = True
End Sub
07-10-2011 20:51:29 | # | 0 | Zuigt! Heerst!
Robbie! Retecool Reaguurder

Aantal posts: 103
Aantal reacties: 4639
Gelukkig is Retecool niet gemaakt van Microsoftie, anders had die bovenstaande code zomaar de gehele wikikroeg in één pagina kunnen tieften. Teh horror.
07-10-2011 21:10:54 | # | 0 | Zuigt! Heerst!
Olifantje Retecool Reaguurder

Aantal posts: 17
Aantal reacties: 1063
Hm, ik krijg een foutmelding dat het subscript buiten het bereik valt

het gaat over Set wsSrc = wbSrc.Worksheets("Blad3")
07-10-2011 21:40:29 | # | 0 | Zuigt! Heerst!
eikeltje Retecool Goldmember

Aantal posts: 31
Aantal reacties: 946
Hier moet je invullen op welk werkblad binnen de excel-file de data staat. Bij mijn testbestanden op Blad3, bij jou waarschijnlijk op het eerste blad:
wbSrc.Worksheets(1)
07-10-2011 21:44:23 | # | 0 | Zuigt! Heerst!
Olifantje Retecool Reaguurder

Aantal posts: 17
Aantal reacties: 1063
Ja, dat probeerde ik gelijk, maar dat werkte niet... misschien doe ik wat fout.

Ah, ik denk dat ik het snap, het btreffende werkblad is automatisch al hetzelfde als de filenaam maar dan zonder .xls, dus elke keer anders per file...
07-10-2011 22:00:15 | # | 0 | Zuigt! Heerst!
eikeltje Retecool Goldmember

Aantal posts: 31
Aantal reacties: 946
In jouw bestanden? Dan zou je hiervoor iets van:
Set wsSrc=wbSrc.Worksheets(Left(strFilename,Len(strFilename)-4))
moeten gebruiken...
(dus het linkergedeelte van de naam, met het aantal tekens van de bestandsnaam minus 4).
07-10-2011 22:07:34 | # | 0 | Zuigt! Heerst!
Olifantje Retecool Reaguurder

Aantal posts: 17
Aantal reacties: 1063
Nu draait het, maar... ik zie nergens het resultaat... doe ik wat verkeerd?
Ik open een nieuwe excelmap, ga naar visual basic, voeg een module in, plak de code en pas het pad aan en klik op uitvoeren.
07-10-2011 23:46:48 | # | 0 | Zuigt! Heerst!
eikeltje Retecool Goldmember

Aantal posts: 31
Aantal reacties: 946
Als het goed is wordt er een nieuw naamloos excel-bestand geopend.
08-10-2011 06:14:01 | # | 0 | Zuigt! Heerst!
Draken. Retecool Goldmember

Aantal posts: 86
Aantal reacties: 6850
het gaat over Set wsSrc = wbSrc.Worksheets("Blad3")

Haha, jullie Mickeysoft praat Nederlands.

Computers praten Engels. Onthou dat nou.
08-10-2011 12:10:08 | # | 0 | Zuigt! Heerst!
Olifantje Retecool Reaguurder

Aantal posts: 17
Aantal reacties: 1063
er wordt wel een nieuwe xls map geopend, maar daar staat niks in...
10-10-2011 07:11:31 | # | 0 | Zuigt! Heerst!
eikeltje Retecool Goldmember

Aantal posts: 31
Aantal reacties: 946
Olifantje, check ff je mail... als je twee bestandjes stuurt dan zal ik even kijken wat er bij mij gebeurd....
10-10-2011 15:24:52 | # | 0 | Zuigt! Heerst!
Olifantje Retecool Reaguurder

Aantal posts: 17
Aantal reacties: 1063
Thx! zie mail!
10-10-2011 15:44:29 | # | 0 | Zuigt! Heerst!
Tralala Retecool Reaguurder

Aantal posts: 1
Aantal reacties: 1351
Eikeltje, er werkte al iets om de bestanden in excel te krijgen. Er werkte al iets om ze samen te voegen. Kun je niet iets maken dat in ieder sheet een colom wordt toegevoegd met de naam van de sheet tussen die twee stappen in. Dan is Olifantje er ook. Ikzelf ben niet echt een excell adept, maar jij hebt al laten zien er wel wat van te weten. Zodoende. Dan hoeft Olifantje maar drie stappen uit te voeren en jij er maar een te schrijven.

Succes allebei.
10-10-2011 15:44:55 | # | 0 | Zuigt! Heerst!
eikeltje Retecool Goldmember

Aantal posts: 31
Aantal reacties: 946
Bij mij doet deze het meteen zoals Olifantje wil met onderstaande code... Maar als nu de regel wbDst.Worksheets(1).Delete in verschillende versies van excel anders werkt dan wordt eerst alles samengevoegd en daarna de bestaande pagina verwijderd. Weglaten dus... En als de data in verschillende sheets komt is het lastig om statistische bewerkingen te gaan doen. Eén sheet is dan makkelijker... Hebben we hier trouwens geen code-tag?

Sub samen()
Dim wbDst As Workbook
Dim wbSrc As Workbook
Dim wsSrc As Worksheet
Dim MyPath As String
Dim strFilename As String
Dim wbStart As Integer
Dim wbEind As Integer


Application.DisplayAlerts = False
Application.EnableEvents = False
Application.ScreenUpdating = False
MyPath = "C:\test" ' change to suit
Set wbDst = Workbooks.Add(xlWBATWorksheet)
Set wsDst = wbDst.Worksheets.Add
wsDst.Activate
strFilename = Dir(MyPath & "\*.xls", vbNormal)

If Len(strFilename) = 0 Then Exit Sub

Do Until strFilename = ""

Set wbSrc = Workbooks.Open(Filename:=MyPath & "\" & strFilename)
Set wsSrc = wbSrc.Worksheets(1)

Set rngMaster = wsDst.Range("A65536").End(xlUp)

Aa = wsDst.UsedRange.Rows.Count
Bb = wsSrc.UsedRange.Rows.Count

' get all data cells
Set rngData = wsSrc.UsedRange
' copy data across
rngData.Copy rngMaster
wsDst.Activate
Range(Cells(Aa, 1), Cells(Bb + Aa, 1)).Select
Range(Cells(Aa, 1), Cells(Bb + Aa, 1)).Insert
Range(Cells(Aa, 1), Cells(Bb + Aa, 1)).Value = strFilename



wbSrc.Close False

strFilename = Dir()

Loop
wbDst.Worksheets(1).Delete

Application.DisplayAlerts = True
Application.EnableEvents = True
Application.ScreenUpdating = True
End Sub
10-10-2011 17:44:45 | # | 0 | Zuigt! Heerst!
Olifantje Retecool Reaguurder

Aantal posts: 17
Aantal reacties: 1063
Eikeltje, volgens mij werkt het nu, ik heb nu in ieder geval een bestand wat er goed uitziet met iets meer dan 100.000 regels aan data. Volgens mij klopt dat. Thanks!!! En check je mail!
10-10-2011 17:54:25 | # | 0 | Zuigt! Heerst!
Olifantje Retecool Reaguurder

Aantal posts: 17
Aantal reacties: 1063
Behalve dan dat vanaf de 65846e regel er geen data meer wordt geimporteerd, alleen maar de filenaam. Dat komt vast omdat de xls bestandjes excel versie 2 zijn. Ik run het nu snel even in twee delen.
10-10-2011 18:04:30 | # | 0 | Zuigt! Heerst!
eikeltje Retecool Goldmember

Aantal posts: 31
Aantal reacties: 946
Set rngMaster = wsDst.Range("A65536").End(xlUp)

Daar zal dit wel vanaf komen, is de maximale grootte die ik hier aankan. Ikzelf werkt met gigantisch oude software, office 2000. Don't fix what ain't broken (behalve door over te stappen naar openoffice).

Graag gedaan, leuke puzzel. En Tralala: was voor mij ook de tweede keer dat ik iets in vba knutselde. Maar op een gegeven moment lijken alle script-talen op elkaar dus kom je met goed googelen een heel eind...
10-10-2011 18:11:27 | # | 0 | Zuigt! Heerst!
Wildplasser, beroepsweigeraar Retecool Goldmember

Aantal posts: 40
Aantal reacties: 11546
Dat van die 64k limiet wist ik zelfs. Je hoeft het maar een keer meegemaakt te hebben en je ligt de rest van je leven in de wasmand UBUNTU te roepen.

Een andere instinker is trouwens de locale-settings. Die worden op misterieuze wijze ingezet bij zowel input als output, waardoor je decimale kommaas, dmy-datums met dashes en meer van dat soort rariteiten krijgt.
Maar toch knap dat jullie er uit zijn gekomen. (ik had gedacht: 200 files: 4 uur werk; even doorbijten)
10-10-2011 18:22:27 | # | 0 | Zuigt! Heerst!
Tralala Retecool Reaguurder

Aantal posts: 1
Aantal reacties: 1351
Een hoeraatje voor Eikeltje. En die locale-settings.... aaargggh!
10-10-2011 18:24:42 | # | 0 | Zuigt! Heerst!
Olifantje Retecool Reaguurder

Aantal posts: 17
Aantal reacties: 1063
Super, Eikeltje, heel erg bedankt! Nu komt er in de acknowledgments van mijn paper "Thanks to Little Acorn for helping out with data preparation" te staan.
10-10-2011 19:11:29 | # | 1 | Zuigt! Heerst!
Olifantje Retecool Reaguurder

Aantal posts: 17
Aantal reacties: 1063
En alles staat nu in Stata, waar ik vrolijk verder kan zonder Excel... *blij*
10-10-2011 19:12:31 | # | 0 | Zuigt! Heerst!

Om te kunnen reageren moet je ingelogd zijn.

Gebruikersnaam:

Wachtwoord:

U zei:
biermeester: Waar is de "Wat is dit voor klotenmaaltijd?" /seth?
fishbowl: Haha, NSFA en dan de foto's in de pots potsen. *ac...
Beerdje: GereduceerD
Beerdje: @witjoekel, in BA kan je het idd tegen zwaar geredu...
Witjoekel Vilmer: wet = weet. /freud
Ster
In het forum
Jack Random: En de pest is, ik heb een enorme bak met spaargeld....
Geenszins Joling: En dát noemen ze nou een Calimerocomplex, Sjaak! ...
Jack Random: "Je hád jezelf bijvoorbeeld kunnen organiseren met...
Geenszins Joling: OLO@Die kale Bij de Lid/Aldi soms?
Die_kale: hebben jullie nou verdomme bijna een hele pagina er...
Ster
Sterren
Retecool 8.0 is powered by Howlin' Wolf
Retecool.com is powered by Howlin' Wolf