Generar un código según la cantidad de proyectos de una persona (macros)

Tengo una planilla con cotizaciones de proyectos, la idea es que al ingresar una nueva cotización, se ingrese el cliente y automáticamente se genere un código de proyecto el cual es correlativo según a la cantidad de proyectos del cliente.

Cabe destacar que existen diferentes clientes, por lo tanto el correlativo es para cada cliente.

Por ejemplo:

Juan Perez tiene el proyecto 1001, 1002,1003

Si quiero ingresar un nuevo proyecto debería generar automáticamente el código 1004.

Private Sub ComboBox2_DropButtonClick()
'Cargar en el combobox1
Set h1 = Sheets("CLIENTES")
Set h2 = Sheets("COTIZACIONES")
For i = 7 To h1.Range("B" & Rows.Count).End(xlUp).Row
ComboBox2.AddItem h1.Cells(i, "B")
Next
Worksheets("COTIZACIONES").Cells(ultimafila, "D").Value = ComboBox2.Value 'cliente
Dim cod1 As Range
For i = 7 To h1.Range("B" & Rows.Count).End(xlUp).Row
If h1.Cells(i, "B") = ComboBox2 Then
Worksheets("COTIZACIONES").Cells(ultimafila, "E").Value = Worksheets("CLIENTES").Cells(i, "C").Value 'empresa
Worksheets("COTIZACIONES").Cells(ultimafila, "F").Value = Worksheets("CLIENTES").Cells(i, "D").Value 'codigo
End If
'numero proyecto
For j = 4 To h2.Range("C" & Rows.Count).End(xlUp).Row
If h2.Cells(j, "D") = ComboBox2 Then
cod1 = WorksheetFunction.Max(Range("D:D")) + 1
Worksheets("COTIZACIONES").Cells(ultimafila, "E").Value = cod
End If
Next j
Next

End SUB

ESTO es lo que llevo hasta el momento, la parte con negrita es lo que me arroja error en la depuración.

2 respuestas

Respuesta
1

H o l a:

No entiendo lo que quieres hacer con la macro.

Mejor explícame qué necesitas con ejemplos.

Pon una imagen de tu hoja Cotizaciones.

Si tienes 3 clientes y cada cliente con 4 cotizaciones cómo quedaría la numeración, pon ejemplos en la hoja; y pones la imagen, procura que se vean las filas y las columnas de excel.

Sal u dos.

H o l a:

Hay varios detalles en tu macro que hay que revisar, por eso te comentaba:

"No entiendo lo que quieres hacer con la macro"

Por ejemplo:

Supongo que estás cargando los clientes en el combobox2.

Te recomiendo que cargues los clientes en el evento Activate de tu formulario, de esta manera:

Private Sub UserForm_Activate()
'Por.Dante Amor
    Set h1 = Sheets("CLIENTES")
    For i = 7 To h1.Range("B" & Rows.Count).End(xlUp).Row
        ComboBox2.AddItem h1.Cells(i, "B")
    Next
End Sub


Después tienes esta línea:

Worksheets("COTIZACIONES").Cells(ultimafila, "D").Value = ComboBox2.Value

Si ya estableciste 

Set h2 = Sheets("COTIZACIONES")

entonces la línea deberías ser así:

H2. Cells(ultimafila, "D").Value = ComboBox2.Value

Otro detalle en la misma línea es que no veo en la macro en qué momento llenaste la variable ultimafila.

Lo que te recomiendo es que utilices el evento change del combobox2:

Private Sub ComboBox2_Change()
'Por.Dante Amor
    Set h1 = Sheets("CLIENTES")
    Set h2 = Sheets("COTIZACIONES")
    u = h2.Range("D" & Rows.Count).End(xlUp).Row + 1
    h2.Cells(u, "D") = ComboBox2
End Sub

Después, estás tomando los datos de empresa y de código del cliente seleccionado, primero pones un ciclo For y buscas cuál registro es igual al combo, pero eso no es necesario, ya que sabemos en cuál fila está cargado cada cliente en el combo. Entonces quedaría así:

Private Sub ComboBox2_Change()
'Por.Dante Amor
    Set h1 = Sheets("CLIENTES")
    Set h2 = Sheets("COTIZACIONES")
    u = h2.Range("D" & Rows.Count).End(xlUp).Row + 1
    f = ComboBox2.ListIndex + 7
    h2.Cells(u, "D") = ComboBox2
    h2.Cells(u, "E") = h1.Cells(f, "C")
    h2.Cells(u, "F") = h1.Cells(f, "D")
End Sub

Por último, hay que buscar el último correlativo y sumarle uno.

Si en D estás poniendo el cliente, en E la empresa y en F el código; como no tengo a la vista la imagen de tus datos, voy a suponer que el correlativo va en la columna C.

Entonces la macro completa:

