abonnement Unibet Coolblue
  woensdag 10 juli 2013 @ 18:35:46 #51
62215 qu63
..de tijd drinkt..
pi_128805760
quote:
0s.gif Op woensdag 10 juli 2013 18:21 schreef Sjechov het volgende:

[..]

Even ter verduidelijking.
Hoe moet ik nu die formule maken?

[ afbeelding ]

[ afbeelding ]
In E3:
1=VERT.ZOEKEN(D3;'Code diensten 2013'!$A$4:$D$21;4;ONWAAR)
Deze formule kan je nu doortrekken/kopiëren naar de andere cellen.
Hij gaat alleen de fout in in augustus en september omdat daar de code leeg is. Om dat op te vangen kan je dit doen:

1=ALS(D3="";"";VERT.ZOEKEN(D3;'Code diensten 2013'!$A$4:$D$21;4;ONWAAR))
Nu kijkt ie of D3 leeg is. Als dat zo is dan blijft E3 ook leeg. Als dat niet zo is dan gaat ie op zoek naar de code en geeft ie het aantal uren terug.

Ik neem aan dat de V staat voor Vrij? Om die vrije dagen ook op te vangen kan je dit doen:
1=ALS(OF(D3="";D3="V");"";VERT.ZOEKEN(D3;'Code diensten 2013'!$A$4:$D$21;4;ONWAAR))

Nu moeten we alleen de handmatig ingevoerde uren nog opvangen (zoals in D5):
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)))
It's Time To Shine
[i]What would life be like without rhethorical questions?[/i]
  woensdag 10 juli 2013 @ 18:43:51 #52
158518 Sjechov
Medisch Commercieel Actief!
pi_128805987
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!
Je hoeft de wereld niet te snappen, je hoeft er alleen maar je weg in te vinden
  woensdag 10 juli 2013 @ 18:45:49 #53
62215 qu63
..de tijd drinkt..
pi_128806053
quote:
0s.gif 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!
Dan moet je die code idd toevoegen aan je Code-sheet :)
It's Time To Shine
[i]What would life be like without rhethorical questions?[/i]
  woensdag 10 juli 2013 @ 18:51:40 #54
158518 Sjechov
Medisch Commercieel Actief!
pi_128806277
Werkt als gehoopt!
Dank voor je tijd en moeite!
Je hoeft de wereld niet te snappen, je hoeft er alleen maar je weg in te vinden
  woensdag 10 juli 2013 @ 18:58:18 #55
62215 qu63
..de tijd drinkt..
pi_128806488
quote:
0s.gif Op woensdag 10 juli 2013 18:51 schreef Sjechov het volgende:
Werkt als gehoopt!
Dank voor je tijd en moeite!
Graag gedaan!
It's Time To Shine
[i]What would life be like without rhethorical questions?[/i]
  woensdag 10 juli 2013 @ 19:41:33 #56
62215 qu63
..de tijd drinkt..
pi_128808023
Goed, mijn sheet voor de Rabobank werkt nu (zie ook dit), maar nu wil ik die van de ING ook werkend krijgen..

Voorbeeldje van de ING:
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"
Het filteren van de datum is al gelukt:
1=ALS(Transacties_Raw!A1="";"";DATUM(DEEL(Transacties_Raw!A1;7;4);DEEL(Transacties_Raw!A1;4;2);DEEL(Transacties_Raw!A1;1;2)))

Ook het opzoeken of er geld af of bij komt lukt:
Bij:
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)
Af:
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)

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?
It's Time To Shine
[i]What would life be like without rhethorical questions?[/i]
pi_128809167
quote:
0s.gif 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?
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.
pi_128811150
Lang leven de optie voor tekst naar kolommen. Dat maakt het toch een stuk eenvoudiger.
  woensdag 10 juli 2013 @ 21:54:51 #59
62215 qu63
..de tijd drinkt..
pi_128814060
quote:
0s.gif 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.
True, maar ik wil het zo simpel mogelijk houden. Dit is namelijk voor mijn zusje die er écht geen verstand van heeft..
It's Time To Shine
[i]What would life be like without rhethorical questions?[/i]
  woensdag 10 juli 2013 @ 21:55:52 #60
