[VB] Probleem met een IF constructie niet meer dan 8 OR's?

Pagina: 1
Acties:

  • Shadowzon
  • Registratie: Januari 2001
  • Laatst online: 27-05 17:04
ik heb de volgende code voor een formulier in Access.

code:
1
2
3
4
5
6
7
8
9
10
Private Sub choice10_Exit(Cancel As Integer)

If choice10 = choice1 Or choice10 = choice2 Or choice10 = choice3 Or choice10 = choice4 
Or choice10 = choice5 Or choice10 = choice6 Or choice10 = choice7 Or choice10 = choice8 
Then

MsgBox "You already filled in this value"

End If
End Sub


Dit werkt goed alleen nu wil ik bij deze IF statement nog een OR toevoegen. Maar dat pakt hij dus niet :-( Geeft een melding dat er een THEN moet staan. hieruit concludeer ik dat je maar 8 or's in een IF statement kwijt kunt?

Ik moet er namelijk 20 in kwijt..

Dus de volgende coderegel moet dus nog geadd worden in de bovenstaande code.

code:
1
Or choice10 = choice 9


Dit wordt dus stomweg geweigert. Heeft iemand een oplossing hiervoor?

[ Voor 4% gewijzigd door Shadowzon op 18-12-2003 11:03 ]


  • AtleX
  • Registratie: Maart 2003
  • Niet online

AtleX

Tyrannosaurus Lex 🦖

Visual Basic:
1
or choice10 > 0


Als ik je code goed begrijp controleer je of choice10 al een waarde heeft. ik ben geen VB-kenner maar als je gewoon controleert of de lengte van de waarde van choice10 groter is dan 0, dan weet je het ook. Heeft choice10 een waarde is namelijk de lengte groter dan 0.

Sole survivor of the Chicxulub asteroid impact.


  • bigben04
  • Registratie: December 2001
  • Laatst online: 07-05 10:38
Waarschijnlijk te simpel gedacht, maar 'wrapt' VB de regel niet naar de volgende regel door zodat 'ie daarom de Then niet kan vinden? Dit zou je kunnen verhelpen door een _ aan het eind van je regel te doen, dan een harde enter en op de volgende regel verdergaan met je OR's.

  • Shadowzon
  • Registratie: Januari 2001
  • Laatst online: 27-05 17:04
Big Ben:

Dit heb ik eventjes gedaan omdat de layout er hier heel anders uit komt te zien. Ik heb deze OR's allemaal achterelkaar staan in 1 regel in de IF Statement

@ Others:

Heb 21 combobox velden op mn Form. En bij ieder veld mag niet dezelfe waarde gekozen worden als AL de waardes ingevult in de comboboxen daarrvoor.

[ Voor 36% gewijzigd door Shadowzon op 18-12-2003 11:02 ]


  • bigben04
  • Registratie: December 2001
  • Laatst online: 07-05 10:38
Shadowzon schreef op 18 december 2003 @ 11:00:
Dit heb ik eventjes gedaan omdat de layout er hier heel anders uit komt te zien. Ik heb deze OR's allemaal achterelkaar staan in 1 regel in de IF Statement
Ja oke, maar het zou misschien kunnen dat VB deze lange regel stiekem intern afbreekt o.i.d., dus je zou nog kunnen proberen om hem zelf handmatig af te breken op hierboven beschreven manier.

  • Shadowzon
  • Registratie: Januari 2001
  • Laatst online: 27-05 17:04
BigBen:

Werkt helaas niet....

  • GigaDave56
  • Registratie: Juni 2001
  • Laatst online: 14-12-2025
Shadowzon schreef op 18 december 2003 @ 11:00:

@ Others:

Heb 21 combobox velden op mn Form. En bij ieder veld mag niet dezelfe waarde gekozen worden als AL de waardes ingevult in de comboboxen daarrvoor.
Moeten alle andere 'choice'-waardes ook nog gecontroleerd worden op duplicaten?
Nu controleer je alleen of choice10 dubbel voorkomt. Dan komen er nog aardig wat regels code bij.
Kan je met Access met arrays werken? Dan kan je jezelf mbv een do-loop een hoop werk besparen.

Not so Giga One
> I'd sell my soul for you, babe
> For money to burn, for you
> I'd give you all and have none, babe
> Just to, just to, to have you here by me... [Scooter - Rebel yell]


Verwijderd

Shadowzon schreef op 18 december 2003 @ 10:47:

code:
1
Or choice10 = choice 9
als die spatie tussen "choice" en "9" geen typo is, dan zou ik nog eens checken als ik jou was. Anders zou ik als compiler ook Then verwachten in plaats van 9 :)

  • EXX
  • Registratie: Juni 2001
  • Laatst online: 19-05 18:19

EXX

EXtended eXchange

Kun je het niet omzeilen door gebruik de maken van een paar booleans:

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
Private Sub choice10_Exit(Cancel As Integer)

condition1 = ( choice10 = choice1 Or choice10 = choice2  Or 
choice10 = choice3 Or choice10 = choice4 Or choice10 = choice5)
condition2 = (choice10 = choice6 Or choice10 = choice7 Or 
choice10 = choice8 Or choice10 = choice9)

If (condition1) Or (condition2)
Then

MsgBox "You already filled in this value"

End If
End Sub

For it is the doom of men that they forget...           Huidige en vroegere hardware specs         The Z80 is still alive!


  • Varienaja
  • Registratie: Februari 2001
  • Laatst online: 14-06-2025

Varienaja

Wie dit leest is gek.

Ik zal wel gek zijn, maar as ik moest uitzoeken of 10 waarden uniek waren, dan maakte ik er een verzameling van. Als die verzameling nog steeds uit 10 elementen bestaat, dan zijn ze uniek.

Siditamentis astuentis pactum.


  • Shadowzon
  • Registratie: Januari 2001
  • Laatst online: 27-05 17:04
Heb het werkend gekregen.. Gewoon de pc opnieuw opgestart en toen pakte hij 't wel..

Vaag hoor.. :)

Verwijderd

Misschien een heel stom idee maar kan je alle combo´s niet afhankelijk maken van elkaar. Hiermee bedoel ik wanneer X is gekozen in comboA dan is dat niet meer mogelijk in de rest. De list wordt dus geupdated. En ga zo maar door. Dit zou je heel snel kunnen oplossen met een for each next lus.

Hoe heb je de combovalues opgebouwd. Als het met een SELECT FROM statement is kan het heel snel door er een NOT IN (valuecombo) in te vullen. Dat lijkt mij iets sneller en logischer (Om maar niet te spreken van onderhoudbaar, leesbaar, etc)

Succes ermee

  • LauPro
  • Registratie: Augustus 2001
  • Laatst online: 22:20

LauPro

Prof Mierenneuke®

http://msdn.microsoft.com...ence/objects/optgroup.asp

Kan je daar niet wat mee? 21 Select-boxes is een beetje onzin natuurlijk...

Inkoopacties - HENK terug! - Megabit
It is a war here, so be a general!


  • farlane
  • Registratie: Maart 2000
  • Laatst online: 22-05 16:53
En anders een control array die je kunt indexeren in een of meerdere for-nex loops.

Op een of andere manier denk ik dat je vergelijking simpleren kan.

Somniferous whisperings of scarlet fields. Sleep calling me and in my dreams i wander. My reality is abandoned (I traverse afar). Not a care if I never everwake.


  • Maasluip
  • Registratie: April 2002
  • Laatst online: 08:44

Maasluip

Kabbelend watertje

Waarom doe je dit met zo'n onoverzichtelijke if..then?
Waarom niet
Visual Basic:
1
2
3
Select case choice10
    case choice1,choice2,choice3,choice4,choice5,choice6,choice7: do stuff
End Select

Maar goed, als het al weer werkt. Een van mijn collega's hadden daar een geweldig gezegde voor: 'Ein boot macht immer gut'

[ Voor 19% gewijzigd door Maasluip op 19-12-2003 09:33 . Reden: Mijn VB begint al te roesten ]

Signatures zijn voor boomers.


  • RobIII
  • Registratie: December 2001
  • Niet online

RobIII

Admin Devschuur®

^ Romeinse Ⅲ ja!

(overleden)
't zit wel degelijk in je gebruik van de underscore ( _ ), zoals bigben04 al aangaf

Dit werkt gewoon onder VB6:
Visual Basic 6:
1
2
3
4
5
6
7
    If choice10 = choice1 Or choice10 = choice2 Or choice10 = choice3 Or choice10 = choice4 _
        Or choice10 = choice5 Or choice10 = choice6 Or choice10 = choice7 Or choice10 = choice8 _
        Or choice10 = choice9 Or choice10 = choice11 Or choice10 = choice12 Or choice10 = choice13 _
        Or choice10 = choice14 Or choice10 = choice15 Or choice10 = choice16 Or choice10 = choice17 _
        Then
    
    End If


Copy/paste maar, dit werkt! Mijn gok: je hebt geen spatie voor de _ geplaatst ofzo...

Los daarvan ging ik voor een array ofzo, en daar doorheenlussen:

Visual Basic 6:
1
2
3
4
5
6
7
8
Dim bOK as boolean
Dim T as long

bOK = False
While not bOK and T<25
  bOK = bOK or Choice(T)
  T = T + 1
Wend


Ik gebruik in dit geval een while lus omdat je bij de eerste de beste True kunt kappen (je OR-ed immers de waarden). Natuurlijk kun je ook met een for-lus er doorheen lopen, dat zal bij 25 ofzo waardes niet veel uitmaken (tenzij het een onderdeel is in een andere lus ofzo). Maar dan vind ik bovenstaand toch nog altijd mooier. Wat jij wil ;)

Helaas ondersteunt VB geen short-cutting (kom effe niet op de juiste term), waardoor er in een statement als hierboven (die hele lange if ... or ... or ... or ...) helaas toch alle expressies worden geëvalueerd. In dit geval zou VB na de eerste de beste True de rest niet meer hoeven evalueren, maar dat gebeurt dus toch.

[ Voor 51% gewijzigd door RobIII op 19-12-2003 09:56 ]

There are only two hard problems in distributed systems: 2. Exactly-once delivery 1. Guaranteed order of messages 2. Exactly-once delivery.

Je eigen tweaker.me redirect

Over mij


  • jvdmeer
  • Registratie: April 2000
  • Laatst online: 13:02
RobIII schreef op 19 december 2003 @ 09:49:
Helaas ondersteunt VB geen short-cutting (kom effe niet op de juiste term), waardoor er in een statement als hierboven (die hele lange if ... or ... or ... or ...) helaas toch alle expressies worden geëvalueerd. In dit geval zou VB na de eerste de beste True de rest niet meer hoeven evalueren, maar dat gebeurt dus toch.
Volgens de Delphi-help:
Boolean short-circuit evaluation

In the {$B+} state, the compiler generates code for complete Boolean expression evaluation. This means that every operand of a Boolean expression built from the and and or operators is guaranteed to be evaluated, even when the result of the entire expression is already known.
In the {$B-} state, the compiler generates code for short-circuit Boolean expression evaluation, which means that evaluation stops as soon as the result of the entire expression becomes evident in left to right order of evaluation.

  • Nvidiot
  • Registratie: Mei 2003
  • Laatst online: 11-01 23:32

Nvidiot

notepad!

VB != Delphi :)

What a caterpillar calls the end, the rest of the world calls a butterfly. (Lao-Tze)


  • farlane
  • Registratie: Maart 2000
  • Laatst online: 22-05 16:53
RobIII schreef op 19 december 2003 @ 09:49:
Visual Basic 6:
1
2
3
4
5
6
7
8
Dim bOK as boolean
Dim T as long

bOK = False
While not bOK and T<25
  bOK = bOK or Choice(T)
  T = T + 1
Wend


Ik gebruik in dit geval een while lus omdat je bij de eerste de beste True kunt kappen (je OR-ed immers de waarden). Natuurlijk kun je ook met een for-lus er doorheen lopen, dat zal bij 25 ofzo waardes niet veel uitmaken (tenzij het een onderdeel is in een andere lus ofzo). Maar dan vind ik bovenstaand toch nog altijd mooier. Wat jij wil ;)
Visual Basic 6:
1
2
3
4
5
6
7
8
9
10
Dim bOK as boolean
Dim T as long

bOK = False
For T = 0 to 24
  If Choice(T) Then
    bOK = True
    Exit For
  Endif
Next T

Somniferous whisperings of scarlet fields. Sleep calling me and in my dreams i wander. My reality is abandoned (I traverse afar). Not a care if I never everwake.


  • RobIII
  • Registratie: December 2001
  • Niet online

RobIII

Admin Devschuur®

^ Romeinse Ⅲ ja!

(overleden)
farlane schreef op 19 december 2003 @ 12:11:
[...]


Visual Basic 6:
1
2
3
4
5
6
7
8
9
10
Dim bOK as boolean
Dim T as long

bOK = False
For T = 0 to 24
  If Choice(T) Then
    bOK = True
    Exit For
  Endif
Next T
IMHO is "exit for" toch een tikkie smeriger dan een mooie while lus ;)
(Overigens was een do...loop constructie idem mooi geweest ;) )

There are only two hard problems in distributed systems: 2. Exactly-once delivery 1. Guaranteed order of messages 2. Exactly-once delivery.

Je eigen tweaker.me redirect

Over mij


Verwijderd

Is het niet het gemakkelijkste als je je volgende combobox pas opbouwd als de vorige ingevuld is ? dan kan je gemakkelijk een collectie maken gans in begin van je programma. Die collectie in combo1 steken, wanneer een selectie gedaan die verwijderen uit de collectie. Nu vul je combo2 op met die collectie, waardoor de gebruiker nooit 2x hetzelfde kan selecteren en zo ga je door tot je 21ste combo

  • Mickman
  • Registratie: Juni 2001
  • Laatst online: 29-03 18:11
Weleens van een Case statement gehoord??

  • jvdmeer
  • Registratie: April 2000
  • Laatst online: 13:02
Goh... |:(

Ik reageerde op RobIII met zijn "short-cuttting". Door nu de juiste term "short-circuit evaluating" te noemen incl. wat uitleg van wel/niet short-cutting, hoopte ik voor sommige wat duidelijkheid te verschaffen.

Sorry dat het uit de Delphi-help kwam.

[ Voor 4% gewijzigd door jvdmeer op 19-12-2003 16:10 . Reden: spelvaut ]


  • RobIII
  • Registratie: December 2001
  • Niet online

RobIII

Admin Devschuur®

^ Romeinse Ⅲ ja!

(overleden)
...short-circuit evaluating! Nu weet ik het weer ;)

Thanx jvdmeer ;)

There are only two hard problems in distributed systems: 2. Exactly-once delivery 1. Guaranteed order of messages 2. Exactly-once delivery.

Je eigen tweaker.me redirect

Over mij

Pagina: 1