• Privacywetgeving
    Het is bij Helpmij.nl niet toegestaan om persoonsgegevens in een voorbeeld te plaatsen. Alle voorbeelden die persoonsgegevens bevatten zullen zonder opgaaf van reden verwijderd worden. In de vraag zal specifiek vermeld moeten worden dat het om fictieve namen gaat.

Macro voor importeren van 1 of meerdere .CSV files

Status
Niet open voor verdere reacties.

bikerron

Gebruiker
Lid geworden
9 mei 2009
Berichten
236
Hallo,
In het onderwerp: http://www.helpmij.nl/forum/showthread.php/710547 (CSV-importeren-vba)
kwam ik een oplossing tegen die in mijn geval resulteerde in een Foutmelding.

Is deze macro universeel te leveren?
Ik had zelf een kleine aanpassing gemaakt: (Database) de naam van mijn map gegeven (Blad1)

De macro bevat de onderstaande code:
Code:
Sub snb()
  For Each it In Application.GetOpenFilename("CSV Files (*.csv), *.csv", , , , True)
    With GetObject(it)
      .Sheets(1).Cells(1).CurrentRegion.Resize(, 14).Offset(1).Copy ThisWorkbook.Sheets("Database").Cells(Rows.Count, 1).End(xlUp).Offset(1)
      .Close False
    End With
  Next
End Sub

Bij voorbaat dank.

Ron
 
Welke foutmelding krijg je?
Want die sub van snb doet het prima met Blad1 in plaats van Database.
 
of

Code:
Sub snb()
  For Each it In Application.GetOpenFilename("CSV Files (*.csv), *.csv", , , , True)
    With GetObject(it)
      with .Sheets(1).Cells(1).CurrentRegion.Resize(, 14).Offset(1)
        ThisWorkbook.Sheets("Database").Cells(Rows.Count, 1).End(xlUp).Offset(1).resize(.rows.count,.columns.count)=.value
      end with
      .Close False
    End With
  Next
End Sub
 
Hallo edmoor,
Bedankt voor je reactie.
Als ik je laatste code oppak en uitvoer in een nieuw geopende Excel sheet dan "beweegt" er wel wat, nadat ik een .csv bestand geselecteerd heb maar de boodschap:
Het subscript val buiten het bereik
komt te voorschijn.

Ron
 
je hebt wel ThisWorkbook.Sheets("Database")
Gewijzigd in ThisWorkbook.Sheets("Blad1")?
Laat eens zien wat er in je csv bestand staat.
 
Edmoor,
Ik heb inderdaad Database gewijzigd in Blad1.
Ik heb de macro opgestart vanuit "Blad2" en er bewwgt het een en ander maar resultaat is dus foutmelding.
Hieronder de data die ik vanuit .csv wil verwerken.

Code:
Version CSV1|Tool SE|Linebreaks CR/LF|Delimiter semicolon|Decimalpoint comma|Precision 3		
	
        SN: 2120005212	SN: 2120005212
	SB 2000HF-30	SB 2000HF-30
	2120005212	2120005212
	Totale opbrengst	Vermogen
	Counter	Analog
dd-MM-yyyy HH:mm:ss	kWh	kW
1-5-2012 0:00	528,049	0
1-5-2012 0:05	528,049	0
1-5-2012 0:10	528,049	0
1-5-2012 0:15	528,049	0
1-5-2012 0:20	528,049	0
1-5-2012 0:25	528,049	0
1-5-2012 0:30	528,049	0
1-5-2012 0:35	528,049	0
1-5-2012 0:40	528,049	0
1-5-2012 0:45	528,049	0
1-5-2012 0:50	528,049	0
1-5-2012 0:55	528,049	0

De eerste 7 rijen mogen wil ik skippen, totaal zijn het 296 rijen en slechts 4 kolommen.
 
Ik zie nergens een ; (semicolon) als veldscheiding terwijl dat wel in de kop staat.
Verder zal hij inderdaad fout gaan op de eerste 7 regels.
 
Laatst bewerkt:
Oeps,
Dat was dus een verkeerde "plak actie". Ik haalde de records uit Excel.
Hieronder de ruwe data, vanuit Kladblok.
Code:
sep=;
Version CSV1|Tool SE|Linebreaks CR/LF|Delimiter semicolon|Decimalpoint comma|Precision 3

;SN: 2120005212;SN: 2120005212
;SB 2000HF-30;SB 2000HF-30
;2120005212;2120005212
;Totale opbrengst;Vermogen
;Counter;Analog
dd-MM-yyyy HH:mm:ss;kWh;kW
01-05-2012 00:00:00;528,049;0,000
01-05-2012 00:05:00;528,049;0,000
01-05-2012 00:10:00;528,049;0,000
01-05-2012 00:15:00;528,049;0,000
01-05-2012 00:20:00;528,049;0,000
01-05-2012 00:25:00;528,049;0,000
01-05-2012 00:30:00;528,049;0,000
01-05-2012 00:35:00;528,049;0,000
01-05-2012 00:40:00;528,049;0,000
01-05-2012 00:45:00;528,049;0,000
 
Dan daaruit de eerste 8 regels verwijderen en dan pas importeren.
 
Wel, ik dacht dat je met deze macro dan er voor kon zorgen dat je dat kon instellen, tenminste dat is mijn bedoeling.
Ik heb 30 .csv files die ik tot 1 file wil samenvoegen, alle files beginnen in feite bij de 8ste rij.
Als ik eerst van deze 30 files die 7 rijen er moet afhalen dan kan ik ze net zo goed met de "hand" verder verwerken.:(

Als ik nu even test dat ben ik wel de 8ste rij ook kwijt, althans dat wordt een blanco rij en daarnaast is het veld "datum" samengevoegd met het veld tijd. Deze zou ik liever alsl 2 aparte kolommen afgehandeld zien.
Kortom: Is zoiets te realiseren.:)

