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 :

VBA sélection de cellules fusionnées pour y créer une liste


Sujet :

Macros et VBA Excel

  1. #1
    Membre du Club
    Homme Profil pro
    Inscrit en
    Septembre 2013
    Messages
    64
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Septembre 2013
    Messages : 64
    Points : 58
    Points
    58
    Par défaut VBA sélection de cellules fusionnées pour y créer une liste
    Bonjour,

    Je viens une nouvelle fois vers vous pour un code qui tourne, mais pas à chaque fois....

    EN effet, j'aimerai que mon code sélectionne 2 cellules fusionnées, dont leur emplacement est variable, et y ajoute une liste qui me donne le choix entre 2 mots qui sont quant à eux fixes.

    J'obtiens alors l'erreur pour la ligne 14:

    "erreur d'éxécution 1004:
    La méthode select de la classe range a échoué"

    Ci-dessous 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
     
     
    sub test()
     
    Dim n as integer
    Dim MaPlage as range
     
    n=10
    Do While n <= 21
     
    'on associe en colonne A les choix correspondant à ce résultat
            b = n + 1
            Set MaPlage = Sheets("Check").Range("A" & n & ":A" & b)
            MaPlage.Select
            With Selection.Validation
                .Delete
                .Add Type:=xlValidateList, AlertStyle:=xlValidAlertStop, Operator:= _
                    xlBetween, Formula1:="=Liste!$H$20:$H$21" 'on met en colonne A la liste correspondant à cette conf
                .IgnoreBlank = True
                .InCellDropdown = True
                .InputTitle = ""
                .ErrorTitle = ""
                .InputMessage = ""
                .ErrorMessage = ""
                .ShowInput = True
                .ShowError = True
            End With
     
    n=n+2
    Loop
     
    end sub
    voilà, sachant que dans l'onglet liste, j'ai un mot "chien" dans H20, et "chat" dans H21.

    Le problème, et que des fois l'attribution de cette liste aux cellules An:An+1 marche, et des fois non...

    cela dépend, je pense, des conditions initiales, si j'ai fais un RAZ avant ou si ça écrase une liste déjà existente, je pense que sur cette partie de code je manque de rigueur et cela génère des erreurs... si quelqu'un peut me sortir de ce dileme je suis preneur

  2. #2
    Expert éminent sénior
    Homme Profil pro
    aucune
    Inscrit en
    Septembre 2011
    Messages
    8 207
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : aucune

    Informations forums :
    Inscription : Septembre 2011
    Messages : 8 207
    Points : 14 362
    Points
    14 362
    Par défaut
    Bonjour,

    Est-ce que les cellules sont obligatoirement fusionnées ? Sur quelle ligne se produit l'erreur ?

  3. #3
    Expert éminent sénior Avatar de Menhir
    Homme Profil pro
    Ingénieur
    Inscrit en
    Juin 2007
    Messages
    16 037
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2007
    Messages : 16 037
    Points : 32 866
    Points
    32 866
    Par défaut
    Les cellules fusionnées, dans Excel, c'est vraiment la plaie. Que ce soit pour faire des copies de cellule ou pour le code, ça pose toujours des problèmes.
    Personnellement, je les évites comme la peste.

    Je sais que cette réponse ne va sans doute pas répondre à ta question, mais ne serait-il pas possible, dans ton code, d'éviter les cellules fusionner.
    Peut-être existe-t-il d'autres solutions pour faire ce que cette fusion te permet. Par exemple, si c'est pour centrer un texte sur plusieurs colonnes, on peut le faire sans fusionner.

    Dans ton code, as-tu essayé de mettre dans "MaPlage" que la coordonnée que la première cellule (des deux fusionnées) ?
    Quelque chose comme :
    Set MaPlage = Sheets("Check").Range("A" & n)

    (perso, j'aurais plutôt écrit Set MaPlage = Sheets("Check").Cells(1,n) qui me semble plus lisible)

    Petite remarque concernant ton code : je ne sais pas si tu le sais mais tu n'es pas obligé de sélectionner (Select) une cellule pour la modifier.

    Par exemple, tu pourrais remplacer les quatre premières lignes contenues dans ta boucle par :
    With Sheets("Check").Range(cells(1,n),cells(1,n+1)).Validation

  4. #4
    Membre du Club
    Homme Profil pro
    Inscrit en
    Septembre 2013
    Messages
    64
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Septembre 2013
    Messages : 64
    Points : 58
    Points
    58
    Par défaut
    D'habitude je ne sélectionne ni les feuilles ni les cellules, histoire que le code aille plus vite, après là je l'ai fais, car pas vraiment familier avec les with selection et compagnie... je vais donc sur ton conseil directement mettre le validation

    Dans mon choix, les cellules sont fusionnées, après je peux chercher une autre solution, mais visuellement, c'est mieux que ce soit fusionné...

    L'erreur apparait dès le travail sur la première cellule fusionnée.

    Oui ça m'a bien l'air la plaie le travail sur cellules fusionnées, à titre d'exemple j'avais fais les méthodes suivantes, qui marchaient aussi aléatoirement...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    b = n + 1
            Sheets("Check").Range("A" & n & ":A" & b).Select
            With Selection.Validation
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Sheets("Check").Range("A" & n).Select
            With Selection.Validation
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Sheets("Check").Range(cells(1,n),cells(1,n+1)).Select
            With Selection.Validation
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Sheets("Check").Range(cells(1,n)).Select
            With Selection.Validation

  5. #5
    Expert éminent sénior Avatar de Menhir
    Homme Profil pro
    Ingénieur
    Inscrit en
    Juin 2007
    Messages
    16 037
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2007
    Messages : 16 037
    Points : 32 866
    Points
    32 866
    Par défaut
    Dans ton dernier cadre de code, le Range n'est pas utile.
    En fait, Cells est un cas particulier de Range qui peut s'utiliser quasiment de la même façon limité à une seule cellule.

    Le seul cas où Cells doit être inclus dans Range, c'est pour sélectionner une plage de plusieurs cellules.

  6. #6
    Invité
    Invité(e)
    Par défaut
    on fusionne les 2 pas de Select ,Selection:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    With Sheets("Check").cells(1,n).Validation
    un informaticien c'est un fainéant il ne tape du texte inutile et en plus il y a risque d'erreurs.

  7. #7
    Membre du Club
    Homme Profil pro
    Inscrit en
    Septembre 2013
    Messages
    64
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Septembre 2013
    Messages : 64
    Points : 58
    Points
    58
    Par défaut
    Merci pour les explications, et sans être informaticien j'ai également opté naturellement pour ta version rdurupt


    Du coup, j'ai tout défusionné, ça semble marcher correctement, mais se pose un problème d'aspect visuel.


    Pour résumer:

    Mon code écrit en cellules A10,A12, A14 , des 'OK', 'Deleted', ou 'new_KEY', il créé également dans ces mêmes cellules une liste appropriée qui me laisse le choix entre laisser la valeur (parmi les 3 citées précédemment) écrite ou la remplacer par 'not_OK'.
    AU total 4 valeurs, et le code colore (ci-dessous, il créé une mise en forme conditionnelle en fait), en fonction du texte contenue dans la cellule, la cellule d'une certaine couleur.

    Exemple:
    En A10, j'ai OK, coloré en VERT par la macro, et si jamais je remplace OK par not_OK, la couleur passe automatiquement en ROUGE, et vice-versa.

    Or, ce que je voudrai en plus, c'est que la cellule A11 s'adapte automatiquement et prenne la couleur de A10 en temps réel. Qu'il en soit de même pour les A13, A15,.. etc (sachant qu'A11 est vide)



    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
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    'Mise en forme conditionnelle
    '=================================================
    n=17
    For i = 10 To n
     
        Range("A" & i).Select
        Selection.FormatConditions.Add Type:=xlCellValue, Operator:=xlEqual, _
            Formula1:="=""OK"""
        Selection.FormatConditions(Selection.FormatConditions.Count).SetFirstPriority
        With Selection.FormatConditions(1).Interior
            .PatternColorIndex = xlAutomatic
            .color = 5296274 'vert clair
            .TintAndShade = 0
        End With
        Selection.FormatConditions(1).StopIfTrue = False
     
        Range("A" & i).Select
        Selection.FormatConditions.Add Type:=xlCellValue, Operator:=xlEqual, _
            Formula1:="=""New_key"""
        Selection.FormatConditions(Selection.FormatConditions.Count).SetFirstPriority
        With Selection.FormatConditions(1).Interior
            .PatternColorIndex = xlAutomatic
            .color = 14470546 'bleu ciel
            .TintAndShade = 0
        End With
        Selection.FormatConditions(1).StopIfTrue = False
     
        Range("A" & i).Select
        Selection.FormatConditions.Add Type:=xlCellValue, Operator:=xlEqual, _
            Formula1:="=""Not_ok"""
        Selection.FormatConditions(Selection.FormatConditions.Count).SetFirstPriority
        With Selection.FormatConditions(1).Interior
            .PatternColorIndex = xlAutomatic
            .color = 255 'rouge
            .TintAndShade = 0
        End With
        Selection.FormatConditions(1).StopIfTrue = False
     
        Range("A" & i).Select
        Selection.FormatConditions.Add Type:=xlCellValue, Operator:=xlEqual, _
            Formula1:="=""Deleted"""
        Selection.FormatConditions(Selection.FormatConditions.Count).SetFirstPriority
        With Selection.FormatConditions(1).Interior
            .PatternColorIndex = xlAutomatic
            .color = 49407 'orange
            .TintAndShade = 0
        End With
        Selection.FormatConditions(1).StopIfTrue = False
     
        Sheets("Check").Cells(n + 1, 1).Interior.color = Sheets("Check").Cells(n, 1).Interior.color
     
    i = i + 1
    Next i
    Etant donné que ce code fonctionne pour les A10, A12... L'idéal serait qu'il sélectionne A10, fasse la condition sur cette cellule, mais colore A10 et A11.
    Ca me semble bête dit comme ça mais j'avoue bugguer.

  8. #8
    Invité
    Invité(e)
    Par défaut
    Pas de sélect et de sélection.
    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
    35
    36
    37
    38
    39
    40
    41
    42
    n = 17
    For i = 10 To n
        With Range("A" & i)
            .FormatConditions.Add Type:=xlCellValue, Operator:=xlEqual, _
            Formula1:="=""OK"""
            .FormatConditions(.FormatConditions.Count).SetFirstPriority
            With .FormatConditions(1).Interior
                .PatternColorIndex = xlAutomatic
                .Color = 5296274 'vert clair
                .TintAndShade = 0
            End With
            .FormatConditions(1).StopIfTrue = False
            .FormatConditions.Add Type:=xlCellValue, Operator:=xlEqual, _
            Formula1:="=""New_key"""
            .FormatConditions(.FormatConditions.Count).SetFirstPriority
            With .FormatConditions(1).Interior
                .PatternColorIndex = xlAutomatic
                .Color = 14470546 'bleu ciel
                .TintAndShade = 0
            End With
            .FormatConditions(1).StopIfTrue = False
            .FormatConditions.Add Type:=xlCellValue, Operator:=xlEqual, _
            Formula1:="=""Not_ok"""
            .FormatConditions(.FormatConditions.Count).SetFirstPriority
            With .FormatConditions(1).Interior
                .PatternColorIndex = xlAutomatic
                .Color = 255 'rouge
                .TintAndShade = 0
            End With
                .FormatConditions(1).StopIfTrue = False
                .FormatConditions.Add Type:=xlCellValue, Operator:=xlEqual, _
                Formula1:="=""Deleted"""
                .FormatConditions(.FormatConditions.Count).SetFirstPriority
            With .FormatConditions(1).Interior
                .PatternColorIndex = xlAutomatic
                .Color = 49407 'orange
                .TintAndShade = 0
            End With
            .FormatConditions(1).StopIfTrue = False
        End With
        Sheets("Check").Cells(n + 1, 1).Interior.Color = Sheets("Check").Cells(n, 1).Interior.Color
    Next

  9. #9
    Membre du Club
    Homme Profil pro
    Inscrit en
    Septembre 2013
    Messages
    64
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Septembre 2013
    Messages : 64
    Points : 58
    Points
    58
    Par défaut
    Merci pour ce code, bien plus propre que ma version...

    Par contre, pour l'attribution de la couleur à la ligne i+1 (ligne 41 de ton code), cela ne marche pas, pour plusieurs raisons.

    Tu as mis n, c'est i, mais ça on s'en fiche

    N'existe-t'il pas une fonction pour étendre le choix du coloriage? genre:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    With range A i
    Colorier range (Ai:Ai+1)
    Ok c'est abérent mais ça parle je pense.

    Parce qu'en fait, la ligne 41 ne fonctionne pas, car le code couleur dans les cellules A i est faussé, à cause de la liste je pense.

    Pour tester, j'ai lancé ce code:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    Sub test_couleur()
    Dim couleur As Variant
     
    For i = 10 To 23
    Cells(i, 3).Value = Cells(i, 1).Interior.color
    Next i
    End Sub
    Et ça me renvoie le code couleur '16777215', que la cellule soit colorée ou blanche... code couleur qui correspond à la couleur blanche.

    D'où l'idée que l'extension du coloriage citée plus haut serait plus adaptée..

  10. #10
    Expert éminent sénior Avatar de Menhir
    Homme Profil pro
    Ingénieur
    Inscrit en
    Juin 2007
    Messages
    16 037
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2007
    Messages : 16 037
    Points : 32 866
    Points
    32 866
    Par défaut
    Il suffit de mettre dans ton Range la plage de mesure à laquelle tu compte afficher la couleur :
    Range("A" & i & ":A" & (i+1))

    Perso, j'aurais plutôt écrit
    Range(Cells(i,1),Cells(i+1,1))

  11. #11
    Membre du Club
    Homme Profil pro
    Inscrit en
    Septembre 2013
    Messages
    64
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Septembre 2013
    Messages : 64
    Points : 58
    Points
    58
    Par défaut
    Je l'ai essayé ça aussi, et en fait, ça n'applique la couleur que lorsqu'il y a par exemple le texte "ok", donc les A i se colorent, mais pas les A i+1...

    J'ai aussi tenté vulgairement ça:

    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
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    Sub mise_en_forme()
     
     
    'Mise en forme conditionnelle
    '=================================================
    For i = 10 To 23
     
      With Range("A" & i)
            .FormatConditions.Add Type:=xlCellValue, Operator:=xlEqual, _
            Formula1:="=""OK"""
            .FormatConditions(.FormatConditions.Count).SetFirstPriority
            With Range(Cells(i, 1), Cells(i + 1, 1))
                .FormatConditions(1).Interior
                .PatternColorIndex = xlAutomatic
                .color = 5296274 'vert clair
                .TintAndShade = 0
            End With
            .FormatConditions(1).StopIfTrue = False
            .FormatConditions.Add Type:=xlCellValue, Operator:=xlEqual, _
            Formula1:="=""New_key"""
            .FormatConditions(.FormatConditions.Count).SetFirstPriority
            With Range(Cells(i, 1), Cells(i + 1, 1))
                .FormatConditions(1).Interior
                .PatternColorIndex = xlAutomatic
                .color = 14470546 'bleu ciel
                .TintAndShade = 0
            End With
            .FormatConditions(1).StopIfTrue = False
            .FormatConditions.Add Type:=xlCellValue, Operator:=xlEqual, _
            Formula1:="=""Not_ok"""
            .FormatConditions(.FormatConditions.Count).SetFirstPriority
            With Range(Cells(i, 1), Cells(i + 1, 1))
                .FormatConditions(1).Interior
                .PatternColorIndex = xlAutomatic
                .color = 255 'rouge
                .TintAndShade = 0
            End With
                .FormatConditions(1).StopIfTrue = False
                .FormatConditions.Add Type:=xlCellValue, Operator:=xlEqual, _
                Formula1:="=""Deleted"""
                .FormatConditions(.FormatConditions.Count).SetFirstPriority
            With Range(Cells(i, 1), Cells(i + 1, 1))
                .FormatConditions(1).Interior
                .PatternColorIndex = xlAutomatic
                .color = 49407 'orange
                .TintAndShade = 0
            End With
            .FormatConditions(1).StopIfTrue = False
        End With
    'Cells(i + 1, 1).Interior.color = Cells(i, 1).Interior.color
     
    i = i + 1
    Next i
     
    end sub

  12. #12
    Membre du Club
    Homme Profil pro
    Inscrit en
    Septembre 2013
    Messages
    64
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Septembre 2013
    Messages : 64
    Points : 58
    Points
    58
    Par défaut
    En fait, je vais me contenter du code que tu as proposé hier à 18h43, il marche bien (en retirant la ligne 41 qui est pour le coup inutile) et me suffit amplement.

    Colorer la cellule A i+1 ne m'apporte au final pas grand chose

    Merci rdurupt et Menhir pour l'aide apportée

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

Discussions similaires

  1. [XL-2007] Créer une liste déroulante dans une cellule avec vba
    Par destroyed dans le forum Macros et VBA Excel
    Réponses: 5
    Dernier message: 10/07/2014, 09h19
  2. Réponses: 5
    Dernier message: 21/06/2012, 14h22
  3. Réponses: 2
    Dernier message: 07/07/2006, 10h00
  4. [VBA]Trouver les cellules fusionnées et autres
    Par Invité dans le forum Macros et VBA Excel
    Réponses: 24
    Dernier message: 23/01/2006, 13h12
  5. [VBA]Sélection de cellules
    Par joseph1 dans le forum Macros et VBA Excel
    Réponses: 1
    Dernier message: 13/10/2005, 18h08

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