Met een kleine vba macro moet dat toch wel lukken. Ik zou eerst dan de string inkorten tot het begin van het getal, dus 3 posties na de bij of af dan hoef je alleen nog maar de komma te vinden, en 2 posties verder weer de string af te kappen.quote:Op woensdag 10 juli 2013 21:55 schreef qu63 het volgende:
[..]
Zo ver was ik ook al, maar nu nog uitzoeken hoe lang het getal is. Dan moet ik op zoek naar de tweede komma en vanaf die positie weer 2 tekens aftrekken. Maar hoe vind ik die 2e komma?
Ha, das ook een goeie ja! Komma + 2quote:Op woensdag 10 juli 2013 22:02 schreef Basp1 het volgende:
[..]
Met een kleine vba macro moet dat toch wel lukken. Ik zou eerst dan de string inkorten tot het begin van het getal, dus 3 posties na de bij of af dan hoef je alleen nog maar de komma te vinden, en 2 posties verder weer de string af te kappen.
Ik gebruik .xls want daar had je nog niet dat gezeur met xlsmquote:Sub qu63
Dim numberofrows As Integer
If [a3] <> "" Then
Range("A1").Select
Selection.End(xlDown).Select
numberofrows = ActiveCell.Row
Else
numberofrows = 2
End If
Windows("geld.xls").Activate
Rows("2:" & numberofrows).Select
Selection.Insert Shift:=xlDown
Windows(mijnnaam).Activate
Range("a2:a" & numberofrows).Cut
Windows("bestand.xls").Activate
Range("A2").Select
ActiveSheet.Paste
Selection.TextToColumns Destination:=Range("A2"), DataType:=xlDelimited, _
TextQualifier:=xlDoubleQuote, ConsecutiveDelimiter:=False, Tab:=True, _
Semicolon:=False, Comma:=True, Space:=False, Other:=False, FieldInfo _
:=Array(Array(1, 4), Array(2, 1), Array(3, 1), Array(4, 1), Array(5, 1), Array(6, 1), _
Array(7, 1), Array(8, 1), Array(9, 1)), TrailingMinusNumbers:=True
Columns("A:A").NumberFormat = "m/d/yyyy"
Dim myrow As Range
For Each myrow In Range("F1:F" & numberofrows + 1)
If myrow.Value = "Af" And myrow.Offset(0, 1) > 0 Then
myrow.Offset(0, 1).Value = "-" & Replace(myrow.Offset(0, 1).Value, ",", ".")
End If
Next myrow
Range("K2").Select
If ActiveCell.Value <> "" Then End
While ActiveCell.Value = ""
ActiveCell.Offset(1, 0).Select
Wend
Dim i As Integer
i = ActiveCell.Row
Range("J" & i & ":M" & i + 1).Select
Selection.AutoFill Destination:=Range("J2:M" & i + 1), Type:=xlFillDefault
End Sub
1 | =ALS.FOUT(LINKS(RECHTS(Transacties_Raw!A1;(LENGTE(Transacties_Raw!A1)-VIND.SPEC("Af";Transacties_Raw!A1))-4);VIND.SPEC(",";RECHTS(Transacties_Raw!A1;(LENGTE(Transacties_Raw!A1)-VIND.SPEC("Af";Transacties_Raw!A1))-4))+2)*1;0) |
1 | =ALS.FOUT(LINKS(RECHTS(Transacties_Raw!A2;(LENGTE(Transacties_Raw!A2)-VIND.SPEC("Bij";Transacties_Raw!A2))-5);VIND.SPEC(",";RECHTS(Transacties_Raw!A2;(LENGTE(Transacties_Raw!A2)-VIND.SPEC("Bij";Transacties_Raw!A2))-5))+2)*1;0) |
Hmm, jammer dat ING het exporteerd als rekeningnummer_begindatum_einddatum.csv, zal ik t met jouw macro alsnog zelf moeten kopieëren als ik t goed zie..quote:Op woensdag 10 juli 2013 22:49 schreef snabbi het volgende:
Zo simpel mogelijk is alles in een macro
Open je Excel. Download het bestandje van de site. Vanuit dit gedownloadde bestand vervolgens F9 om de macro te runnen en de rest gaat vanzelf. (anders moet je zus nog dingen lopen kopieren enzo)
[..]
Ik gebruik .xls want daar had je nog niet dat gezeur met xlsm
De macro kopieert de logica die ik zelf had gebouwd en had toegevoegd in de laatste 3 kolommen. In deze kolommen heb ik zelf via vlookups een categorie gemaakt op basis van tegenrekening. Je zal alleen zelf iets moeten bouwen voor de nieuwe IBAN structuur.
Hmm, ik denk dat mijn bestand (zie PM) toch handiger is voor een absolute Excel-n00b..quote:Op woensdag 10 juli 2013 23:52 schreef snabbi het volgende:
de csv is het bestand dat je constant weg gooit en je excel bestand is wat je transacties over een langere periode kan bewaren.
doordat je de naam van je vaste excel bestand weet, heb je de csv actief staan en kan je switchen van je csv naar het bestand waar je de naam wel van weet.
Enige waar je op moet letten is dat het juiste tabblad is geselecteerd, via PM voorbeeld gestuurd.
quote:'dit moet het csv bestand van ING voorstellen qua naam voor Excel
Dim mijnnaam As String
mijnnaam = ActiveWorkbook.Name
'aantal regels
Dim numberofrows As Integer
If [a3] <> "" Then
Range("A1").Select
Selection.End(xlDown).Select
numberofrows = ActiveCell.Row
Else
numberofrows = 2
End If
Windows("Format financieren.xlsx").Activate
Sheets("Transacties_Raw").Select
'hier zorgen we dat je genoeg nieuwe regels krijgt om vanaf bovenaf aan te vullen
Rows("2:" & numberofrows).Select
Selection.Insert Shift:=xlDown
Windows(mijnnaam).Activate
Range("a2:a" & numberofrows).Cut
Windows("Format financieren.xlsx").Activate
Range("A2").Select
ActiveSheet.Paste
oh zeker weten jaquote:Op woensdag 10 juli 2013 18:07 schreef qu63 het volgende:
[..]
Nou ja, het is wel makkelijk als je al je data in Excel hebt dat je het dan ook leuk weer kan geven
Maar voor de meeste dingen zal wel specifieke software geschreven zijn die standaard in die branche is
1 2 3 4 5 6 7 | dim rngarray(ubound(allranges)) as variant i=1 for each rng in allranges rngarray(i)=application.worksheetfunctions.transpose(rng) 'dit geeft me een 1d array i=i+1 next rng |
1 | =lookup("ORDERCOUNT from DATATABLE where YEAR = 2012 and MONTH = 4 and PRODUCT = product123") |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | Dim keys As Variant Dim data(10) As Variant Dim TwoDData As Variant Dim dct As Dictionary Set dct = New Dictionary 'headers keys = ThisWorkbook.Sheets("data").Range("A1:J1") '2d data ineens inladen TwoDData = ThisWorkbook.Sheets("data").Range("A2:J15721") 'dictionary vullen en array met arrays vullen For i = 1 To 10 data(i) = Application.WorksheetFunction.Transpose(ActiveSheet.ListObjects("sales").ListColumns(keys(1, i)).DataBodyRange) dct.Add keys(1, i), data(i) Next |
1 2 3 4 5 6 7 8 | 'option 1 : array in array to form a fake 2d array tmp = data(lcol)(lrow) 'option 2 : 2d array tmp = TwoDData(lrow, lcol) 'option 3 : dictionary with arrays tmp = dct.Item(keys(1, lcol))(lrow) |
Voor optimalisatie kom ik altijd hier heenquote:Op donderdag 11 juli 2013 09:37 schreef Holy_Goat het volgende:
Momenteel ben ik overigens bezig met een stukje optimalisatie. Weet niet of jij / iemand anders er ook verstand van hebt, maar heb er een vraag bij:
ik kom de laatste tijd meuk tegen (werk) waarin meerdere workbooks van 200mb+ aan elkaar geknoopt moeten worden ter analysequote:Op donderdag 11 juli 2013 11:52 schreef qu63 het volgende:
[..]
Voor optimalisatie kom ik altijd hier heen
En mijn sheets hebben (gelukkig) nooit zoveel datapoints dat optimalisatie nodig is. MOA en MOU uit de OP zijn voor mij dan vaak voldoende (al heb ik ze pas 1x echt geïmplementeerd)
Auw!quote:Op donderdag 11 juli 2013 13:42 schreef Holy_Goat het volgende:
[..]
ik kom de laatste tijd meuk tegen (werk) waarin meerdere workbooks van 200mb+ aan elkaar geknoopt moeten worden ter analyse
Ongetwijfeld klopt je bewering dat optie2 beter is als optie1 wanneer je het over lower level talen hebt, maar in vba wordt data niet direct via de index opgehaald (immers, je kunt een array van 85-100 laten lopen ipv 0-15) dus er wordt altijd een extra lookup gedaan per dimensie van je array. Hierdoor zal het ophalen van data niet wezenlijk anders zijn tussen geneste en tweedimensionale arrays.quote:Op donderdag 11 juli 2013 09:37 schreef Holy_Goat het volgende:
edit: heb de vraag zelf al beantwoord. Weet niet precies waarom het antwoord ook echt zo is, maar empirisch vastgesteld dat het zo is. Lezen is alleen interessant als je geinteresseerd bent (eventueel) in snelheidsoptimalisatie van je macro's in excel
[..]
oh zeker weten ja
Momenteel ben ik overigens bezig met een stukje optimalisatie. Weet niet of jij / iemand anders er ook verstand van hebt, maar heb er een vraag bij:
Zou optie1 vergeleken optie 2 veel inefficienter zijn?
1) N 1-d arrays met lengte L, in een array gestopt
2) 1 NxL 2-d array
oproepen van willekeurige data kan voor de verschillende opties op de manieren:
1) array(1 .. N)(1 .. L)
2) array(1 .. N, 1 .. L)
Het voordeel is voor mij dat ik verschillende kolommen van verschillende sheets eenvoudig in de array kan stoppen met methode 1 met bv
[ code verwijderd ]
en dit gaat een stuk minder eenvoudig (heb iig nog geen methode gevonden zonder te handmatig te loopen) bij methode 2. Weet niet hoe ik makkelijk / efficient verschillende even lange ranges in een 2d array stoppen kan.
Alleen de vraag is nu, is het oproepen van data in methode 1 veel inefficienter dan in methode 2? De array populaten is in methode 1 dan wel sneller, maar 21098312098 keer iets opvragen is wellicht weer sneller in methode 2?
Gedachte hierachter is dat ik het idee heb dat methode 1 eerst een array ergens uit op moet halen en daarna pas het item daaruit kan vissen, terwijl methode 2 directe toegang heeft tot het juiste element...
------------------
achterliggend verhaaltje: ben bezig met een proof of concept projectje, een worksheetfunction welke zeer snel de juiste data uit een tabel kan fietsen, gebruik makend van sql-achtige statements in een query. (ja ik weet dat je ook echt via odbc een connectie naar eigen werkblad kan opzetten, maar gaat om het idee).
Een en ander werkt overigens al prima, alleen is de eerste keer de query opbouwen nog traag en dit wil ik verbeteren (omdat het kan). Na opbouwen kost een query ong 0.0001 seconde, waardoor het in een lijst van 30.000+ regels alsnog sneller is dan gangbare vlookup/sumif combinaties.
[ code verwijderd ]
Edit: een en ander empirisch vergeleken. Bij een tabelgrootte van 15000 regels en 10 kolommen, kost het opzoeken van 1.000.000 waarden gemiddeld 10% minder tijd bij het gebruik van optie 1 (een array met daarin meerdere arrays) dan bij het gebruik van een grote 2D array. Let wel, we hebben het over ordegrootte ~0.01 seconden verschil. Not much, maar tochOm eea af te sluiten ook nog een korte vergelijking met het gebruik van de kolommen met data in een dictionary. Voor 1000 (1000x minder!) willekeurige requests was gemddeld al 0.88 seconde nodig . Dit maakt het gebruik van dictionaries dus ~10.000 x langzamer. Niet doen dus.
nog even onder elkaar:
inladen
[ code verwijderd ]
Tests welke 100x worden uitgevoerd met 1.000.000 (1.000 bij dict) willekeurige row en cols.
[ code verwijderd ]
1 2 3 | [][] [,] assign 18.1757812500 14.78125000000 read 445.7382812500 400.90234375000 |
Daar wil ik wel iets meer over weten. Echter, dit kan waarschijnlijk niet zó ingesteld worden dat het ook overal werkt , zonder extra bestanden mee te moeten sturen / installs nodig heb? Vooral op locaties zonder enig admin rechten ben je snl de sjaak.quote:Op
donderdag 11 juli 2013 14:03 schreef ralfie het volgende:
[..]
Ongetwijfeld klopt je bewering dat optie2 beter is als optie1 wanneer je het over lower level talen hebt, maar in vba wordt data niet direct via de index opgehaald (immers, je kunt een array van 85-100 laten lopen ipv 0-15) dus er wordt altijd een extra lookup gedaan per dimensie van je array. Hierdoor zal het ophalen van data niet wezenlijk anders zijn tussen geneste en tweedimensionale arrays.
Heb voor de gein een testje gemaakt (100*10000 assigns, 3 miljoen random reads met wegschrijven naar het werkblad):
[ code verwijderd ]
Zoals je ziet is [][] in beide gevallen trager, maar bij het lezen zijn de verschillen minimaal. Ik heb het idee dat de verschillen meer te maken hebben met wat processen op de achtergrond doen, aangezien ik moeite moest doen deze getallen niet precies hetzelfde te krijgen. Zonder de getallen elke keer weg te schrijven naar een werkblad presteren beide arrays ongeveer hetzelfde (de ene keer is de ene wat sneller, de andere keer de andere).
Ik gok (als ik het zo gauw bekijk) dat je tijdswinst eerder zit in het direct kopieren van een range-achtig object naar een array.
Als je vaker dit soort ongein tegenkomt, waarom implementeer je niet wat code in C# of C. De overhead ben je snel overheen wanneer je dit soort dingen gaat doen.
Je zult wel op zijn minst een dlltje mee moeten zenden ja. Admin rechten maakt niets uit, maar een extra (.dll)bestandje is op zijn minst wel nodig ja. Zolang een overactieve system admin dlls niet blokkeert en de pc redelijk up to date is zouden er geen problemen moeten zijn.quote:Op donderdag 11 juli 2013 20:11 schreef Holy_Goat het volgende:
[..]
Daar wil ik wel iets meer over weten. Echter, dit kan waarschijnlijk niet zó ingesteld worden dat het ook overal werkt , zonder extra bestanden mee te moeten sturen / installs nodig heb? Vooral op locaties zonder enig admin rechten ben je snl de sjaak.
Het viel mij overigens enorm op dat het gebruik maken van dictionaries zo mega veel trager is. Is dat niet raar?
Mwa. Bij grote bedrijven werken ze kennelijk toch nog best heel erg vaak met grote sheets om reportings op te draaien....quote:Op donderdag 11 juli 2013 20:37 schreef ralfie het volgende:
[..]
Je zult wel op zijn minst een dlltje mee moeten zenden ja. Admin rechten maakt niets uit, maar een extra (.dll)bestandje is op zijn minst wel nodig ja. Zolang een overactieve system admin dlls niet blokkeert en de pc redelijk up to date is zouden er geen problemen moeten zijn.
En ik kan me voorstellen dat dictionaries met dergelijke hoeveelheden trager zijn ja. Ik geloof nooit dat de implementatie ervan in vb(a) nou zo optimaal is. Immer voor dergelijke hoeveelheden pakken mensen eerder een database-achtig iets of een andere omgeving.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | for i = 1 to 15000) for j = 1 to N key = "-" key(j) next k keys(i)=right(key,len(key)-1) next i of met for i = 1 to 15000) for j = 1 to N keyarray(j) = key(j) next k keys(i)=join(keyarray,"-") next i |
Verticaal zoeken proberen.quote:Op maandag 22 juli 2013 09:41 schreef Locutus-of-Borg het volgende:
Ik heb een sheet met gegevens van verschillende projecten (elk project staat op een rij). De projecten zijn verdeeld in verschillende categorieën (welke categorie elk project in valt, staat in een kolom). Het ziet er dus zo ongeveer uit:
naam beginjaar categorie eindjaar etc
Nu wil ik sheets per categorie toevoegen. In deze sheet moeten dus alleen de projecten komen die in één bepaalde categorie vallen. Met de if/als-functie kan ik het wel voor elkaar krijgen, maar dan komen er (veel) lege rijen in de sheets. Hoe doe ik dit dat er in elke sheet (van de categorie) alleen de projecten van die categorie komen? En het liefst dat ik dus kan kiezen welke gegevens (kolommen) uit de (moeder)sheet overgenomen worden in de (categorie)sheet.
Dat is een goede suggestie. Alleen voor zover ik het nu kan zien kun je dan maar één waarde teruggeven. Als er dus meerdere waardes aan de voorwaarde voldoen, is verticaal zoeken niet handig.quote:
De zoekwaarde kan (denk ik) ook een OF-functie zijn.quote:Op maandag 22 juli 2013 10:31 schreef Locutus-of-Borg het volgende:
[..]
Dat is een goede suggestie. Alleen voor zover ik het nu kan zien kun je dan maar één waarde teruggeven. Als er dus meerdere waardes aan de voorwaarde voldoen, is verticaal zoeken niet handig.
Ik probeer het nu met filter.
Viel mij ook al op ja.quote:Op donderdag 18 juli 2013 06:32 schreef Holy_Goat het volgende:
Je kunt wel merken dat het vakantie isal een week niets gepost hier.
Mensen die buiten komenquote:Op maandag 22 juli 2013 10:44 schreef PAAC het volgende:
[..]
Viel mij ook al op ja.
Zelf heb ik de afgelopen 3 weken amper m'n laptopje gezien door een ander project(waarvoor ik mijn laptop niet nodig heb)
Alleen jammer dat je daarna geen kont meer kunt doen met die filter waarden. Naja, dat kan wel met getpivotdata, maar heel handig is het niet.quote:Op maandag 22 juli 2013 10:44 schreef DroogDok het volgende:
[..]
De zoekwaarde kan (denk ik) ook een OF-functie zijn.
Maar filter is inderdaad een makkelijkere oplossing.
Hoe bedoel je dat precies, dat je er 'geen kont meer mee kunt doen'? Ik lees bepaalde waarde onder de voorwaarde (aangegeven in de filter) uit en geef deze in een de nieuwe sheet weer. Aan de hand van deze gefilterde database kan ik toch grafieken (per voorwaarde) gaan plotten?quote:Op maandag 22 juli 2013 11:17 schreef Holy_Goat het volgende:
[..]
Alleen jammer dat je daarna geen kont meer kunt doen met die filter waarden. Naja, dat kan wel met getpivotdata, maar heel handig is het niet.
Zelf blijf ik liever binnenquote:
ja natuurlijk kun je er mee doen wat jij zo beschrijftquote:Op maandag 22 juli 2013 12:22 schreef Locutus-of-Borg het volgende:
[..]
Hoe bedoel je dat precies, dat je er 'geen kont meer mee kunt doen'? Ik lees bepaalde waarde onder de voorwaarde (aangegeven in de filter) uit en geef deze in een de nieuwe sheet weer. Aan de hand van deze gefilterde database kan ik toch grafieken (per voorwaarde) gaan plotten?
1 2 3 4 5 6 7 8 9 | JAAR STAD WINST 2003 Ede 240 2001 Urk 90 2000 Ede 300 2001 Ede 100 2000 Urk 50 2002 Urk 100 2003 Urk 30 2002 Ede 150 |
selecteer gegevens (inclusief titels)quote:Op woensdag 24 juli 2013 22:11 schreef LogiteX het volgende:
In Excel 2007 heb ik onderstaande tabel. Ik wil hier een grafiek van maken:
- op de X as de jaren
- op de Y as de winst
- vervolgens (en dit is het moeilijke gedeelte) 2 lijnen in dezelfde grafiek: een voor Urk, de ander voor Ede.
Het lukt me alleen niet, wat ik ook probeer, met Google kon ik het ook niet direct vinden
De enige oplossing die ik wist is sorteren op Stad en vervolgens 2 keer die data aan de grafiek toevoegen. Je snapt echter dat mijn tabel in de praktijk zich daar niet makkelijk voor leent.
bij voorbaat dank
[ code verwijderd ]
Forum Opties | |
---|---|
Forumhop: | |
Hop naar: |