Macro para activar una hoja en una función propia

Hola!
He creado una función propia que se visualiza así =ValCuali(N5, O5, P5)
Estoy manejando 2 hojas, La primera tiene una serie de combinaciones y los resultados de estas combinaciones.
En la segunda voy ingresando a las celdas valores y donde necesite el resultado de combinar coloco la fórmula que les indique =ValCuali(N5, O5, P5)
Mi problema es que cuando llamo la función desde otra hoja diferente a la de combinaciones no está activando la hoja y por lo tanto no encuentra los resultados.
Por favor ayuda!
Dentro de VB en un modulo coloque la siguiente función
Option Explicit
 Const P = 1 'Columna A 
 Const I = 2 'Columa B 
 Const A = 3 ' Columna C 
 Const ValCual = 4 'Columna D correspondiente al valor resultado
Public Function ValCuali(Pp, Ii, Aa)
´recibe de entrada los valores de cada respuesta 
 Dim colxls As Integer 
 Dim rowxls As Integer 
 Dim Ufil As Integer
    Sheets("Combinaciones").Select
    Ufil = Range("A65536").End(xlUp).Row 'sera el valor de la ultima fila
    'Recorrer la hoja de combinaciones hasta encontrar los valores igual a las entradas de función
    For rowxls = 2 To Ufil 'Empieza a leer por fila
        If (Columns(P).Rows(rowxls) = Pp) And (Columns(I).Rows(rowxls) = Is) And (Columns(A).Rows(rowxls) = Aa) Then
         ValCuali = Columns(ValCual).Rows(rowxls) 'el valor de la funcion
         Exit Function
        End If
    Next rowxls
End Function
Respuesta
1
Para que tu función sea válida desde otras hojas debes modificarla de este modo:
Public Function ValCuali(Pp, Ii, Aa)
    'recibe de entrada los valores de cada respuesta
    Dim colxls As Integer
    Dim rowxls As Integer
    Dim Ufil As Integer
    Ufil = Sheets("Combinaciones").Range("A65536").End(xlUp).Row 'sera el valor de la ultima fila
    'Recorrer la hoja de combinaciones hasta encontrar los valores igual a las entradas de función
    For rowxls = 2 To Ufil 'Empieza a leer por fila
        If (Sheets("Combinaciones").Columns(P).Rows(rowxls) = Pp) And _
           (Sheets("Combinaciones").Columns(I).Rows(rowxls) = Ii) And _
           (Sheets("Combinaciones").Columns(A).Rows(rowxls) = Aa) Then
             ValCuali = Sheets("Combinaciones").Columns(ValCual).Rows(rowxls) 'el valor de la funcion
             Exit Function
        End If
    Next rowxls
End Function
Me cuentas que tal te va así ;)
Saludos,
Carlos
[email protected]
Muchas gracias ha funcionado!
Para no quedarme con la duda, y entender un poco mejor, me podrías dar una explicación de por que funciona hacer una mayor referencia de la hoja para saber cuando llamarlas como me indicas y cuando como yo lo puse.
En otras ocasiones he usado SUB y he activado las hojas.
Claro que si (xxxxxx), encantado.
Tu función está perfecta si la llamas desde código.
Pero cuando haces una función para ser usada desde una celda de excel, como en tu caso, hay ciertas limitaciones.
En tu ejemplo, esta sentencia no es válida para ser usada desde una función en una celda:
Sheets("Combinaciones").Select
A ver si soy capaz de explicar esto que creo que es la primera vez que trato de explicarlo :)
En general, desde funciones que vayas a usar en celdas, tan solo puedes realizar operaciones que no tengan ningún efecto sobre los objetos que forman parte de Excel (libros, hojas, celdas, etc)
Como ejemplo, no te está permitido desde una fórmula usada en una celda:
- Cambiar el color de fondo de una celda
- Crear una fila
- Activar otra hoja
En cambio, si podrás realizar cualquier otra operación que no afecte a los objetos de Excel
- Asignar a una variable el color de fondo de una celda
- Obtener la suma de los valores de la columna A
- Conocer el número de hojas que tiene tu libro
Volviendo a tu caso, cuando usas la sentencia Sheets("Combinaciones").Select estás tratando de activar otra hoja diferente a la hoja activa, esta sentencia usada en una función dentro de una celda es ignorada por excel, no da error, tan solo la ignora, el código continua y para excel es como si no estuviera.
Por eso en el cambio que te he propuesto he tratado de hacer lo mismo, pero evitando el uso de esta sentencia.
No sé si he sido claro en mi exposición, si te queda algo que no entiendas me dices.
Espero haberte ayudado,
Carlos
[email protected]

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas