IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Macros et VBA Excel Discussion :

Problème boucle with


Sujet :

Macros et VBA Excel

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Avril 2012
    Messages
    61
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2012
    Messages : 61
    Par défaut Problème boucle with
    Bonjour ,

    J'aurai besoin d'aide.. Voilà j'ai un USF dans lequel j'ai deux boucles avec une condition qui permette pour l'une de vérifier si le texte saisi dans une combobox se trouve dans une feuille 'table adresse' , si c'est oui alors active la cellule en question, dans la deuxième boucle je fais un test pour voir si le texte entré dans la combobox ne se trouve pas dans la feuille 'table adresse' et obtient un MsgBox qui stipule que le nom recherché n'existe pas.

    Je pense que j'aurai pu faire cela dans une seule boucle avec deux If imbriqué mais je n'ai pas réussi..

    Donc mon problème c'est que lorsque je lance mon USF j'ai seulement la boucle pour laquelle il n'y a pas de nom trouvé qui s'active et cela même si je rentre un texte dans la combobox se trouvant bien la feuille 'table adresse'.

    Voici à quoi ressemble mon code :

    1er boucle :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    With Worksheets("Table adresse")
     
     
                   For ligne3 = 1 To 65536
     
     
             If UserForm_Nom_Client.NcRecherche = Cells(ligne3, 2) Then
    Range("B" & 2 + Me.NcRecherche.ListIndex).Select
     
                                  UserForm_Nom_Client.Hide
     
                                 MsgBox "Nom de Client renseigné!"
     
    Exit For
            End If
     
             Next ligne3
    End With

    2e boucle :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    With Worksheets("Table adresse")
                   Dim ligne7 As Long
                   For ligne7 = 1 To 65536
     
     
     
              If UserForm_Nom_Client.NcRecherche <> Cells(ligne7, 2) Then
     
     
     
                  MsgBox " Il n'y a pas de client avec ce nom!"
                 MsgBox "Réessayer un autre nom de client"
     
                     'vide la ListBox
                    UserForm_Nom_Client.NcRecherche = ""
    Exit For
            End If
     
             Next ligne7
     
    End With

  2. #2
    Membre Expert
    Homme Profil pro
    Retraité
    Inscrit en
    Avril 2011
    Messages
    1 858
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Avril 2011
    Messages : 1 858
    Par défaut
    Bonjour,

    Essaie ce code et dis-moi si j'ai bien compris ta demande.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    Dim c As Range
        Set c = Worksheets("Table adresse").Range("B:B").Find(Me.NcRecherche.Value)
        If Not c Is Nothing Then
            c.Select
            Me.Hide
            MsgBox "Nom de Client renseigné !"
        Else
            MsgBox " Il n'y a pas de client avec ce nom !" & Chr(10) & _
            "Réessayer un autre nom de client"
        End If
    Cordialement.

  3. #3
    Membre Expert Avatar de rvtoulon
    Homme Profil pro
    Agent Technique
    Inscrit en
    Mars 2009
    Messages
    1 042
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Agent Technique
    Secteur : Santé

    Informations forums :
    Inscription : Mars 2009
    Messages : 1 042
    Par défaut
    Bonjour,
    je te conseillerais d'utiliser plutôt la fonction FIND. Fais une recherche dans l'aide d'excel (F1).

    Pour ton cas ça ressemblerais à ceci:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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
    dim vnom as string
    With Worksheets("Table adresse")
     
    'je donne a vnom le nom recherché
     vnom = UserForm_Nom_Client.NcRecherche.value
     
    'je recherche le nom en colonne B 
    Set vrech = .columns("B:B").find (vnom)
     
    'si le nom n'existe pas alors message d'erreur 
    If vrech is nothing then
      MsgBox " Il n'y a pas de client avec ce nom!" & chr(10) & "Réessayer un autre nom de client"
     
      'vide la ListBox
      UserForm_Nom_Client.NcRecherche = ""
     
    'si il existe 
    Else
    'je selectionne la cellule ou il se trouve 
    vrech.select
     
     UserForm_Nom_Client.Hide
     
     End If
     
    End With
    EDIT: Oupss désolé pour le doublon...

  4. #4
    Membre chevronné Avatar de jackborogar
    Homme Profil pro
    Etudiant Ingénierie Financière
    Inscrit en
    Avril 2012
    Messages
    290
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Etudiant Ingénierie Financière
    Secteur : Finance

    Informations forums :
    Inscription : Avril 2012
    Messages : 290
    Par défaut
    Bonjour,

    vérifier si le texte saisi dans une combobox se trouve dans une feuille 'table adresse' , si c'est oui alors active la cellule en question
    Essayes cela



    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    'Cherche la cellule qui contient le nom du tableau
     
    Set Rg = Sheets("table_adresse").Range("A1:IV65536").Find(what:=ton_userform.Combobox1.Text, lookat:=xlWhole)
     
    'Si le nom est trouvé 
     
    If Not Rg Is Nothing Then
     
     'ton code
     
    Else
       'ton autre code

    Cdt,

  5. #5
    Membre averti
    Profil pro
    Inscrit en
    Avril 2012
    Messages
    61
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2012
    Messages : 61
    Par défaut
    Re,

    Je vous remercie pour le temps consacré et les codes envoyés.

    Mais j'aurai voulu savoir s'il était possible de faire ce que j'ai énoncé mais avec un programme qui s'inspire du mien?

    De plus , si vous pourriez m'éclairer sur la possible erreur que j'aurai pu faire sur mon code.

  6. #6
    Membre chevronné Avatar de jackborogar
    Homme Profil pro
    Etudiant Ingénierie Financière
    Inscrit en
    Avril 2012
    Messages
    290
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Etudiant Ingénierie Financière
    Secteur : Finance

    Informations forums :
    Inscription : Avril 2012
    Messages : 290
    Par défaut
    GFZT82 l'a adapté à ton code.

  7. #7
    Membre averti
    Profil pro
    Inscrit en
    Avril 2012
    Messages
    61
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2012
    Messages : 61
    Par défaut
    Cela ne marche pas, j'obtiens cette erreur:
    Erreur : variable objet ou variable de bloc non définie.
    Sur la ligne suivante :
    Code :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    var_nom_client = Feuil4.Columns(2).Cells.Find(What:=stringChaine, LookAt:=xlWhole)
    à noter que var_nom_client est déclarée de la façon suivante :

    Code :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    dim var_nom_client as string
    donc je n'utilise pas c mais var_nom_client , de plus , je ne peux changer la déclaration de var_nom_client en range car j'ai une contrainte qui m'impose de la laisser en string.

  8. #8
    Membre Expert Avatar de rvtoulon
    Homme Profil pro
    Agent Technique
    Inscrit en
    Mars 2009
    Messages
    1 042
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Agent Technique
    Secteur : Santé

    Informations forums :
    Inscription : Mars 2009
    Messages : 1 042
    Par défaut
    Pour être franc mieux vaut utiliser la méthode Find car beaucoup plus rapide et direct.

    Cependant tu souhaites utilisés ton code.
    Avec ton code tu fais deux boucles, tu te compliques la vie. Voici une idée sur la base de ton code mais avec une seule boucle.

    Tout d'abord on cherche la dernière ligne utilisée de la colonne B et on met ce n° dans une variable pour pouvoir faire ta boucle.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    derlign = .range("B" & rows.count).end(xlup).row
    ensuite on donne à la variable vnom la valeur choisie dans la combo:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    vnom = UserForm_Nom_Client.NcRecherche.value
    dans le code je donne à une variable i la valeur 0 car dans la boucle je vais chercher si je trouve le nom et si c'est le cas je donnerai à la variable i la valeur 1 car une fois sortie de la boucle je vais vérifié la valeur de i.
    si i=0 c'est que je n'ai pas trouvé de nom correspondant alors j'envois mon message qui m'informe de recommencer.

    donc voici comment ce présenterais ton code une fois revue:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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
    dim derlign as long, vnom as string, i as byte
    dim ligne3 as long
     
    With Worksheets("Table adresse")
     derlign = .range("B" & rows.count).end(xlup).row
     vnom = UserForm_Nom_Client.NcRecherche.value
     
     i=0 
     
     For ligne3 = 1 To derlign
            If vnom = .Cells(ligne3, 2) Then
                .Range("B" & ligne3).Select
                i=1
                UserForm_Nom_Client.Hide
     
                MsgBox "Nom de Client renseigné!"
     
                Exit For
            End If
     
     Next ligne3
     
    If i=0 then
      MsgBox " Il n'y a pas de client avec ce nom!" & chr(10) & "Réessayer un autre nom de client"
     
      'vide la ListBox
      UserForm_Nom_Client.NcRecherche.clear
    End If
     
    End With
    Je ne l'ai pas testé mais le principe est là.

  9. #9
    Membre averti
    Profil pro
    Inscrit en
    Avril 2012
    Messages
    61
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2012
    Messages : 61
    Par défaut
    Re,

    Après essai , la première condition marche bien mais pour la seconde j'obtiens bien la MsgBox
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     MsgBox " Il n'y a pas de client avec ce nom!" & chr(10) & "Réessayer un autre nom de client"
    mais j'obtiens une erreur dans la suite de mon programme sur la ligne suivante :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
       Dim AdresseID As Integer, EquipmentID As Integer, C As Range, Ctr As Boolean
     
        'Recherche de l'"Adresse ID correspondant au nom de la première combobox
        'les fonctions Index et Match correspondent aux fonctions INDEX et EQUIV
     
      With Sheets("table adresse")
            AdresseID = Application.Index(.[A:A], Application.Match(Me.NcRecherche.Value, .[B:B], 0))
        End With
    Il s'agit d'une erreur incompatibilité du type.

    Je pense pas que tu réussira à m'aider avec seulement cette ligne là , mais le code est long..

Discussions similaires

  1. [XL-2010] Problème boucle With
    Par dylan.pascal dans le forum Macros et VBA Excel
    Réponses: 7
    Dernier message: 10/02/2015, 09h20
  2. [Débutant] Problème boucle for
    Par toniooooo dans le forum Langage
    Réponses: 10
    Dernier message: 18/04/2006, 14h42
  3. [XSL] problème boucle
    Par VolaiL dans le forum XSL/XSLT/XPATH
    Réponses: 2
    Dernier message: 10/04/2006, 16h55
  4. Problème boucle while et evenement
    Par tse_tilky_moje_imja dans le forum Général Python
    Réponses: 2
    Dernier message: 30/03/2006, 18h11
  5. [FLASH 8] Problème Boucle For
    Par Begood dans le forum Flash
    Réponses: 6
    Dernier message: 21/03/2006, 11h36

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo