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 :

Fusionner des cellules sur 34000 lignes


Sujet :

Macros et VBA Excel

  1. #1
    Membre régulier
    Profil pro
    Responsable de projet
    Inscrit en
    Décembre 2005
    Messages
    97
    Détails du profil
    Informations personnelles :
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Responsable de projet

    Informations forums :
    Inscription : Décembre 2005
    Messages : 97
    Points : 110
    Points
    110
    Par défaut Fusionner des cellules sur 34000 lignes
    Bonjour à tous,

    J'ai developpé une macro qui fait du fusionnement de cellules.
    Le probleme etant que sur un tableau de 34 000 lignes, le fusionnement est beaucoup trop long.

    Avez vous une idée pour optimiser 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
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    Sub mergeLines()
     
    Application.ScreenUpdating = False
    Application.Calculation = xlCalculationManual
    Application.DisplayAlerts = False
     
        Dim nbLigne As Long
        Dim j As Integer
        Dim k As Integer
     
        nbLigne = Range("B65536").End(xlUp).Row
     
        For i = 1 To nbLigne
     
            If Range("Z1").Offset(i, 0).Value = Range("Z1").Offset(i + 1, 0).Value Then
     
                j = i + 1
                k = i + 2
     
                Range("A" & j & ":A" & k).Merge
                Range("B" & j & ":B" & k).Merge
                Range("C" & j & ":C" & k).Merge
                Range("D" & j & ":D" & k).Merge
                Range("E" & j & ":E" & k).Merge
                Range("F" & j & ":F" & k).Merge
                Range("G" & j & ":G" & k).Merge
                Range("H" & j & ":H" & k).Merge
                Range("I" & j & ":I" & k).Merge
                Range("J" & j & ":J" & k).Merge
                Range("K" & j & ":K" & k).Merge
                Range("L" & j & ":L" & k).Merge
                Range("M" & j & ":M" & k).Merge
                Range("N" & j & ":N" & k).Merge
                Range("O" & j & ":O" & k).Merge
                Range("P" & j & ":P" & k).Merge
                Range("Q" & j & ":Q" & k).Merge
                Range("R" & j & ":R" & k).Merge
                Range("S" & j & ":S" & k).Merge
                Range("T" & j & ":T" & k).Merge
                Range("U" & j & ":U" & k).Merge
                Range("V" & j & ":V" & k).Merge
                Range("W" & j & ":W" & k).Merge
                Range("X" & j & ":X" & k).Merge
                Range("Y" & j & ":Y" & k).Merge
                Range("Z" & j & ":Z" & k).Merge
     
     
            End If
     
        Next i
     
    Application.ScreenUpdating = True
    Application.Calculation = xlCalculationAutomatic
    Application.DisplayAlerts = True
     
    End Sub
    Merci beaucoup de votre aide

  2. #2
    Membre averti
    Profil pro
    Inscrit en
    Février 2006
    Messages
    288
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 288
    Points : 364
    Points
    364
    Par défaut
    Il peut y avoir une solution qui est de fusionner des plages de plus de deux lignes quand c'est possible, mais elle ne serait vraiment efficace que si le tableau n'est pas trop morcelé et que de grandes plages sont fusionnables.
    Tant que Zx est semblable à Zx+1 on se contente d'incrémenter une variable, et dès que c'est différent on fait la fusion. Je suis désolé j'ai réécrit la boucle sans les offset parce que je ne suis pas familiarisé avec cette technique et que j'aurais risqué de faire des erreurs, mais bon c'est tout à fait possible avec évidemment.

    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
    56
    57
    58
    Sub mergeLines()
     
    Application.ScreenUpdating = False
    Application.Calculation = xlCalculationManual
    Application.DisplayAlerts = False
     
        Dim nbLigne As Long
        Dim j As Integer
        Dim k As Integer
     
        nbLigne = Range("B65536").End(xlUp).Row
     
        j = 1 'j = variable de début de plage    
     
        For i = 1 To nbLigne + 1       'je rajoute +1 à nbLigne pour que le code considère qu'il y a une différence entre la dernière ligne et la dernière ligne + 1, afin de fusionner la fin si besoin.
            If Range("Z" & i).Value = Range("Z" & i+1).Value Then
                'on ne fait rien sinon se contenter de laisser monter i 
            Else  
                k = i 'k = variable de fin de plage (pas vraiment utile, on pourrait utiliser i, mais ça m'évite de modifier ton code ci-dessous)
                if j <> k then 'on ne va pas fusionner des plages d'une ligne !
                  Range("A" & j & ":A" & k).Merge
                  Range("B" & j & ":B" & k).Merge
                  Range("C" & j & ":C" & k).Merge
                  Range("D" & j & ":D" & k).Merge
                  Range("E" & j & ":E" & k).Merge
                  Range("F" & j & ":F" & k).Merge
                  Range("G" & j & ":G" & k).Merge
                  Range("H" & j & ":H" & k).Merge
                  Range("I" & j & ":I" & k).Merge
                  Range("J" & j & ":J" & k).Merge
                  Range("K" & j & ":K" & k).Merge
                  Range("L" & j & ":L" & k).Merge
                  Range("M" & j & ":M" & k).Merge
                  Range("N" & j & ":N" & k).Merge
                  Range("O" & j & ":O" & k).Merge
                  Range("P" & j & ":P" & k).Merge
                  Range("Q" & j & ":Q" & k).Merge
                  Range("R" & j & ":R" & k).Merge
                  Range("S" & j & ":S" & k).Merge
                  Range("T" & j & ":T" & k).Merge
                  Range("U" & j & ":U" & k).Merge
                  Range("V" & j & ":V" & k).Merge
                  Range("W" & j & ":W" & k).Merge
                  Range("X" & j & ":X" & k).Merge
                  Range("Y" & j & ":Y" & k).Merge
                  Range("Z" & j & ":Z" & k).Merge
                end if
     
                j = i + 1 'on réinitialise j pour un début de nouvelle plage
            End If
     
        Next i
     
    Application.ScreenUpdating = True
    Application.Calculation = xlCalculationAutomatic
    Application.DisplayAlerts = True
     
    End Sub
    Je dois avouer piteusement que je n'ai pas le temps de tester, donc ça nécessitera peut-être de petites adaptations.

Discussions similaires

  1. [XL-2007] Cibler des cellules sur chaque ligne dans une sélection
    Par Ghuron dans le forum Macros et VBA Excel
    Réponses: 3
    Dernier message: 30/09/2014, 09h59
  2. [XL-2003] copier des cellules sur la dernière ligne
    Par chrnoe dans le forum Excel
    Réponses: 1
    Dernier message: 15/02/2010, 18h18
  3. Datagridview: Masquer des cellules sur certaines lignes
    Par boby62423 dans le forum Windows Forms
    Réponses: 0
    Dernier message: 27/04/2009, 14h57
  4. Fusionner des cellules sur plusieurs lignes
    Par pekka77 dans le forum Macros et VBA Excel
    Réponses: 4
    Dernier message: 04/07/2008, 18h05
  5. [XSL:FO] fusionner une cellule sur deux lignes.
    Par Luc Hermitte dans le forum XSL/XSLT/XPATH
    Réponses: 6
    Dernier message: 03/07/2008, 11h33

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