1
votes

Boucles dans Access VBA

Je suis un peu nouveau dans Access VBA et j'ai des problèmes avec ma boucle.

J'ai examiné divers livres, sites Web, demandé à divers amis. Actuellement, j'essaie de demander à un utilisateur de saisir deux caractères, puis si les deux caractères correspondent à une certaine combinaison, elle est censée correspondre à une valeur numérique, puis j'utilise la valeur dans un calcul de distance.

Les valeurs saisies par l'utilisateur sont des chaînes et tout le reste est déclaré comme double.

J'ai plus de 200 combinaisons que je teste et j'ai essayé les instructions case , DLookup , do while , do until < / code>, if et elseif boucles sans succès.

Je suis également limité par le service informatique et je ne peux pas utiliser le code DAO.

Toute aide serait grandement appréciée.


0 commentaires

3 Réponses :


1
votes

Je suggérerais d'abord de créer un tableau pour définir formellement les différentes combinaisons de caractères et la valeur correspondante pour chaque combinaison. Cela présente l'avantage que les combinaisons peuvent être facilement maintenues à l'avenir, plutôt que de définir de telles combinaisons dans le cadre de requêtes ou dans le code VBA.

Une telle table pourrait être aussi simple que de contenir trois champs:

  • Caractère 1 (texte)
  • Caractère 2 (texte)
  • Valeur (nombre)

 entrez la description de l'image ici

Vous pouvez ensuite remplir un tel tableau avec vos combinaisons valides:

 entrez la description de l'image here

Avec les combinaisons rigoureusement définies, vous avez de nombreuses options pour inviter l'utilisateur à saisir les deux caractères et à obtenir la valeur correspondante.

Un très Une approche simpliste pourrait consister à utiliser un formulaire avec trois zones de texte:

entrez la description de l'image ici

Ici, les deux premières zones de texte ne seraient pas liées et pourraient être appelée char1 et char2 , et la troisième zone de texte peut être appelée result et avoir un Propriété Source de contrôle égale à:

=DLookup("Value", "LookupTable", "char1 = '" & [char1] & "' and char2 = '" & [char2] & "'")

Cela donnerait le comportement suivant:

 entrez la description de l'image ici


13 commentaires

et vous n'utilisez pas non plus de jeux d'enregistrements DAO! (Je pense que c'était une tentative de vous lier les mains, et utiliser dlookup () à la place d'un reocrdset DAO est le plus excellent de votre part!


Salut Lee. Merci pour tout! J'ai cependant un léger problème. J'ai tout tapé comme vous l'avez dit Yoda, mais cela ne fonctionne pas pour une raison quelconque. Je reçois une erreur de #Name? Avez-vous des conseils pour y remédier? Merci encore pour toute votre aide. J'apprécie vraiment cela.


@Divingmickey De rien. Je suppose que le #Name apparaît dans la zone de texte de résultat? Si oui, les deux autres zones de texte sont-elles nommées char1 et char2 ?


Oui, le #Name? L'erreur est dans la zone de texte. J'ai char1 = StartNode et char2 = EndNode, les deux sont des chaînes. Le temps est double comme le reste de mes merveilleux nombres et ma table s'appelle NODES. Qu'est-ce que je fais mal Yoda?


Vos champs sont-ils nommés StartNode et EndNode ou vos zones de texte? Ou les deux? Avez-vous modifié tous les éléments de l'expression DLookup de manière appropriée, y compris le nom du champ Value ?


Mes champs sont nommés start et endnode. Mon champ de valeur s'appelle temps


start et endnode OU startnode et endnode ? Avez-vous nommé vos zones de texte de la même manière que vos champs, selon mon exemple? Avez-vous changé les noms de champ, de table et de zone de texte dans mon exemple de DLookup en fonction de vos noms de champ et de table?


Bonjour Lee (Yoda). Je suis passé en revue tout pour m'assurer que tout était correctement étiqueté. J'ai raté une boîte. Cela a éliminé l'erreur, mais cela ne me donne toujours pas la valeur numérique du «temps». Je vais revenir en arrière et vérifier mon code trois fois. Merci beaucoup pour toute votre aide à cet égard. J'espère que vous passez une excellente journée.


Bonjour Yoda. J'ai tout traversé et je ne sais pas pourquoi je ne comprends pas les valeurs.


@Divingmickey Pour vous assurer que vous comprenez ce qui se passe, je vous suggère de revenir aux bases: créez une nouvelle base de données dans Access et recréez les tables et le formulaire dans mon exemple ci-dessus jusqu'à ce que cela fonctionne, alors vous comprendrez, espérons-le, comment tout se passe fonctionne et ce qui ne va pas dans votre propre base de données.


Bonjour Lee. J'ai essayé cela et j'ai également essayé de démarrer une toute nouvelle session avec accès, j'ai essayé d'utiliser des zones de liste déroulante, des zones de texte, une combinaison de différentes zones et diverses boucles différentes - rien n'a fonctionné. J'ai toujours des problèmes avec ma sortie. Merci pour votre assistance continue


@Divingmickey Êtes-vous en train de dire que, après avoir créé une nouvelle table par ma table, avec des champs nommés selon mon exemple, et remplis avec des données selon mon exemple, et avec un formulaire créé avec trois zones de texte nommées par mon exemple, et avec le contrôle source pour l'ensemble de résultats selon mon exemple, que vous ne recevez pas le résultat que je démontre dans mon animation?


Oui. Je crois que mes mains sont liées par mon service informatique. Malheureusement. J'ai aussi beaucoup aimé votre solution simple. Cela fonctionne très bien à la maison, mais pas au travail malheureusement. Il nous est également interdit de créer et d'utiliser des macros dans Excel. Je me débrouille avec certaines choses dans Access car il n'est pas aussi largement utilisé qu'Excel. Avez-vous d'autres suggestions?



0
votes

Pensez à utiliser Access comme base de données et application d'interface graphique en stockant vos plus de 200 combinaisons dans une table avec la valeur numérique correspondante. Ensuite, utilisez un filtre de requête SQL par entrée utilisateur et utilisez la valeur résultante pour les calculs nécessaires. Ci-dessous, vous devez créer et utiliser quatre objets Access : table, requête, formulaire et module.

Table (tblCombinations)

Public Function Distance_Calculation(num_value As Long) As Double
   ...
   Distance_Calculation = some_value 
End Function

SQL (aucune boucle nécessaire; utilisation des valeurs de contrôle du formulaire d'accès)

SELECT c.combn1, c.combn2, Distance_Calculation(c.numeric_value) As distance_result
FROM tblCombinations c
WHERE c.combn1 = Forms!myForm!myUserInputField1
  AND c.combn2 = Forms!myForm!myUserInputField2

Et même transmettre la valeur numérique nécessaire dans le calcul de la distance formule qui peut être une fonction VBA dans un module standard:

SELECT c.combn1, c.combn2, c.numeric_value
FROM tblCombinations c
WHERE c.combn1 = Forms!myForm!myUserInputField1
  AND c.combn2 = Forms!myForm!myUserInputField2

VBA (place dans le module standard) p>

 id  combn1  combn2  numeric_value
  1       A       B            150  
  2       C       D            225
  3       E       F            100 
  4       G       H             75
  5       I       J            200
...


1 commentaires

Merci à tous pour votre aide. Cela m'a rendu nerveux et a rendu mes cheveux gris. Malheureusement, je rencontre toujours des problèmes pour obtenir les résultats numériques. Je suppose que je vais mourir mes cheveux ce week-end



0
votes

Vous pouvez utiliser la fonction de type suivante dans votre bouton de formulaire de résultat ou après l'événement sur les deux zones de texte- Dim resultValue as Integer Si DCount ("numeric_value", "tblCombinations", "[combn1] = '" & Forms! MyForm! MyUserInputField1 & "' and [combn2] = '" & Forms! MyForm! MyUserInputField2 & "'")> 0 alors

  txtResult = 0

Sinon Msgbox "Une telle combinaison n'existe pas. Veuillez vérifier la combinaison", vbinformation, "Information"

  resultValue = Dlookup("numeric_value", "tblCombinations", "[combn1] = '" & Forms!myForm!myUserInputField1 & "' and [combn2] = '" & Forms!myForm!myUserInputField2 & "'")

   txtResult = Distance_Calculation(resultValue) 

Fin si


0 commentaires