web-dev-qa-db-fra.com

Une fonction VBA dans Excel peut-elle renvoyer une plage?

Il semble que j'obtienne une erreur de non-correspondance de type lorsque j'essaie de faire quelque chose comme ceci:

Dans le nouveau classeur:

A1 B1
5  4

Function Test1() As Integer
    Dim rg As Range
    Set rg = Test2()
    Test1 = rg.Cells(1, 1).Value
End Function
Function Test2() As Range
    Dim rg As Range
    Set rg = Range("A1:B1")
    Test2 = rg
End Function

Ajouter = Test1 () devrait retourner 5 mais le code semble se terminer lors du retour d'une plage de test2 (). Est-il possible de retourner une gamme?

24
Dane O'Connor

Une plage est un objet. L'affectation d'objets nécessite l'utilisation du mot clé SET et il semble que vous en ayez oublié un dans votre fonction Test2:

Function Test1() As Integer
    Dim rg As Range
    Set rg = Test2()
    Test1 = rg.Cells(1, 1).Value
End Function

Function Test2() As Range
    Dim rg As Range
    Set rg = Range("A1:B1")
    Set Test2 = rg         '<-- Don't forget the SET here'
End Function
45
BradC

Vous pouvez également renvoyer une Variant() qui représente un tableau de valeurs. Voici un exemple de fonction qui inverse les valeurs d'une plage vers une nouvelle plage:

Public Function ReverseValues(ByRef r_values As Range) As Variant()
    Dim i As Integer, j As Integer, N As Integer, M As Integer
    Dim y() As Variant
    N = r_values.Rows.Count
    M = r_values.Columns.Count
    y = r_values.value    'copy values from sheet into an array
    'y now is a Variant(1 to N, 1 to M) 
    Dim t as Variant
    For i = 1 To N / 2
        For j = 1 To M
            t = y(i, j)
            y(i, j) = y(N - i + 1, j)
            y(N - i + 1, j) = t
        Next j
    Next i

    ReverseValues = y
End Function

Dans la feuille de calcul, vous devez appliquer cette fonction en tant que formule matricielle (avec Ctrl-Shift-Enter) avec un nombre approprié de cellules sélectionnées. Les détails de la fonction Swap () ne sont pas importants ici.

Remarque que pour de nombreuses lignes, c'est très efficace. Faire le x = Range.Value et Range.Value = x opérations lorsque x est un tableau et que la plage contient plusieurs lignes colonnes est plusieurs fois plus rapide que de faire les opérations une par une directement sur les cellules.

8
ja72

Remplacez la dernière ligne de Test2 par:

Set Test2 = rg
4
AnthonyWJones

Cela fonctionne aussi

Function Test2(Rng As Range) As Range
    Set Test2 = Rng
End Function
2
asif