Private Sub ComboBox2_Change()
'Por.Dante Amor
    If ComboBox2 = "" Then Exit Sub
    Set h1 = Sheets("CLIENTES")
    Set h2 = Sheets("COTIZACIONES")
    u = h2.Range("D" & Rows.Count).End(xlUp).Row + 1    'ultima fila de cotizaciones
    f = ComboBox2.ListIndex + 7                         'fila del cliente
    c = 1                                               'correlativo = 1
    Set b = h2.Columns("D").Find(ComboBox2, lookat:=xlWhole, SearchDirection:=xlPrevious)
    If Not b Is Nothing Then                            'si ya existe el cliente
        c = h2.Cells(b.Row, "C") + 1                    'se incrementa en 1 el correlativo
    End If
                                                        'Se pasan los datos a Cotizaciones
    h2.Cells(u, "C") = c                                'correlativo
    h2.Cells(u, "D") = ComboBox2                        'cliente
    h2.Cells(u, "E") = h1.Cells(f, "C")                 'empresa
    h2.Cells(u, "F") = h1.Cells(f, "D")                 'codigo
End Sub
'
Private Sub UserForm_Activate()
'Por.Dante Amor
    Set h1 = Sheets("CLIENTES")
    For i = 7 To h1.Range("B" & Rows.Count).End(xlUp).Row
        ComboBox2.AddItem h1.Cells(i, "B")
    Next
End Sub

Reemplaza tu evento ComboBox2_DropButtonClick, por las macros que te estoy enviando.

Avísame cualquier duda que tengas.


Hola Esta es mi hoja cotizaciones, aquí separé los numeros de proyectos por color según el cliente. Por ejemplo Cesar tiene el proyecto 1001, 1002,1003,1004, si llegase a cotizar otro proyecto este llevaría por número 1005. Lo mismo con Juan perez, donde su cotización sería 1004.

Utilicé ambos códigos pero los 2 me llegan a error.

Lo último que tengo es esto.

Dim ultimafila As Long
Dim codigo As Integer
Dim cliente As Range
Private Sub cotizacion_Click()
    ultimafila = Range("C65536").End(xlUp).Row
    ultimafila = ultimafila + 1
    Cells(ultimafila, "B").Select
End Sub
Private Sub ComboBox2_Change()
    'Cargar en el combobox2
    If ComboBox2 = " " Then Exit Sub
    Set h1 = Sheets("CLIENTES")
    Set h2 = Sheets("COTIZACIONES")
    u = h2.Range("B" & Rows.Count).End(xlUp).Row + 1
    f = ComboBox2.ListIndex + 7
    c = 1
    Set b = h2.Columns("D").FindFind(ComboBox2, lookat:=xlWhole, SearchDirection:=xlPrevious)
    If Not b Is Nothing Then
        c = h2.Cells(b, Row, "F") + 1
    End If
    h2.Cells(u, "B") = ComboBox2 'cliente
    h2.Cells(u, "C") = h1.Cells(f, "D") 'empresa
    h2.Cells(u, "D") = h1.Cells(f, "E") 'cod cliente
    h2.Cells(u, "F") = c
     'fecha actual
    Cells(u, "H").Select
    ActiveCell.FormulaR1C1 = "=TODAY()" 'fecha actual
End Sub
Private Sub Userform_Activate()
    Set h1 = Sheets("CLIENTES")
    For i = 7 To h1.Range("B" & Rows.Count).End(xlUp).Row
         ComboBox2.AddItem h1.Cells(i, "B")
    Next
End Sub

Espero que puedas ayudarme, de antemano muchas gracias

El cliente se tiene que buscar en la columna "C"

Set b = h2.Columns("D")

Pero para evitar más confusiones, mejor envíame tu archivo.

Explícame en qué momento quieres enviar los datos a la hoja, supongo que los vas a enviar hasta que se termine toda la captura y presiones un botón.

Mi correo [email protected]

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

Hola, le envié un correo GRACIAS!!

Así quedaría la opción cuando seleccionas el cliente desde el combo:

Dim sel, cargando
Private Sub ComboBox2_Change()
'Registrar cotización
    sel = True
    If cargando = True Then cargando = False
    If ComboBox2 = " " Or ComboBox2 = "" Then
        MsgBox "Captura el Cliente"
        Exit Sub
    End If
    If ComboBox2.ListIndex = -1 Then Exit Sub
    Application.ScreenUpdating = False
    Set h1 = Sheets("CLIENTES")
    Set h2 = Sheets("COTIZACIONES")
    'u = h2.Range("C" & Rows.Count).End(xlUp).Row + 1
    u = 4
    Do While h2.Cells(u, "C") <> ""
        u = u + 1
    Loop
    f = ComboBox2.ListIndex + 7
    c = 1
    Set b = h2.Columns("C").Find(ComboBox2, lookat:=xlWhole, SearchDirection:=xlPrevious)
    If Not b Is Nothing Then
        c = h2.Cells(b.Row, "F") + 1
    End If
    h2.Cells(u, "C") = ComboBox2
    h2.Cells(u, "D") = h1.Cells(f, "C")
    h2.Cells(u, "E") = h1.Cells(f, "D")
    h2.Cells(u, "F") = c
    h2.Cells(u, "G") = Now
    Application.ScreenUpdating = True