62215 qu63
..de tijd drinkt..
pi_128814114
quote:
0s.gif 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.
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?
It's Time To Shine
[i]What would life be like without rhethorical questions?[/i]
pi_128814533
quote:
0s.gif 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?
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.
  woensdag 10 juli 2013 @ 22:41:58 #62
62215 qu63
..de tijd drinkt..
pi_128816742
quote:
0s.gif 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.
Ha, das ook een goeie ja! Komma + 2 :)
It's Time To Shine
[i]What would life be like without rhethorical questions?[/i]
pi_128817255
Zo simpel mogelijk is alles in een macro :P
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)

quote:
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
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.
  woensdag 10 juli 2013 @ 22:58:31 #64
62215 qu63
..de tijd drinkt..
pi_128817836
Ha! Het werkt!
Uitgaande bedragen:
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)
Inkomende bedragen:
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)

*O*
It's Time To Shine
[i]What would life be like without rhethorical questions?[/i]
  woensdag 10 juli 2013 @ 23:00:40 #65
62215 qu63
..de tijd drinkt..
pi_128817951
quote:
0s.gif Op woensdag 10 juli 2013 22:49 schreef snabbi het volgende:
Zo simpel mogelijk is alles in een macro :P
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, 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..
It's Time To Shine
[i]What would life be like without rhethorical questions?[/i]
pi_128820422
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.
  woensdag 10 juli 2013 @ 23:58:10 #67
62215 qu63
..de tijd drinkt..
pi_128820673
quote:
0s.gif 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.
Hmm, ik denk dat mijn bestand (zie PM) toch handiger is voor een absolute Excel-n00b..

In mijn geval hoeven de rijen uit de cvs alleen gekopieerd en geplakt te worden in transacties_raw, that's it..
It's Time To Shine
[i]What would life be like without rhethorical questions?[/i]
pi_128821171
Leuke sheet, ook leuk voor de analyse.
Pak alleen het eerste deel van de macro voor de kopieer actie. De rest was specifiek op mijn functionaliteit:

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
  donderdag 11 juli 2013 @ 09:37:24 #69
249182 Holy_Goat
mhèèhèhè
pi_128826407
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


quote:
0s.gif 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 :P
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

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

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.

1=lookup("ORDERCOUNT from DATATABLE where YEAR = 2012 and MONTH = 4 and PRODUCT = product123")

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
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

Tests welke 100x worden uitgevoerd met 1.000.000 (1.000 bij dict) willekeurige row en cols.

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)


[ Bericht 7% gewijzigd door Holy_Goat op 11-07-2013 11:30:27 ]
  donderdag 11 juli 2013 @ 11:52:54 #70
62215 qu63
..de tijd drinkt..
pi_128829816
quote:
0s.gif 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:
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)
It's Time To Shine
[i]What would life be like without rhethorical questions?[/i]
  donderdag 11 juli 2013 @ 13:42:55 #71
249182 Holy_Goat
mhèèhèhè
pi_128833206
quote:
0s.gif 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)
ik kom de laatste tijd meuk tegen (werk) waarin meerdere workbooks van 200mb+ aan elkaar geknoopt moeten worden ter analyse
  donderdag 11 juli 2013 @ 13:51:33 #72
62215 qu63
..de tijd drinkt..
pi_128833513
quote:
0s.gif 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
Auw!
It's Time To Shine
[i]What would life be like without rhethorical questions?[/i]
  donderdag 11 juli 2013 @ 14:03:33 #73
85514 ralfie
!Yvan eht nioj
pi_128833957
quote:
0s.gif 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 ]

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):

1
2
3
        [][]              [,]
assign  18.1757812500     14.78125000000
read    445.7382812500    400.90234375000
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.
  donderdag 11 juli 2013 @ 20:11:23 #74
249182 Holy_Goat
mhèèhèhè
pi_128845946
quote:
0s.gif 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.
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?
  donderdag 11 juli 2013 @ 20:37:33 #75
85514 ralfie
!Yvan eht nioj
pi_128846873
quote:
0s.gif 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?
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.
abonnement Unibet Coolblue
Forum Opties
Forumhop:
Hop naar:
(afkorting, bv 'KLB')