Code:
1-5-2012	528,049	0
1-5-2012 0:05	528,049	0
1-5-2012 0:10	528,049	0
1-5-2012 0:15	528,049	0
1-5-2012 0:20	528,049	0
1-5-2012 0:25	528,049	0
1-5-2012 0:30	528,049	0
1-5-2012 0:35	528,049	0
1-5-2012 0:40	528,049	0
1-5-2012 0:45	528,049	0
1-5-2012 0:50	528,049	0
1-5-2012 0:55	528,049	0
1-5-2012 1:00	528,049	0
1-5-2012 1:05	528,049	0
1-5-2012 1:10	528,049	0
1-5-2012 1:15	528,049	0
1-5-2012 1:20	528,049	0
1-5-2012 1:25	528,049	0
1-5-2012 1:30	528,049	0
1-5-2012 1:35	528,049	0
1-5-2012 1:40	528,049	0
1-5-2012 1:45	528,049	0
1-5-2012 1:50	528,049	0
1-5-2012 1:55	528,049	0
1-5-2012 2:00	528,049	0
1-5-2012 2:05	528,049	0
1-5-2012 2:10	528,049	0
1-5-2012 2:15	528,049	0
Ik heb dus gebruik gemaakt van onderstaande code:
Code:
Sub snb()
  For Each it In Application.GetOpenFilename("CSV Files (*.csv), *.csv", , , , True)
    With GetObject(it)
      With .Sheets(1).Cells(1).CurrentRegion.Resize(, 14).Offset(1)
        ThisWorkbook.Sheets("[B][COLOR="#FF0000"]Blad1[/COLOR][/B]").Cells(Rows.Count, 1).End(xlUp).Offset(1).Resize(.Rows.Count, .Columns.Count) = .Value
      End With
      .Close False
    End With
  Next
End Sub
 
De CSV import is afhankelijk van een standaard layout. Die eerste regels voldoen daar niet aan.
Als je dat wilt zou de functie herschreven moeten worden om dat aan te kunnen.
Bij je initiële vraag is dit niet aan bod gekomen.
 
Edmoor,
Daar heb je helemaal gelijk in. :eek:
Ik was in de veronderstelling dat wat ik in de eerdere post gevonden oplossing ook voor mij zou kunnen voldoen.
Omdat de macro niet direct werkte ging ik er dus van uit dat er een "kleine" aanpassing nodig was om het werkend te krijgen.

Kortom.....
Is het mogelijk dat ik 1 of meerdere .CSV bestanden kan laten verwerken dat zou moeten voldoen aan de volgende criteria:
1ste 7 regels overslaan
regel acht is de header
Regel negen tot end of data bestaat uit de volgende velden:
Kolom1:Datum
Kolom2:Tijd
Kolom3:Getal, met 3 decimalen
Kolom4:Getal, met 3 decimalen​

De kolommen 1 en 2 zijn onderling gescheiden door een spatie
De kolommen 2,3,en 4 zijn onderling gescheiden door een ; (puntkomma)

Als dit zou kunnen dan zou ik daar heel blij mee zijn.

Ron
 
Code:
Sub snb()
  For Each it In Application.GetOpenFilename("CSV Files (*.csv), *.csv", , , , True)
    With GetObject(it)
      With .Sheets(1).Cells(1).CurrentRegion.Offset(7).Resize(, 4)
        ThisWorkbook.Sheets("Blad1").Cells(Rows.Count, 1).End(xlUp).Offset(1).Resize(.Rows.Count, .Columns.Count) = .Value
      End With
      .Close False
    End With
  Next
End Sub
 
Edmoor,
das vlot!.
Maar... er wordt nu alleen de kopregel, per file, ingelezen de rest van de data wordt niet geïmporteerd.
Hieronder het resultaat van het inlezen van 4 files
Dit zijn 3 kolommen, dd-MM-yyyy HH:MM:SS is 1 kolom, deze zou ik graag gesplitst zien.

dd-MM-yyyy HH:mm:ss kWh kW
dd-MM-yyyy HH:mm:ss kWh kW
dd-MM-yyyy HH:mm:ss kWh kW
dd-MM-yyyy HH:mm:ss kWh kW
dd-MM-yyyy HH:mm:ss kWh kW
 
Ik deed niks! Dat was snb die zo snel was ;)

Je zegt 7 regels maar volgens mij zijn het er 8.
Wijzig de 7 van snb dus in 8.

Over je opmerking m.b.t. de datum/tijd velden, die zijn niet met een ; gescheiden dus dan worden ze ook niet in aparte kolommen geplaatst.
 
Laatst bewerkt:
Resultaat is nu dat slechts rij 8, en de rest niet, wordt teruggeven in Blad1.
Dus van elke ingelezen .csv file komt maar 1 rij terug in plaats van de verwachte plus minus 290 rijen per file

Als ik het goed begrijp is het dus niet mogelijk de kolommen 1 en 2 gescheiden te leveren?

Ron
 
Kijk eens in de hulpfunktie van de vbeditor wat 'currentregion' betekent.
De meeste vragen krijg je beantwoord in de hulpmiddelen op je iegen computer.
Hoe beter je vragen (door een voorbeeldbestand te plaatsen), hoe beter de antwoorden.

Je kunt laten blijken dat je de code snapt door 2 minimale aanpassingen te maken, waardoor exact het door jou gewenste resultaat bereikt wordt. 98% van de voorzet is gedaan, jij hoeft nog maar 2% 'in te koppen'.
 
Laatst bewerkt:
Snb,
Ik ga er mee aan de slag. Ik hoop dt ik de puzzel kan oplossen, maar ik weet: help is a click away :).
Ron
 
