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]Trouver les cellules fusionnées et autres


Sujet :

Macros et VBA Excel

  1. #1
    Membre à l'essai
    Inscrit en
    Juin 2004
    Messages
    24
    Détails du profil
    Informations forums :
    Inscription : Juin 2004
    Messages : 24
    Points : 11
    Points
    11
    Par défaut [Résolu][VBA]Trouver les cellules fusionnées et autres
    Bonjour à tous.

    Je suis face à un problème que j'ai du mal à résoudre.

    Imaginez :

    j'ai un tableau dont le nombre de colonnes est fixe mais dont le nombre de lignes peut varier. Dans ce tableau, il y a des cellules fusionnées. Quand une cellule de la colonne A est fusionnée, toutes les cellules appartenant à la même ligne le sont aussi.

    J'ai besoin de trouver automatiquement toutes les cellules qui sont fusionnées, les "défusionner" et copier le contenu initial de ces cellules dans les cellules vide apparue suite à l'opération de "défusion".

    Le nombre de cellules dans une cellule fusionnée est aléatoire.

    Mes capacités en VBA étant trés limitée (je fais souvent du bricolage grâce à l'outil d'enregistrement de macro) je ne connais pas suffisamment la syntaxe de ce langage.

    J'ai pensé à une méthode :

    - tester quelle est la dernière ligne du tableau ;
    - tester, colonne par colonne, toutes les cellules ;
    - si une cellule est fusionnée, défusionner la cellule ;
    - copier le contenu initial dans toutes les cellules apparues (jusqu'à ce que l'on rencontre une cellule non vide).

    On pourrait aussi faire un test que sur la colonne A et ensuite selectionner toute une ligne, défusionner toutes les cellules de cette ligne et recopier le contenu initial dans toutes les lignes vide apparues (raisonnement par plage de cellules).

    Quelqu'un pourrait-il m'aider ?

    Merci beaucoup.

  2. #2
    Inactif  
    Avatar de jmfmarques
    Profil pro
    Inscrit en
    Décembre 2005
    Messages
    3 784
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2005
    Messages : 3 784
    Points : 4 674
    Points
    4 674
    Par défaut
    Bel exercice :

    Mais, dis-nous, çà nous/me interesse grandement :

    1) Quand tu "défusionnes", tu voudrais pas aussi, par hasard, "rétablir" ce que tu avais avant de fusionner ? (et dans ce cas, où as-tu mis en mémoire la situation originelle ?)
    2) Sinon : dans quelle cellule "défusionnée" veux-tu placer ce qui était "fusionné" ??

    Vaste programme, à vrai dire !


  3. #3
    Membre expérimenté Avatar de Megaxel
    Profil pro
    Inscrit en
    Mai 2003
    Messages
    1 187
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2003
    Messages : 1 187
    Points : 1 405
    Points
    1 405
    Par défaut
    Hello!
    Je ne sais pas exactement ce que tu veux faire, donc je vais peut-être te dire une sottise: et si tu intercales une (ou des ) lignes vides avant tes cellule fusionnées pour y mettre tes données, ça éviterait déjà tous les "défusionnages"...
    Non?

  4. #4
    Inactif  
    Avatar de jmfmarques
    Profil pro
    Inscrit en
    Décembre 2005
    Messages
    3 784
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2005
    Messages : 3 784
    Points : 4 674
    Points
    4 674
    Par défaut
    Ah ! les voilà rendues possibles, nos mémoires de situation originelle...
    On m'en dira tant !
    Hé ! Sframe , qu'en penses-tu ?


  5. #5
    Membre à l'essai
    Inscrit en
    Juin 2004
    Messages
    24
    Détails du profil
    Informations forums :
    Inscription : Juin 2004
    Messages : 24
    Points : 11
    Points
    11
    Par défaut
    Et bien pour vous répondre à tous les deux :

    - je n'ai pas besoin d'une mémoire tampon à priori car l'opération de "défusionnage" ne supprime pas le contenu original, il est juste mis dans une seule cellule, la première au dessus des autres (puisque les cellules sont fusionnées verticalement).

    - Je ne peux pas intercaler des lignes vierges car mon tableau est généré par une requête dans une base de donnée via un programme que je ne peux pas modifier (sinon je ferais en sorte que les celllules ne soient pas fusionnées).

    Est ce que quelqu'un serait capable d'interpreter cette opération sous forme de code ?

  6. #6
    Membre à l'essai
    Inscrit en
    Juin 2004
    Messages
    24
    Détails du profil
    Informations forums :
    Inscription : Juin 2004
    Messages : 24
    Points : 11
    Points
    11
    Par défaut
    Bon j'ai essayé de faire quelque chose mais ca ne fonctionne pas du tout !

    En fait il ne se passe rien.

    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
     
    Dim Mergedcells As Range
    Dim Lastrow As Range
    Dim i As Integer
    Dim c As Integer
    Dim r As Integer
     
    Application.ScreenUpdating = False
     
    Set Lastrow = ActiveSheet.UsedRange.SpecialCells(xlCellTypeLastCell)
     
    For c = 1 To 34
     
        For i = 2 To Lastrow
     
            If ActiveSheet.Cells(i, c).MergeCells = True Then
            Mergedcells = ActiveSheet.RangeCells(i, c)
            Mergedcells.UnMerge
     
            r = 1
     
                While ActiveSheet.Cells(i + r, c).IsEmpty
                ActiveSheet.Range(Cells(i, c), Cells(i + r, c)).FillDown
                Wend
     
            End If
     
        Next i
     
    Next c
    Qu'en pensez vous ?

  7. #7
    Membre expérimenté Avatar de Megaxel
    Profil pro
    Inscrit en
    Mai 2003
    Messages
    1 187
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2003
    Messages : 1 187
    Points : 1 405
    Points
    1 405
    Par défaut
    Juste comme ça: LastRow, c'est quoi? Je suppose que tu veux que ça soit le numéro de la dernière ligne. Tu dois donc ajouter ".Row" à la fin de la ligne où tu le définis.
    Après.... On verra...

  8. #8
    Membre à l'essai
    Inscrit en
    Juin 2004
    Messages
    24
    Détails du profil
    Informations forums :
    Inscription : Juin 2004
    Messages : 24
    Points : 11
    Points
    11
    Par défaut
    Hum si j'ajoute .Row, il me retourne une erreur type 424 "Object required".

    LastRow doit effectivement me permettre de trouver quelle est la dernière ligne de mon tableau, puisque le nombre de ligne de ce tableau est aléatoire.

  9. #9
    Inactif  
    Avatar de jmfmarques
    Profil pro
    Inscrit en
    Décembre 2005
    Messages
    3 784
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2005
    Messages : 3 784
    Points : 4 674
    Points
    4 674
    Par défaut
    Bon ! je vois mal où tu sélectionnes les colonnes ou lignes fusionnées

    Commences donc par ce truc tout bête, juste pour voir comment s'y prend Monsieur VBA :

    1) Tu crées un document nouveau dans lequel tu disposes des cellules de façon similaire à celles reçues de ta base. (cellules fusionnées etc... étant entendu que tu n'a pas besoin de mettre tout ce que t'envoie ta base)
    2) tu lances l'enregistreur de macro et, en prenant soin, tu accomplis manuellement les opérations que tu souhaites
    3) tu arrêtes l'enregistrement puis va lire comment VBA a interprété et codé tes gestes...
    4) tu adaptes tout celà, avec cette syntaxe, à ta guise...


  10. #10
    Membre à l'essai
    Inscrit en
    Juin 2004
    Messages
    24
    Détails du profil
    Informations forums :
    Inscription : Juin 2004
    Messages : 24
    Points : 11
    Points
    11
    Par défaut
    J'ai déjà essayé évidemment, sans beaucoup de succès

  11. #11
    Inactif  
    Avatar de jmfmarques
    Profil pro
    Inscrit en
    Décembre 2005
    Messages
    3 784
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2005
    Messages : 3 784
    Points : 4 674
    Points
    4 674
    Par défaut
    Attends Attends !

    On va partir du principe selon lequel on ne risque jamais de défusionner ce qui n'est pas fusionné (n'est-ce-pas ?)

    Si toutes les cellules sont sélectionnées puis dégroupées, il ne devrait plus y avoir de problème de présence de cellules groupées, non ?

    L'enregistreur de macro te donnera bien volontiers cette petite syntaxe (tout sélectionner puis tout dégrouper)

    C'edst juste une idée...

    :

  12. #12
    Membre à l'essai
    Inscrit en
    Juin 2004
    Messages
    24
    Détails du profil
    Informations forums :
    Inscription : Juin 2004
    Messages : 24
    Points : 11
    Points
    11
    Par défaut
    Bonne idée mais il me manque la fonction qui me permet de recopier dans les cellules vide ("défusionnées") le contenu initial de chaque cellule fusionnée.

  13. #13
    Inactif  
    Avatar de jmfmarques
    Profil pro
    Inscrit en
    Décembre 2005
    Messages
    3 784
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2005
    Messages : 3 784
    Points : 4 674
    Points
    4 674
    Par défaut
    Ah, çà c'est autre chose.. on va voir

    Mais (je viens d'essayer) tu auras une erreur chaque fois que VBA cherchera à dégrouper ce qui ne l'est pas.

    Il convient donc d'utiliser On Error ... pour gérer celà puis de ramener err à 0

    a +

  14. #14
    Inactif  
    Avatar de jmfmarques
    Profil pro
    Inscrit en
    Décembre 2005
    Messages
    3 784
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2005
    Messages : 3 784
    Points : 4 674
    Points
    4 674
    Par défaut
    Pour l'autre question, on en revient à la mienne (voir plus haut) :

    2) Sinon : dans quelle cellule "défusionnée" veux-tu placer ce qui était "fusionné" ??

    Vaste programme, à vrai dire !
    Il est clair qu'aucune instruction ne pourra "re-répartir" ce dont ne connait pas la répartition originelle......(C'est pour celà qu'on parlait de "mémoire de la situation originelle")... mais tu nous dis que les données sont reçues, fusionnées, par une application qui reste "maître"... alors...

  15. #15
    Membre à l'essai
    Inscrit en
    Juin 2004
    Messages
    24
    Détails du profil
    Informations forums :
    Inscription : Juin 2004
    Messages : 24
    Points : 11
    Points
    11
    Par défaut
    et ben c'est pas trés compliqué en théorie, il suffit de demander à VBA de copier la première cellule dans les cellules vide qui se situent juste en dessous (d'où mon "FillDown") juqu'à ce qu'il rencontre la prochaine cellule non vide.

    Toujours personne pour m'aider à corriger mon code ?

  16. #16
    Inactif  
    Avatar de jmfmarques
    Profil pro
    Inscrit en
    Décembre 2005
    Messages
    3 784
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2005
    Messages : 3 784
    Points : 4 674
    Points
    4 674
    Par défaut
    Pas moi en tous cas (ne suis pas devin).

  17. #17
    Modérateur
    Avatar de AlainTech
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Mai 2005
    Messages
    4 235
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 70
    Localisation : Belgique

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : Finance

    Informations forums :
    Inscription : Mai 2005
    Messages : 4 235
    Points : 24 327
    Points
    24 327
    Par défaut
    Je pars du principe que les cellules fusionnées sont en colonne A et qu'on ne copie des valeurs que là où il y quelque chose en colonne B.

    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
    Sub UnMerge()
      Dim rRange As Range
      Dim rCell As Range
      Dim sContent As String
      Dim iLastRow As Integer
      iLastRow = Cells.SpecialCells(xlLastCell).Row
      Set rRange = Range("A:A")
      For Each rCell In rRange
        If rCell.MergeCells Then
          sContent = rCell
          rCell.UnMerge
        Else
          If Not rCell.Offset(0, 1).Value = "" Then
            rCell = sContent
          End If
        End If
        If rCell.Row > iLastRow Then Exit Sub
      Next rCell
    End Sub
    N'oubliez pas de cliquer sur quand vous avez obtenu ou trouvé vous-même la réponse à votre question.
    Si vous trouvez seul, pensez à poster votre solution. Elle peut servir à d'autres!
    Pensez aussi à voter pour les réponses qui vous ont aidés.
    ------------
    Je dois beaucoup de mes connaissances à mes erreurs!

  18. #18
    Inactif  
    Avatar de jmfmarques
    Profil pro
    Inscrit en
    Décembre 2005
    Messages
    3 784
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2005
    Messages : 3 784
    Points : 4 674
    Points
    4 674
    Par défaut
    Une petite idée pour que l'on y voie bien clair :
    Sframe peut-il mettre dans son prochain message 2 petits tableaux qui représenteraient :
    - l'un la situation telle qu'à la réception
    -2 la situation souhaitée après traitement

    pour qu'il n'y ait aucune ambiguité, la représentation de cellules jointes pourrait être faite avec des caratères de couleur différente. Ces couleurs devraient se retrouver dans le résultat final si l'on veut bien cerner comment a été faite la répartition souhaitée des chaînes.

    Ce procédé aurait l'énorme avantage de nous mettre tous sur la même longueur d'onde. En ce qui me concerne, en effet, les choses sont diféremment interprétables à chaque nouvelle re/lecture...

    Bonne nuit.



    PS : la partie la plus ambigüe pour moi est celle-ci :

    copier le contenu initial dans toutes les cellules apparues (jusqu'à ce que l'on rencontre une cellule non vide).
    TOUT le contenu initial dans CHAQUE cellule libérée par le dégroupage ?

    ou

    UNE PARTIE seulement, et LAQUELLE ALORS et selon QUEL PARTAGE entre les cellules "libérées" ?

    C'est là la question que je me pose depuis le début et aucune des lectures/relectures de tout ce qui précède ne m'a réellement permis de deviner la réponse.

  19. #19
    Modérateur
    Avatar de AlainTech
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Mai 2005
    Messages
    4 235
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 70
    Localisation : Belgique

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : Finance

    Informations forums :
    Inscription : Mai 2005
    Messages : 4 235
    Points : 24 327
    Points
    24 327
    Par défaut
    Un petit "avant - après" pour montrer l'usage:





    Certaines feuilles sont formatées pour avoir un look plus agéable en évitant la redondance d'information mais, du coup, c'est nettement moins pratique pour le traitement automatisé.
    D'où l'intérêt de remettre les infos redondantes pour faciliter le traitement.
    N'oubliez pas de cliquer sur quand vous avez obtenu ou trouvé vous-même la réponse à votre question.
    Si vous trouvez seul, pensez à poster votre solution. Elle peut servir à d'autres!
    Pensez aussi à voter pour les réponses qui vous ont aidés.
    ------------
    Je dois beaucoup de mes connaissances à mes erreurs!

  20. #20
    Inactif  
    Avatar de jmfmarques
    Profil pro
    Inscrit en
    Décembre 2005
    Messages
    3 784
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2005
    Messages : 3 784
    Points : 4 674
    Points
    4 674
    Par défaut
    Merci AlainTech

    Ce serait ainsi vraiment TOUT dans CHACUNE des cellules dégroupées (Je ne voulais pas y croire, ne voyant pas l'utilité de faire celà)

    On va maintenant attendre que SFrame nous confirme que c'est bien celà qu'il voulair exprimer.


+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 2 12 DernièreDernière

Discussions similaires

  1. [VBA-E] Compter les cellules fusionnées
    Par Korleone dans le forum Macros et VBA Excel
    Réponses: 4
    Dernier message: 18/08/2017, 16h09
  2. find ignoré dans les cellules fusionnées
    Par onejock dans le forum Macros et VBA Excel
    Réponses: 29
    Dernier message: 23/06/2008, 00h55
  3. Trouver les cellules référencées ailleurs
    Par Alqualonde dans le forum Excel
    Réponses: 2
    Dernier message: 07/09/2007, 17h33
  4. [EXCEL][VBA] Compter les cellules non-vides
    Par Squelet dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 27/02/2006, 15h40
  5. [VBA]Compter les cellules selon leurs couleurs...
    Par ronron1978 dans le forum Macros et VBA Excel
    Réponses: 6
    Dernier message: 31/01/2006, 15h27

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