none
Problème de comportement d'un Range RRS feed

  • Question

  • Bonjour,

    Je joins un morceau de code vba qui expose mon problème :

    Tout se passe bien pour la 1ère partie (Row 1), mais pas pour la 2ème partie (Row 3) alors que les principes du code (Range et SubRange) sont les mêmes. Pourquoi le range adresse la Row 5 ?

    Vos explications sont vivement attendues...

    Private Sub Test()
        Dim MySheet As Worksheet
        Dim MyRange As Range
        Set MySheet = ThisWorkbook.Sheets(1)
        MySheet.Cells.NumberFormat = "@"
        MySheet.Cells.HorizontalAlignment = xlCenter
        '*****************************
        '* Row 1 with Range("A1:N1") *
        '*****************************
        Set MyRange = MySheet.Range("A1:N1")
        With MyRange.Range(MyRange(1), MyRange(2))      'Row = 1 -> OK
            .Merge
            .Value = "1-2"
        End With
        With MyRange.Range(MyRange(3), MyRange(4))      'Row = 1 -> OK
            .Merge
            .Value = "3-4"
        End With
        MyRange(5).Value = "5"                          'Row = 1 -> OK
        MyRange(6).Value = "6"                          'Row = 1 -> OK
        With MyRange.Range(MyRange(7), MyRange(10))     'Row = 1 -> OK
            .Merge
            .Value = "7-10"
        End With
        MyRange(11).Value = "11"                        'Row = 1 -> OK
        With MyRange.Range(MyRange(12), MyRange(14))    'Row = 1 -> OK
            .Merge
            .Value = "12-14"
        End With
        '*****************************
        '* Row 3 with Range("A3:N3") *
        '*****************************
        Set MyRange = MySheet.Range("A3:N3")
        MyRange(1).Value = "1"                          'Row = 3 -> OK
        MyRange(2).Value = "2"                          'Row = 3 -> OK
        MyRange(3).Value = "3"                          'Row = 3 -> OK
        MyRange(4).Value = "4"                          'Row = 3 -> OK
        MyRange(5).Value = "5"                          'Row = 3 -> OK
        MyRange(6).Value = "6"                          'Row = 3 -> OK
        With MyRange.Range(MyRange(7), MyRange(10))     'Row = 5 <<<<<<< Pourquoi >>>>>>>
            .Merge
            .Value = "7-10"
        End With
        MyRange(11).Value = "11"                        'Row = 3 -> OK
        MyRange(12).Value = "12"                        'Row = 3 -> OK
        MyRange(13).Value = "13"                        'Row = 3 -> OK
        MyRange(14).Value = "14"                        'Row = 3 -> OK
    End Sub




    dimanche 28 janvier 2018 15:06

Toutes les réponses

  • Bonjour,

    Le code que vous avez est bien complexe par rapport à ce que vous voulez en obtenir mais c'est un point vue perso.

    L'usage d'objet Range qualifié avec des propriété Range dévie très souvent sur des plages inattendues (par rapport à ce que l'on souhaite) à cause des propriété intrinsèques lié à la sélection en cours...

    Dans l'aide, il est écrit :

    Quand la propriété Range est appliquée à un objet Range, elle se rapporte à l'objet Range. Par exemple, si la sélection est la cellule C3, Selection.Range("B1") renvoie la cellule D3 parce qu'elle se rapporte à l'objet Range renvoyé par la propriété Selection. En revanche, le code ActiveSheet.Range("B1") renvoie toujours la cellule B1.

    Le code suivant renvoie bien la plage d'écriture que vous constatez $G$5:$J$5 :

    MySheet.Range("A3:N3").Range(MyRange(7), MyRange(10)).Address

    Comme l'adresse ligne de votre objet MyRange est égale à 3, l'adressage de MyRange.Range renvoie sur la 5 car cela équivaut (dans le code) à écrire :

    MyRange.Range(cells(3,7),cells(3,10)).address

    par rapport à la selection.

    Ce qui vous met en erreur c'est la sélection que vous ne «remanipulez» pas en fait.

    De fait, la partie incriminée tournerait comme attendue sous cette forme :

            With Range(MyRange(7), MyRange(10))
                .Merge
                .Value = "7-10"
            End With
    
    Qoi qu'il en soit, dans l'absolu, je comprends votre étonnement.


    Argy

    mardi 30 janvier 2018 11:36
    Modérateur