variable valor seleccionar recorrer rango propiedades macro hoja funcion existe determinar desde celda activar activa excel vba excel-vba

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