abonnement Unibet Coolblue Bitvavo
pi_78627017
quote:
Op dinsdag 2 maart 2010 10:22 schreef ralfie het volgende:
@Hi_flyer

besef je wel dat dit

dim a, b, c as String

hetzelfde is als
dim a as variant, b as variant, c as string?

en je dus eigenlijk
dim a as string, b as string, c as string
bedoelt?

Verder nutteloze opmerking, maar wel een beetje snelheidswinst.
Volgens de VBA help niet: http://msdn.microsoft.com/en-us/library/7ee5a7s1(VS.80).aspx

halverwege de pagina staat de volgende code namelijk
1
2
Dim a, b, c As Single, x, y As Double, i As Integer
' a, b, and c are all Single; x and y are both Double
Supra Groningam Nihil
Postjubilea: 10.000 15.000 20.000 25.000
Sit jou kop in die koei se kont en wag tot die bul jou kom holnaai
Wat niemand je vertelt over de bioindustrie, geen bloed maar feiten
  dinsdag 2 maart 2010 @ 10:50:24 #62
249182 Holy_Goat
mhèèhèhè
pi_78627059
Ralfie, ben ik niet met je eens.

Kijk ook even hier
quote:
Different Types.
You can specify different data types for different variables by using a separate As clause for each variable you declare. Alternatively, you can declare several variables to be of the same type by using a common As clause. Each variable takes the data type specified in the first As clause encountered after its variablename part.

Dim a, b, c As Single, x, y As Double, i As Integer
' a, b, and c are all Single; x and y are both Double;
  dinsdag 2 maart 2010 @ 10:50:51 #63
249182 Holy_Goat
mhèèhèhè
pi_78627079
whehehe net ff eerder jij
  dinsdag 2 maart 2010 @ 10:53:44 #64
85514 ralfie
!Yvan eht nioj
pi_78627179
Grappig

1
2
3
Dim a As String, b, c As String
    a = 12
    MsgBox TypeName(a)

geeft string
terwijl
1
2
3
Dim a, b, c As String
    a = 12
    MsgBox TypeName(a)

geeft integer

probeer maar!
  dinsdag 2 maart 2010 @ 10:57:54 #65
249182 Holy_Goat
mhèèhèhè
pi_78627343
Hmm ralfie, das inderdaad waar :s
Naja, gelukkig dim ik alles stuk voor stuk altijd, met

dim a as string
dim b as string
dim c as string

maar het is wel erg raar dat dit zo werkt!
pi_78628512
Heel bizar:
1
2
3
4
5
6
7
8
9
10
11
Sub dimtest1()

Dim a, b, c As String

a = 12
b = 12
c = 12

MsgBox TypeName(a) & TypeName(b) & TypeName(c)

End Sub

Geeft integer integer string

1
2
3
4
5
6
7
8
9
10
11
12
Sub dimtest2()

Dim a As String
Dim b, c As String

a = 12
b = 12
c = 12

MsgBox TypeName(a) & TypeName(b) & TypeName(c)

End Sub

Geeft string integer string

Blijkbaar wordt alleen de laatste variabele echt gedimd. Is dus niet Zoals het door microsoft wordt uitgelegd.
Supra Groningam Nihil
Postjubilea: 10.000 15.000 20.000 25.000
Sit jou kop in die koei se kont en wag tot die bul jou kom holnaai
Wat niemand je vertelt over de bioindustrie, geen bloed maar feiten
pi_78629135
Wat vaag! Ik was ook altijd in de veronderstelling dat ze allemaal als String gedimd werden!
Dat verklaart wel wat, maar meestal Dim ik ze ook stuk voor stuk zoals Holy.
pi_78630307
De uitleg die ik en holy-goat vonden blijkt dus voor de "echte" visual basic en dot-net visual basic te zijn. Daar werkt dat wel zoals wij zeiden maar bij visual basic for applications (VBA) werkt het dus blijkbaar toch weer anders.
Het is dus zaak om in excel al je variabelen apart te DIMmen of in ieder geval in de gaten houden dat alleen de laatste variabele in een DIM rijtje echt geDIMt wordt en de rest variant blijft totdat er gegevens in de variabele worden gedouwd.
Supra Groningam Nihil
Postjubilea: 10.000 15.000 20.000 25.000
Sit jou kop in die koei se kont en wag tot die bul jou kom holnaai
Wat niemand je vertelt over de bioindustrie, geen bloed maar feiten
  dinsdag 2 maart 2010 @ 12:11:50 #69
134944 Hi_flyer
Van alles te melden
pi_78630561
Wow dit is nieuw voor me en wellicht ook belangrijk. Ik dim vaak een rijtje variabelen en op deze manier vreet dat wel wat geheugen (netwerk is hier meer de bottleneck though).
  dinsdag 2 maart 2010 @ 12:26:42 #70
249182 Holy_Goat
mhèèhèhè
pi_78631154
Even tussen haakjes: aangezien ik mezelf alles aangeleerd heb wat vba betreft:

zijn er wat stukken tekst die ik echt gelezen móet hebben? Ik heb vaak het idee dat ik nog best "ranzig" programmeer namelijk.

En momenteel doe ik alles nog in vba behorende bij office 2003. Zou ik stiekem wel eens een keer .net moeten gaan leren?

Verder nog een subvraagje:
Kan ik sub of subsubclasses maken in vba?
Voorbeeld: variabele diersoorten.kat.poot.lengte
pi_78631502
Holy, wat ikzelf wel belangrijk vind mbt 'netjes' programmeren zijn
- Inspringen voor bv loops en Ifs
- Leszynski naming convention voor controls en variables: http://en.wikipedia.org/wiki/Leszynski_naming_convention
pi_78632346
quote:
Op dinsdag 2 maart 2010 12:26 schreef Holy_Goat het volgende:
Even tussen haakjes: aangezien ik mezelf alles aangeleerd heb wat vba betreft:

zijn er wat stukken tekst die ik echt gelezen móet hebben? Ik heb vaak het idee dat ik nog best "ranzig" programmeer namelijk.

En momenteel doe ik alles nog in vba behorende bij office 2003. Zou ik stiekem wel eens een keer .net moeten gaan leren?

Verder nog een subvraagje:
Kan ik sub of subsubclasses maken in vba?
Voorbeeld: variabele diersoorten.kat.poot.lengte
Leer arrays te gebruiken, dat heeft mij ontzettend veel ruimte en snelheid opgeleverd. Zeker als je bepaalde handelingen door een hele sheet wilt uitvoeren.
Supra Groningam Nihil
Postjubilea: 10.000 15.000 20.000 25.000
Sit jou kop in die koei se kont en wag tot die bul jou kom holnaai
Wat niemand je vertelt over de bioindustrie, geen bloed maar feiten
  dinsdag 2 maart 2010 @ 14:07:16 #73
85514 ralfie
!Yvan eht nioj
pi_78635072
quote:
Op dinsdag 2 maart 2010 12:26 schreef Holy_Goat het volgende:
Even tussen haakjes: aangezien ik mezelf alles aangeleerd heb wat vba betreft:

zijn er wat stukken tekst die ik echt gelezen móet hebben? Ik heb vaak het idee dat ik nog best "ranzig" programmeer namelijk.
De allerbelangrijkste eye-opener voor mij was dat een range in een keer omgezet kan worden naar een variant (als array)

Dim w as variant
w = range(a1:b2);
MsgBox w(1,1)

en dit is vele malen sneller als met for en/of foreach door je cellen te gaan

andersom kan ook

range(a1:b2) = w

als je dus een berekening gaat doen op een zooi cellen, stop de waarden dan in een variant, doe je berekening, en zet je waarden terug.


Vergelijk
1
2
3
4
5
6
7
8
Dim w As Variant
    w = Range("A1:Z1502")
    For x = 1 To UBound(w)
        For y = 1 To UBound(w, 2)
            w(x, y) = w(x, y) * 26 + 45 / 7 + w(x, y)
        Next y
    Next x
    Range("AA1:AZ1502") = w


versus
1
2
3
4
For Each cell In Range("A1:Z1502")
        q = cell.Value
        cell.Offset(0, 26).Value = q * 26 + 45 / 7 + q
    Next cell

De eerste code is bij deze range vol random getallen 100 x sneller, bij application.screenupdating =false en applicaiton.calculation=xlmanual nog zeker 10x sneller. Geen overbodige luxe bij een taaltje waarvan snelheid toch wel het grootste probleem is (mijns inziens)
  dinsdag 2 maart 2010 @ 14:17:43 #74
249182 Holy_Goat
mhèèhèhè
pi_78635506
Arrays gebruik ik té vaak
Maar vraag me soms wel af of dingen niet sneller kunnen, dat is in mijn geval vaak ook een bottleneck.
Ik heb soms arrays met 100.000+ waarden, en dan wil ik snel wat opzoeken in die array, maar dan wel 1000x achter elkaar iets opzoeken. Dan is een for loop gewoon te traag. (gebruik een binary search methode).

Waar ik me nu nog aan stoor soms is langzaam inladen van data.
Een sheet met 8 kolommen en een x aantal rijen (niet van te voren bekend) wil ik dan naar 8 aparte arrays schrijven. (niet naar een X * 8 2dim array). Ik doe dat nu nog door een while loop te gebruikend die data inleest (steeds redimensionen ook) tot de arrays gevuld zijn. Dit kan dus veel sneller ralph?

Voorbeeld van bestand: hier

Ook zou ik dus graag die subclasses willen gebruiken als mogelijk.

Verder gebruik ik gelukkig wel tabs, en gebruik veel comments
Alleen zijn mijn debug technieken volgens mij niet zo best.
Error handlers inbouwen ook niet. daar zou ik wel wat beter in willen worden.

[ Bericht 8% gewijzigd door Holy_Goat op 02-03-2010 14:23:43 ]
pi_78635835
quote:
Op dinsdag 2 maart 2010 14:07 schreef ralfie het volgende:

[..]

De allerbelangrijkste eye-opener voor mij was dat een range in een keer omgezet kan worden naar een variant (als array)

Dim w as variant
w = range(a1:b2);
MsgBox w(1,1)

Wist ik niet.
  dinsdag 2 maart 2010 @ 15:06:39 #76
62215 qu63
..de tijd drinkt..
pi_78637597
quote:
Op maandag 1 maart 2010 10:36 schreef Deetch het volgende:

[..]

Helaas geen tijd om uitgebreid te coderen.

Echter een principe schetsje ziet er mi als volgt uit.
[ code verwijderd ]
Helaas is mijn kennis van VBA te klein (nihil namelijk) om dit zelf verder uit te werken

Kan iemand me op weg helpen?
It's Time To Shine
[i]What would life be like without rhethorical questions?[/i]
pi_78639036
quote:
Op dinsdag 2 maart 2010 15:06 schreef qu63 het volgende:

[..]

Helaas is mijn kennis van VBA te klein (nihil namelijk) om dit zelf verder uit te werken

Kan iemand me op weg helpen?
goedverdoemme moet kabouter wesley u dan ook alles voorkauwen
Supra Groningam Nihil
Postjubilea: 10.000 15.000 20.000 25.000
Sit jou kop in die koei se kont en wag tot die bul jou kom holnaai
Wat niemand je vertelt over de bioindustrie, geen bloed maar feiten
  dinsdag 2 maart 2010 @ 15:47:15 #78
62215 qu63
..de tijd drinkt..
pi_78639236
quote:
Op dinsdag 2 maart 2010 15:43 schreef Deetch het volgende:

[..]

goedverdoemme moet kabouter wesley u dan ook alles voorkauwen
Ja
It's Time To Shine
[i]What would life be like without rhethorical questions?[/i]
pi_78646318
quote:
Op dinsdag 2 maart 2010 15:47 schreef qu63 het volgende:

[..]

Ja
vlats

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
Sub random_x()

opnieuw:

Dim aantal As Integer
Dim lengte As Integer
Dim lowerbound As Integer
Dim upperbound As Integer
Set myRange = Range("A140:A867")

aantal = InputBox("Geef aantal x-en") '
lengte = myRange.Cells.Count - 1
lowerbound = 140
upperbound = lowerbound + lengte

ReDim myArray(aantal) As Integer

'LET OP: i betekent ( i ) zonder spaties
For i = 1 To aantal
    myArrayi = Int((upperbound - lowerbound + 1) * Rnd + lowerbound)
Next i

'x-jes neerzetten
For j = 1 To aantal
    ActiveSheet.Cells(myArray(j), 1).Value = "X"
Next j

'check op aantal ingevulde x-en ivm rnd functie
check = Application.WorksheetFunction.CountIf(myRange, "X")
vraag = MsgBox("Wil je opnieuw laten invullen?" & vbNewLine & "Gevraagde aantal x-en: " & aantal & vbNewLine & "Aantal ingevulde x-en: " & check, vbRetryCancel)

If vraag = vbRetry Then
    Range("A140:A867").Select
    Selection.ClearContents
    Range("A139").Select
    GoTo opnieuw
End If

End Sub

Probleem met random is dat je elke keer andere getallen krijgt en je dus nooit van te voren weet hoeveel x-jes je krijgt als je om 140 x-jes vraagt. Hiervoor is de msgbox aan het einde zodat je een andere waarde voor de gevraagde hoeveelheid x-jes kunt invoeren totdat je er wel precies 140 krijgt.
Het kan vast eleganter maar daar had ik geen tijd voor.
Supra Groningam Nihil
Postjubilea: 10.000 15.000 20.000 25.000
Sit jou kop in die koei se kont en wag tot die bul jou kom holnaai
Wat niemand je vertelt over de bioindustrie, geen bloed maar feiten
pi_78646398
Misschienw erkt deze code wel beter: http://www.ozgrid.com/VBA/RandomNumbers.htm
Supra Groningam Nihil
Postjubilea: 10.000 15.000 20.000 25.000
Sit jou kop in die koei se kont en wag tot die bul jou kom holnaai
Wat niemand je vertelt over de bioindustrie, geen bloed maar feiten
  dinsdag 2 maart 2010 @ 19:06:21 #81
249182 Holy_Goat
mhèèhèhè
pi_78647225
**wacht op clever antwoord van ralphie op vraag**
  dinsdag 2 maart 2010 @ 21:22:28 #82
85514 ralfie
!Yvan eht nioj
pi_78655110
quote:
Op dinsdag 2 maart 2010 19:06 schreef Holy_Goat het volgende:
**wacht op clever antwoord van ralphie op vraag**
je kunt 8x een range inlezen of 1x alle kolommen en die in vba splitsen in meerdere arrays. Geen idee welke sneller is, maar ik denk dat bij vele waarden de eerste methode het beste is.
Indien je gebruik maakt van variant = range(xxx) zit je altijd met een multidimensionale array, dus als je dat niet wilt, zul je de hele reut in een keer in moeten laden en daarna in vba met een for each je arrays maken

1
2
3
4
5
6
7
8
9
10
11
dim alles = range("b3:G" & Range("B65536").End(xlup).Row) 'laatste rij opzoeken via lookup
dim a1() as string,a2() as string,a3() as string 'je arrays
redim a1(1 to ubound(alles))
redim a2(1 to ubound(alles))
redim a3(1 to ubound(alles))

for x=1 to UBound(alles)
    a1(x) = alles(x,1)
    a2(x) = alles(x,2)
    a3(x) = alles(x,3)
next x

ofzoiets
  dinsdag 2 maart 2010 @ 21:39:08 #83
85514 ralfie
!Yvan eht nioj
pi_78656249
quote:
Op dinsdag 2 maart 2010 15:47 schreef qu63 het volgende:

[..]

Ja
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
Sub randomx()
    Dim rng As Range, aantal As Integer, aantalcellen As Integer, value As Integer
    
    rng = "A1:A100" 'vul hier je range in
    aantal = InputBox("Hoeveel xjes ?", "seriously", 0)
    Dim x As Variant
    x = Range("A1:A100")
    aantalcellen = UBound(x)
    If UBound(x, 2) > 1 Then
        MsgBox "Bereik is ongeldig, slechts support voor 1 kolom!"
        Exit Sub
    ElseIf aantal < 1 Or aantal >= aantalcellen Then
        MsgBox "Invoer is ongeldig, teveel of te weinig"
        Exit Sub
    End If
    Randomize
    Do
        value = Int(Rnd * aantalcellen)
        If Not x(value, 1) = "x" Then
            x(value, 1) = "x"
            aantal = aantal - 1
        End If
    Loop While aantal > 0
    Range("A1:A100") = x
End Sub



daar deze code in een loopje door blijft gaan totdat er een x aantal xjes zijn gezet, kan het zijn dat ie oneindig lang door blijft gaan. Je zou een timer of iets dergelijke hiervoor in de do while loop moeten bouwen om dit te voorkomen
  dinsdag 2 maart 2010 @ 22:09:48 #84
249182 Holy_Goat
mhèèhèhè
pi_78658352
quote:
Op dinsdag 2 maart 2010 21:22 schreef ralfie het volgende:

[..]

je kunt 8x een range inlezen of 1x alle kolommen en die in vba splitsen in meerdere arrays. Geen idee welke sneller is, maar ik denk dat bij vele waarden de eerste methode het beste is.
Indien je gebruik maakt van variant = range(xxx) zit je altijd met een multidimensionale array, dus als je dat niet wilt, zul je de hele reut in een keer in moeten laden en daarna in vba met een for each je arrays maken
[ code verwijderd ]

ofzoiets
dus dit is veel sneller als bijvoorbeeld:

1
2
3
4
5
6
7
8
9
10
11
12
13
i=2
do while cells(i,1) <>""
   redim preserve array1(i-1)
...
   redim preserve array8(i-1)
   
   array1(i-1)=cells(i,1)
...
   array8(i-1)=cells(i,8)


    i=i+1
loop
  woensdag 3 maart 2010 @ 12:45:48 #85
278786 EINZ
WHEEEH! HEHEH!
pi_78677598
Welke fomule pas ik toe voor de inverse cosinus in excel?
Deze reply is uitsluitend bestemd voor geadresseerde(n). Dit bericht kan informatie bevatten die vertrouwelijk is. Indien u niet de geadresseerde bent, wordt u er hierbij op gewezen dat u geen recht hebt kennis te nemen van deze reply.
pi_78678935
quote:
Op woensdag 3 maart 2010 12:45 schreef EINZ het volgende:
Welke fomule pas ik toe voor de inverse cosinus in excel?
http://office.microsoft.com/nl-nl/excel/HP052089811043.aspx

BOOGCOS() in NL.
ACOS() in EN.
  woensdag 3 maart 2010 @ 15:15:39 #87
278786 EINZ
WHEEEH! HEHEH!
pi_78684275
quote:
Op woensdag 3 maart 2010 13:14 schreef DaFan het volgende:

[..]

http://office.microsoft.com/nl-nl/excel/HP052089811043.aspx

BOOGCOS() in NL.
ACOS() in EN.
Neah! Inverse cosinus van 0,43 is iets van 64 graden, en boogcos geeft me als antwoord 1,12 aan.
Deze reply is uitsluitend bestemd voor geadresseerde(n). Dit bericht kan informatie bevatten die vertrouwelijk is. Indien u niet de geadresseerde bent, wordt u er hierbij op gewezen dat u geen recht hebt kennis te nemen van deze reply.
pi_78684806
quote:
Op woensdag 3 maart 2010 15:15 schreef EINZ het volgende:

[..]

Neah! Inverse cosinus van 0,43 is iets van 64 graden, en boogcos geeft me als antwoord 1,12 aan.
Geometrie-noob aan Geometrie-expert:
Ik weet weinig van cos, sin en boogcos. Ik heb wel eens gemerkt dat je de uitkomst niet in graden krijgt:
Wie weet zegt je het iets als je weet dat voor Excel het volgende geldt::

BOOGCOS(-1) = PI
BOOGCOS(0) = 0,5*PI
BOOGCOS(1) = 0

Misschien moet je de uitslag wel vermenigvuldigen met 180/pi.

boogcos(0,43)= bij Excel: 1,12630355
1,12630355 x 180/pi = 64,53243986

Klopt 't zo?


[ Bericht 17% gewijzigd door Twentsche_Ros op 03-03-2010 15:33:55 ]
Je kunt beter één kaars opsteken dan duizend maal de duisternis vervloeken.
pi_78685197
Staat ook in de voorbeelden in de link die ik heb gegeven.

BOOGCOS(0,43)*(180/PI()) geeft wel 64,53 aan.
Ook GRADEN(BOOGCOS(0,43)) geeft dat antwoord.
quote:
Als u de boogcosinus wilt uitdrukken in graden, vermenigvuldigt u het resultaat met 180/PI() of gebruikt u de functie GRADEN.
pi_78686330
Casus!

Ik heb een werkblad met drie kolommen, kolom 1 is gevuld met getal, kolom 2 met tekst en nu de crux kolom 3 ook met tekst, maar dit zijn telkens 3 woorden die met een tab gescheiden zijn.

Ik wil dus graag de cellen in kolom C splitsen naar drie cellen met één woord.

Kan dat?
I got soul, but I'm not a soldier
abonnement Unibet Coolblue Bitvavo
Forum Opties
Forumhop:
Hop naar:
(afkorting, bv 'KLB')