valor - seleccionar hoja excel vba
¿Puede una función de VBA en Excel devolver un rango? (4)
Cambie la última línea en Test2 a:
Set Test2 = rg
Parece que estoy obteniendo un error de desajuste de tipo cuando trato de hacer algo como esto:
En el nuevo libro de trabajo:
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
Adding = Test1 () debería devolver 5 pero el código parece terminar cuando se devuelve un rango desde test2 (). ¿Es posible devolver un rango?
Esto también funciona
Function Test2(Rng As Range) As Range
Set Test2 = Rng
End Function
También puede devolver una Variant()
que representa una matriz de valores. Aquí hay un ejemplo de una función que invierte los valores de un rango a un nuevo rango:
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 debe 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í.
Tenga en cuenta que para muchas filas, esto es muy eficiente. Hacer x = Range.Value
y Range.Value = x
operaciones cuando x
es una matriz y el rango contiene múltiples filas de columnas es mucho más rápido que hacer las operaciones una a una directamente en las celdas.
Un rango es un objeto. La asignación de objetos requiere el uso de la palabra clave SET, y parece que olvidó uno en su función 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