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 :

Nommer une Feuille dont une cellule est fusionner avec les lignes au-dessus


Sujet :

Macros et VBA Excel

  1. #1
    Membre habitué
    Inscrit en
    juillet 2008
    Messages
    268
    Détails du profil
    Informations forums :
    Inscription : juillet 2008
    Messages : 268
    Points : 130
    Points
    130
    Par défaut Nommer une Feuille dont une cellule est fusionner avec les lignes au-dessus
    Bonjour à tous,
    Je suis sous excel 2003 avec windows xp.

    Je dois nommer des lignes dans un grand documment. Toute cette partie marche s'il n'y a pas de cellules fusionnées avec une ou des ligne(s) au-dessus.
    Le problème est que je viens de découvrir que ce document contient des lignes fusionnées.
    Comment puis-je tout de même nommer ma ligne sans toucher à cette foutue cellule. Je fais juste un traitement intermédiaire pour moi => je ne peux pas défusionner les cellules.

    J'ai quand même essayé de nommer la ligne, mais quand on sélectionne la plage nommée représentant la ligne, toutes les lignes contenant la cellule fusionnée sont sélectionnées.

    Si on ne peut pas récupérer les données contenues dans cette cellule, ce n'est pas grave. Je veux juste nommer chaque ligne.

    Je n'ai pas d'idée sur une façon de m'y prendre pour me sortir de là.
    Quelqu'un peut-il m'aiguiller?

  2. #2
    Membre émérite
    Profil pro
    Inscrit en
    juillet 2007
    Messages
    2 130
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : juillet 2007
    Messages : 2 130
    Points : 2 443
    Points
    2 443
    Par défaut
    Salut buzz73 et le forum
    Bienvenue (malgré le problème )

    Tu ne peux pas sélectionner une par un nom ta ligne si des cellules sont fusionnées.Excel ne peut sélectionner que des rectangles, et comme ta cellule est fusionnée, il sélectionne la fusion. Excel est bête, mais il essaie de faire ce que tu lui demandes.

    Si tu expliquais le but de ta manip ?
    Dans Excel, il y a tant de chemin pour arriver à un résultat...
    A+

  3. #3
    Membre habitué
    Inscrit en
    juillet 2008
    Messages
    268
    Détails du profil
    Informations forums :
    Inscription : juillet 2008
    Messages : 268
    Points : 130
    Points
    130
    Par défaut
    salut Gorfael et merci de te pencher sur mon problème.
    En gros, je dois me servir d'excel comme d'une base de données (oui oui je sais mais je n'ai pas le choix )
    Bref :
    J'ai un fichier que BCP de personnes utilise, mon but est de récupérer sur un autre fichier certaines données contenues dans les premières colonnes du document.
    N'ayant pas d'identifiant sûr, je nomme chaque ligne créée avec un nom unique. Ainsi, je peux être sûr que le produit est représenté par cette ligne.
    J'ai réglé le pb de suppression de ligne.
    Simplement, lors de l'ajout d'une nouvelle ligne, je nomme "à la volée" la nouvelle ligne grâce à un compteur (dans une cellule de mon document perso ).
    Le problème c'est que certaines cellules sont fusionnées.
    J'ai fais différents tests et il semble que si je parvenais à
    1. détecter que ma nouvelle ligne contient des cellules fusionnées
    2. connaître l'adresse de ces cellules
    3. défusionner ces cellules
    4. nommer la ligne (ça je sais faire)
    5. refusionner les cellules
    ce serait impeccable.
    J'ai essayé "à la main" et ça semble marcher : mon compteur survi.

    Donc à la fin :
    1. chaque ligne utilisée a un nom unique
    2. Les cellules qui étaient fusionnées le sont encore

    ton avis?

  4. #4
    Membre habitué
    Inscrit en
    juillet 2008
    Messages
    268
    Détails du profil
    Informations forums :
    Inscription : juillet 2008
    Messages : 268
    Points : 130
    Points
    130
    Par défaut
    Quelqu'un sait comment détecter toutes les cellules fusionnées sur une ligne?
    Comment récupérer leurs adresses?

  5. #5
    Expert éminent
    Avatar de fring
    Homme Profil pro
    Engineering
    Inscrit en
    février 2008
    Messages
    3 900
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 59
    Localisation : Belgique

    Informations professionnelles :
    Activité : Engineering

    Informations forums :
    Inscription : février 2008
    Messages : 3 900
    Points : 7 962
    Points
    7 962
    Par défaut
    Bonjour,

    Tu peux t'inspirer de ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    Sub test()
    Dim Cel As Range, result As String, x As String
     
    For Each Cel In Range("A5:Z5")
        If Cel.MergeCells = True Then
            If Cel.MergeArea.Address <> x Then
                x = Cel.MergeArea.Address
                result = result & Chr(10) & Cel.MergeArea.Address(0, 0)
            End If
        End If
    Next
     
    MsgBox "Les cellules fusionnées sont :" & Chr(10) & result
    End Sub
    LES FAQ OFFICE - LES COURS OFFICE - LES COURS EXCEL - LES LIVRES OFFICE - SOURCES VBA - ATELIER BRICOLAGE VBA

    Lorsque votre problème est solutionné, pensez à le signaler en cliquant sur le bouton au bas de la discussion.

  6. #6
    Membre habitué
    Inscrit en
    juillet 2008
    Messages
    268
    Détails du profil
    Informations forums :
    Inscription : juillet 2008
    Messages : 268
    Points : 130
    Points
    130
    Par défaut
    bonjour fring
    Je venais justement de trouver un début de réponse à force de tester :
    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
    Sub detectFusion()
        For i = 18 To 28
            With activesheet.Rows(i)
                    For Each cell In .Cells
                        If cell.MergeCells Then
                            With cell
                               Debug.Print "Zone : " & .MergeArea.Address
                               zone = .MergeArea.Address
                               Range(zone).UnMerge
                            End With
                        End If  
                    Next cell
            End With
        Next i
    End Sub
    je vais donc étudier ta réponse aussi
    merci de m'aider.
    Au passage, comment peut-on faire pour faire l'équivalent d'un "push" dans un tableau dans vba.
    Doit-on à chaque fois faire un
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    nouvelIndice=ubound(tab)+1
    redim preserve tab(nouvelIndice)
    tab(nouvelIndice)=nouvelleValeur
    ?

    J'ai oublié de préciser que je cherche les cellules fusionnées de la ligne en cours.

  7. #7
    Membre habitué
    Inscrit en
    juillet 2008
    Messages
    268
    Détails du profil
    Informations forums :
    Inscription : juillet 2008
    Messages : 268
    Points : 130
    Points
    130
    Par défaut
    J'aimerais augmenter la taille de mon tableau à chaque nouvel élément trouvé en le plaçant à la fin.

    ça veut dire quoi
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    result = result & Chr(10) & Cel.MergeArea.Address(0, 0)
    ?

    En gros, mon traitement ce serait ça : (revu mais pas encore testé) :
    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
    Sub test()
    Dim Cel As Range
    Dim addresse As String 'Adresse des cellules fusionnées
    Dim result() As String 'Tableau des adresses des cellules fusionnées
    Dim bFusion As Boolean 'Fusion
    Dim i As Long
     
    ReDim result(1)
    For i = 18 To 28
        bFusion = False
        For Each Cel In ThisWorkbook.Sheets("PERMANENT 2009").Rows(i).Cells
            If Cel.MergeCells = True Then
                bFusion = True
                If Cel.MergeArea.Address <> addresse Then
                    addresse = Cel.MergeArea.Address
                    result = result & Chr(10) & Cel.MergeArea.Address(0, 0)
                End If
            End If
        Next
     
        '''''''''''''''''''''''''''
        ' Traitement de la fusion '
        '''''''''''''''''''''''''''
        If bFusion Then
            For i = 1 To UBound(result)
                result(i).UnMerge
            Next i
        End If
     
     
        ''''''''''''''''''''''''''
        ' Traitement de la ligne '
        ''''''''''''''''''''''''''
        'blablabla
     
     
        '''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
        ' Refusion des cellules pour récupérer le format d'origine (tout pareil qu'avant) avec les modifs en plus '
        '''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
        If bFusion Then
            For i = 1 To UBound(result)
                result(i).Merge
            Next i
        End If
     
    Next i
    End Sub

  8. #8
    Membre habitué
    Inscrit en
    juillet 2008
    Messages
    268
    Détails du profil
    Informations forums :
    Inscription : juillet 2008
    Messages : 268
    Points : 130
    Points
    130
    Par défaut
    Que penses-tu de ça?
    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 test()
    Dim Cel As Range
    Dim addresse As String 'Adresse des cellules fusionnées
    Dim result() As String 'Tableau des adresses des cellules fusionnées
    Dim idxResult As Long 'index de result()
    Dim bFusion As Boolean 'Fusion
    Dim i As Long
    Dim j As Long
    Dim feuilTraitee As String 'Feuille traitée
     
    clasTraite = ThisWorkbook.Name
    feuilTraitee = "PERMANENT 2009"
     
    idxResult = 0
    ReDim result(1)
    For i = 18 To 28
        bFusion = False
        For Each Cel In Workbooks(clasTraite).Sheets(feuilTraitee).Rows(i).Cells
            If Cel.MergeCells = True Then
                bFusion = True
                idxResult = idxResult + 1
                If Cel.MergeArea.Address <> addresse Then
                    addresse = Cel.MergeArea.Address
                    ReDim Preserve result(idxResult)
                    result(idxResult) = addresse
                End If
            End If
        Next
     
        '''''''''''''''''''''''''''
        ' Traitement de la fusion '
        '''''''''''''''''''''''''''
        If bFusion Then
            For j = 1 To UBound(result)
                Workbooks(clasTraite).Sheets(feuilTraitee).Range(result(j)).UnMerge
            Next j
        End If
     
     
        ''''''''''''''''''''''''''
        ' Traitement de la ligne '
        ''''''''''''''''''''''''''
        'blablabla
     
     
        '''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
        ' Refusion des cellules pour récupérer le format d'origine (tout pareil qu'avant) avec les modifs en plus '
        '''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
        If bFusion Then
            For j = 1 To UBound(result)
                Workbooks(clasTraite).Sheets(feuilTraitee).Range(result(j)).Merge
            Next j
        End If
     
    Next i
    End Sub
    Mon but étant de nommer chaque ligne, j'ai remarqué que si une cellule de la ligne était fusionnée avec une autre ligne, la nommination prenait toutes les lignes de la cellule fusionnée (c'est l'impression que j'ai eu, donc je cherche une solution pour pouvoir retester).

    Mais comme je traite les lignes une à une, je "repasse" souvent sur les mêmes cellules fusionnées.
    Il vaut mieux
    1. traiter les lignes une à une en défusionnant et refusionnant les cellules?
    2. traiter toute la feuille en 1 fois, tout défusionner (dans tous les sens ce coup-ci), mettre un nom à chaque ligne et tout refusionner?
    Le traitement le plus rapide serait lequel. Y a-t-il un inconvénient à l'une des 2 méthodes?

  9. #9
    Expert éminent
    Avatar de fring
    Homme Profil pro
    Engineering
    Inscrit en
    février 2008
    Messages
    3 900
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 59
    Localisation : Belgique

    Informations professionnelles :
    Activité : Engineering

    Informations forums :
    Inscription : février 2008
    Messages : 3 900
    Points : 7 962
    Points
    7 962
    Par défaut
    ça veut dire quoi
    result = result & Chr(10) & Cel.MergeArea.Address(0, 0)
    cela sert simplement à récupérer dans la variable "result" les adresses des cellules fusionnées
    MergeArea.Address = adresse de la plage de cellules fusionnées

    Le (0, 0) est dans ce cas ci uniquement de la coqueterie, supposons les cellules fusionnées A5, B5, C5 et D5
    Cel.MergeArea.Address donne le résultat --> $A$5:$D$5
    Cel.MergeArea.Address(0, 0) donne le résultat --> A5:D5

    J'aimerais augmenter la taille de mon tableau à chaque nouvel élément trouvé en le plaçant à la fin.
    Tu pourrais utiliser une Collection qui t'éviterais de devoir la redimensionner à chaque ajout d'un Item, exemple d'utilisation
    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
    Sub test3()
    Dim Col As New Collection, x As Integer, result As String
     
    x = 15
     
    'Charger la collection
    For i = 1 To x
        Col.Add "ligne" & i
    Next
     
    'Récupérer les données de la collection
    For i = 1 To Col.Count
        result = result & Chr(10) & Col(i)
    Next
     
    MsgBox "les données de la collection sont :" & Chr(10) & result
     
    End Sub
    LES FAQ OFFICE - LES COURS OFFICE - LES COURS EXCEL - LES LIVRES OFFICE - SOURCES VBA - ATELIER BRICOLAGE VBA

    Lorsque votre problème est solutionné, pensez à le signaler en cliquant sur le bouton au bas de la discussion.

  10. #10
    Membre habitué
    Inscrit en
    juillet 2008
    Messages
    268
    Détails du profil
    Informations forums :
    Inscription : juillet 2008
    Messages : 268
    Points : 130
    Points
    130
    Par défaut
    C'est plus lisible avec , je modifie donc mon code. Impeccable.

    Donc si j'ai bien compris la collection (merci pour l'exemple!) le code remodifié devrait donner :
    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
    Sub test()
    Dim Cel As Range
    Dim addresse As String 'Adresse des cellules fusionnées
    Dim colResult As New Collection 'collection des adresses des cellules fusionnées
    'Dim idxResult As Long 'index de result()
    Dim bFusion As Boolean 'Fusion
    Dim i As Long
    Dim j As Long
    Dim feuilTraitee As String 'Feuille traitée
     
    clasTraite = ThisWorkbook.Name
    feuilTraitee = "PERMANENT 2009"
     
    'idxResult = 0
    For i = 18 To 28
        bFusion = False
        For Each Cel In Workbooks(clasTraite).Sheets(feuilTraitee).Rows(i).Cells
            If Cel.MergeCells = True Then
                bFusion = True
                'idxResult = idxResult + 1
                If Cel.MergeArea.Address <> addresse Then
                    addresse = Cel.MergeArea.Address(0, 0)
                    'ReDim Preserve result(idxResult)
                    colResult.Add addresse
     
                    'result(idxResult) = addresse
                End If
            End If
        Next
     
        '''''''''''''''''''''''''''
        ' Traitement de la fusion '
        '''''''''''''''''''''''''''
        If bFusion Then
            'For j = 1 To UBound(result)
            '    Workbooks(clasTraite).Sheets(feuilTraitee).Range(result(j)).UnMerge
            'Next j
            For j = 1 To colResult.Count
                Workbooks(clasTraite).Sheets(feuilTraitee).Range(colResult(j)).UnMerge
            Next j
        End If
     
     
        ''''''''''''''''''''''''''
        ' Traitement de la ligne '
        ''''''''''''''''''''''''''
        'blablabla
     
     
        '''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
        ' Refusion des cellules pour récupérer le format d'origine (tout pareil qu'avant) avec les modifs en plus '
        '''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
        If bFusion Then
            'For j = 1 To UBound(result)
            '    Workbooks(clasTraite).Sheets(feuilTraitee).Range(result(j)).Merge
            'Next j
            For j = 1 To colResult.Count
                Workbooks(clasTraite).Sheets(feuilTraitee).Range(colResult(j)).Merge
            Next j
        End If
     
    Next i
    End Sub
    Je n'arrive pas à faire la distinction entre une collection et un tableau.
    Sauf que la collection semble plus pratique à modifier si on ne connait pas par avance le nombre d'éléments final.
    Peut-on définir un type pour les éléments d'une collection? (comme on définit un type pour les éléments d'un tableau)

  11. #11
    Expert éminent
    Avatar de fring
    Homme Profil pro
    Engineering
    Inscrit en
    février 2008
    Messages
    3 900
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 59
    Localisation : Belgique

    Informations professionnelles :
    Activité : Engineering

    Informations forums :
    Inscription : février 2008
    Messages : 3 900
    Points : 7 962
    Points
    7 962
    Par défaut
    Disons qu'une collection est un tableau dynamique à une dimension mais plus puissante de ce dernier.
    Dans une collection tu peux ajouter des items sans te soucier de son dimensionnement, tu peux supprimer des doublons en utilisant une "clé", tu peux supprimer aisément des items sans devoir redimensionner ni décaler les lignes (ce qui est un peu galère dans un tableau dynamique)

    On ne définit pas le type (Integer, String, Long, etc) d'une collection.
    LES FAQ OFFICE - LES COURS OFFICE - LES COURS EXCEL - LES LIVRES OFFICE - SOURCES VBA - ATELIER BRICOLAGE VBA

    Lorsque votre problème est solutionné, pensez à le signaler en cliquant sur le bouton au bas de la discussion.

  12. #12
    Membre habitué
    Inscrit en
    juillet 2008
    Messages
    268
    Détails du profil
    Informations forums :
    Inscription : juillet 2008
    Messages : 268
    Points : 130
    Points
    130
    Par défaut
    Effectivement c'est pratique de pouvoir supprimer les doublons facilement.
    Pour le code de défusion et de fusion, je vais avoir des fichiers de tailles variables. Vaut-il mieux traiter les lignes au fur et à mesure ou bien tout défusionner toute la feuille, traiter toutes les lignes puis refusionner toutes les cellules initiales?
    Je me disais que la seconde manière pouvait être plus rapide mais je ne suis pas sûr. Peut-on savoir ce genre de choses sans tout tester?

  13. #13
    Expert éminent
    Avatar de fring
    Homme Profil pro
    Engineering
    Inscrit en
    février 2008
    Messages
    3 900
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 59
    Localisation : Belgique

    Informations professionnelles :
    Activité : Engineering

    Informations forums :
    Inscription : février 2008
    Messages : 3 900
    Points : 7 962
    Points
    7 962
    Par défaut
    Citation Envoyé par buzz73 Voir le message
    Peut-on savoir ce genre de choses sans tout tester?
    Non mais à mon avis la différence entre les deux sera minime surtout que tu ne traites pas des milliers de lignes, tu pourras peut-être gagner quelques millième de seconde

    Par contre là où tu pourras gagner du temps c'est dans la plage de cellules à vérifier. Au lieu de faire
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    For Each Cel In Workbooks(clasTraite).Sheets(feuilTraitee).Rows(i).Cells
    ce qui oblige la boucle à parcourir les 255 colonnes même si tu n'as que 10 colonnes utilisées, ce qui sur Excel 2007 va obliger la boucle à parcourir les 16384 colonnes...!
    Si toutes tes lignes comportent le même nombre de colonnes, tu pourrais faire
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    Dim DerCol As Integer
     
    feuiltraitee = "PERMANENT 2009"
     
    DerCol = Sheets(feuiltraitee).Cells(18, Columns.Count).End(xlToLeft).Column
     
    For i = 18 To 28
        bFusion = False
        For Each Cel In Sheets(feuiltraitee).Range(Cells(i, 1), Cells(i, DerCol))
            'suite de la procedure
    Il n'est pas nécessaire de préciser le Workbook si tu travailles dans le classeur contenant la procédure
    LES FAQ OFFICE - LES COURS OFFICE - LES COURS EXCEL - LES LIVRES OFFICE - SOURCES VBA - ATELIER BRICOLAGE VBA

    Lorsque votre problème est solutionné, pensez à le signaler en cliquant sur le bouton au bas de la discussion.

  14. #14
    Membre habitué
    Inscrit en
    juillet 2008
    Messages
    268
    Détails du profil
    Informations forums :
    Inscription : juillet 2008
    Messages : 268
    Points : 130
    Points
    130
    Par défaut
    En fait j'ai pris le nom du classeur car c'est pour les tests, par la suite la macro sera contenue dans un autre classeur pour travailler sur ce fichier.
    J'ai fait un essai avec la feuille entière :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    For Each Cel In Workbooks(Classeur).Sheets(Feuille).Cells
            'Cellule Fusionnée
            If Cel.MergeCells = True Then
                If Cel.MergeArea.Address(0, 0) <> addresse Then
                    addresse = Cel.MergeArea.Address(0, 0) 'Récupération de l'adresse
                    ColCelFusion.Add addresse 'Stockage de l'adresse
                    ...
    échec cuisant (mais je voulais essayer ) : le pc plante (susceptible le petit mais ça se comprend )
    Je trouve ta solution intéressante, mais je ne sais par avance ni si toutes les lignes ont le même nombre de colonnes ni si la ligne a des "cellules vides" (hautement probable!).
    Avant de faire la boucle, peut-on récupérer la dernière colonne utilisée dans une feuille(ça pourrait m'être utile par la suite )? Et la dernière colonne utilisée dans la ligne (même s'il y a des cellules vides)?

  15. #15
    Expert éminent
    Avatar de fring
    Homme Profil pro
    Engineering
    Inscrit en
    février 2008
    Messages
    3 900
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 59
    Localisation : Belgique

    Informations professionnelles :
    Activité : Engineering

    Informations forums :
    Inscription : février 2008
    Messages : 3 900
    Points : 7 962
    Points
    7 962
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    DerCol = Cells.SpecialCells(xlCellTypeLastCell).Column
    LES FAQ OFFICE - LES COURS OFFICE - LES COURS EXCEL - LES LIVRES OFFICE - SOURCES VBA - ATELIER BRICOLAGE VBA

    Lorsque votre problème est solutionné, pensez à le signaler en cliquant sur le bouton au bas de la discussion.

  16. #16
    Membre habitué
    Inscrit en
    juillet 2008
    Messages
    268
    Détails du profil
    Informations forums :
    Inscription : juillet 2008
    Messages : 268
    Points : 130
    Points
    130
    Par défaut
    J'ai essayé
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    For i = 18 To 28
        bFusion = False
        DerCol = Sheets(feuilTraitee).Cells(i, Columns.Count).End(xlToLeft).Column
        For Each Cel In Workbooks(clasTraite).Sheets(feuilTraitee).Range(Cells(i, 1), Cells(i, DerCol))
    mais le nombre de colonnes de la ligne est faux (103 au lieu de 107 par exemple).
    Je n'arrive pas à détecter la dernière colonne de la feuille utilisée.
    J'ai essayé
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    nbCol = Workbooks(clasTraite).Sheets(feuilTraitee).UsedRange.Columns.Count
    mais il me retourne la valeur 256.
    Une colonne est considérée comme utilisée si elle a un format ou une valeur?
    J'ai besoin de détecter toutes les cellules fusionnées d'une ligne, même s'il y en a une qui se balade au loin sans valeur. J'aimerais palier ce type de problème pour être sûr.

  17. #17
    Membre habitué
    Inscrit en
    juillet 2008
    Messages
    268
    Détails du profil
    Informations forums :
    Inscription : juillet 2008
    Messages : 268
    Points : 130
    Points
    130
    Par défaut
    Mince, ta réponse n'avait pas apparue avant que je tape ma question.
    Je teste.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    DerCol = Workbooks(clasTraite).Sheets(feuilTraitee).Cells.SpecialCells(xlCellTypeLastCell).Column
    me retourne aussi 256, je ne comprends pas pourquoi

    Je viens de comprendre (je pense) : il y a des formats sur les lignes et je viens de lire que
    xlCellTypeLastCell. The last cell in the used range. Note this XlCellType will include empty cells that have had any of cells default format changed
    Je ne vois plus comment m'y prendre...

  18. #18
    Expert éminent
    Avatar de fring
    Homme Profil pro
    Engineering
    Inscrit en
    février 2008
    Messages
    3 900
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 59
    Localisation : Belgique

    Informations professionnelles :
    Activité : Engineering

    Informations forums :
    Inscription : février 2008
    Messages : 3 900
    Points : 7 962
    Points
    7 962
    Par défaut
    Citation Envoyé par buzz73 Voir le message
    J'ai essayé
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    For i = 18 To 28
        bFusion = False
        DerCol = Sheets(feuilTraitee).Cells(i, Columns.Count).End(xlToLeft).Column
        For Each Cel In Workbooks(clasTraite).Sheets(feuilTraitee).Range(Cells(i, 1), Cells(i, DerCol))
    mais le nombre de colonnes de la ligne est faux (103 au lieu de 107 par exemple).
    Ce n'est pas possible
    LES FAQ OFFICE - LES COURS OFFICE - LES COURS EXCEL - LES LIVRES OFFICE - SOURCES VBA - ATELIER BRICOLAGE VBA

    Lorsque votre problème est solutionné, pensez à le signaler en cliquant sur le bouton au bas de la discussion.

  19. #19
    Membre habitué
    Inscrit en
    juillet 2008
    Messages
    268
    Détails du profil
    Informations forums :
    Inscription : juillet 2008
    Messages : 268
    Points : 130
    Points
    130
    Par défaut
    ah...
    peux-tu m'expliquer ce que fait exactement :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Sheets(feuilTraitee).Cells(i, Columns.Count).End(xlToLeft).Column
    s'il te plaît?

    J'ai compris!
    Tu as raison, en fait je viens de voir que les lignes testées étaient vides à partir de la colonne 103
    je vais donc essayer en fusionnant une cellule vide plus loin que la colonne 103.

  20. #20
    Expert éminent
    Avatar de fring
    Homme Profil pro
    Engineering
    Inscrit en
    février 2008
    Messages
    3 900
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 59
    Localisation : Belgique

    Informations professionnelles :
    Activité : Engineering

    Informations forums :
    Inscription : février 2008
    Messages : 3 900
    Points : 7 962
    Points
    7 962
    Par défaut
    En fait après réflexion...oui c'est possible si les dernières cellules sont des cellules fusionnées, comme je l'ai dit précédemment, les cellules fusionnées sont une plaie ! Mais cela n'a pas d'importance dans ton code du moment qu'il tient compte de la dernière cellule, si celle-ci est la cellule dans la colonne 103 et qu'elle est fusionnée avec la colonne 104, 105, 106 et 107, cela sera pris en compte dans Cel.MergeArea

    [EDIT] après autre réflexion...cela ne fonctionne pas vu que les cellules fusionnées ne contiennent pas forcément quelque chose
    LES FAQ OFFICE - LES COURS OFFICE - LES COURS EXCEL - LES LIVRES OFFICE - SOURCES VBA - ATELIER BRICOLAGE VBA

    Lorsque votre problème est solutionné, pensez à le signaler en cliquant sur le bouton au bas de la discussion.

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

Discussions similaires

  1. MACRO de copie d'une feuille dont le nom est contenu dans une cellule
    Par youssy dans le forum Macros et VBA Excel
    Réponses: 8
    Dernier message: 04/03/2015, 14h33
  2. MACRO de copie d'une feuille dont le nom est contenu dans une cellule
    Par youssy dans le forum Macros et VBA Excel
    Réponses: 0
    Dernier message: 01/03/2015, 19h39
  3. [XL-2007] Sélectionner une feuille dont le nom est contenu dans une cellule
    Par Nonno 94 dans le forum Macros et VBA Excel
    Réponses: 4
    Dernier message: 30/06/2014, 20h47
  4. [XL-2007] Chercher une feuille dont le nom est variable
    Par dubdub22 dans le forum Macros et VBA Excel
    Réponses: 1
    Dernier message: 18/01/2012, 19h20
  5. [XL-2007] Afficher une checkbox dans une feuille si une checkbox d'une autre feuille est cochée
    Par JessieCoutas dans le forum Macros et VBA Excel
    Réponses: 3
    Dernier message: 18/08/2009, 13h35

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