UserForm Excel 2003: encontrar el valor máximo de una base de datos

P/ Dante Amor y Elsa Matilde

Bueno días, soy nuevo en el tema de usar UserForm y no pude encontrar una solución a mi trabajo. Les adjunto un ejemplo de mi base de datos que está en la hoja "BBDD" (le agregué color a los registros para que se pueda observar que corresponden a la misma categoría, si bien son distintos):

El tema es el siguiente: en la columna I ("Código Parte"), existen una serie de números que deben ser CORRELATIVOS, ya que las "Parte" (columna H) a veces puede ser distinta. Lo ejemplifico:

  • En la fila 2 tengo el ÁREA máquina, SECCIÓN depósito, PARTE aaa cuyo código es 1
  • en la fila 3 aparece un nuevo registro: tengo el ÁREA máquina, SECCIÓN depósito, PARTE bbb cuyo código es 2

Estas correlatividades en los códigos necesito que se realicen de manera automática en el siguiente UserForm (pongo como ejemplo que quiero cargar un nuevo registro de las mismas "área y sección" PERO distinta "parte"):

Necesito un código VBA (para colocar en el textbox señalado), que busque en la hoja "BBDD" el valor máximo en la columna I cuando se cumplan las mismas condiciones en la columna D y F.

Espero haber sido claro con lo que tengo que hacer.

1 Respuesta

Respuesta
1

H o l a:

Te anexo 2 opciones,

Una con un ciclo:

Private Sub ComboBox1_Change()
'Por.Dante Amor
    '
    'Aquí va el código que ya tengas
    '
    If ComboBox2 <> "" Then
        LlenarTextbox
    End If
End Sub
'
Private Sub ComboBox2_Change()
'Por.Dante Amor
    '
    'Aquí va el código que ya tengas
    '
    If ComboBox1 <> "" Then
        LlenarTextbox
    End If
End Sub
'
Sub LlenarTextbox()
'Por.Dante Amor
    Set h1 = Sheets("BBDD")
    wmax = 0
    Set r = h1.Columns("D")
    Set b = r.Find(ComboBox1, lookat:=xlWhole)
    If Not b Is Nothing Then
        ncell = b.Address
        Do
            'detalle
            If h1.Cells(b.Row, "F") = ComboBox2 Then
                If h1.Cells(b.Row, "I") > wmax Then
                    wmax = h1.Cells(b.Row, "I")
                End If
            End If
            Set b = r.FindNext(b)
        Loop While Not b Is Nothing And b.Address <> ncell
        TextBox3 = wmax
    End If
End Sub

Si requieres que en el textbox3 te aparezca el siguiente consecutivo, entonces tendrás que poner la línea así:

TextBox3 = wmax + 1


La siguiente macro hace lo mismo que la anterior, pero utiliza una fórmula matricial para obtener el máximo número. Deberás abrir el formulario en la hoja "BBDD"

Private Sub ComboBox1_Change()
'Por.Dante Amor
    '
    'Aquí va el código que ya tengas
    '
    If ComboBox2 <> "" Then
        ConMatricial
    End If
End Sub
'
Private Sub ComboBox2_Change()
'Por.Dante Amor
    '
    'Aquí va el código que ya tengas
    '
    If ComboBox1 <> "" Then
        ConMatricial
    End If
End Sub
'
Sub ConMatricial()
'Por.Dante Amor
    u = Range("D" & Rows.Count).End(xlUp).Row
    TextBox3 = Evaluate("=max((D2:D" & u & "=""" & ComboBox1 & """)*(F2:F" & u & "=""" & ComboBox2 & """)*I2:I" & u & ")")
End Sub

De igual forma si quieres el siguiente consecutivo la línea del textbox3 quedaría así:

TextBox3 = Evaluate("=max((D2:D" & u & "=""" & ComboBox1 & """)*(F2:F" & u & "=""" & ComboBox2 & """)*I2:I" & u & ")") + 1

Con la fórmula matricial debe ser más rápido, además el código está en dos líneas, mientras que con el ciclo está en varias líneas.

Prueba con las 2 opciones.


Hola! Estuve tratando de hacer funcionar la macro pero no encuentro la solución.

Resulta que funciona bien cuando cargo el primer registro que no existe (aparece en el textbox "1"), después al crear otro registro que tenga iguales datos en D y F PERO distinto H (este registro debería llevar en el textbox el número "2") la macro no funciona bien, devuelve SIEMPRE el número 1

Según tu imagen en las columnas D y F estás poniendo textos, si estás poniendo números el comportamiento es diferente.

¿Estás agregando el + 1 que te comenté?

¿Cuál macro es la que vas a ocupar?

Prueba nuevamente, es posible que omitiste poner el + 1. Sigue las indicaciones que te indiqué.

Si no puedes adaptar el + 1 en el código, envíame tu archivo con los datos con los que estás probando.

Mi correo [email protected]

En el asunto del correo escribe tu nombre de usuario “Abel Rodrigo” y el título de esta pregunta.

¡Gracias! Te envié el archivo por e-mail porque sigo con el problema. Saludos.

Cambiaste la macro, tengo una variable llamada wmax y le pusiste vmax pero no cambiaste el nombre de la variable en todas las líneas.

Lo correcto debe ser así:

Sub LlenarTextbox()
'Por.Dante Amor
    Set h1 = Sheets("BBDD")
    wmax = 0
    Set r = h1.Columns("D")
    Set b = r.Find(ComboBox1, lookat:=xlWhole)
    If Not b Is Nothing Then
        ncell = b.Address
        Do
            'detalle
            If h1.Cells(b.Row, "F") = ComboBox2 Then
                If h1.Cells(b.Row, "I") > wmax Then
                    wmax = h1.Cells(b.Row, "I")
                End If
            End If
            Set b = r.FindNext(b)
        Loop While Not b Is Nothing And b.Address <> ncell
        TextBox6 = wmax + 1
    End If
End Sub

Tenes razón, ahora sí suma.

Ahora el problema que tengo es que si la parte existe debería arrojarme en el textbox3 el número que le corresponda en la BBDD (de no ser así, tendría iguales partes pero con códigos distintos y no tiene que ser así, debe ser un único código para una única área-sección-parte).

G r a c i a s.

Tu pregunta original es esta:

"Necesito un código VBA (para colocar en el textbox señalado), que busque en la hoja "BBDD" el valor máximo en la columna I cuando se cumplan las mismas condiciones en la columna D y F."


Con gusto te ayudo con las nuevas consideraciones que necesites. Valora esta respuesta y crea una nueva pregunta. En el desarrollo de la pregunta nueva escribe que va dirigida a Dante Amor y explicas con detalle lo que necesitas.

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas