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 deux cellules en variables


Sujet :

Macros et VBA Excel

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Septembre 2015
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 32
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Finance

    Informations forums :
    Inscription : Septembre 2015
    Messages : 7
    Par défaut Fusionner deux cellules en variables
    Bonjour à tous !

    Je suis face à un problème que je n'arrive pas à solutionner, et mes recherches Internet sont infructueuses

    Je souhaite fusionner deux cellules faisant parties d'une boucle, voici une partie de la macro en question :


    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
                                For j = 7 To 35
                                        If Hor.Cells(4, j) = Hdeb Then
                                        Hor.Cells(i, j) = Hor.Cells(i, 5) + 1
                                        'Dim alpha As Range
                                        Set alpha = Hor.Cells(i, j).Range
                                        'MsgBox alpha
                                        End If
                                        If Hor.Cells(4, j) = Hfin Then
                                        Hor.Cells(i, j) = Hor.Cells(i, 5) + 1
                                        'Dim beta As Range
                                        Set beta = Hor.Cells(i, j).Range
                                        End If
                                        Hor.Select
                                        Range(alpha & ":" & beta).Select
                                        Selection.Merge
                                Next
    QUand je fais tourner ma macro il m'arrete sur la ligne Range(alpha & ":" & beta) et me dit qu'il y a une erreur.

    QUelqu'un aurait il une idée sur :
    - comment déclarer une cellule en variable
    - fusionner deux cellules déclarées préalablement en variable

    MErci à vous !

  2. #2
    Expert confirmé

    Homme Profil pro
    Curieux
    Inscrit en
    Juillet 2012
    Messages
    5 169
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Curieux
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Juillet 2012
    Messages : 5 169
    Billets dans le blog
    5
    Par défaut
    Bonjour,

    alpha et beta sont des objets représentant des cellules


    quand ensuite tu utilises un Range() pour définir une plage de cellules, c'est la propriété "adresse" de ton objet Range qu'il faut utiliser

    donc ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Hor.Select
    Range(alpha & ":" & beta).Select
    Selection.Merge
    devient :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Hor.Range(alpha.Address & ":" & beta.Address).Merge

    il y a à vue d'œil une grosse optimisation possible dans ta procédure, mais sans la voir en entier ainsi que l'explication qui va bien, impossible de le certifier.

    Si en l'état ça fonctionne et te convient, autant laisser ainsi

  3. #3
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Septembre 2015
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 32
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Finance

    Informations forums :
    Inscription : Septembre 2015
    Messages : 7
    Par défaut
    Salut joe.levrai !

    Merci énormément pour ta réponse !
    J'ai corrigé en prenant ta remarque en compte mais j'ai toujours une erreur dans le code.
    Une grosse optimisation possible ? Tu peux préciser ? Je suis preneur !
    Car oui ma macro fonctionne mais ne connaissant quasiment que IF et FOR j'avoue galérer un peu parfois ^^

    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
    59
    60
    61
    62
    63
    64
    65
    Ref.Select
    For j = 87 To 124
    service = Hor.Cells(j, 3)
     
        If service = "" Then
        GoTo finishcadre
        End If
     
        Ref.Range("A2:AP" & DernLigneUser).AutoFilter Field:=1, Criteria1:=service        'Range(A2:AP)
        Ref.Select
        DernLigneUserHor = Ref.Range("AK" & Rows.Count).End(xlUp).Row
     
        add = 0
        For i = 3 To DernLigneUserHor
     
            If Ref.Cells(i, 1) = Hor.Cells(j, 3) Then
                If Ref.Cells(i, 17) = "JOUR" Then
                    If Ref.Cells(i, 41).Value = Hor.Cells(85, 3) Then
     
                    For k = j To j + add
                        If Ref.Cells(i, 37) = Hor.Cells(k, 4) Then
                        Hor.Cells(k, 5) = Hor.Cells(k, 5) + 1
                        GoTo nexxtcadre
                        End If
                    Next
                    If add > 0 Then
                    Hor.Rows(j + add).Insert
                    Hor.Select
                    Range(Cells(j, 3), Cells(j + add, 3)).Merge
                    End If
                    Hor.Cells(j + add, 4) = Ref.Cells(i, 37)
                    add = add + 1
                    End If
                End If
            End If
    nexxtcadre:
        Next
    finishcadre:
    Next
     
                        DernLigneHorHor = Hor.Range("D" & Rows.Count).End(xlUp).Row
                        For i = 85 To DernLigneHorHor
                            If Hor.Cells(i, 4) <> "" Then
                                Href = Hor.Cells(i, 4).Value
                                Hdeb = Left(Href, Len(Href) - 8)
                                Hfin = Right(Href, Len(Href) - 8)
     
                                For j = 7 To 35
                                        If Hor.Cells(4, j) = Hdeb Then
                                        Hor.Cells(i, j) = Hor.Cells(i, 5) + 1
                                        'Dim alpha As Range
                                        Set alpha = Hor.Cells(i, j).Object
                                        'MsgBox alpha
                                        End If
                                        If Hor.Cells(4, j) = Hfin Then
                                        Hor.Cells(i, j) = Hor.Cells(i, 5) + 1
                                        'Dim beta As Range
                                        Set beta = Hor.Cells(i, j).Object
                                        End If
                                        Hor.Select
                                        Hor.Range(alpha.Address & ":" & beta.Address).Merge
                                        Selection.Merge
                                Next
                            End If
                        Next

  4. #4
    Expert confirmé

    Homme Profil pro
    Curieux
    Inscrit en
    Juillet 2012
    Messages
    5 169
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Curieux
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Juillet 2012
    Messages : 5 169
    Billets dans le blog
    5
    Par défaut
    oulà

    il va falloir expliquer un peu ce que fais ta procédure (tout du moins ce que tu veux qu'elle fasse) en décrivant brièvement ce qu'il y a sur tes feuilles excel


    on s'y perd un peu avec tes indices de boucles quand on ne sait pas ce que c'est censé faire
    je vois déjà une suppression certaine de tes Goto (à éviter ! C'est du code spaghetti très indigeste à relire et maintenir)

    également des petits conseils :

    - indenter le code, c'est à dire le mettre "en relief" pour voir en un coup d'œil sa structure et s'y repérer
    - il est permis dans une boucle For/Next de ne pas nommer la variable en fin de boucle (on écrit "Next" tout court). Cependant, quand on débute, qu'on indente pas son code, qu'on met des Goto .... ça devient presque un impératif pour savoir à quel boucle se rapporte quel next
    - plutôt que d'activer un objet (une feuille, une cellule etc...), d'utiliser l'objet actif (celui qu'on a sélectionné) et ensuite de lui appliquer une méthode ou de consulter une propriété, il est préférable (moins de code, exécution plus rapide) de tout faire d'un seul coup : MonObjet.MaPropriété. Regarde l'exemple que j'ai mis dans le message précédent, où on passe de trois lignes de code (sélectionner une feuille pour la rendre active / sélectionner une plage de la feuille active / fusionner la plage active) à une seule ligne (LaFeuille.LaPlage.Fusionner)

    voici déjà la remise en forme du code, et l'ajout des variable après les next.
    Tu verras tout de suite l'alambication de ton code, qui est probablement simplifiable en + des Goto qui vont se supprimer avec une modification habile des if qui sont liés

    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
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    Ref.Select
     
    For j = 87 To 124
        service = Hor.Cells(j, 3)
     
        If service = "" Then
            GoTo finishcadre
        End If
     
        Ref.Range("A2:AP" & DernLigneUser).AutoFilter Field:=1, Criteria1:=service 'Range(A2:AP)
        Ref.Select
        DernLigneUserHor = Ref.Range("AK" & Rows.Count).End(xlUp).Row
     
        Add = 0
        For i = 3 To DernLigneUserHor
     
            If Ref.Cells(i, 1) = Hor.Cells(j, 3) Then
                If Ref.Cells(i, 17) = "JOUR" Then
                    If Ref.Cells(i, 41).Value = Hor.Cells(85, 3) Then
                        For k = j To j + Add
                            If Ref.Cells(i, 37) = Hor.Cells(k, 4) Then
                                Hor.Cells(k, 5) = Hor.Cells(k, 5) + 1
                                GoTo nexxtcadre
                            End If
                        Next j
     
                        If Add > 0 Then
                            Hor.Rows(j + Add).Insert
                            Hor.Select
                            Range(Cells(j, 3), Cells(j + Add, 3)).Merge
                        End If
     
                        Hor.Cells(j + Add, 4) = Ref.Cells(i, 37)
                        Add = Add + 1
                    End If
                End If
            End If
     
    nexxtcadre:
        Next i
    finishcadre:
    Next j
     
    DernLigneHorHor = Hor.Range("D" & Rows.Count).End(xlUp).Row
     
    For i = 85 To DernLigneHorHor
        If Hor.Cells(i, 4) <> "" Then
            Href = Hor.Cells(i, 4).Value
            Hdeb = Left(Href, Len(Href) - 8)
            Hfin = Right(Href, Len(Href) - 8)
     
            For j = 7 To 35
                If Hor.Cells(4, j) = Hdeb Then
                    Hor.Cells(i, j) = Hor.Cells(i, 5) + 1
                    'Dim alpha As Range
                    Set alpha = Hor.Cells(i, j).Object
                    'MsgBox alpha
                End If
     
                If Hor.Cells(4, j) = Hfin Then
                    Hor.Cells(i, j) = Hor.Cells(i, 5) + 1
                    'Dim beta As Range
                    Set beta = Hor.Cells(i, j).Object
                End If
     
                Hor.Select
                Hor.Range(alpha.Address & ":" & beta.Address).Merge
                Selection.Merge
            Next
        End If
    Next

    pour la suite ... faut des explications. Dis-toi qu'on a juste ton code sous les yeux, on doit comprendre le contexte pour aller plus loin

  5. #5
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Septembre 2015
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 32
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Finance

    Informations forums :
    Inscription : Septembre 2015
    Messages : 7
    Par défaut
    Joe.levrai merci infiniment.

    Je vais essayer de rendre le code plus clair, i lest vrai que même moi je m'y perds parfois.

    Par contre, pour la première question, cela ne fonctionne toujours pas, quelqu'un a une idée ?
    Pour rappel :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
                                        If Hor.Cells(4, j) = Hdeb Then
                                        Hor.Cells(i, j) = Hor.Cells(i, 5) + 1
                                        'Dim alpha As Range
                                        alpha = Hor.Cells(i, j).Object
                                        End If
    
                                        If Hor.Cells(4, j) = Hfin Then
                                        Hor.Cells(i, j) = Hor.Cells(i, 5) + 1
                                        beta = Hor.Cells(i, j).Object
                                        End If
    
                                        Hor.Select
                                        Hor.Range(alpha.Address & ":" & beta.Address).Merge
                                        Selection.Merge
    J'ai toujours mon erreur sur la fusion

  6. #6
    Expert confirmé

    Homme Profil pro
    Curieux
    Inscrit en
    Juillet 2012
    Messages
    5 169
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Curieux
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Juillet 2012
    Messages : 5 169
    Billets dans le blog
    5
    Par défaut
    enlève déjà les .Object

    et pourquoi avoir enlevé l'instruction Set ... qui est obligatoire quand on instancie une variable Objet

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Set MaCellule = MaFeuille.Cells(Ligne,Colonne)
    mais ne t'attarde pas trop à bricoler ta structure de code qui semble inappropriée, passe plutôt ce temps sur l'explication de ce que doit faire cette macro par rapport à la structure de ta feuille.

    la façon de faire ton merge est dangereuse, mais impossible de le certifier sans avoir le contexte. Il suffit que tes deux cellules ne soient pas contigues et tu va fusionner toute la plage comprise entre les deux cellules.

  7. #7
    Expert éminent
    Avatar de Marc-L
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2013
    Messages
    9 468
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2013
    Messages : 9 468
    Par défaut
    Bonjour, bonjour !

    Citation Envoyé par joe.levrai Voir le message
    alpha et beta sont des objets représentant des cellules
    quand ensuite tu utilises un Range() pour définir une plage de cellules, c'est la propriété "adresse" de ton objet Range qu'il faut utiliser
    donc ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Hor.Select
    Range(alpha & ":" & beta).Select
    Selection.Merge
    devient :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Hor.Range(alpha.Address & ":" & beta.Address).Merge

    C'est dommage de transformer des cellules en adresses alors que Range accepte aussi des cellules !

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
        Dim alpha As Range, beta As Range
     
        Set alpha = Hor.Cells(i, j)
     
         Set beta = Hor.Cells(i, j)
     
        Range(alpha, beta).Merge
    Voilà, voilà !

    ______________________________________________________________________________________________________
    Je suis Paris, Charlie, Bruxelles, …

  8. #8
    Expert confirmé

    Homme Profil pro
    Curieux
    Inscrit en
    Juillet 2012
    Messages
    5 169
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Curieux
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Juillet 2012
    Messages : 5 169
    Billets dans le blog
    5
    Par défaut
    Hello,

    entièrement d'accord, j'aurai gagné à la préciser
    d'où mon conseil de ne pas chercher à rafistoler la procédure actuelle, et ma mise en garde sur le danger possible d'utiliser ce type de Range()

    Mais vu le point de départ et l'arrivée attendue, je préfère le faire par étape, sinon on risque de le perdre en cours de route ?

  9. #9
    Expert éminent
    Avatar de Marc-L
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2013
    Messages
    9 468
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2013
    Messages : 9 468
    Par défaut

    Peut-être …

    Ce qui me gêne c'est la fusion, déconseillée quel que soit le forum, français comme étranger !
    Souvent un alignement horizontal Centré sur plusieurs colonnes de la plage de cellules est suffisant la plupart du temps …

  10. #10
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Septembre 2015
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 32
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Finance

    Informations forums :
    Inscription : Septembre 2015
    Messages : 7
    Par défaut
    Coucou à vous !
    Merci pour vos réponses mais la solution pour fusionner les cellules à partir de variables n'est toujours pas fonctionnelle

    J'ai fait une procédure plus simple, basé sur le même fonctionnement, j'imagine que ce sera plus simple pour vous pour m'aider :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    Sub testfus()
     
    Set a = Worksheets("feuil1")
     
    Dim alpha As Range, beta As Range
    alpha = a.Cells(1, 1)
    beta = a.Cells(1, 2)
     
    Range(alpha.Address, beta.Address).Merge
     
    End Sub
    J'ai toujours une erreur sur la ligne
    Range(alpha.Address, beta.Address).Merge

    Pour ce qui est de l'explication de mon code entier, il est vraiment trop compliqué à expliquer je ne sais même pas par ou commencer ..

    PS : j'ai également essayé avec : Range(alpha, beta).Merge mais ça ne fonctionne pas non plus

  11. #11
    Expert confirmé Avatar de casefayere
    Homme Profil pro
    RETRAITE
    Inscrit en
    Décembre 2006
    Messages
    5 138
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 71
    Localisation : France, Ardennes (Champagne Ardenne)

    Informations professionnelles :
    Activité : RETRAITE
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Décembre 2006
    Messages : 5 138
    Par défaut
    Bonjour,
    sans analyser plus loin, dans cette partie, il manque les "Set"
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Dim alpha As Range, beta As Range
     alpha = a.Cells(1, 1)
     beta = a.Cells(1, 2)
    soit
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Set alpha = a.Cells(1, 1)
     Set beta = a.Cells(1, 2)
    Cordialement,
    Dom
    _____________________________________________
    Vous êtes nouveau ? pour baliser votre code, cliquer sur cet exemple : Anomaly
    pensez à cliquer sur :resolu: si votre problème l'est
    Par contre, il est désagréable de voir une discussion résolue sans message final du demandeur (satisfaction, désarroi, remerciement, conclusion...)

Discussions similaires

  1. DBGrid - Fusionner deux cellules
    Par LaurentC33 dans le forum Composants VCL
    Réponses: 6
    Dernier message: 12/07/2013, 10h29
  2. Réponses: 1
    Dernier message: 08/08/2011, 00h54
  3. Fusionner deux cellules
    Par kensem dans le forum C#
    Réponses: 2
    Dernier message: 27/09/2010, 10h32
  4. fusionner deux cellules html en javascript
    Par b-boy baki dans le forum Général JavaScript
    Réponses: 0
    Dernier message: 15/06/2010, 10h09
  5. [Debutant] [JTable] Fusionner deux cellules
    Par devil26 dans le forum Composants
    Réponses: 4
    Dernier message: 03/05/2005, 13h39

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