Nou daar ben ik dan weer.
Ik ben aan het puzzelen geslagen en heb nu 2 macro's die "iets" doen maar hoe deze samen te voegen is mij even onduidelijk.
Ik zal mijn "wens" nog eens beschrijven en daaronder de code van de macto's tonenen.
Wat wil ik:
Ik heb per maand 30 .scv files die ik in één keer wil laten samenvoegen tot 1 nieuwe Excel sheet.
De lay-out van de files zijn:
Code:
sep=;
Version CSV1|Tool SE|Linebreaks CR/LF|Delimiter semicolon|Decimalpoint comma|Precision 3

;SN: 2120005212;SN: 2120005212
;SB 2000HF-30;SB 2000HF-30
;2120005212;2120005212
;Totale opbrengst;Vermogen
;Counter;Analog
dd-MM-yyyy HH:mm:ss;kWh;kW
01-05-2012 00:00:00;528,049;0,000
01-05-2012 00:05:00;528,049;0,000
01-05-2012 00:10:00;528,049;0,000
01-05-2012 00:15:00;528,049;0,000
01-05-2012 00:20:00;528,049;0,000
01-05-2012 00:25:00;528,049;0,000
01-05-2012 00:30:00;528,049;0,000
01-05-2012 00:35:00;528,049;0,000
01-05-2012 00:40:00;528,049;0,000
01-05-2012 00:45:00;528,049;0,000

Er zijn 8 rijen waarvan ik alleen de laatste "koprij" (dd-MM-yyyy HH:mm:ss Kwh KW) wil hebben en er zijn 4 kolommen.
Deze 4 kolommen zijn als volgt van elkaar gescheiden:
Kolom 1 2 (dd-MM-yyyy HH:mm:ss) gescheiden door een spatie.
Kolom 2, 3 en 4 (HH:mm:ss;kWh;kW) zijn gescheiden door een puntkomma ;

Van Edmoor heb ik een macro ontvangen die keurig alle .CSV-files inleest die in een opgegeven directory aanwezig zijn maar er wordt helaas maar 1 rij per file terug gegeven.
Deze macro ziet er als volg uit:
Code:
Sub snb()
  For Each it In Application.GetOpenFilename("CSV Files (*.csv), *.csv", , , , True)
    With GetObject(it)
      With .Sheets(1).Cells(1).CurrentRegion.Offset(7).Resize(, 4)
        ThisWorkbook.Sheets("Blad1").Cells(Rows.Count, 1).End(xlUp).Offset(1).Resize(.Rows.Count, .Columns.Count) = .Value
      End With
      .Close False
    End With
  Next
End Sub

Nu heb ik zelf, nou ja zelf, via "Macro opnemen" weten voor elkaar te krijgen dat er 1 files ingelezen wordt
én dat de kolommen goed "gespiltst worden".
Wat hier bij het probleem is:
1. Er wordt 1 file ingelezen.
2. Als ik een tweede file wil inlezen dan wordt deze file "links naast" de andere ingelezen file geplaatst op het zelfde werkblad.
Zie hieronder:
dd-MM-yyyy HH:mm:ss;kWh;kW dd-MM-yyyy HH:mm:ss;kWh;kW
2-5-2012 00:00:00;532 245;0 0 1-5-2012 00:00:00;528 049;0 0
2-5-2012 00:05:00;532 245;0 0 1-5-2012 00:05:00;528 049;0 0
2-5-2012 00:10:00;532 245;0 0 1-5-2012 00:10:00;528 049;0 0
2-5-2012 00:15:00;532 245;0 0 1-5-2012 00:15:00;528 049;0 0
2-5-2012 00:20:00;532 245;0 0 1-5-2012 00:20:00;528 049;0 0
2-5-2012 00:25:00;532 245;0 0 1-5-2012 00:25:00;528 049;0 0
2-5-2012 00:30:00;532 245;0 0 1-5-2012 00:30:00;528 049;0 0
2-5-2012 00:35:00;532 245;0 0 1-5-2012 00:35:00;528 049;0 0
2-5-2012 00:40:00;532 245;0 0 1-5-2012 00:40:00;528 049;0 0
2-5-2012 00:45:00;532 245;0 0 1-5-2012 00:45:00;528 049;0 0
2-5-2012 00:50:00;532 245;0 0 1-5-2012 00:50:00;528 049;0 0
2-5-2012 00:55:00;532 245;0 0 1-5-2012 00:55:00;528 049;0 0
2-5-2012 01:00:00;532 245;0 0 1-5-2012 01:00:00;528 049;0 0
2-5-2012 01:05:00;532 245;0 0 1-5-2012 01:05:00;528 049;0 0
2-5-2012 01:10:00;532 245;0 0 1-5-2012 01:10:00;528 049;0 0

Ik snap wel dat dat kan, ik heb natuurlijk een vaste waarde in de macro staan waar de ingelezen file geplaatst moet worden.
Als deze waarde nu "aangepast" kan worden ná het inlezen van een file dan denk ik dat ik er ben, ik zou alleen niet weten hoe dat werkt. Iets met een "variabele" en een for next etc.

Dus als de 2 genoemde macro's samengenomen kunnen worden dan dacht ik dat ik er was, maar hoe doe je dat?
Hieronder de door Macro Opnemen gegenereerde code
Code:
With ActiveSheet.QueryTables.Add(Connection:= _
        "TEXT;D:\Mijn Documenten\Sma-Sunny Explorer\Samengevoegd\201205\De Brink 6-20120502.csv" _
        , Destination:=Range("$A$1"))
        .Name = "De Brink 6-20120501"
        .FieldNames = True
        .RowNumbers = False
        .FillAdjacentFormulas = False
        .PreserveFormatting = True
        .RefreshOnFileOpen = False
        .RefreshStyle = xlInsertDeleteCells
        .SavePassword = False
        .SaveData = True
        .AdjustColumnWidth = True
        .RefreshPeriod = 0
        .TextFilePromptOnRefresh = False
        .TextFilePlatform = 850
        .TextFileStartRow = 9
        .TextFileParseType = xlDelimited
        .TextFileTextQualifier = xlTextQualifierDoubleQuote
        .TextFileConsecutiveDelimiter = True
        .TextFileTabDelimiter = True
        .TextFileSemicolonDelimiter = False
        .TextFileCommaDelimiter = True
        .TextFileSpaceDelimiter = True
        .TextFileColumnDataTypes = Array(1, 1, 1, 1, 1, 1, 1)
        .TextFileTrailingMinusNumbers = True
        .Refresh BackgroundQuery:=False
        ActiveCell.SpecialCells(xlLastCell).Select
    Range("A290").Select
    End With
End Sub
 
Nou, ik heb een oplossing.

Eigenlijk is deze heel simpel en ligt ook wel voor de hand. Maar ik had gedacht dat een van "goeroes" nog met iets meer praktisch zou kommen, helaas.

Mijn oplossing:
- Met een .cmd file er voor zorgen dat ALLE .csv files in 1 nieuwe .csv file worden weggeschreven
- Vervolgens deze nieuw gecreëerde .CSV inlezen met Excel --> Gegevens --> Van Text
- pas de juiste conversie zaken toe en gaan met die banaan

Wat na deze actie dan overblijft is om ALLE kopregels - 1 uit de file te verwijderen en je hebt het gewenste resultaat.
(Elke toegevoegde CSV file heeft een eigen kopregel en je hebt er maar 1 nodig).

Succes voor de eventuele volgende oplossingzoekers, dit onderwerp blijkt al heel vaak terug gekomen te zijn.

Ron
 
Status
Niet open voor verdere reacties.
Terug
Bovenaan Onderaan