VBA : condition pour fusionnage

Résolu
Flo -  
 Flo -
Bonjour,

Je suis débutant dans la réalisation de macro et je n'arrive pas a créer un code me permettant de réaliser la formule suivante:

Sur la plage "A30:A90":
Si le contenu de la cellule "A30" est identique a celui de la cellule A31,
Alors fusionner ces cellules
Sinon, réitérer la condition pour les cellules "A31" et "A32" (et ainsi de suite jusqu'à la cellule "A90").

Toutes mes cellules dans cette plage de donnée contiennent du texte (parfois identique, d'où le but de cette macro).
Au final, mon objectif est d'avoir 2, 3 (ou plus) cellules fusionnées dans la colonne A (afin de rendre le tableau plus facile à la lecture).

A titre informatif, j'utilise

Merci d'avance pour votre aide.

Mots clés: Excel - Macro - VBA - Fusion - Merge - Condition - If - Then

5 réponses

  1. michel_m Messages postés 18903 Date d'inscription   Statut Contributeur Dernière intervention   3 320
     
    Bonjour
    Pour macitoch
    donc ça tu peux trouver tout seul ^^
    Très sympa !
    Avec des "select" ?
    Etudie les premières bases de VBA
    je te cote -1

    Bonjour Flo

    après les 2 "profs" ci dessous une proposition qui comportait un petit piège qu'ils n'ont pas vu
    Dans ce code , j'ai considéré qu'il n'y avait pas 2 cellules vides adjacentes.

    Si tu as besoin d'explications fais signe
    Option Explicit
    '--------------------------------
    Sub fusionnerV()
    Dim Lig As Byte
    Application.ScreenUpdating = False
    Application.DisplayAlerts = False
    For Lig = 30 To 90
    If Cells(Lig, "A") = Cells(Lig + 1, "A") Then
    With Range(Cells(Lig, "A"), Cells(Lig + 1, "A"))
    .MergeCells = True
    .VerticalAlignment = xlCenter
    End With
    Lig = Lig + 2
    End If
    Next
    Application.DisplayAlerts = True

    End Sub


    4
    1. Flo
       
      Merci beaucoup pour ton aide michel !!!

      Tu as bien compris ma demande et tu y réponds quasi parfaitement ^^

      Premier détail que j'avais oublié de préciser: mon tableau contient initialement 60 lignes vierge. Suite au lancement d'une macro, celui-ci vient se remplir mais pas entièrement. J’obtiens donc des cellules vides en fin de tableau. Je supprime les lignes vides grâce à une macro mais je ne peux savoir avant combien de lignes mon tableau contiendra au final... Mais peut importe puisque ça ne semble pas poser de problème à priori (je réaliserai la fusion avant la suppression).

      Concernant ton code à proprement dit:
      Lorsque j'ai 2 cellules identiques (exemple: A31 et A32), ton code fonctionne parfaitement.
      Par contre:
      - lorsque j'ai 3 ou 4 cellules identiques (exemple: A31, A32 et A33 (et A34)), ça me fusionne uniquement les deux premières (A31 et A32)
      - lorsque j'ai 5 cellules identiques ou plus, ça me donne: 2 cellules fusionnées, 1 non fusionnée, 2 fusionnées, ...

      Lorsque je relance la macro plusieurs fois ensuite, je remarque que pour le cas de 5 cellules ou plus, ça me donne: 2 fusionnées, 3 fusionnées, 3 fusionnées, ...

      J'ai l'impression que si nous avons 2 cellules déjà fusionnées et que nous souhaitons les fusionner avec une 3ème cellule alors ça ne marchera pas mais, à l'inverse, si nous avons une cellule non fusionnée suivie de 2 cellules fusionnée alors ça marchera (nous obtiendrons alors 3 cellules fusionnées).
      J'ai fais le test avec 1 cellule non fusionnée suivie de 3 cellules fusionnées et en lançant la macro ça me fusionne bien mes 4 cellules.

      Je pense que si la macro s'effectuait dans l'autre sens (de la cellule 90 à la cellule 30) ça solutionnerait ce problème mais je ne sais pas si c'est réalisable...

      En attendant, encore merci pour ta réponse !!
      0
    2. michel_m Messages postés 18903 Date d'inscription   Statut Contributeur Dernière intervention   3 320
       
      Bonjour
      pour les N cellules fusionnées, je te fais ca dès que j'ai un moment

      par contre je ne comprend pourquoi
      Lorsque je relance la macro plusieurs fois ensuite, je remarque que pour le cas de 5 cellules ou plus, ça me donne: 2 fusionnées, 3 fusionnées, 3 fusionnées, ...

      En relançant la macro, il faudrait peut-^tre revoir tout le code et que je sache quels changements ont été apportés qui justifie la relance

      dans l'attente
      0
    3. Flo
       
      Je n'avais rien changé à ta macro mais en la relançant ca me refaisait des fusions: si j'avais une cellule simple Y suivie des 2 cellules Y déjà fusionnées entre elles alors ça me fusionnait ces 3 cellules lorsque je lançais la macro une seconde fois. Mais comme tu l'a compris mon objectif serait de fusion N cellules ensemble.

      En essayant de comprendre et de me dépatouiller de mon coté, j'ai modifié ton code comme ceci:

      Dim Lig As Byte
      Application.ScreenUpdating = False
      Application.DisplayAlerts = False
      For Lig = 30 To 90
      If Cells(Lig, "A") = Cells(Lig + 1, "A") Then
      With Range(Cells(Lig, "A"), Cells(Lig + 1, "A"))
      .MergeCells = True
      .VerticalAlignment = xlCenter
      End With
      Lig = Lig + 2
      End If
      Next
      For Lig = 30 To 90
      If Cells(Lig, "A") = Cells(Lig + 2, "A") Then
      With Range(Cells(Lig, "A"), Cells(Lig + 2, "A"))
      .MergeCells = True
      .VerticalAlignment = xlCenter
      End With
      Lig = Lig + 3
      End If
      Next
      For Lig = 30 To 90
      If Cells(Lig, "A") = Cells(Lig + 3, "A") Then
      With Range(Cells(Lig, "A"), Cells(Lig + 3, "A"))
      .MergeCells = True
      .VerticalAlignment = xlCenter
      End With
      Lig = Lig + 4
      End If
      Next
      Application.DisplayAlerts = True
      End Sub


      Et ça à l'air de plutôt bien fonctionner. Le problème (parce qu'évidement rien ne peut fonctionner parfaitement), c'est lorsque je rajoute:

          For Lig = 30 To 90
      If Cells(Lig, "A") = Cells(Lig + 4, "A") Then
      With Range(Cells(Lig, "A"), Cells(Lig + 4, "A"))
      .MergeCells = True
      .VerticalAlignment = xlCenter
      End With
      Lig = Lig + 5
      End If
      Next

      Alors là ça me fait du grand nimporte (je me retrouve avec 21 cellules fusionnées, la quasi totalité de mon tableau) alors que ça ne devrait pas...

      Moi qui pensait avoir trouver la solution, je ne sais plus trop quoi penser maintenant ^^
      0
      1. michel_m Messages postés 18903 Date d'inscription   Statut Contributeur Dernière intervention   3 320 > Flo
         
        Désolé, coupure de courant (orage)

        Je regarde demain.... ;o)
        0
  2. michel_m Messages postés 18903 Date d'inscription   Statut Contributeur Dernière intervention   3 320
     
    Bonjour Flo

    le code modifié avec N cellules au lieu de 2
    Option Explicit
    '--------
    Sub fusionnerV()
    Dim Lig As Byte, Deb As Byte
    'fige le défilement de l'écran:confort et rapidité
    Application.ScreenUpdating = False
    'empèche le message d'avertissement de fusion de cellules
    Application.DisplayAlerts = False
    For Lig = 30 To 90
    'Si cellule du dessous =cellule en cours
    If Cells(Lig, "A") = Cells(Lig + 1, "A") Then
    Deb = Lig 'mémorise la ligne de départ de fusion

    'Incrémente la ligne jusqu'à fin de condition =
    Do
    Lig = Lig + 1
    Loop Until Cells(Lig, "A") <> Cells(Lig + 1, "A")

    'fusionne le bloc des cellules adjacentes =
    With Range(Cells(Deb, "A"), Cells(Lig, "A"))
    .MergeCells = True
    .VerticalAlignment = xlCenter
    End With
    End If
    Next

    Application.DisplayAlerts = True
    'encadre la nouvelle présentation
    Range("A30:A90").Borders.Weight = xlThin

    End Sub


    2
    1. Flo
       
      WOUAH !!! C'est parfait !!! Merci beaucoup !!
      Avec les commentaires pour m'expliquer en plus c'est vraiment top!!! Je pense avoir bien compris le code et pouvoir à l'avenir en créer un du même type tout seul (bon il me faudra quand même quelques heures d'entrainement pour bien maîtrise les conditions, les boucles, etc. mais ça viendra certainement).
      Encore merci michel !!!
      0
  3. Arkana0 Messages postés 1980 Date d'inscription   Statut Modérateur Dernière intervention   183
     
    Bonjour,

    Voici des éléments pour t'aider à faire ton code :

    Premièrement, n'hésite pas à abuser du "enregistrer macro" pour obtenir le code permettant de réaliser des actions telles que fusionner des cellules.

    Ensuite, sur ce site : https://www.excel-pratique.com/fr/vba/introduction.php tu trouveras une aide précieuse. Tu devrais notamment être intéressé par le chapitre sur les boucles et celui sur les conditions.

    Enfin tu trouveras certainement pratique les élements suivants :
    ActiveCell
    , qui permet de se référer à la cellule active, ou sélectionnée pour le dire autrement.
    Cells(x,y)
    , qui permet de se référer la à la cellule de la ligne x et de la colonne y (où x et y sont des nombres), la cellule "A1" correspondant à Cells(1,1)
    Ainsi que les méthodes suivantes :
    .Select
    , qui permet de sélectionner la cellule à laquelle tu te réfères (exemple : Cells(x,y).Select)
    .Offset(x,y)
    , qui permet, à partir d'une cellule à laquelle tu fais référence de s'intéresser à la cellule se situant x lignes plus bas et y colonnes plus loin. Exemple : ActiveCell.Offset(0,1).Select permet de sélectionner la cellule de la colonne suivant celle où se trouve la cellule actuellement active
    .Value
    , qui permet de faire référence à la valeur de la cellule sélectionnée. Exemple : ActiveCell.Offset(0,1).Value = "" permet de rentrer une case vide dans la cellule une colonne après la cellule qui est actuellement active.
    1
    1. Flo
       
      Merci pour ta réponse.

      Pour faire mes macros j'abusais de la fonction "enregistrer une macro" comme tu dis et j'apprenais en regardant les codes dans visual basic. Le problème c'est que pour des macros avec des conditions je ne peux faire ainsi. Et pour mon cas en particulier je ne peux me débrouiller uniquement avec tes conseils.
      Mais encore merci pour ta contribution.
      0
  4. Heas Messages postés 73 Statut Membre 5
     
    Bonjour,
    le problème que ta as posé a été résolu avec la première macro.
    MAIS, en fait ton problème est que tu veux fusionner n cellules identiques.
    Ce qui est légèrement différent.

    D'autre part, pourquoi fusionner des cellules identiques?

    Aussi, essaye de travailler avec les conseils d'Arkana.

    Et dans ton cas, si tu tiens vraiment à faire la fusion, travaille avec une boucle du type
    Depart= 30 : i=1
    WHILE Cell(Depart)=Cell(depart+i)
    i=i+1
    wend

    Fusionner de Depart à Depart +i-1 (Si on sort de la boucle, c'est que la cellule est différente)

    Et attention à faire le While avec un test sur le nombre max de cellules, car tu peux avoir la 59 et la 60 identiques; sauf SI TU ES SUR que la 61 est vide.
    1
  5. Vous n’avez pas trouvé la réponse que vous recherchez ?

    Posez votre question
  6. makitoch Messages postés 789 Statut Membre 94
     
    franchement les conditions sur les cellule c'est juste des boucles for () avec des if () donc ça tu peux trouver tout seul ^^

    voici comment fusionner des cellules :
    Range("D5:D6").Select
    Selection.Merge
    Selection.UnMerge
    -5