2009-01-13 58 views
20

que parecen estar recibiendo un error de coincidencia de tipos cuando se trata de hacer algo como esto:¿Puede una función de VBA en Excel devolver un rango?

En nuevo libro:

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 

Adición = Prueba1() debe devolver 5 pero el código parece dar por terminado cuando vuelva un rango de test2(). ¿Es posible devolver un rango?

Respuesta

39

Un rango es un objeto. Asignación de objetos requiere el uso de la palabra clave SET, y se ve como se le olvidó uno en su función Prueba2:

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 
+1

¿Se puede usar esto como un UDF? – ja72

4

Cambio última línea de Prueba2 a:

Set Test2 = rg 
+0

puedes contar sobre lo que esto está haciendo? ¿Debería siempre estar usando set? Veo muchos ejemplos donde se omite. Gracias por la ayuda rápida. –

7

También puede devolver un Variant() que representa una matriz de valores. Este es un ejemplo para una función que invierte los valores de una serie en una nueva gama:

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 

En la hoja de trabajo que tiene que aplicar esta función como una fórmula de matriz (con Ctrl-Shift - Enter) con un número apropiado de celdas seleccionadas Los detalles de la función Swap() no son importantes aquí.

Nota que para muchas filas, esto es muy eficiente. Hacer las operaciones x = Range.Value y Range.Value = x cuando x es una matriz y el rango contiene varias filas columnas es muchas veces más rápido que hacer las operaciones una por una directamente en las celdas.

2

Esto también funciona

Function Test2(Rng As Range) As Range 
    Set Test2 = Rng 
End Function 
Cuestiones relacionadas