web-dev-qa-db-fra.com

Comment créer une plage à partir de 2 plages dans VBA

J'ai deux plages contenant chacune une seule cellule (par exemple "A1" et "C3")

Quelle est la façon la plus simple d'obtenir une nouvelle plage contenant toutes les cellules entre ces deux ("A1: C3").

J'essaie d'écrire quelque chose comme ça, mais cela ne fonctionne pas:

 Set NewRange = Range(Range1.Address:Range2.Address)

Une autre question que j'ai est de savoir comment définir une plage au format R1C1? Je veux utiliser quelque chose comme Range ("R1C2") au lieu de Range ("A2").

Merci!

21
grozhd

Comme ça?

Sub Sample()
    Dim rng1 As Range, rng2 As Range
    Dim NewRng As Range

    With ThisWorkbook.Sheets("Sheet1")
        Set rng1 = .Range("A1")
        Set rng2 = .Range("C3")

        Set NewRng = .Range(rng1.Address & ":" & rng2.Address)

        Debug.Print NewRng.Address
    End With
End Sub

Au lieu du format R1C1, utilisez Cells(r,c). Cela vous donnera plus de flexibilité et de contrôle

Donc Range("A2") peut être écrit comme Cells(2,1)

24
Siddharth Rout

Vous pouvez définir la nouvelle gamme de différentes manières. Voici quelques exemples. Pour obtenir le format R1C1 - Personnellement, je trouve plus facile d'entrer la formule normale, puis d'utiliser VBA pour extraire le format R1C1 requis. Voir les instructions debug.print ci-dessous.

Sub test()
Dim rng1 As Range
Dim rng2 As Range
Dim newRng As Range

    With Sheet1

        Set rng1 = .Range("A1")
        Set rng2 = .Range("C3")

        Debug.Print rng1.FormulaR1C1
        Debug.Print rng1.FormulaR1C1Local

        'Method1
        Set newRng = .Range(rng1, rng2)

        'method2
        Set newRng = .Range(rng1.Address, rng2.Address)

        'method3 (Only works if rng1 & rng2 are single cells
        Set newRng = .Range(rng1.Address & ":" & rng2.Address)

        'method4
        Set newRng = Union(rng1, rng2)


    End With
End Sub
14
user3357963

La méthode 4 n'est pas la même que la méthode 1 lorsque les plages ne sont pas adjacentes.

With Sheet1
Set rng1 = .Range("A1:A3")
Set rng2 = .Range("C1:C3")

'This combines the two separate ranges, so select A1, A2, A3, C1, C2, C3
set newRng = Union(rng1, rng2)

'This combines the two ranges in the same way as when using "A1:C3", 
'so including the cells from column B
set newRng = .Range(rng1, rng2)
10
user3484615

Mettez cela dans un module:

Private Function CombineRanges(rng1 As Range, rng2 As Range) As Range

    Set CombineRanges = ActiveSheet.Range(rng1.Address & ":" & rng2.Address)

End Function

Utilisez-le comme:

Dim NewRange As Range
Set NewRange  = CombineRanges(Range1, Range2)
2
thanos.a

C'est aussi possible quelque chose comme:

    Dim newRange as Range
    Set newRange = Range("A1:A4,A7:A9,C1:D9")  'Three different regions grouped
    'or
    Set newRange = Range("A1:A4,A7:A9,C1:D9, D10:D11")  'Four different regions grouped.
    'or
    Set newRange = Range("A1:A4,A7:A9,C1:D9, D10:D11, ...")  'N different regions grouped.
2
Roberto Santos