[Excel + VBA] Switch functie

Pagina: 1
Acties:

  • jsiegmund
  • Registratie: Januari 2002
  • Laatst online: 21-08 21:12
Omdat Excel geen switch functie kent wil ik die graag zelf implementeren m.b.v. VBA...
Nu ben ik op de volgende functie omschrijving gekomen:
Switch ( switchcase1, switchcase2, ...)
waarbij een switchcase is opgebouwd uit:
(a,b,c)

per opgegeven switchcase wordt het volgende gedaan:
if (a==b)
return c;

Nu het probleem: ik zou niet weten waar ik moest beginnen, heb nog nooit met VBA gewerkt en te weinig tijd om me helemaal in te lezen. Daarbij hoef ik ook echt alleen dit ene dingetje te weten, dus om daar nu VBA voor te gaan zitten leren. Als iemand me een beetje opweg kan helpen: graag!

  • Maasluip
  • Registratie: April 2002
  • Laatst online: 20-08 09:24

Maasluip

Kabbelend watertje

Ik help je even opweg. Zoek in de helpfiles eens naar Select en Case

Signatures zijn voor boomers.


Verwijderd

Maasluip schreef op maandag 20 juni 2005 @ 13:30:
Ik help je even opweg. Zoek in de helpfiles eens naar Select en Case
Jah das dezelfde functie als wat jij wilt...
Dus ik sluit me hierbij aan

  • jsiegmund
  • Registratie: Januari 2002
  • Laatst online: 21-08 21:12
Ik weet niet of ik daar echt wat aan ga hebben. Die functie zit in VBA en gebruikt een vast aantal (hardcoded) cases. De input van mijn functie is echter variabel qua aantal cases, dus een loopje met een if-statement lijkt me praktischer. Ik weet alleen niet hoe ik kan specificeren dat de input een lijst is van 3-tupels en hoe je dan vervolgens door die lijst loopt.

  • henkleerssen
  • Registratie: December 2000
  • Niet online

henkleerssen

Your life is as you narrate it

iCe01 schreef op maandag 20 juni 2005 @ 13:39:
Ik weet niet of ik daar echt wat aan ga hebben. Die functie zit in VBA en gebruikt een vast aantal (hardcoded) cases. De input van mijn functie is echter variabel qua aantal cases, dus een loopje met een if-statement lijkt me praktischer. Ik weet alleen niet hoe ik kan specificeren dat de input een lijst is van 3-tupels en hoe je dan vervolgens door die lijst loopt.
Klinkt allemaal niet zo moeilijk..
Kijk inderdaad ff naar select case statement ..
En als je dus verschillende parameters wilt stoppen in een functie.. kun je eens kijken naar een geparametriseerde array als functie..
Gewoon ff googlen: http://www.google.nl/sear...amarray+vba+example&meta=
en een mooi voorbeeld is http://www.dicks-blog.com...g-vba-advanced-functions/

Is eigenlijk een basic programmeer vraagje... had je al gezocht op got?

  • jsiegmund
  • Registratie: Januari 2002
  • Laatst online: 21-08 21:12
Ik heb gezocht ja, maar zolang je niet precies weet waar je naar aan het zoeken bent vind je door de bomen het bos niet. Toevallig was ik je voorbeeld net zelf ook tegengekomen, ik ga er even mee aan de slag.

  • jsiegmund
  • Registratie: Januari 2002
  • Laatst online: 21-08 21:12
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
Function ExpertIF(ParamArray varExpr() As Variant)

    Sheets("data").Select
    
    ' niks gevonden dus leeg
    ExpertIF = ""

    ' Zoek langs alle array entries
    For i = LBound(varExpr) To UBound(varExpr)
        
        ' evalueren
        If (varExpr(i)(0) = varExpr(i)(1)) Then
            ExpertIF = Range(varExpr(0)(2))
        End If
        
    Next i


End Function


Is wat ik tot nu toe heb, alleen werkt het niet :) Ik gok erop dat het varExpr(i)(0) deel niet echt is zoals het zou moeten zijn?

[ Voor 85% gewijzigd door jsiegmund op 20-06-2005 14:38 . Reden: Code-update ]


  • henkleerssen
  • Registratie: December 2000
  • Niet online

henkleerssen

Your life is as you narrate it

wat bedoel je met varExpr(i)(0).. je gaat element i uit array varexpr met 0 vermenigvuldigen? :?
Wat wil je nou eigenlijk?
En gebruik nou eens het select case dan ipv if... want je wilde toch heel veel vergelijkingen gaan maken? VBA leren wil je niet... maar ...tja je begrijpt wel iets van programmeren toch?

  • jsiegmund
  • Registratie: Januari 2002
  • Laatst online: 21-08 21:12
Ja dat met die varExpr(i)(o) was een foutje... en zoals ik hierboven ook al vroeg: aan het select/case statement heb je toch niks op het moment dat je niet weet hoeveel cases je gaat krijgen? Dat is nog altijd hardcoded neem ik aan, tenzij vba een manier heeft om dat variabel te doen? Alle voorbeelden die ik tegenkom zijn hardcoded!

Wat ik nu wil:
functie krijgt een lijst van cellen mee; het aantal cellen moet een drievoud zijn!
dan vervolgens per drievoud de volgende code:

code:
1
2
3
If (a = b) Then
   result  = c
End If


Dus bijvoorbeeld:

funcie (A1,B1,C1,B2,C2,D2)

levert:
code:
1
2
3
4
5
6
If (A1 =B1) Then
   result  = C1
End If 
If (B2 = C2) Then
   result  = D2
End If


en dat dus voor een variabel aantal cellen! Dan heb je aan select/case dus niks voor zover ik zie.

De rede dat ik hier tegenaanloop overigens: in Excel kun je maar 7 IF-jes nesten, en ik heb er nog een paar meer nodig. Normaal los je dat op met een switch statement maar dat kent Excel niet... in de cellen van de worksheet weet ik natuurlijk hoeveel IF-parameters ik heb, maar in de functie moet dit variabel zijn.
henkleerssen schreef op maandag 20 juni 2005 @ 14:56:
wat bedoel je met varExpr(i)(0).. je gaat element i uit array varexpr met 0 vermenigvuldigen? :?
Wat wil je nou eigenlijk?
En gebruik nou eens het select case dan ipv if... want je wilde toch heel veel vergelijkingen gaan maken? VBA leren wil je niet... maar ...tja je begrijpt wel iets van programmeren toch?
Ik kan programmeren ja... en in mijn opzicht is dan varExpr(i)(o) het 0-de element van array varExpr(i) in varExpr... heeft niks met vermenigvuldigen te maken hoor??!

[ Voor 38% gewijzigd door jsiegmund op 20-06-2005 15:11 ]


  • jsiegmund
  • Registratie: Januari 2002
  • Laatst online: 21-08 21:12
Ik heb nu overigens al dit:

code:
1
2
3
4
5
6
7
8
Function expertIF(ParamArray varExpr() As Variant)
expertIF = ""

If (varExpr(0).Value = varExpr(0 + 1).Value) Then
expertIF = varExpr(0 + 2).Value
End If

End Function


Wat goed werkt voor 3 argumenten, maar natuurlijk is dit niet variabel dus moet ik nog een tellertje inbouwen of iets dergelijks. Ik denk dat ik dat maar vies ga oplossing met een extra argument (integer met aantal 3-vouden)

Verwijderd

in dat schema helpt select case inderdaad geen moer. wat je doet is gewoon naar je expertif functie een range (bereik) doorsturen die de eerste kolom van je cellen bevat en dan elke rij doorloopt tot je het uiteindelijke resultaat bekomt. zoals jij het aangeeft heeft de laatste vergelijking voorrang (oudere resultaten gaan verloren) zoiets bv. (ongetest)
Visual Basic:
1
2
3
4
5
6
7
8
9
10
11
12
13
sub testexpertif
  msgbox _
    expertif(range(worksheets(1).range("a1"),worksheets(1).range("a65536").end(xlup))
end sub

function ExpertIf(Vergelijkingen as range) as variant
 dim Vergelijking as range
 for each Vergelijking in vergelijkingen
  if vergelijking.value=vergelijking.offset(0,1).value then
   expertif=vergelijking.offset(0,2).value
  end if
 next
end function

[ Voor 5% gewijzigd door Verwijderd op 20-06-2005 15:22 ]


  • jsiegmund
  • Registratie: Januari 2002
  • Laatst online: 21-08 21:12
Antwoord voor mensen die het willen weten:

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
Function expertIF(ParamArray varExpr() As Variant)
expertIF = "geen"
Dim nieuweGevonden As Boolean
nieuweGevonden = False

' einde van parameterArray opzoeken
Dim maxIndex As Integer
maxIndex = UBound(varExpr)

' maxIndex moet een tweevoud zijn, uitrekenen hoevaak we moeten loopen
For i = 0 To maxIndex / 2
    ' nieuwe index specificeren
    Dim index2 As Integer
    index2 = i * 2
    ' logische test uitvoeren
    If (varExpr(index2) And (nieuweGevonden = False)) Then
        expertIF = varExpr(index2 + 1).Value
        nieuweGevonden = True
    End If
Next i


End Function


Misschien niet helemaal netjes maar voor mij werkt het goed genoeg.

[ Voor 27% gewijzigd door jsiegmund op 20-06-2005 15:41 ]


  • henkleerssen
  • Registratie: December 2000
  • Niet online

henkleerssen

Your life is as you narrate it

iCe01 schreef op maandag 20 juni 2005 @ 15:22:
Antwoord voor mensen die het willen weten:

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
Function expertIF(ParamArray varExpr() As Variant)
expertIF = "geen"
Dim nieuweGevonden As Boolean
nieuweGevonden = False

' einde van parameterArray opzoeken
Dim maxIndex As Integer
maxIndex = UBound(varExpr)

' maxIndex moet een tweevoud zijn, uitrekenen hoevaak we moeten loopen
For i = 0 To maxIndex / 2
    ' nieuwe index specificeren
    Dim index2 As Integer
    index2 = i * 2
    ' logische test uitvoeren
    If (varExpr(index2) And (nieuweGevonden = False)) Then
        expertIF = varExpr(index2 + 1).Value
        nieuweGevonden = True
    End If
Next i


End Function


Misschien niet helemaal netjes maar voor mij werkt het goed genoeg.
kan wel netter ja.. (dim i as integer bijvoorbeeld)... en je gaat er van uit dat parameters altijd een even aantal is (maxindex/2 levert anders een breuk op != integer waarde)?.. je gaat er wel gemakshalve van uit dat begin index nummer in vba 0 is... is toevallig ook zo.. maar om het zeker te zijn kun je bovenaan de module "option base 0" plaatsen . Doe dan ook gelijk bovenaan option explicit (Gaat die even zeuren dat bepaalde variabelen niet zijn gedefenieerd... maar daar voorkom je erger mee)....maar..hee het werkt blijkbaar voor jou ;)
Pagina: 1