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?
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
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.
Remplacez la dernière ligne de Test2 par:
Set Test2 = rg
Cela fonctionne aussi
Function Test2(Rng As Range) As Range
Set Test2 = Rng
End Function