2017-06-01 4 views
1

Commençons par dire que ma connaissance du code est limitée au mieux. Je comprends généralement les concepts, mais n'a jamais été très bon à les mettre en œuvre. Cela dit, voici un extrait de code d'un projet qui est tombé sur mes genoux.Utilisation de caractères génériques dans VBA pour Microsoft Access

Option Compare Database 
Private Sub Form_Current() 
If IsNull(Me![OPT-78 (5900EL)]) Then 
    Me![OPT-78 (5900EL)].Visible = False 
    Me![OPT-78 (5900EL) Label].Visible = False 
Else 
    Me![OPT-78 (5900EL)].Visible = True 
    Me![OPT-78 (5900EL) Label].Visible = True 
End If 
If IsNull(Me![OPT-78 (7900EL)]) Then 
    Me![OPT-78 (7900EL)].Visible = False 
    Me![OPT-78 (7900EL) Label].Visible = False 
Else 
    Me![OPT-78 (7900EL)].Visible = True 
    Me![OPT-78 (7900EL) Label].Visible = True 
End If 
If IsNull(Me![OPT-152 (4310B)]) Then 
    Me![OPT-152 (4310B)].Visible = False 
    Me![OPT-152 (4310B) Label].Visible = False 
Else 
    Me![OPT-152 (4310B)].Visible = True 
    Me![OPT-152 (4310B) Label].Visible = True 
End If 

Ceci est situé à l'intérieur du formulaire a de l'événement "current". Maintenant, je sais que les jokers pourraient limiter toutes ces déclarations, sinon d'autres, à une simple et simple solution de déclaration, mais je n'ai pas réussi à les faire fonctionner. J'ai essayé *,%, __, et?, Mais pas de chance. Il y a BEAUCOUP plus de déclarations, sinon d'autres, qui devront être écrites, alors j'espère qu'il y aura une solution plus propre.

Merci!

+0

Peut-être une déclaration 'select' peut être travaillé pour raccourcir votre code un peu? – UnseenSpecter

Répondre

1

Je commencerais en créant un sous pour gérer le réglage de la visibilité:

Sub SetVis(controlName as String) 
    Dim vis as Boolean 
    vis = Not IsNull(Me.Controls(controlName)) 
    Me.Controls(controlName).Visible = vis 
    Me.Controls(controlName & " Label").Visible = vis 
End sub 

Ensuite, vous pouvez conduire que sous d'une boucle, peut-être par une boucle sur la collection Controls du formulaire pour trouver ceux d'intérêt.

Dim c 
For Each c in Me.Controls 
    'some If statement here to see if this is a control you're interested in 
    'Might also want to check that the control type is a textbox so you can 
    ' skip the labels 
    If c.Name like "OPT*" And Not c.Name like "*Label" Then 
     SetVis CStr(c.Name) 
    End if 
Next c 

Ou une simple boucle basée sur un réseau fixe de noms:

Dim c 
For Each c In Array("OPT-78 (5900EL)", "OPT-78 (7900EL)", "OPT-152 (4310B)") 
    SetVis CStr(c) 
Next c 
+0

Notez (aussi @Nogg) que si une étiquette est attachée à sa zone de texte, il vous suffit de définir la zone de texte visible/invisible, l'étiquette est automatiquement définie en conséquence. – Andre

+0

Merci les gars. @ Andre: J'ai trouvé que l'étiquette suit la zone de texte avec la visibilité désactivée, mais quand je la retourne plus tard dans le formulaire, elle ne le fait pas. Je ne sais pas pourquoi. @Tim: Je regardais le code que vous avez posté et je me demandais si cela me permettrait de saisir le nom des zones de texte avec des noms différents. En d'autres termes, j'essaie de saisir la zone de texte OPT-1, OPT-12A, OPT-435 et de les faire basculer en fonction de si la valeur à l'intérieur est nulle. Je ne suis pas vraiment familier avec la façon de configurer les boucles et les whiles. J'ai suivi un cours de programmation très basique il y a environ 8 ans. ;) – Nogg

+0

Voir mes modifications ci-dessus (tous non testés, mais devrait vous donner l'idée générale) –