Précédent   Forum des professionnels en informatique > Logiciels > Microsoft Office > Access > VBA Access
VBA Access Le forum pour les questions relatives au code VBA sous Access, et à son environnement de développement VBE.
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 28/02/2011, 15h31   #1
Invité de passage
 
Inscription : mars 2009
Messages : 27
Détails du profil
Informations forums :
Inscription : mars 2009
Messages : 27
Points : 2
Points : 2
Par défaut saisie et recherche département

Bonjour,

Etant débutant en programmation et ayant repris sur un BTS IG en alternance option dev après un début caothique de ma vie proféssionnelle, je vous demande à l'aide.

Voila, maintenant que ma présentation est faite je vous explique mon problème !!

Pour être plus clair :

Notre prof de programmation en VBA nous a demandée un algorithme permettant de faire la saisie de 99 départements avec une recherche par numéro département ou nom département.

- L'utilisateur devra saisir les 99 départements lui même. La syntaxe des saisie devra être numéro_département suivi d'un espace et du nom_département.
- Les données devront être stockées dans un tableau.
- une recherche par numéro ou nom département devra être possible.

Ci-dessous le début de mon code : (on se moque pas ^^)

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
Sub dep()
Dim compteur As Integer
Dim tableau(99) As String
Dim numdep As Integer
Dim nomdep As String
Dim saisie As String
 
 
For compteur = 1 To 99
 
    saisie = InputBox("Veuillez rentrer le numéro d'un département suivi de son nom")
    numdep = Left$(saisie, 2)
    tableau(compteur) = numdep ' j'arrive a extraire le numéro departement mais pas le nom
 
Next compteur
Debug.Print numdep
   End Sub
En vous remerciant par avance de votre aide.

Cordialement,
discretos39 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 28/02/2011, 19h12   #2
Modérateur
 
Homme René MAROT
Inscription : octobre 2005
Messages : 5 462
Détails du profil
Informations personnelles :
Nom : Homme René MAROT
Localisation : Canada

Informations forums :
Inscription : octobre 2005
Messages : 5 462
Points : 7 539
Points : 7 539
Bonjour normalement le forum ne répond pas au devoir de classe mais comme tu as déjà fait l'effort de proposer une réponse je vais répondre à la question : Comment récupérer le libellé ?

La commande à utiliser est Mid().

Note que dans ta solution tu enregistres le numéro de département ... mais où vas-tu mettre le nom du département ?

Bon succès dans tes études.

A+
__________________
Vous voulez une réponse rapide et efficace à vos questions téchniques ? Ne les posez pas en message privé mais dans le forum, vous bénéficiez ainsi de la compétence et de la disponibilité de tous les contributeurs.
marot_r est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 28/02/2011, 21h02   #3
Invité de passage
 
Inscription : mars 2009
Messages : 27
Détails du profil
Informations forums :
Inscription : mars 2009
Messages : 27
Points : 2
Points : 2
Bonsoir,

J'ai réussi à prendre l'autre partie avec nomdep = Mid(saisie, 4, 20) Maintenant se pause la grande question des conditions et je ne sais pas si mon mid va m'aider pour çà ...

Code :
1
2
3
4
5
6
numdep = Left$(saisie, 2)
    tableau(compteur) = numdep
    nomdep = Mid(saisie, 4, 20)
        If numdep > 2 Or numdep = 0 Then
            numdep = MsgBox("attention")
        End If
J'aimerais dire si numdep > 2 caractères (et non supérieur au chiffre 2 ) alors msgbox erreur. Dois je mettre une boucle ? J'ai essayé mais ma boucle se lance et ne s'arrête plus ^^

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
For compteur = 1 To 2
    saisie = InputBox("Veuillez rentrer le numéro d'un département suivi de son nom")
 
        While numdep <> 2 'caractere
            saisie = InputBox("Veuillez rentrer le numéro d'un département suivi de son nom")
        Wend
 
    numdep = Left$(saisie, 2)
    tableaunum(compteur) = numdep
    nomdep = Mid(saisie, 4, 20)
    tableaunom(compteur) = nomdep
 
Debug.Print numdep & nomdep
Next compteur
Par la même occasion, si l'utilisateur vient à taper le nom du département avant le numéro. Comment dois je m'y prendre?

Merci de m'avoir répondu !
discretos39 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 28/02/2011, 22h07   #4
Modérateur
 
Homme René MAROT
Inscription : octobre 2005
Messages : 5 462
Détails du profil
Informations personnelles :
Nom : Homme René MAROT
Localisation : Canada

Informations forums :
Inscription : octobre 2005
Messages : 5 462
Points : 7 539
Points : 7 539
Bon évidement j'ai toutes les réponses :-) ... mais comme je l'ai dit précédement, il est meilleur que tu fasses ton apprentissage par toi-même.

Déjà tu a un problème ici numdep <> 2. Tu compares une chaines de caractères d'au plus 2 caractères (à cause de Left()) avec le chiffre 2. Donc cela ne devrait marché que si ton utilisateur a tapé "2" et rien d'autre.

Pour pouvoir avancer autrement qu'au hazard, il serait préférable que tu lises au moins une fois la liste des fonctions de VBA. Concentres toi sur celles qui manipulent les chaînes car c'est celle dont tu vas avoir besoin dans l'immédiat.

Ce que tu veux vérifier finalement c'est que le code du département soit supérieur ou égale à 00 et que le code du département soit inférieur ou égale à 99 (et n'oublie pas que ce sont des chaînes de caractères).

Si ces condition ne sont pas remplies, probablement que l'utilisateur s'est trompé et qu'il n'a pas respecter ton format.

A+
__________________
Vous voulez une réponse rapide et efficace à vos questions téchniques ? Ne les posez pas en message privé mais dans le forum, vous bénéficiez ainsi de la compétence et de la disponibilité de tous les contributeurs.
marot_r est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 01/03/2011, 07h30   #5
Membre du Club
 
Inscription : mai 2010
Messages : 36
Détails du profil
Informations personnelles :
Âge : 61
Localisation : France, Paris (Île de France)

Informations forums :
Inscription : mai 2010
Messages : 36
Points : 45
Points : 45
Bonjour

Petite contribution au problème posé : attention aux numéros de département d'outre-mer ils ont 3 chiffres.
Bon travail.
Nourson est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 01/03/2011, 18h41   #6
Modérateur
 
Homme René MAROT
Inscription : octobre 2005
Messages : 5 462
Détails du profil
Informations personnelles :
Nom : Homme René MAROT
Localisation : Canada

Informations forums :
Inscription : octobre 2005
Messages : 5 462
Points : 7 539
Points : 7 539
Merci Norson et dans cas le test sur 00 à 99 ne marche pas.
Donc il conviendrait aussi de vérifier que 3ième caractères est bien un espace.

A+
__________________
Vous voulez une réponse rapide et efficace à vos questions téchniques ? Ne les posez pas en message privé mais dans le forum, vous bénéficiez ainsi de la compétence et de la disponibilité de tous les contributeurs.
marot_r est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 02/03/2011, 07h58   #7
Membre Expert
 
Inscription : août 2006
Messages : 1 435
Détails du profil
Informations forums :
Inscription : août 2006
Messages : 1 435
Points : 1 753
Points : 1 753
Bonjour,
Une solution avec un type défini et la fonction Split
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
 
Type dep          'définition du type de variable
 texte As String
 NumDep As String
 departement As String
End Type
 
Sub traitement(d As dep) 'la procedure qui éclate le texte
 Dim s() As String
 s = Split(d.texte, " ")      'on eclate le texte dans un tableau
 d.NumDep = s(0)            'le premier est le numéro du département
 d.departement = ""
 For i = 1 To UBound(s)    'on concatène le reste
  d.departement = d.departement & s(i) & " "
 Next i
End Sub
 
Sub test()
 Dim s As dep
 s.texte = "21 Code d'or"    'on initialise le texte
 Call traitement(s)
 Debug.Print s.NumDep, s.departement  'on affiche le résultat dans la fenêtre Execution
End Sub
helas est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 02/03/2011, 18h49   #8
Invité de passage
 
Inscription : mars 2009
Messages : 27
Détails du profil
Informations forums :
Inscription : mars 2009
Messages : 27
Points : 2
Points : 2
Bonjour,

Merci Helas, mais hélas ^^ je n'attendais pas une réponse toute faite. Je suis plus d'avis avec marot_r "un apprentissage par moi même". J'ai bien pris note de tout vos commentaires à tous et vous en remercie. J'ai donc utilisé le split pour séparer les 2 champs (en plus simple que Helas certe mais je ne veux pas me compliquer plus la tâche pour l'instant et m'embrouiller).

Code :
1
2
3
 
        NumDep = Split(saisie, " ")(0)
        nomdep = Split(saisie, " ")(1)
Cependant je n'arrive pas à placer mes conditions :

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
 
For compteur = 1 To 2
 
    saisie = InputBox("Veuillez rentrer le numéro d'un département suivi de son nom")
 
    If NumDep >= 1 And NumDep <= 99 Then
        NumDep = Split(saisie, " ")(0)
        nomdep = Split(saisie, " ")(1)
    Else
    Do Until NumDep >= 1 And NumDep <= 99
        saisie = InputBox("Veuillez rentrer le numéro d'un département suivi de son nom")
    Loop
 
Next compteur
 
    Debug.Print NumDep, nomdep
Mais j'ai un message comme quoi il ne trouve pas le next. Donc ma question est : peut on incrémenter une boucle until dans un for?
discretos39 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 02/03/2011, 22h20   #9
Modérateur
 
Homme René MAROT
Inscription : octobre 2005
Messages : 5 462
Détails du profil
Informations personnelles :
Nom : Homme René MAROT
Localisation : Canada

Informations forums :
Inscription : octobre 2005
Messages : 5 462
Points : 7 539
Points : 7 539
Bon j'ai craqué voici une solution :o) mais tu l'avait presque.

Code :
1
2
3
4
5
6
 
Do 
    saisie = InputBox("Veuillez rentrer le numéro d'un département suivi de son nom")
    NumDep = Split(saisie, " ")(0)
    nomdep = Split(saisie, " ")(1)
Loop Until NumDep >= 1 And NumDep <= 99
Ça c'est ta boucle pour qui vérifie que tes données sont correctes. Note que tu n'enforces pas ta règle qui veut que le numéro de département soit sur 2 positions numériques.

Tu peux très bien imbriquer des boucles dans des boucles.

Par exemple ici on va avoir un

For ... Next compteur

et à l'intérieur un do ... until

Exemple de boucles imbriquées

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
 
do 
 
   for 
 
       for 
 
           for
 
              do until
 
                 for 
                 next
 
                 do while
                 loop
 
              loop
 
           next
 
       next
 
   next
 
loop while
A+
__________________
Vous voulez une réponse rapide et efficace à vos questions téchniques ? Ne les posez pas en message privé mais dans le forum, vous bénéficiez ainsi de la compétence et de la disponibilité de tous les contributeurs.
marot_r est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 03/03/2011, 06h13   #10
Membre Expert
 
Inscription : août 2006
Messages : 1 435
Détails du profil
Informations forums :
Inscription : août 2006
Messages : 1 435
Points : 1 753
Points : 1 753
Bonjour,
il me semble que nomdep = Split(saisie, " ")(1) ne retourne que la première partie du nom de département
qu'en est-il de la saisie 21 Cote d'or ou 94 Val de Marne ?
helas est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 03/03/2011, 14h32   #11
Invité de passage
 
Inscription : mars 2009
Messages : 27
Détails du profil
Informations forums :
Inscription : mars 2009
Messages : 27
Points : 2
Points : 2
Bonjour,
En effet Hellas, pour les noms de département à plusieurs champs. J'ai été obligé de m'inspirer de ton code. Maintenant j'ai cela :

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
For compteur = 1 To 2
 
    saisie = InputBox("Veuillez rentrer le numéro d'un département suivi de son nom")
    s = Split(saisie, " ")
    NumDep = s(0)
    cdep = Len(NumDep)
    nomdep = ""
 
 
            While cdep <> 2
                saisie = InputBox("Veuillez rentrer 2 chiffres pour les numéros département")
                s = Split(saisie, " ")
                NumDep = s(0)
                cdep = Len(NumDep)
                nomdep = ""
                    For i = 1 To UBound(s)
                        nomdep = nomdep & s(i) & " "
                    Next i
            Wend
 
    For i = 1 To UBound(s)
        nomdep = nomdep & s(i) & " "
    Next i
 
 
Debug.Print NumDep & nomdep & Len(NumDep)
 
Next
 
End Sub
Mais j'ai toujours des problèmes avec mes boucles qui ne sont pas prises en compte.
Exemple, si je tape un numdep <> 2, le for compteur continue sa boucle sans pauser de question sur la quantité des caractères de mon numéro département.

Pour information, j'ai essayé comme ça mais sans succès :
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
 
For compteur = 1 To 2
    saisie = InputBox("Veuillez rentrer le numéro d'un département suivi de son nom")
    s = Split(saisie, " ")
    NumDep = s(0)
    cdep = Len(NumDep)
    nomdep = ""
 
  Do
    saisie = InputBox("Veuillez rentrer le numéro d'un département suivi de son nom")
    s = Split(saisie, " ")
    NumDep = s(0)
    cdep = Len(NumDep)
    nomdep = ""
        For i = 1 To UBound(s)
            nomdep = nomdep & s(i) & " "
        Next i
 
Loop Until cdep=2
Next
Merci pour tout !
discretos39 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 03/03/2011, 18h54   #12
Membre Expert
 
Inscription : août 2006
Messages : 1 435
Détails du profil
Informations forums :
Inscription : août 2006
Messages : 1 435
Points : 1 753
Points : 1 753
Bonsoir,
Plus simplement
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
 
Do
    saisie = InputBox("Veuillez rentrer le numéro d'un département suivi de son nom")
    s = Split(saisie, " ")
    NumDep = s(0)
    If (NumDep="") Or Not IsNumeric(NumDep) Then Exit Do    'sortie sur saisie nulle ou n'est pas un nombre
 
    Select case CLng(NumDep))
    Case 1 To 95   'si numero valide
      nomdep = ""
      For i = 1 To UBound(s)
            nomdep = nomdep & s(i) & " "
      Next i
 
    Case Else        'sinon message
      MsgBox("Département invalide")
    End Select 
 
    '......
 
Loop
helas est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 06/03/2011, 20h07   #13
Invité de passage
 
Inscription : mars 2009
Messages : 27
Détails du profil
Informations forums :
Inscription : mars 2009
Messages : 27
Points : 2
Points : 2
Bonjour,

Pourriez vous me dire pourquoi mon code n'arrive pas à terminer sa boucle principale FOR. Lorsque je l'exécute il me dit next sans for et souligne le dernier NEXT.

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
For compteur = 1 To 2
 
    saisie = InputBox("Veuillez rentrer le numéro d'un département suivi de son nom")
    s = Split(saisie, " ")
    NumDep = s(0)
 
        Select Case NumDep
            Case 1 To 95
            NumDep = ""
                For i = 1 To UBound(s)
                    nomdep = nomdep & s(i) & " "
                Next i
 
            Case Else
            NumDep = MsgBox("erreur")
 
    Debug.Print NumDep & nomdep & Len(NumDep)
 
Next
 
End Sub

Merci,
discretos39 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 07/03/2011, 01h54   #14
Membre Expert
 
Homme Pierre ANTOINE
Inscription : février 2008
Messages : 650
Détails du profil
Informations personnelles :
Nom : Homme Pierre ANTOINE
Âge : 43
Localisation : France, Côte d'Or (Bourgogne)

Informations professionnelles :
Secteur : Enseignement

Informations forums :
Inscription : février 2008
Messages : 650
Points : 1 302
Points : 1 302
Bonjour

Vous ne terminez pas votre select, donc, il prend la dernière instruction de fermeture, même si ce n'est pas la bonne, en l'occurence un "next".

Mais de ce coup, il reste un "for" sans "next".

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
For compteur = 1 To 2
    
    saisie = InputBox("Veuillez rentrer le numéro d'un département suivi de son nom")
    s = Split(saisie, " ")
    NumDep = s(0)
            
        Select Case NumDep
            Case 1 To 95
            NumDep = ""
                For i = 1 To UBound(s)
                    nomdep = nomdep & s(i) & " "
                Next i
            
            Case Else
            NumDep = MsgBox("erreur")

             End Select
        
    Debug.Print NumDep & nomdep & Len(NumDep)
 
Next
     
End Sub

Pierre

PS : je vous conseille la lecture du tutoriel Initiation au VBA Office (pas facile à trouver puisqu'il est dans les tutoriel de Word, mais valable aussi pour le VBA Acess, pour la plupart des informations.
pier.antoine est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 07/03/2011, 16h35   #15
Invité de passage
 
Inscription : mars 2009
Messages : 27
Détails du profil
Informations forums :
Inscription : mars 2009
Messages : 27
Points : 2
Points : 2
Bonjour,

Je n'arrive toujours pas à faire fonctionner mon code :
Voici les modifications apportées :

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
Public Const MAX_DEP As Integer = 2
Public Const MAX_NUM As Integer = 1000
 
Sub recherche()
 
Dim compteur As Integer
Dim NumDep As Variant
Dim NumDep2 As Variant
Dim nomdep As String
Dim saisie As String
Dim s() As String
Dim i As Integer
Dim cdep As Integer
Dim bool As Boolean
 
For compteur = 1 To MAX_DEP
 
    saisie = InputBox("Veuillez rentrer le numéro d'un département suivi de son nom")
    s = Split(saisie, " ")
    NumDep = s(0)
 
    If Not IsNumeric(NumDep) Or NumDep < 1 Or NumDep > 99 Or NumDep = 0 Then
        bool = False
 
            If bool = False Then
                Do
                    saisie = InputBox("Veuillez commencer par un numéro département")
                    s = Split(saisie, " ")
                    NumDep = s(0)
                Loop Until bool = True
 
            End If
    Else
 
            nomdep = ""
            For i = 1 To UBound(s)
                nomdep = nomdep & s(i) & " "
            Next i
 
    End If
 
    Debug.Print NumDep & " " & nomdep
 
Next
 
End Sub
Si numdep est valide alors le code se déroule normalement. Si numdep est non numérique alors ma boucle ne s'arrête pas...
Je pense que le problème est le numdep = s(0) de ma boucle DO qui garde l'ancienne donnée de la première saisie.

Code :
1
2
3
4
5
6
            If bool = False Then
                Do
                    saisie = InputBox("Veuillez commencer par un numéro département")
                    s = Split(saisie, " ")
                    NumDep = s(0)                
                    Loop Until bool = True
Avez vous une sollution pour que ma boucle DO se termine normalement ?

Merci d'avance,
discretos39 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 09/03/2011, 20h00   #16
Invité de passage
 
Inscription : mars 2009
Messages : 27
Détails du profil
Informations forums :
Inscription : mars 2009
Messages : 27
Points : 2
Points : 2
Bonjour,

Voici mon algo pour saisir les numéros et noms des départements Français

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
 
Dim compteur As Integer
Dim Numdep As Variant
Dim Nomdep As String
Dim saisie As String
Dim s() As String
Dim i As Integer
Dim cdep As Integer
Dim tableau(2, 2) As Variant
 
 
For compteur = 1 To MAX_DEP
 
saisie = InputBox("Veuillez rentrez un numéro département suivi de son nom")
s = Split(saisie, " ")
Numdep = s(0)
cdep = Len(Numdep)
 
 
    If Not IsNumeric(Numdep) Or Numdep < 1 Or Numdep > 99 Then
 
        Do
            saisie = MsgBox("erreur de saisie")
            saisie = InputBox("Veuillez commencer par un numéro departement")
            s = Split(saisie, " ")
            Numdep = s(0)
 
 
        Loop Until IsNumeric(Numdep)
            Nomdep = ""
                For i = 1 To UBound(s)
                    Nomdep = Nomdep & s(i) & " "
                Next i
 
 
    Else
        s = Split(saisie, " ")
        Numdep = s(0)
        Nomdep = ""
            For i = 1 To UBound(s)
                Nomdep = Nomdep & s(i) & " "
            Next i
 
 
    End If
 
 
        If cdep = 1 Then
            Debug.Print 0 & Numdep & " " & Nomdep
        Else
            Debug.Print Numdep & " " & Nomdep
        End If
 
 
Next
Cependant, il me reste à faire la condition " si numéro déja existant alors recommencer ".
J'aimerais savoir si je peux exploiter mon SPLIT pour faire ma condition? ou si je dois créer un autre tableau ?
J'ai fait plusieurs recherches concernant les tableaux en VBA access et les résultats sont maigres.. Auriez vous des ressources qui peuvent m'intéresser?

En vous remerciant par avance,
discretos39 est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 14h19.


 
 
 
 
Partenaires

Hébergement Web