2010-09-23 13 views
2

J'ai un formulaire avec un ComboBox (YearToBeBuilt) et deux champs textBox (Cost et YearofExpenditureCost). Tous les contrôles sont liés à une table principale et la table est mise à jour une fois que les sélections/entrées ont été faites sur le formulaire.Si [ComboBox] est une instruction null dans VBA/Access 2007

J'ai écrit une procédure en VB appelée ReCalcIt() qui effectue la procédure en cas d'appel suivant:

Private Sub ReCalcIt() 
If Me.YearToBeBuilt = "" Then 
    Me.YearofExpenditureCost = Me.Cost 
Else 
    Me.YearofExpenditureCost = Me.Cost * (1 + 0.031)^(Me.YearToBeBuilt - 2010) 
End If 
End Sub 

Quand j'ai écrit ce je pensais que cela procédez comme suit:

Si le ComboBox [YearToBeBuilt] est vide (par exemple, aucune sélection effectuée) puis la zone de texte [YearOfExpenditureCost] renverra la valeur de la zone de texte [Cost]. Sinon, le calcul pour YearofExpenditureCost est effectué.

Mais cela ne fonctionne pas la façon dont il devrait

Qu'est-ce que je fais mal? Je suis un VBA n00b alors peut-être ma syntaxe est incorrecte?

+0

Voulez-vous vraiment utiliser un exposant pour la dernière partie de votre calcul? Vous réalisez que 'Me.Cost * (1 + 0.031)^(Me.YearToBeBuilt - 2010)' est l'équivalent de x^N où N est le résultat de la différence entre YearToBeBuilt et 2010, donc si N = 3, ce sera Me.Cost * (1 + 0.031) en cubes? –

Répondre

4

Essayez avec

If Len(Me.YearToBeBuilt & vbNullString) = 0 

Ainsi, le code ressemblera à ceci:

Private Sub ReCalcIt() 
If Len(Me.YearToBeBuilt & vbNullString) = 0 Then 
    Me.YearofExpenditureCost = Me.Cost 
Else 
    Me.YearofExpenditureCost = Me.Cost * (1 + 0.031)^(Me.YearToBeBuilt - 2010) 
End If 
End Sub 
+0

Vous êtes génial - cela a fait exactement ce que je voulais qu'il fasse! Merci beaucoup! Donc, parce que j'essaie de comprendre ceci ... fondamentalement cette sélection vide dans la liste déroulante est interprétée comme une valeur de chaîne? Donc vous devez dire à la forme que si la valeur de la chaîne = 0 alors faites ceci ... etc. Sinon ... etc.? Est-ce exact? – myClone

+0

Oui, vous avez raison. L'interpréter comme une chaîne, voir sa longueur et vérifier si elle est 0. Je pense que cela devrait fonctionner aussi sans la partie vbNullString - vous devriez le tester, mais c'est plus sûr de cette façon. – CristiC

+0

Intéressant - merci! Fyi - le & vbNullString est nécessaire pour ma situation ... Je l'ai testé et cela n'a pas fonctionné sans cela inclus. – myClone

0

La manière habituelle est de dire:

If IsNull(MyControl) Then 

Voir aussi: Access VBA: If Form Value <> NULL then run query else, end if. - not doing anything

+0

Les versions récentes d'Access permettent d'autoriser ZLS dans le concepteur de table. Je ne sais pas si cela conduit au stockage de ZLS sauf si vous faites quelque chose de spécifique ou non, mais en utilisant juste Non IsNull() ne fonctionnera que de manière fiable 100% pour les champs qui interdisent ZLS. –

+0

J'ai testé avec Access 2010 et un formulaire basé sur une table qui a été délibérément configurée pour permettre ZLS. Même lorsqu'un champ (colonne) lié à un tel contrôle est rempli d'espace, le contrôle est renvoyé par If IsNull (ctl). – Fionnuala

+0

Vraiment? Eh bien, cela me semble être un bug. Que faire si vous utilisez un Null comme valeur par défaut (inconnu) et ZLS pour signifier "connu pour être vide"? Si un contrôle lié à ce champ renvoie Null quelle que soit la valeur stockée, il annule complètement la valeur de permettre le stockage des ZLS. Hmm. relisant, vous dites que s'il y a des espaces, c'est aussi Null? C'est vraiment inquiétant pour moi. –

0

Il me semble t Cela peut-il dépendre du format de la zone de liste déroulante? Si c'est un nombre, alors

If Len(Me.YearToBeBuilt & vbNullString) = 0 

ne fonctionne pas. Parce que le Me.YearToBeBuilt a une valeur de 0, et donc ce qui précède renvoie 1.

Je me demande s'il existe une méthode plus robuste? Peut-être

Me.YearToBeBuilt.ListIndex = -1