In E3:quote:Op woensdag 10 juli 2013 18:21 schreef Sjechov het volgende:
[..]
Even ter verduidelijking.
Hoe moet ik nu die formule maken?
[ afbeelding ]
[ afbeelding ]
1 | =VERT.ZOEKEN(D3;'Code diensten 2013'!$A$4:$D$21;4;ONWAAR) |
1 | =ALS(D3="";"";VERT.ZOEKEN(D3;'Code diensten 2013'!$A$4:$D$21;4;ONWAAR)) |
1 | =ALS(OF(D3="";D3="V");"";VERT.ZOEKEN(D3;'Code diensten 2013'!$A$4:$D$21;4;ONWAAR)) |
1 | =ALS.FOUT(ALS(OF(D3="";D3="V");"";VERT.ZOEKEN(D3;$A$13:$D$21;4;ONWAAR));RECHTS(D3;LENGTE(D3)-VIND.ALLES("-";D3))-LINKS(D3;LENGTE(D3)-VIND.ALLES("-";D3))) |
Dan moet je die code idd toevoegen aan je Code-sheetquote:Op woensdag 10 juli 2013 18:43 schreef Sjechov het volgende:
Ik ga eens kijken.
Die maanden zijn niet meer leeg, maar ik was aan het vullen.
Code V kan ik natuurlijk ook 0 uur aan toekennen, dan is het ook direct duidelijk.
Dank voor het snelle antwoord!
Graag gedaan!quote:Op woensdag 10 juli 2013 18:51 schreef Sjechov het volgende:
Werkt als gehoopt!
Dank voor je tijd en moeite!
1 2 | 08-07-2013,"04-07-13 09:38 BETAALAUTOMAAT ","NL45 INGB XXXX XXXX XX","","BA","Af","5,99","Betaalautomaat"," BP DE GRACHTEN / SOEST 007 486402 71097104 ING BANK NV PASTRANSACTIES" 03-07-2013,"NAAM","NL45 INGB XXXX XXXX XX","YYYYYYYY","OV","Bij","250,00","Overschrijving"," AUTO" |
1 | =ALS(Transacties_Raw!A1="";"";DATUM(DEEL(Transacties_Raw!A1;7;4);DEEL(Transacties_Raw!A1;4;2);DEEL(Transacties_Raw!A1;1;2))) |
1 | =ALS.FOUT(ALS(LINKS(RECHTS(Transacties_Raw!A1;LENGTE(Transacties_Raw!A1)-VIND.SPEC("Bij";Transacties_Raw!A1)+1);1)="B";1;0);0) |
1 | =ALS.FOUT(ALS(LINKS(RECHTS(Transacties_Raw!A1;LENGTE(Transacties_Raw!A1)-VIND.SPEC("Af";Transacties_Raw!A1)+1);1)="A";1;0);0) |
De text postie van bij of af in de string bepalen en dan met wat links rechts spelen om het cijfer te vinden, ik neem aan dat bij het cijfer ook altijd nog een punt of komma gebruikt wordt voor de cent.quote:Op woensdag 10 juli 2013 19:41 schreef qu63 het volgende:
Maar nu moet ik dus op zoek naar de bedragen. Deze staan dus niet altijd op dezelfde positie en zijn ook niet altijd even lang. Ze staan wel altijd 3 posities na "Bij" of "Af". Zoeken op dubbele aanhalingstekens werkt helaas niet. Iemand anders een oplossing?
True, maar ik wil het zo simpel mogelijk houden. Dit is namelijk voor mijn zusje die er écht geen verstand van heeft..quote:Op woensdag 10 juli 2013 20:57 schreef snabbi het volgende:
Lang leven de optie voor tekst naar kolommen. Dat maakt het toch een stuk eenvoudiger.
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?quote:Op woensdag 10 juli 2013 20:14 schreef Basp1 het volgende:
[..]
De text postie van bij of af in de string bepalen en dan met wat links rechts spelen om het cijfer te vinden, ik neem aan dat bij het cijfer ook altijd nog een punt of komma gebruikt wordt voor de cent.
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 toch Om 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?
Forum Opties | |
---|---|
Forumhop: | |
Hop naar: |