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 :

Plage de valeur s'arrête à une valeur donnée [XL-2007]


Sujet :

Macros et VBA Excel

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé Avatar de Nephyline
    Profil pro
    Inscrit en
    Janvier 2008
    Messages
    161
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2008
    Messages : 161
    Par défaut Plage de valeur s'arrête à une valeur donnée
    Bonjour,

    Grâce au tuto de Silkyroad sur "Comment gérer un Combobox dans un onglet personnalisé ?", j'ai pu mettre en place une combobox qui s'alimente avec des données de ma feuille active.

    Seulement, les données que je souhaite récupérer sont toujours dans la même colonne (C) mais ne commencent pas toujours à la même ligne, selon les feuilles. Cependant, la première valeur est toujours la même ("Siège")
    Je récupère mes données depuis le bas et remonte jusqu'à la première ligne.
    Je cherche depuis quelques temps à ce que les données de la plage de cellule ne remonte que jusqu'à cette première ligne "Siège".
    J'ai essayé avec la méthode .find mais je n'ai pas réussi à obtenir ce que je voulais.

    J'espère avoir été assez claire... ^^°
    Existe-t-il un moyen de réaliser ce que je souhaite ?

    Voici mon code :

    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
    Option Explicit
     
    'Callback for Combo1 getItemCount
    Sub NbItemCombo(control As IRibbonControl, ByRef returnedVal)
        'Définit le nombre d'éléments dans la combobox
        'Récupère le nombre de données dans la colonne C.
        returnedVal = ActiveSheet.Range("C1").End(xlDown).Row
     
    End Sub
     
    'Callback for Combo1 getItemLabel
    'Index est défini par la valeur saisie dans la fonction de rappel NbItemCombo
    Sub ComboLabel(control As IRibbonControl, index As Integer, ByRef returnedVal)
     
        If ActiveSheet.Range("C1").End(xlDown).Row = 0 Then Exit Sub
     
        'Alimente le Combobox à partir des données de la plage de cellules
        returnedVal = ActiveSheet.Cells(index + 30, 3)
     
    End Sub
    Merci de votre attention.

  2. #2
    Membre confirmé
    Inscrit en
    Janvier 2004
    Messages
    173
    Détails du profil
    Informations forums :
    Inscription : Janvier 2004
    Messages : 173
    Par défaut
    J'espère que ce que j'ai fait répond à ta question. Dans A1, j'écris Chaise, dans A2 Table, dans A3 Siège, dans A4 Bureau, dans A5 Armoire, et dans A6 Lit.

    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
    Sub toto()
        Dim celluleDepart As Range
        Set celluleDepart = Range("A65536")
     
        Dim celluleBasListe As Range
        Set celluleBasListe = celluleDepart.End(xlUp)
     
        Dim celluleHautListe As Range
        Set celluleHautListe = celluleBasListe.End(xlUp)
     
        Dim plageTotale As Range
        Set plageTotale = Range(celluleBasListe, celluleHautListe)
     
        Dim cellule As Range
        Dim celluleSiege As Range
        For Each cellule In plageTotale
            If cellule.Value = "Siège" Then
                Set celluleSiege = cellule
            End If
        Next cellule
     
        Dim plageFinale As Range
        Set plageFinale = Range(celluleBasListe, celluleSiege)
     
        plageFinale.Select
    End Sub
    Est ce que le code ci dessus sélectionne bien ce que tu veux ?

  3. #3
    Membre confirmé Avatar de Nephyline
    Profil pro
    Inscrit en
    Janvier 2008
    Messages
    161
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2008
    Messages : 161
    Par défaut
    Bonjour et merci beaucoup ANOVA !

    Le code que tu proposes sélectionne bien ce que je souhaite si je le place dans une feuille.
    Le problème, c'est que j'ai besoin de ce code dans un module et dès lors que je l'y place, j'obtiens l'erreur d'exécution 1004 (La méthode Range de l'objet Global a échoué) sur la ligne
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
        Set plageFinale = Range(celluleBasListe, celluleSiege)
    J'ai essayé d'intégrer
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Set plageFinale = ActiveSheet.Range(celluleBasListe, celluleSiege)
    Mais j'ai une nouvelle erreur 1004 : "Erreur définie par l'application ou par l'objet"

    Je ne comprends pas pourquoi il ne veut pas prendre en compte ma feuille active
    N'y a-t-il pas une possibilité de définir la feuille active ?

  4. #4
    Membre confirmé
    Inscrit en
    Janvier 2004
    Messages
    173
    Détails du profil
    Informations forums :
    Inscription : Janvier 2004
    Messages : 173
    Par défaut
    C'est bizarre. Je viens de faire le test, j'ai copié la Sub toto() dans un module1, et lorsque je l'exécute, tout fonctionne bien (comme quand la fonction est dans ThisWorkbook). J'utilise la version Excel 2010.

    Comme je n'ai pas la même erreur que toi, c'est difficile pour moi de la résoudre. Je me contenterai donc de suggestions : ActiveSheet renvoie un objet de type Sheet ou de type WorkSheet ? Je ne sais pas, mais c'est peut être important. Si tu veux désigner une feuille en particulier, tu peux utiliser worksheets("nomDeLaFeuille") ou worksheets(numeroDeLaFeuille). Sinon, tu as aussi la même chose avec Sheets (je n'ai jamais compris la différence entre les objets de type sheet et les objets de type worksheet, il faudrait que je me renseigne, mais la deuxième erreur que tu obtiens pourrait venir de là).

  5. #5
    Expert éminent 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
    Par défaut
    Une autre proposition (pour la feuille active)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    Public Sub PlageCombo()
    Dim LastLig As Long, FirstLig As Long
    Dim Plage As Range, c As Range
     
    LastLig = Cells(Rows.Count, 3).End(xlUp).Row
    Set c = Range("C1:C" & LastLig).Find("Siège", lookat:=xlWhole, SearchDirection:=xlPrevious)
    If Not c Is Nothing Then FirstLig = c.Row
    Set Plage = Range("C" & FirstLig & ":C" & LastLig)
    Plage.Interior.ColorIndex = 3 'on colorie
    End Sub

  6. #6
    Membre confirmé Avatar de Nephyline
    Profil pro
    Inscrit en
    Janvier 2008
    Messages
    161
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2008
    Messages : 161
    Par défaut
    ANOVA, je me suis renseigné sur la différence entre worksheet et sheet car, pour moi aussi, la nuance était bien floue, voir complètement invisible... Et j'ai trouvé des infos sur un très bon site de la toile ici.

    Dans mon cas, il s'agit donc de worksheet puisque je n'ai pas de graphique.

    Cependant, la solution de mercatog a résolu mon problème. Merci à toi !

    Voici mon code :

    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
    32
    33
    34
    Option Explicit
     
    'Callback for Combo1 getItemCount
    Sub NbItemCombo(control As IRibbonControl, ByRef returnedVal)
     
    Dim LastLig As Long, FirstLig As Long
    Dim Plage As Range, c As Range
     
        'Définit le nombre d'éléments dans la combobox
        'Récupère le nombre de données dans la colonne C. 
    LastLig = Cells(Rows.Count, 3).End(xlUp).Row
        Set c = Range("C1:C" & LastLig).Find("Siège", lookat:=xlWhole, SearchDirection:=xlPrevious)
        If Not c Is Nothing Then FirstLig = c.Row
        Set Plage = Range("C" & FirstLig & ":C" & LastLig)
        returnedVal = Plage.Count
     
    End Sub
     
    'Callback for Combo1 getItemLabel
    'Index est défini par la valeur saisie dans la fonction de rappel NbItemCombo
    Sub ComboLabel(control As IRibbonControl, index As Integer, ByRef returnedVal)
     
    Dim LastLig As Long, FirstLig As Long
    Dim Plage As Range, c As Range
     
    LastLig = Cells(Rows.Count, 3).End(xlUp).Row
        Set c = Range("C1:C" & LastLig).Find("Siège", lookat:=xlWhole, SearchDirection:=xlPrevious)
        If Not c Is Nothing Then FirstLig = c.Row
        Set Plage = Range("C" & FirstLig & ":C" & LastLig)
     
        'Alimente le Combobox à partir des données de la plage de cellules
        returnedVal = Plage.Cells(index + 1, 1)
     
    End Sub
    Merci encore à vous deux !

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

Discussions similaires

  1. tester une valeur et affecter une valeur
    Par Elise0251 dans le forum Développement de jobs
    Réponses: 1
    Dernier message: 29/07/2009, 17h31
  2. Exécution lorsque une valeur change parmi une plage
    Par Janny dans le forum Macros et VBA Excel
    Réponses: 4
    Dernier message: 11/05/2009, 14h56
  3. Réponses: 5
    Dernier message: 25/09/2008, 19h53
  4. Réponses: 10
    Dernier message: 05/02/2008, 15h37
  5. Réponses: 10
    Dernier message: 01/12/2006, 00h06

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