XL 2016 Fusion cellule VBA

  • Initiateur de la discussion Initiateur de la discussion Ethlios
  • Date de début Date de début

Boostez vos compétences Excel avec notre communauté !

Rejoignez Excel Downloads, le rendez-vous des passionnés où l'entraide fait la force. Apprenez, échangez, progressez – et tout ça gratuitement ! 👉 Inscrivez-vous maintenant !

Ethlios

XLDnaute Junior
Bonjour à tous,

Je cherche un code VBA permettant fusionner des cellules. Exemple, je définis un nombre de cellule en amont, 20 cellules, et je veux en fusionner 2, puis 5, puis 7... à la suite, sans pour autant fusionner les 20. J'imaginais donc un système d'inputbox qui pose plusieurs fois la même question jusqu'à écrire 0 pour arrêter le code. Comment retranscrire cela en code VBA.

Exemple en pièce jointe pour illustré

Merci d'avance pour votre aide.

Ethlios
 

Pièces jointes

Bonjour,
je définis un nombre de cellule en amont, 20 cellules
Tu les définis comment en amont ?

Voici un code qui fait ça sur la base d'un sélection préalable de cellules contigües (pas d'Areas multiples).
Il faut lancer la Macro soit par un bouton, soit par un raccourci clavier après la sélection.
La fusion se fait par lignes.
VB:
Sub FusionCellules()
    Dim RangeRestant As Range
    Dim Réponse As Variant
    Dim NbV As Integer

    If Not TypeOf Selection Is Range Then Exit Sub
    If Selection.Areas.Count > 1 Then Exit Sub
    If Selection.Cells.Count = 1 Then Exit Sub
   
    Set RangeRestant = Selection
   
    Do While Not RangeRestant Is Nothing
        Réponse = Application.InputBox("Combien de cellules sont à fusionner en hauteur ?", "Fusion", "2", Type:=1)
        If VarType(Réponse) = vbBoolean Then Exit Sub
       
        NbV = CInt(Réponse)
        If NbV = 0 Or NbV > RangeRestant.Rows.Count Then
            MsgBox "Le nombre de cellules à fusionner dépasse les limites du range restant à fusionner"
        Else
            If RangeRestant.Cells(1, 1).Resize(NbV, RangeRestant.Columns.Count).Cells.Count = 1 Then
                MsgBox "Il faut au moins 2 cellules pour une fusion"
            Else
                RangeRestant.Cells(1, 1).Resize(NbV, RangeRestant.Columns.Count).MergeCells = True
                If RangeRestant.Rows.Count = NbV Then
                    Set RangeRestant = Nothing
                Else
                    Set RangeRestant = RangeRestant.Cells(NbV + 1, 1).Resize(RangeRestant.Rows.Count - NbV, RangeRestant.Columns.Count)
                    If RangeRestant.Cells.Count = 1 Then
                        Set RangeRestant = Nothing
                    Else
                        MsgBox "Encore " & RangeRestant.Rows.Count & " lignes à fusionner."
                    End If
                End If
            End If
        End If
    Loop
   
    MsgBox "Fusion terminée."
End Sub
 
Dernière édition:
Bonsoir Ethkios, Dudu2,

Voyez le fichier joint et la macro affectée au bouton :
VB:
Sub Fusion()
Dim r As Range
On Error Resume Next
Set r = Application.InputBox("Sélectionnez les cellules jaunes à fusionner :", Type:=8)
If r Is Nothing Then Exit Sub
Set r = Intersect(r, [G4:X4])
If Not r Is Nothing Then r.Merge: r.Select
End Sub
Bonne nuit.
 

Pièces jointes

Bonjour,

Tu les définis comment en amont ?

Voici un code qui fait ça sur la base d'un sélection préalable de cellules contigües (pas d'Areas multiples).
Il faut lancer la Macro soit par un bouton, soit par un raccourci clavier après la sélection.
La fusion se fait par lignes.
VB:
Sub FusionCellules()
    Dim RangeRestant As Range
    Dim Réponse As Variant
    Dim NbV As Integer

    If Not TypeOf Selection Is Range Then Exit Sub
    If Selection.Areas.Count > 1 Then Exit Sub
    If Selection.Cells.Count = 1 Then Exit Sub
 
    Set RangeRestant = Selection
 
    Do While Not RangeRestant Is Nothing
        Réponse = Application.InputBox("Combien de cellules sont à fusionner en hauteur ?", "Fusion", "2", Type:=1)
        If VarType(Réponse) = vbBoolean Then Exit Sub
     
        NbV = CInt(Réponse)
        If NbV = 0 Or NbV > RangeRestant.Rows.Count Then
            MsgBox "Le nombre de cellules à fusionner dépasse les limites du range restant à fusionner"
        Else
            If RangeRestant.Cells(1, 1).Resize(NbV, RangeRestant.Columns.Count).Cells.Count = 1 Then
                MsgBox "Il faut au moins 2 cellules pour une fusion"
            Else
                RangeRestant.Cells(1, 1).Resize(NbV, RangeRestant.Columns.Count).MergeCells = True
                If RangeRestant.Rows.Count = NbV Then
                    Set RangeRestant = Nothing
                Else
                    Set RangeRestant = RangeRestant.Cells(NbV + 1, 1).Resize(RangeRestant.Rows.Count - NbV, RangeRestant.Columns.Count)
                    If RangeRestant.Cells.Count = 1 Then
                        Set RangeRestant = Nothing
                    Else
                        MsgBox "Encore " & RangeRestant.Rows.Count & " lignes à fusionner."
                    End If
                End If
            End If
        End If
    Loop
 
    MsgBox "Fusion terminée."
End Sub

Je les définis par la taille de mon tableau.

NB:
*Quand je sélectionne les cellules et que je lance la macro puis j'inscris le nombre de cellules à fusionner cela ne fonctionne pas j'ai le message "Le nombre de cellules à fusionner dépasse les limites du range restant à fusionner" la seule valeur qui fonctionne est 1
 
Dernière édition:
*Quand je sélectionne les cellules et que je lance la macro puis j'inscris le nombre de cellules à fusionner cela ne fonctionne pas j'ai le message "Le nombre de cellules à fusionner dépasse les limites du range restant à fusionner" la seule valeur qui fonctionne est 1
C'est que n'as sélectionné qu'une seule ligne. Donc 1 pour 1 ligne.
Les cellules de la ligne sélectionnée seront fusionnées.
 
Bon, dans cette version j'ai intégré la fusion de lignes et la fusion de colonnes (prompt au début).
Tu devrais choisir l'option fusion en colonnes valable pour 1 ou plusieurs lignes.
L'option fusion en lignes est elle valable pour 1 ou plusieurs colonnes.

Ça gère aussi l'erreur qui intervient lorsqu'on annule un fusion suite au warning Excel des valeurs qui ne sont pas reportées.
VB:
Sub FusionCellules()
    Dim RangeRestant As Range
    Dim Réponse As Variant
    Dim Nb As Integer
    Dim FusionLignes As Boolean
    Dim ErrNumber As Long
  
    If Not TypeOf Selection Is Range Then Exit Sub
    If Selection.Areas.Count > 1 Then Exit Sub
    If Selection.Cells.Count = 1 Then Exit Sub
 
    Set RangeRestant = Selection
  
    Do While 1
        Réponse = Application.InputBox("Fusionner des cellules en lignes (L) ou en colonnes (C) ?", "Fusion", "C", Type:=2)
        If VarType(Réponse) = vbBoolean Then Exit Sub
      
        Select Case UCase(Réponse)
            Case "C"
                FusionLignes = False
                Exit Do
            Case "L"
                FusionLignes = True
                Exit Do
            Case Else
                MsgBox "Répondre 'L' pour fusion de lignes ou 'C' pour fusion de colonnes."
        End Select
    Loop
 
    Do While Not RangeRestant Is Nothing
        'Fusion de lignes
         If FusionLignes Then
             Réponse = Application.InputBox("Combien de lignes sont à fusionner ?", "Fusion", RangeRestant.Rows.Count, Type:=1)
             If VarType(Réponse) = vbBoolean Then Exit Sub
          
             Nb = CInt(Réponse)
      
            If Nb = 0 Or Nb > RangeRestant.Rows.Count Then
                MsgBox "Le nombre de lignes à fusionner dépasse les limites du range restant"
            Else
                If RangeRestant.Cells(1, 1).Resize(Nb, RangeRestant.Columns.Count).Cells.Count = 1 Then
                    MsgBox "Il faut au moins 2 cellules pour une fusion"
                Else
                    On Error Resume Next
                    RangeRestant.Cells(1, 1).Resize(Nb, RangeRestant.Columns.Count).MergeCells = True
                    ErrNumber = Err.Number
                    On Error GoTo 0
                  
                    If ErrNumber = 0 Then
                        If RangeRestant.Rows.Count = Nb Then
                            Set RangeRestant = Nothing
                        Else
                            Set RangeRestant = RangeRestant.Cells(Nb + 1, 1).Resize(RangeRestant.Rows.Count - Nb, RangeRestant.Columns.Count)
                            If RangeRestant.Cells.Count = 1 Then
                                Set RangeRestant = Nothing
                            Else
                                MsgBox "Encore " & RangeRestant.Rows.Count & " lignes à fusionner"
                            End If
                        End If
                    End If
                End If
            End If
      
        'Fusion de colonnes
        Else
            Réponse = Application.InputBox("Combien de colonnes sont à fusionner ?", "Fusion", RangeRestant.Columns.Count, Type:=1)
            If VarType(Réponse) = vbBoolean Then Exit Sub
          
             Nb = CInt(Réponse)
          
            If Nb = 0 Or Nb > RangeRestant.Columns.Count Then
                MsgBox "Le nombre de colonnes à fusionner dépasse les limites du range restant"
            Else
                If RangeRestant.Cells(1, 1).Resize(RangeRestant.Rows.Count, Nb).Cells.Count = 1 Then
                    MsgBox "Il faut au moins 2 cellules pour une fusion"
                Else
                    On Error Resume Next
                    RangeRestant.Cells(1, 1).Resize(RangeRestant.Rows.Count, Nb).MergeCells = True
                    ErrNumber = Err.Number
                    On Error GoTo 0
                  
                    If ErrNumber = 0 Then
                        If RangeRestant.Columns.Count = Nb Then
                            Set RangeRestant = Nothing
                        Else
                            Set RangeRestant = RangeRestant.Cells(1, Nb + 1).Resize(RangeRestant.Rows.Count, RangeRestant.Columns.Count - Nb)
                            If RangeRestant.Cells.Count = 1 Then
                                Set RangeRestant = Nothing
                            Else
                                MsgBox "Encore " & RangeRestant.Columns.Count & " colonnes à fusionner"
                            End If
                        End If
                    End If
                End If
            End If
        End If
    Loop
 
    MsgBox "Fusion terminée."
