Check alle échte Black Friday-deals Ook zo moe van nepaanbiedingen? Wij laten alleen échte deals zien

[autohotkey] uitlezen excel bestanden en inhoud exporteren

Pagina: 1
Acties:

  • Gemineye
  • Registratie: December 2003
  • Laatst online: 06-11-2024

Gemineye

KEFalicious..

Topicstarter
Ik heb ongeveer 2500 excel bestanden, allen identiek qua opbouw. Elk van die bestanden bevat data die ik in 1 bestand wil hebben.

Het goede nieuws is dus dat elk bestand gelijk is van opzet, dus ik weet in welke cellen de data staat die ik nodig heb.

Ik heb onderstaande geprobeerd, omdat ik ongeveer dacht te begrijpen hoe de commando's werken. Helaas werkt dit niet.



FileSelectFolder, WhichFolder
Loop, %WhichFolder%\*.xlsx, , 1

{
oWorkbook := ComObjGet
CellC4Value := oWorkbook.Worksheets("Sheet1").Range("C4").Value
CellF4Value := oWorkbook.Worksheets("Sheet1").Range("F4").Value
CellI7Value := oWorkbook.Worksheets("Sheet1").Range("I7").Value
CellK12Value := oWorkbook.Worksheets("Sheet1").Range("K12").Value
ConcatenateValue := %CellC4Value% . ; . %CellF4Value% . ; . %CellI7Value% . ; . %CellK12Value%
Fileappend %concatenatevalue%`n, C:\RESULTS.txt
}




Het idee is dus dat hij alle bestanden in een op te geven directory naloopt en alle gegevens van specifieke cellen exporteert naar een tekstbestand, iedere keer de 4 waarden op een nieuwe regel.
(liefst nog exporteren naar CSV of XLS, maar dit heb ik nog niet ontdekt)

Graag opmerkingen in begrijpelijke taal, ik ben geen programmeur ;)

KEF; if it's not what you're made of, you're not what I'm looking for. You are willing but unable to give me any more..


  • Stitch!
  • Registratie: Juli 2011
  • Laatst online: 13-11 22:12
Ik zou gaan kijken naar VBA, kan van het weekend even kijken of ik wat voor je kan doen. Maar lees je even in op het gebied van VBA zou ik zeggen. Enorm krachting middel voor het geavanceerdere excel werk. Handeleidingen, tutorials en voorbeelden zijn ook overal te vinden. Nogmaals, ik zal zaterdag even kijken of ik kan helpen met jou specifieke geval. Bookmarked!

  • Fish
  • Registratie: Juli 2002
  • Niet online

Fish

How much is the fish

Ik ben ook geen ster in excel macro's maar je hebt al iets wat over de files heenwandeld

Ik zou een macro opnemen met de macro recorder, en dus exact met de hand doen wat je wil bereiken en dan die macro aanpassen dat hij dat voor elke file doet

[ Voor 5% gewijzigd door Fish op 02-04-2014 16:39 ]

Iperf


  • Gemineye
  • Registratie: December 2003
  • Laatst online: 06-11-2024

Gemineye

KEFalicious..

Topicstarter
ik hou me aanbevolen. Heb er ook aan gedacht om een macro in excel te bouwen, maar het probleem is dat er een onbekend aantal bestanden in een directory staan. Ik zou dan in VBA dus iets moeten bouwen wat alle bestanden in die directory doorloopt, en stopt als hij ze allemaal heeft gehad. Zou zo niet weten hoe dat in VBA werkt. Ik had het wel gevonden voor AHK, dus vandaar dat ik het zo heb geprobeerd.

Maar bovenstaand script resulteert in een foutmelding en ik begrijp niet zo heel erg goed waarom :/

KEF; if it's not what you're made of, you're not what I'm looking for. You are willing but unable to give me any more..


  • Stitch!
  • Registratie: Juli 2011
  • Laatst online: 13-11 22:12
In het bovenstaande script lijken trouwens placeholders te staan. Ik neem aan dat je deze normaal aanpast aan jou specifieke situatie. (Bijvoorbeeld:="C:\documents\excelbestand1.xlsx")

Ben geen expert hierin, dus kan zijn dat ik dit fout zie.

[ Voor 3% gewijzigd door Stitch! op 02-04-2014 16:49 ]


  • RobIII
  • Registratie: December 2001
  • Niet online

RobIII

Admin Devschuur®

^ Romeinse Ⅲ ja!

(overleden)
Gemineye schreef op woensdag 02 april 2014 @ 16:41:
Ik zou dan in VBA dus iets moeten bouwen wat alle bestanden in die directory doorloopt, en stopt als hij ze allemaal heeft gehad. Zou zo niet weten hoe dat in VBA werkt.
[google=vba list files in directory]
Gemineye schreef op woensdag 02 april 2014 @ 16:41:
Maar bovenstaand script resulteert in een foutmelding en ik begrijp niet zo heel erg goed waarom :/
Ah! "Een" foutmelding! Dan weten we precies wat 't is! Je fluxcapacitor is waarschijnlijk ge-thingy-ma-bob'ed.
Stitch! schreef op woensdag 02 april 2014 @ 16:38:
Ik zou gaan kijken naar VBA, kan van het weekend even kijken of ik wat voor je kan doen.
Kan iemand even...?
Los daarvan: als jij 't nou voor TS oplost leert TS er niets van, noch anderen die in de toekomst op dit topic stuiten middels google / onze search. Ga je het voor hun ook allemaal doen? ;)
Je bedoeling is goed hoor, daar niet van. Maar zo maak je 't nut van een forum redelijk loos tenzij we hier allemaal alleen nog maar gaan komen om mensen te zoeken die onze klusjes achter de schermen voor ons opknappen ;)
Give a man a fish and feed him for a day. Teach a man how to fish and feed him for a lifetime.

[ Voor 41% gewijzigd door RobIII op 02-04-2014 17:06 ]

There are only two hard problems in distributed systems: 2. Exactly-once delivery 1. Guaranteed order of messages 2. Exactly-once delivery.

Je eigen tweaker.me redirect

Over mij


  • Nextron
  • Registratie: Maart 2005
  • Laatst online: 10:40

Nextron

Ik weet dat ik niets weet

Probeer wat duidelijker aan te geven 'wat' er niet werkt. Krijg je een foutmelding of niet de verwachte output? Daarnaast is code beter leesbaar wanneer je het tussen [code][/code] -tags zet.

Wat me opvalt is de regel:
code:
1
ConcatenateValue := %CellC4Value% . ; . %CellF4Value% . ; . %CellI7Value% . ; . %CellK12Value%
Door := te gebruiken worden er variabelen verwacht en niets letterlijks, jij zet je variabelen tussen %-tekens, waardoor niet de naam, maar de inhoud als variabele-naam wordt gezien.

Daarnaast is de puntkomma het commentaarteken, wat hier ook voor problemen zorgt, probeer dit eens:
code:
1
ConcatenateValue := CellC4Value . ";" . CellF4Value . ";" . CellI7Value . ";" . CellK12Value


Daarnaast: In de loop verwijst A_LoopFileFullPath naar het betreffende bestand. Je moet dat nog wel ergens open met het ComObject lijkt me.

[ Voor 8% gewijzigd door Nextron op 02-04-2014 17:24 ]

Hoe meer ik weet,
hoe meer ik weet,
dat ik niets weet.


  • Gemineye
  • Registratie: December 2003
  • Laatst online: 06-11-2024

Gemineye

KEFalicious..

Topicstarter
Als reactie op iedereen tezamen;
Stitch! schreef op woensdag 02 april 2014 @ 16:48:
In het bovenstaande script lijken trouwens placeholders te staan. Ik neem aan dat je deze normaal aanpast aan jou specifieke situatie. (Bijvoorbeeld:="C:\documents\excelbestand1.xlsx")

Ben geen expert hierin, dus kan zijn dat ik dit fout zie.
Snap niet precies wat je bedoelt, maar het eerste stuk script roept een schermpje op waarmee ik de directory kan aangeven waarin de bedoelde bestanden staan. Dit werkt prima.
RobIII schreef op woensdag 02 april 2014 @ 17:02:


Ah! "Een" foutmelding! Dan weten we precies wat 't is! Je fluxcapacitor is waarschijnlijk ge-thingy-ma-bob'ed.
ik heb werkelijk geen idee wat je met dat laatste bedoelt, maar de foutmelding luidt "Error: ambiguous or invalid use of "." "
Nextron schreef op woensdag 02 april 2014 @ 17:12:

Wat me opvalt is de regel:
code:
1
ConcatenateValue := %CellC4Value% . ; . %CellF4Value% . ; . %CellI7Value% . ; . %CellK12Value%
Door := te gebruiken worden er variabelen verwacht en niets letterlijks, jij zet je variabelen tussen %-tekens, waardoor niet de naam, maar de inhoud als variabele-naam wordt gezien.

Daarnaast is de puntkomma het commentaarteken, wat hier ook voor problemen zorgt, probeer dit eens:
code:
1
ConcatenateValue := CellC4Value . ";" . CellF4Value . ";" . CellI7Value . ";" . CellK12Value
Ik moet het toch wel tussen % tekens zetten om de inhoud van de variabele te krijgen? Je hebt idd gelijk mbt de puntkomma!
Daarnaast: In de loop verwijst A_LoopFileFullPath naar het betreffende bestand. Je moet dat nog wel ergens open met het ComObject lijkt me.
Je hebt gelijk! Ik had een ander stuk script gevonden, maar dat is denk ik alleen bruikbaar voor als je dat document al open hebt.

ik begin het script nu met;
code:
1
2
3
4
5
6
Xl := ComObjCreate("Excel.Application")
FileSelectFolder, WhichFolder
Loop, %WhichFolder%\*.xlsx, , 1
    {
    res = 
    Xl.Workbooks.Open(A_LoopFileFullPath)


en afgesloten met

code:
1
2
3
Fileappend %res%`n, %Whichfolder%\Scriptresults.csv
    Xl.WorkBooks.Close()                                                    ;close file
    }

Ik heb heb hierin dus ook het afsluiten van het geopende bestand opgenomen.

Het opzoeken van de inhoud van de cel werkte op bovenstaande manier, maar volgens een collega kan het ook simpeler/beter:

code:
1
2
    for x,y in array := ["c4","F4","I7","K12"]
        res .= xl.Range(y).Value (x=array.MaxIndex()?"":";")

Dat is dus een stuk korter. Resultaat van deze exercitie is dat genoemde cellen worden geexporteerd, gescheiden door een puntkomma. Resultaat is dus uiteindelijk hetzelfde, maar bovenstaand stukje script begrijpen doe ik nog niet helemaal.

KEF; if it's not what you're made of, you're not what I'm looking for. You are willing but unable to give me any more..


  • Nextron
  • Registratie: Maart 2005
  • Laatst online: 10:40

Nextron

Ik weet dat ik niets weet

Gemineye schreef op woensdag 02 april 2014 @ 21:17:
ik heb werkelijk geen idee wat je met dat laatste bedoelt, maar de foutmelding luidt "Error: ambiguous or invalid use of "." "
Flux_capacitor ;)
Ik moet het toch wel tussen % tekens zetten om de inhoud van de variabele te krijgen? Je hebt idd gelijk mbt de puntkomma!
Om het makkelijk te houden: Ja en/of nee. In commands en eenvoudige assignments (=) met %. In functies en andere assignments (:= .= +=) zonder %. Dan zijn er nog situaties waar je het kan mengen.
Het opzoeken van de inhoud van de cel werkte op bovenstaande manier, maar volgens een collega kan het ook simpeler/beter:

code:
1
2
    for x,y in array := ["c4","F4","I7","K12"]
        res .= xl.Range(y).Value (x=array.MaxIndex()?"":";")

Dat is dus een stuk korter. Resultaat van deze exercitie is dat genoemde cellen worden geexporteerd, gescheiden door een puntkomma. Resultaat is dus uiteindelijk hetzelfde, maar bovenstaand stukje script begrijpen doe ik nog niet helemaal.
De for-loop voert de regel eronder zo vaak uit als dat er elementen in de array zijn. Bij elke loop krijgen x en y een nieuwe waarde: x de arrayindex [1, 2, 3, 4] en y de celwaarden ["c4","F4","I7","K12"].
res .= voegt het rechter deel toe aan de huidige waarde van res.
xl.Range(y).Value wordt vier keer uitgevoerd met elk van de vier cellen, zoals voorheen.
array.MaxIndex() is de maximale index van de array, namelijk 4.
. (x=array.MaxIndex()?"":";") is een ternary operator die je kan lezen als: if x=array.MaxIndex() then "" else ";" dat voegt dus een puntkomma toe aan res (via een geïmpliceerde concatenatiepunt) wanneer de laatste cel verwerkt wordt en anders niets.

Hoe meer ik weet,
hoe meer ik weet,
dat ik niets weet.


  • Gemineye
  • Registratie: December 2003
  • Laatst online: 06-11-2024

Gemineye

KEFalicious..

Topicstarter
Nog even een terugkoppeling; er is een wereld van programmeren voor me open gegaan. Na bovenstaande post, wat zoeken op internet, wat extra hulp van collega's, trial&error methodiek en heeel veeel geduld is het me uiteindelijk gelukt.

Resultaat is naar wens en door het scriptje even aan te passen kan ik ook verschillende cellen in verschillende kolommen krijgen. de titels van de kolommen komen er nu automatisch ook in, opgelost door een documentje "00titels.xls" in de directory op te nemen, met in de gezochte cellen de titels van de kolom (de "00" in de bestandsnaam zorgt ervoor dat dat bestand als eerste wordt gelezen en dus bovenaan in de file komt). Dat laatste is wellicht nog een beetje een beunhaas manier, maar werkt prima en geeft mij de mogelijkheid om heel eenvoudig ook andere documenten uit te lezen.

KEF; if it's not what you're made of, you're not what I'm looking for. You are willing but unable to give me any more..

Pagina: 1