Función en VBA que no funciona

Tengo un código para crear una función en VBA y usarla en una celda de la hoja que me busque si hay coincidencias con un numero y una palabra.

Mi idea es que tome como parámetros dos celdas que están en su misma fila, por ejemplo si aplico la función en la celda H2 me tomara A2 (m) y B2 (n)

Luego, quiero que este string lo vaya comparando con todos los datos que fueron agregados en el futuro (como la tabla esta definida, las columnas se van agregando al principio (fila 2), entonces quiero que me compare con las siguientes filas hacia arriba (si estoy en la fila 8 que me compare desde 8 hasta 2) y si encuentra una coincidencia entre ambos string (que sean iguales) quiero que salga del boucle y me escriba en la celda donde aplico la función la palabra "KO", y si no encuentra en toda la búsqueda, quiero que deje la celda en blanco "".

Creo que mi problema esta en como estoy definiendo la función, ya que no se si esta bien los parámetros que estoy tomando, o sino en la parte donde uso el Return para salir del If ( ya que si encuentra algo no quiero que siga comparando)

Mi código es el siguiente :

Function test(m As String, n As String)
    Dim maliason As String
    Dim liason As String
    Dim j As Integer
    Dim i As Integer
    i = ActiveCell.Row
    maliasion = m & n
    j = i
    While j >= 2
        liason = ActiveWorksheet.Cells(j, 1) & ActiveWorksheet.Cells(j, 2)
        If liasion = maliasion Then
            ActiveCell.Value = "KO"
            Return
        Else
            ActiveCell.Value = ""
            j = j - 1
        End If
    Wend
End Function

Respuesta
1

Hi Sara,

No estoy muy seguro si entendí (estaría buenísimo si subes una imagen de la hoja)

Pero por ahora podría decirte que la función se puede mejorar. Creo que es un problema que uses ActiveCell en una función. No estoy seguro de lo que te voy a decir (tendría que hacer algunas pruebas) pero cuando entras la función en la celda, puedes aplicarla dando Enter o Tab, y ahí cambia la celda activa y la función puede confundirse.

Yo te recomiendo que pases los parámetros como Range y no como String de esa forma puedes usar el .Address o el .Row

También veo que valoras i como ActiveCell. Row y luego valoras j como i para trabajar solo con j. Esta muy enredado, en programación le llamamos a esto código espagueti.

Me encantaría ayudarte pero no entiendo bien el propósito, ese ActiveCell me confunde mucho. La celda que contiene la función no tiene que ser la ActiveCell.

Hola!

Gracias por la información, cambie por As range como me dijiste. Tambien me di cuenta que estaba haciendo el ciclo mal, y ahora agregue un ciclo For next.

Lo que quiero que haga la función que agregare en la columna H, es comparar un texto concatenado de la columna A con la B para ver si lo encuentra en registros anteriores (descendiendo desde la fila 2 hasta la ultima). Ej: tengo en A2B2 : 700525162CHAT, y quiero revisar si en todos los registros existe esta misma combinación, por lo que la función toma A2 y B2 y a partir de ellos busca la coincidencia y si encuentra alguna, la función debería arrojar "KO".

Gracias !!

En mi opinión esto no es algo que debas hacer con una función, pero prueba si es esto lo que necesitas.

Function FindKO(Rng As Range)
Dim fRow As Integer: fRow = Rng.Row
Dim maliason As String, liason As String
Dim i As Integer
maliason = Range("A" & fRow).Value & Range("B" & fRow).Value
For i = 2 To fRow - 1
    liason = Range("A" & i).Value & Range("B" & i).Value
    If liason = maliason Then
        FindKO = "KO"
        Exit Function
    Else
        FindKO = ""
    End If
Next i
End Function

Tienes que pasarle un rango por la variable Rng, puede ser cualquier celda de la fila que estas evaluando.

Osea cuando escribas =FindKO( y abras el paréntesis, escribe o selecciona cualquier celda de esa misma fila. No se me ocurre otra forma de obtener la fila donde esta la función.

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas