abonnement Unibet Coolblue Bitvavo
  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.
  donderdag 11 juli 2013 @ 21:23:21 #76
249182 Holy_Goat
mhèèhèhè
pi_128848842
quote:
0s.gif 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.
Mwa. Bij grote bedrijven werken ze kennelijk toch nog best heel erg vaak met grote sheets om reportings op te draaien....

Even wat anders. Ik probeer (zo snel mogelijk, uiteraard) N arrays met zo'n 15000 items samen te voegen tot 1 array met 15000 items, liefst met een delimiter.

Nu loop ik er doorheen en plak ik alle kolommen achter elkaar met
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
wat even snel is. In mijn geval, met N = 3 duurt het nog zo'n hele seconde, ofwel 50% (!) van het totale proces van pre-genereren. Als dit sneller kan dan zit hier dus behoorlijk winst. Ben vooral geinteresseerd in een non-dll aanpak, maarja dat moet dan wel kunnen.

Ik neem aan dat er geen manier is om hups ineens meerdere arrays te joinen, maar vind het door de array heen loopen wel een beetje zo-zo...

Jij een idee?

---
edit: doevents eruit gesloopt (die zat er ook in, in die loop, was gewoonte van me). Kost nu nog maar 0.04 sec. nice. Overigens blijft de vraag staan, is nog steeds goed om te weten namelijk

edit2: ik kan alleen nog maar iets bedenken met een winapi call, of bv memcopy, maar kom daar niet uit en is maar de vraag of het wat oplevert

[ Bericht 10% gewijzigd door Holy_Goat op 12-07-2013 16:53:22 ]
  donderdag 18 juli 2013 @ 06:32:17 #77
249182 Holy_Goat
mhèèhèhè
pi_129072189
Je kunt wel merken dat het vakantie is :P al een week niets gepost hier.
pi_129212272
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.
  maandag 22 juli 2013 @ 09:42:33 #79
199535 DroogDok
Sandcastle
pi_129212297
quote:
0s.gif 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.
Verticaal zoeken proberen.
"We are all atheists about most of the gods that humanity has ever believed in. Some of us just go one god further." - Richard Dawkins
pi_129213313
quote:
0s.gif Op maandag 22 juli 2013 09:42 schreef DroogDok het volgende:

[..]

Verticaal zoeken proberen.
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.
  maandag 22 juli 2013 @ 10:44:15 #81
199535 DroogDok
Sandcastle
pi_129213599
quote:
0s.gif 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.
De zoekwaarde kan (denk ik) ook een OF-functie zijn.
Maar filter is inderdaad een makkelijkere oplossing.
"We are all atheists about most of the gods that humanity has ever believed in. Some of us just go one god further." - Richard Dawkins
pi_129213607
quote:
0s.gif Op donderdag 18 juli 2013 06:32 schreef Holy_Goat het volgende:
Je kunt wel merken dat het vakantie is :P al een week niets gepost hier.
Viel mij ook al op ja.
Zelf heb ik de afgelopen 3 weken amper m'n laptopje gezien door een ander project :P (waarvoor ik mijn laptop niet nodig heb)
  maandag 22 juli 2013 @ 11:15:53 #83
249182 Holy_Goat
mhèèhèhè
pi_129214413
quote:
0s.gif 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 :P (waarvoor ik mijn laptop niet nodig heb)
Mensen die buiten komen :r
  maandag 22 juli 2013 @ 11:17:48 #84
249182 Holy_Goat
mhèèhèhè
pi_129214476
quote:
0s.gif 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.
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.
pi_129216470
quote:
0s.gif 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.
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?
pi_129218120
quote:
0s.gif Op maandag 22 juli 2013 11:15 schreef Holy_Goat het volgende:

[..]

Mensen die buiten komen :r
Zelf blijf ik liever binnen :)
En dat project was niet vakantie houden jammer genoeg(heb ik wel nodig als het klaar is :P)
  dinsdag 23 juli 2013 @ 09:10:20 #87
249182 Holy_Goat
mhèèhèhè
pi_129244924
quote:
0s.gif 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?
ja natuurlijk kun je er mee doen wat jij zo beschrijft :)
Ik bedoelde alleen: het automatisch weer uitlezen van allerhande gegevens uit pivots die je louter hebt gemaakt om eea te groeperen voor verdere automatische verwerking gaat soms wat lastiger.

(getpivotdata functie (which i dont like): http://office.microsoft.c(...)ata-HP005209107.aspx)

[ Bericht 1% gewijzigd door Holy_Goat op 23-07-2013 09:15:50 ]
pi_129308041
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
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
  woensdag 24 juli 2013 @ 23:26:37 #89
85514 ralfie
!Yvan eht nioj
pi_129312043
quote:
5s.gif 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 ]

selecteer gegevens (inclusief titels)
ga naar tabje 'invoegen'. Klik op pijltje bij 'draaitabel' -> 'draaigrafiek'
OK
in het paneel rechts
sleep 'stad' (bovenaan) naar legendavelden (onderin)
sleep 'winst' naar waarden
sleep 'jaar' naar asvelden

Verander eventueel grafiek soort.
pi_129312298


[ Bericht 100% gewijzigd door snabbi op 24-07-2013 23:31:27 ]
  woensdag 24 juli 2013 @ 23:33:02 #91
62215 qu63
..de tijd drinkt..
pi_129312384
quote:
0s.gif Op woensdag 24 juli 2013 23:31 schreef snabbi het volgende:

Ja, dat :P
It's Time To Shine
[i]What would life be like without rhethorical questions?[/i]
pi_129312469
quote:
0s.gif Op woensdag 24 juli 2013 23:33 schreef qu63 het volgende:

[..]

Ja, dat :P
Als er een betere oplossing is, haal ik de mijne weg. Ik zou zeggen dump de steden in aparte kolommen, maar dit is handiger.
  woensdag 24 juli 2013 @ 23:50:37 #93
62215 qu63
..de tijd drinkt..
pi_129313283
quote:
0s.gif Op woensdag 24 juli 2013 23:34 schreef snabbi het volgende:

[..]

Als er een betere oplossing is, haal ik de mijne weg. Ik zou zeggen dump de steden in aparte kolommen, maar dit is handiger.
Jammer, eigenlijk. Ook van 'fouten' of minder handige oplossingen valt te leren, imho. Ik zat namelijk op dezelfde weg als jou, maar wilde de reeksen dynamisch maken dmv een als()-constructie. Helaas werkt dat laatste niet..
En was het nog niet helemaal duidelijk in mijn hoofd..
It's Time To Shine
[i]What would life be like without rhethorical questions?[/i]
pi_129313357
quote:
0s.gif Op woensdag 24 juli 2013 23:50 schreef qu63 het volgende:

[..]

Jammer, eigenlijk. Ook van 'fouten' of minder handige oplossingen valt te leren, imho. Ik zat namelijk op dezelfde weg als jou, maar wilde de reeksen dynamisch maken dmv een als()-constructie. Helaas werkt dat laatste niet..
En was het nog niet helemaal duidelijk in mijn hoofd..
Orginele tekst:
Waarom plaats je elke stad niet in een aparte kolom? Op die manier kan je van elke kolom een aparte lijn maken. Het is zelfs vrij eenvoudig van je huidige lijst een dergelijke waargave te maken door middel van bijvoorbeeld sommen.als (uitgaande van het feit dat elk jaar 1 keer een stad heeft).

Stel deze tabel die je nu hebt staat in blad1 kolommen A t/m C
In blad2 krijg je iets als:
Jaar Ede
2000 =SOMMEN.ALS(Blad1!C:C;Blad1!A:A;A2;Blad1!B:B;B1)
pi_129321069
quote:
0s.gif Op woensdag 24 juli 2013 23:26 schreef ralfie het volgende:

[..]

selecteer gegevens (inclusief titels)
ga naar tabje 'invoegen'. Klik op pijltje bij 'draaitabel' -> 'draaigrafiek'
OK
in het paneel rechts
sleep 'stad' (bovenaan) naar legendavelden (onderin)
sleep 'winst' naar waarden
sleep 'jaar' naar asvelden

Verander eventueel grafiek soort.
ontzettend bedankt
dit was precies wat ik zocht
_O_
pi_129372817
Een hele simpele vraag waarschijnlijk:

Ik heb drie kolommen,
A = verkoop
B = inkoop
C = saldo van beide

Als ik in een formule bij C echter A-B doe, valt hij soms foutief uit. In sommige stellen staat immers niets (¤ -) en dan neem bij bijvoorbeeld: (0 - -300 = +300). Min en min is plus, maar dat gaat in deze natuurlijk niet op...

Hoe verhelp je dit?
pi_129373078
Doe je
ABS(A) - ABS(B)
  vrijdag 26 juli 2013 @ 17:00:24 #98
62215 qu63
..de tijd drinkt..
pi_129373246
quote:
0s.gif Op vrijdag 26 juli 2013 16:47 schreef Zocalo het volgende:
Een hele simpele vraag waarschijnlijk:

Ik heb drie kolommen,
A = verkoop
B = inkoop
C = saldo van beide

Als ik in een formule bij C echter A-B doe, valt hij soms foutief uit. In sommige stellen staat immers niets (¤ -) en dan neem bij bijvoorbeeld: (0 - -300 = +300). Min en min is plus, maar dat gaat in deze natuurlijk niet op...

Hoe verhelp je dit?
DaFan's oplossing is idd een goede, maar kijk ook eens naar hoe je je sheet op hebt gebouwd. In mijn sheets zijn alle bedragen altijd positief, behalve het saldo. Er komt altijd een positief bedrag bij en er gaat altijd een positief bedrag uit..
It's Time To Shine
[i]What would life be like without rhethorical questions?[/i]
  vrijdag 26 juli 2013 @ 17:06:38 #99
85514 ralfie
!Yvan eht nioj
pi_129373427
quote:
0s.gif Op vrijdag 26 juli 2013 16:47 schreef Zocalo het volgende:
Een hele simpele vraag waarschijnlijk:

Ik heb drie kolommen,
A = verkoop
B = inkoop
C = saldo van beide

Als ik in een formule bij C echter A-B doe, valt hij soms foutief uit. In sommige stellen staat immers niets (¤ -) en dan neem bij bijvoorbeeld: (0 - -300 = +300). Min en min is plus, maar dat gaat in deze natuurlijk niet op...

Hoe verhelp je dit?
Ik vind het vreemder dat je een inkoop van -300 kunt hebben. Tenzij ik je omschrijving 'saldo van beide' misvat, lijkt +300 me toch een goede uitkomst?
pi_129374080
quote:
0s.gif Op vrijdag 26 juli 2013 17:06 schreef ralfie het volgende:

[..]

Ik vind het vreemder dat je een inkoop van -300 kunt hebben. Tenzij ik je omschrijving 'saldo van beide' misvat, lijkt +300 me toch een goede uitkomst?
Het is het verschil van week A met week B.
Product X is in week A vs B verkoopprijs 10 cent gestegen (*afzet), inkoopprijs is 20 cent gedaald (*afzet). Verschil tussen gewogen afzet inkoop en verkoop is C. Daarbij kan het soms negatief zijn dus.

quote:
7s.gif Op vrijdag 26 juli 2013 16:54 schreef DaFan het volgende:
Doe je
ABS(A) - ABS(B)
Top, wat houdt die functie in?
abonnement Unibet Coolblue Bitvavo
Forum Opties
Forumhop:
Hop naar:
(afkorting, bv 'KLB')