End Sub
'
Private Sub ComboBox2_DropButtonClick()
'Cargar clientes
    If sel = True Then sel = False: Exit Sub
    cargando = True
    Set h1 = Sheets("CLIENTES")
    ComboBox2.Clear
    For i = 7 To h1.Range("B" & Rows.Count).End(xlUp).Row
         ComboBox2.AddItem h1.Cells(i, "B")
    Next
End Sub
Respuesta

El tema del error en línea negrita se debe a que estás declarando la variable 'cod1' como Range y luego le intentas enviar un valor numérico que es el valor máx de una columna. Solo reemplaza la línea de la declaración con:

Dim cod1 as Integer    'puede ser también Long dependiendo de los valores que pueda llegar a tomar.

El otro tema es que necesitas el máx para el cliente elegido en el Combobox2 (así lo interpreto según tu código).

Esto se resuelve utilizando la fórmula:

maxi=SUMAPRODUCTO(MAX((rgo1)*(rgo2=combobox2))) +  1

Donde 'rgo1' es el rango donde se encuentran los nros de proyectos y 'rgo2' es el rango donde se encuentran los clientes.

Lamentablemente no tengo acceso al Editor de macros por el momento por lo que solo puedo dejar las aclaraciones e idea de la instrucción que necesitas. Seguramente con esto ya el otro experto podrá terminarlo:

'numero proyecto
'falta definir los rangos
cod1 = WorksheetFunction.SumProd(Max((rgo1) * (rgo2=combobox2)))
Worksheets("COTIZACIONES").Cells(ultimafila, "E").Value = cod1+1

Sdos y no olvides valorar la respuesta.

Hola Esta es mi hoja cotizaciones, aquí separé los numeros de proyectos por color según el cliente. Por ejemplo Cesar tiene el proyecto 1001, 1002,1003,1004, si llegase a cotizar otro proyecto este llevaría por número 1005. Lo mismo con Juan perez, donde su cotización sería 1004.

Utilicé ambos códigos pero los 2 me llegan a error.

Lo último que tengo es esto.

Dim ultimafila As Long
Dim codigo As Integer
Dim cliente As Range
Private Sub cotizacion_Click()
    ultimafila = Range("C65536").End(xlUp).Row
    ultimafila = ultimafila + 1
    Cells(ultimafila, "B").Select
End Sub
Private Sub ComboBox2_Change()
    'Cargar en el combobox2
    If ComboBox2 = " " Then Exit Sub
    Set h1 = Sheets("CLIENTES")
    Set h2 = Sheets("COTIZACIONES")
    u = h2.Range("B" & Rows.Count).End(xlUp).Row + 1
    f = ComboBox2.ListIndex + 7
    c = 1
    Set b = h2.Columns("D").FindFind(ComboBox2, lookat:=xlWhole, SearchDirection:=xlPrevious)
    If Not b Is Nothing Then
        c = h2.Cells(b, Row, "F") + 1
    End If
    h2.Cells(u, "B") = ComboBox2 'cliente
    h2.Cells(u, "C") = h1.Cells(f, "D") 'empresa
    h2.Cells(u, "D") = h1.Cells(f, "E") 'cod cliente
    h2.Cells(u, "F") = c
     'fecha actual
    Cells(u, "H").Select
    ActiveCell.FormulaR1C1 = "=TODAY()" 'fecha actual
End Sub
Private Sub Userform_Activate()
    Set h1 = Sheets("CLIENTES")
    For i = 7 To h1.Range("B" & Rows.Count).End(xlUp).Row
         ComboBox2.AddItem h1.Cells(i, "B")
    Next
End Sub
   

Ojalá puedan ayudarme desde ya muchas gracias por ambos consejos.

Al inició de tu consulta marcaste una línea en negrita y comentaste:

'ESTO es lo que llevo hasta el momento, la parte con negrita es lo que me arroja error en la depuración.

Eso motivo mi respuesta inicial: que estabas declarando como 'range' una variable que luego la utilizabas para guardar el valor máximo de una columna.

Hasta aquí la resolución de esta parte de la consulta ya merece una valoración de tu parte.

Luego continuaste con otra consulta que si bien en ese momento no la pude resolver mediante código por lo menos envié aclaraciones para que se comprenda lo que estabas necesitando... Lo que refuerza la merecida valoración.

Sdos!

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas