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

Excel Discussion :

Problème récupération valeur de la ligne ou la cellule est active [XL-2010]


Sujet :

Excel

  1. #1
    Futur Membre du Club
    Homme Profil pro
    comptable
    Inscrit en
    Août 2014
    Messages
    11
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : Belgique

    Informations professionnelles :
    Activité : comptable

    Informations forums :
    Inscription : Août 2014
    Messages : 11
    Points : 7
    Points
    7
    Par défaut Problème récupération valeur de la ligne ou la cellule est active
    Voilà, je suis débutant et après avoir cherché sur internet, je n'arrive pas à résoudre mon problème.

    Le voici : je tente de récupérer la valeur des lignes "C" "E" et "W" de ma feuille donnée en fonction de la valeur d'une combobox (ici la variable : Valeur_société). La combobox récupère le nom d'une société qui se trouve en colonne "F" de la feuille "données". Si le nom de la société est trouvé, alors on reprend les infos de la cellule "C" "E" et "W" et on les copie dans une autre feuille.

    Voici le code actuel

    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
    31
    Private Sub CommandButton1_Click()
    Dim plage As Range, cel As Range
    Dim Num_Ligne As Integer
     
    Application.ScreenUpdating = False
     
    'on se positionne sur la colonne ou se trouve la valeur de la société et on définit la plage à analyser pour comparer la valeur de la combobox
    With Worksheets("Données")
            derlig = .Range("F" & Rows.Count).End(xlUp).Row
            Set plage = .Range("F4:F" & derlig)
     End With
     
     
     
    'on parcours la plage définie plus haut
    For Each cel In plage
            'si la valeur de la cellule correspond à la valeur de la combobox (ici Valeur_societe) alors on récupère la donnée de la cellule C-E-W de la ligne sur laquelle on se trouve (feuille données)
            If cel = Valeur_societe Then
                Sheets("Données").Select
                Range("C" & ActiveCell.Row & ",E" & ActiveCell.Row & ",W" & ActiveCell.Row).Select
                Range("C" & ActiveCell.Row & ",E" & ActiveCell.Row & ",W" & ActiveCell.Row).Copy
                'on se place sur la feuille Inasti et on colle la valeur 
                Sheets("Inasti").Select
                Worksheets("Inasti").Range("A4").Select
                ActiveSheet.Paste
                Selection.Insert Shift:=xlDown
            End If
        Next cel
     
        Application.ScreenUpdating = True
    End Sub

    Le problème est que la macro renvoie bien le nombre de ligne correspondant (ex société 1 :19 lignes, société 2 : 17 lignes) mais ne renvoie pas la bonne valeur. J'ai toujours le même nom qui s'affiche
    comme si Range("C" & ActiveCell.Row) était toujours identique.

    Merci d'avance pour votre aide .

    Nb : il me reste une option c'est d'aller voir si je peux faire un copier d'une cellule genre cel.Copy avec offset dedans...

  2. #2
    Membre expert
    Avatar de Igloobel
    Homme Profil pro
    Développeur ERP - VBA et Formateur bureautique
    Inscrit en
    Septembre 2005
    Messages
    1 869
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loiret (Centre)

    Informations professionnelles :
    Activité : Développeur ERP - VBA et Formateur bureautique
    Secteur : Industrie

    Informations forums :
    Inscription : Septembre 2005
    Messages : 1 869
    Points : 3 442
    Points
    3 442
    Billets dans le blog
    1
    Par défaut
    Salut

    d'abord petite remarque quand on met au point du code il est bon d'avoir les message qui s'affiche.
    Met en commentaire tes lignes sur : Application.ScreenUpdating de façon à avoir les messages d'erreur si il y a.
    Deuxièmement

    tu dis
    Voilà, je suis débutant ...
    Et j'aurais pas utiliser si vite un for each qui est quand plus difficile à appéhender que le reste.
    J'aurais à ta place utiliser la boucle : DO ... LOOP WHILE(Condition)

    Du coup :
    -recupérer la valeur de ta combobox
    -boucler sur les lignes en compararant les noms de société jusqu'a trouver le bon
    -on s'arrête sur la bonne ligne (dès que c'est = )
    -on récupère les valeurs qui vont bien et on les copie où c'est nécessaire

    cela me parrait plus simple à faire (en tout cas surtout quand on débute)

    Je parle en connaissance de cause puisque j'ai été débutant moi aussi

    dis si tu as besoin d'aide

    à bienôt

  3. #3
    Futur Membre du Club
    Homme Profil pro
    comptable
    Inscrit en
    Août 2014
    Messages
    11
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : Belgique

    Informations professionnelles :
    Activité : comptable

    Informations forums :
    Inscription : Août 2014
    Messages : 11
    Points : 7
    Points
    7
    Par défaut
    Merci Igloobel pour tes remarques.

    Ce qu'il se passe, c'est que la fonction marche très bien.

    Si je fais "cel.EntireRow.Copy" ca fonctionne parfaitement, ca me copie toutes les lignes relatives à la société voulue dans la combobox.
    Mais je ne désire pas copier toute la ligne, je désire juste copier certaine colonne.
    Je sais faire par exemple : cel(0, 0).Copy mais je ne sais pas comment en copier plusieurs d'un coup.

    Je persévère et je testerai ta méthode si je n'y arrive pas (même si je pense être bloqué au même endroit c'est-à-dire :
    on récupère les valeurs qui vont bien)

  4. #4
    Expert éminent sénior Avatar de mercatog
    Homme Profil pro
    Inscrit en
    Juillet 2008
    Messages
    9 435
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Autre

    Informations forums :
    Inscription : Juillet 2008
    Messages : 9 435
    Points : 31 877
    Points
    31 877
    Par défaut
    il est temps de regarder du coté de la méthode Range.Find (cf aide vba). pas la peine de faire des boucles quand ce n'est pas nécessaire, Elle ne font que consommer du temps précieux.

    Exemple pour ton cas
    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
    Private Sub CommandButton1_Click()
    Dim Societe As String
    Dim c As Range
     
    Application.ScreenUpdating = False
    If Valeur_societe.ListIndex > -1 Then
        Societe = Valeur_societe.Value
        With Worksheets("Données")
            Set c = .Range("F:F").Find(Societe, LookIn:=xlValues, lookat:=xlWhole)
            If Not c Is Nothing Then
                Worksheets("Inasti").Range("A4").Resize(, 3) = Array(.Range("C" & c.Row), .Range("E" & c.Row), .Range("W" & c.Row))
                Set c = Nothing
                Worksheets("Inasti").Rows(4).Insert Shift:=xlDown
            End If
        End With
    End If
    End Sub


    Code identique au précédent pour un débutant
    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
    Private Sub CommandButton1_Click()
    Dim Societe As String
    Dim c As Range
     
    Application.ScreenUpdating = False
    If Valeur_societe.ListIndex > -1 Then
        Societe = Valeur_societe.Value
        With Worksheets("Données")
            Set c = .Range("F:F").Find(Societe, LookIn:=xlValues, lookat:=xlWhole)
            If Not c Is Nothing Then
                Worksheets("Inasti").Range("A4") = .Range("C" & c.Row)
                Worksheets("Inasti").Range("B4") = .Range("E" & c.Row)
                Worksheets("Inasti").Range("C4") = .Range("W" & c.Row)
                Set c = Nothing
                Worksheets("Inasti").Rows(4).Insert Shift:=xlDown
            End If
        End With
    End If
    End Sub

  5. #5
    Futur Membre du Club
    Homme Profil pro
    comptable
    Inscrit en
    Août 2014
    Messages
    11
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : Belgique

    Informations professionnelles :
    Activité : comptable

    Informations forums :
    Inscription : Août 2014
    Messages : 11
    Points : 7
    Points
    7
    Par défaut
    Merci Mercatog,
    Ta solution marche à merveille et (mais) renvoie une seule valeur.
    Je dois utiliser un tableau car le nom de la société est présent plusieurs fois.

    Ceci dit, je pense que j'ai les éléments à présent pour avancer .
    Je laisse ouvert le post au cas ou.

  6. #6
    Expert éminent sénior Avatar de mercatog
    Homme Profil pro
    Inscrit en
    Juillet 2008
    Messages
    9 435
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Autre

    Informations forums :
    Inscription : Juillet 2008
    Messages : 9 435
    Points : 31 877
    Points
    31 877
    Par défaut
    As tu regardé l'aide vba de Find

    Tu as là un exemple concret d'utilisation de la méthode pour récupérer plusieurs valeurs

    Si tu n'arrives pas à l'adapter, fais nous signe

  7. #7
    Futur Membre du Club
    Homme Profil pro
    comptable
    Inscrit en
    Août 2014
    Messages
    11
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : Belgique

    Informations professionnelles :
    Activité : comptable

    Informations forums :
    Inscription : Août 2014
    Messages : 11
    Points : 7
    Points
    7
    Par défaut
    Non je n'ai pas encore eu le temps mais je vais m'y pencher. Au pire demain !
    Je vous tiens au courant.

    Et bien sur merci pour votre aide

  8. #8
    Expert éminent sénior Avatar de mercatog
    Homme Profil pro
    Inscrit en
    Juillet 2008
    Messages
    9 435
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Autre

    Informations forums :
    Inscription : Juillet 2008
    Messages : 9 435
    Points : 31 877
    Points
    31 877
    Par défaut
    En attendant, voilà le code si tu me promet que tu vas adapter l'aide de vba sur Range.Find à ton cas
    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
    Private Sub CommandButton1_Click()
    Dim Societe As String, Prm As String
    Dim c As Range
     
    Application.ScreenUpdating = False
    If Valeur_societe.ListIndex > -1 Then
        Societe = Valeur_societe.Value
        With Worksheets("Données")
            Set c = .Range("F:F").Find(Societe, LookIn:=xlValues, lookat:=xlWhole)
            If Not c Is Nothing Then
                Prm = c.Address
                Do
                    Worksheets("Inasti").Range("A4").Resize(, 3) = Array(.Range("C" & c.Row), .Range("E" & c.Row), .Range("W" & c.Row))
                    Worksheets("Inasti").Rows(4).Insert Shift:=xlDown
                    Set c = .Range("F:F").FindNext(c)
                Loop While Not c Is Nothing And c.Address <> Prm
            End If
        End With
    End If
    End Sub

  9. #9
    Futur Membre du Club
    Homme Profil pro
    comptable
    Inscrit en
    Août 2014
    Messages
    11
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : Belgique

    Informations professionnelles :
    Activité : comptable

    Informations forums :
    Inscription : Août 2014
    Messages : 11
    Points : 7
    Points
    7
    Par défaut
    Merci, ça fonctionne parfaitement.

    J'étais effectivement parti sur un do... while avec la fonction FindNext

    Un grand merci à toi :-). Ca va me servir énormément pour les fichiers que je dois préparer.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [MySQL] Re problème récupération valeur liste dynamique
    Par stefsas dans le forum PHP & Base de données
    Réponses: 2
    Dernier message: 01/03/2010, 08h58
  2. Problème récupération valeur liste déroulante
    Par philouelgeek dans le forum Interfaces Graphiques
    Réponses: 1
    Dernier message: 26/01/2010, 08h22
  3. Récupération valeur sur une ligne
    Par marcello06 dans le forum Langage
    Réponses: 7
    Dernier message: 12/09/2008, 19h33
  4. Trigger - Problème Récupération valeur
    Par Silvia12 dans le forum Développement
    Réponses: 6
    Dernier message: 02/05/2007, 17h51
  5. problème récupération valeur d'un "div"
    Par LE NEINDRE dans le forum Général JavaScript
    Réponses: 5
    Dernier message: 29/06/2005, 10h04

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