End Sub
 
C'est vrai que mon fichier (1) ne faisait pas exactement ce qui était demandé, alors voyez ce fichier (2).

On traite uniquement la plage G4:X4, comme indiquée dans le fichier du post #1 :
VB:
Sub Fusion()
Dim R As Range, ncol%, x, n, nn%
Set R = [G4:X4] 'vecteur ligne à adapter
ncol = R.Count
R.UnMerge 'RAZ
R(1).Copy R
Do
    x = Application.InputBox("Nombre de cellules à fusionner :", "Fusion", IIf(n > 0, "", CStr(x)), 2)
    If VarType(x) = vbBoolean Then Exit Sub
    n = Int(Val(x))
    If n > 0 Then
        If nn + n > ncol Then n = ncol - nn
        With R(1, nn + 1).Resize(, n)
            .Merge
            .Select
            If nn + n >= ncol - 1 Then MsgBox "Terminée", , "Fusion": Exit Sub
            nn = nn + n
        End With
    End If
Loop
End Sub
 

Pièces jointes

Dernière édition:
C'est vrai que mon fichier (1) ne faisait pas exactement ce qui était demandé, alors voyez ce fichier (2).

On traite uniquement la plage G4:X4, comme indiquée dans le fichier du post #1 :
VB:
Sub Fusion()
Dim R As Range, ncol%, x, n, nn%
Set R = [G4:X4] 'vecteur ligne à adapter
ncol = R.Count
R.UnMerge 'RAZ
R(1).Copy R
Do
    x = Application.InputBox("Nombre de cellules à fusionner :", "Fusion", IIf(n > 0, "", CStr(x)), 2)
    If VarType(x) = vbBoolean Then Exit Sub
    n = Int(Val(x))
    If n > 0 Then
        If nn + n > ncol Then n = ncol - nn
        With R(1, nn + 1).Resize(, n)
            .Merge
            .Select
            If nn + n >= ncol - 1 Then MsgBox "Terminée", , "Fusion": Exit Sub
            nn = nn + n
        End With
    End If
Loop
End Sub
C'est encore mieux ! Merci beaucoup !!
 
- Navigue sans publicité
- Accède à Cléa, notre assistante IA experte Excel... et pas que...
- Profite de fonctionnalités exclusives
Ton soutien permet à Excel Downloads de rester 100% gratuit et de continuer à rassembler les passionnés d'Excel.
Je deviens Supporter XLD

Discussions similaires

  • Question Question
Réponses
5
Affichages
300
Réponses
7
Affichages
345
Retour