Dos Formularios VBA en una misma fila en excel

Expertos, buenas tardes.

Tengo una duda tengo una macro con dos formularios individualmente funcionan es decir me cargan los datos en las celdas y filas que quiero pero no en una misma fila, useform1 cuando presiono CommandButton1 "agregar" me agrega los datos del formulario desde el rango "A2:G2" y el commandButton3 que se encuentra el formulario 1, sale el formulario useform2 ambos se complementan, es decir los datos que cargo en el formulario 2 tienen cargar en excel desde el rango "H2:Z2", una vez cargado ambos formularios cuando utilizo de nuevo los formulario me tendria que cargar los datos en "A3:Z3".

Los datos del formulario 1 en boton insertar

Private Sub CommandButton1_Click()

Sheets("sheet1").Activate
ActiveSheet.Cells(2, 1).Select
Selection.EntireRow.Insert
ActiveSheet.Cells(2, 1) = ComboBox1
ActiveSheet.Cells(2, 2) = ComboBox2
ActiveSheet.Cells(2, 3) = ComboBox3

ComboBox1 = Empty
ComboBox2 = Empty
ComboBox3 = Empty
TextBox1.SetFocus

y en el formulario 2

Private Sub CommandButton1_Click()

Sheets("sheet1").Activate
ActiveSheet.Cells(2, 4).Select
Selection.EntireRow.Insert
ActiveSheet.Cells(2, 4) = TextBox3
ActiveSheet.Cells(2, 5) = ComboBox6
ActiveSheet.Cells(2, 6) = TextBox4

En sistesis quiero que los datos que cargo en ambos formularios, se carguen en una misma fila.

2 respuestas

Respuesta
1

Pero antes de pasar al userform2 tienes que validar que los datos del userform1 ya fueron agregados. Otra opción es, antes de pasar al userform2 validar que estén correctos los datos del userform1, después al presionar el botón insertar del userform2, se deberán guardar los datos del usreform1 y del userform2 en la misma fila.

Veo que en tu macro estás insertando una fila, ¿quieres qué se inserte la fila o que se guarden en la siguiente fila disponible?, es decir, en la fila 4, luego en la 5, 6, etc.

Dime cómo quieres hacerlo.

Dante, buen día, la opción más correcta a lo que quiero que realice la macro es "antes de pasar al userform2 validar que estén correctos los datos del userform1, después al presionar el botón insertar del userform2, se deberán guardar los datos del usreform1 y del userform2 en la misma fila."

Después cuando quiera ingresar de nuevo a cargar el formulario sea en la siguiente disponible, cabe agregar que tiene otro módulo en que cual me agrega en forma ascendente, los datos de las columna "A y D"

Desde ya muchas gracias!

Te anexo el código completo para insertar el registro en la siguiente fila disponible, tal como lo necesitas.

Código para el UserForm1

Private Sub CommandButton1_Click()
'El botón1 del userform1 ya no es necesario
End Sub
Private Sub CommandButton3_Click()
'Por.Dante Amor
'Botón 3 del userform1 para Abrir el formulario 2
    '
    'Valida los datos
    If ComboBox1 = "" Then
        MsgBox "El combo1 está vacío, favor de capturar un dato correcto.", vbExclamation, "CAPTURA"
        Exit Sub
    End If
    If ComboBox2 = "" Then
        MsgBox "El combo2 está vacío, favor de capturar un dato correcto.", vbExclamation, "CAPTURA"
        Exit Sub
    End If
    If ComboBox3 = "" Then
        MsgBox "El combo3 está vacío, favor de capturar un dato correcto.", vbExclamation, "CAPTURA"
        Exit Sub
    End If
    '
    'Abre userform2
    UserForm2.Show
    '
    Unload Me
End Sub

Código para el UserForm2

Private Sub CommandButton1_Click()
'Botón para insertar
    Set h1 = Sheets("sheet1")
    '
    'Validación de datos
    If TextBox3 = "" Then
        MsgBox "Capturar información en el textbox3", vbExclamation, "CAPTURA"
        Exit Sub
    End If
    'Fila siguiente
    u = h1.Range("A" & Rows.Count).End(xlUp).Row + 1
    '
    'Se insertan los datos del form1
    h1.Cells(u, 1) = UserForm1.ComboBox1
    h1.Cells(u, 2) = UserForm1.ComboBox2
    h1.Cells(u, 3) = UserForm1.ComboBox3
    'Se insertan los datos del form2
    h1.Cells(u, 4) = TextBox3
    h1.Cells(u, 5) = ComboBox6
    h1.Cells(u, 6) = TextBox4
    'Limpiar datos
    UserForm1.ComboBox1 = Empty
    UserForm1.ComboBox2 = Empty
    UserForm1.ComboBox3 = Empty
    TextBox3 = Empty
    ComboBox6 = Empty
    TextBox4 = Empty
    '
    MsgBox "Datos insertados", vbInformation, "CAPTURA"
    Unload Me
End Sub


S a l u d o s . D a n t e   A m o r

Recuerda valorar la respuesta.

Sabe cargue los datos como usted los hizo y me da este error un error 

Entiendo que h1 = sheets1 (sheet1) y u hace referencia a la fila y el num a la culumna pero cuando le hago un click al botón agregar me da error 424 y cuando lo depuero me selecciona esa fila.

Desde ya muchas gracias!!!

En tu macro tienes esto:

Sheets("sheet1"). Activate

Entonces asumo que en la hoja "sheet1" vas a insertar los datos, ¿correcto?

¿Qué texto aparece en el mensaje de error?

¿Tienes un control en el userform1 que se llama textbox1?

En tu macro original no había un control textbox1, entonces puedo ver que modificaste la macro, pero no sé exactamente qué modificaste y si lo estás haciendo correctamente.

Si la macro que te entregué, sin los cambios que le estás haciendo, te funciona correctamente, entonces valora esta respuesta.


En tu macro el combobox1 se insertaba en la columna "A", ahora quieres insertar el textbox1, pero antes debes validar que el textbox1 siempre tenga datos, de lo contrario no va a funcionar correctamente la macro.

Si quieres que revise todo lo que necesitas, crea una nueva pregunta y me dices qué controles (textbox, combobox, etc), tienes en el userform1 y en cuáles columnas quieres que se inserten.

También me tienes que decir cuáles controles tienes en el userform2 y en cuáles columnas quieres que se inserten.

Respuesta
1

Si agregaras los datos al final sería fácil de determinar el fin de rango... pero como estás insertando una fila para colocar los datos al inicio, no debes insertar nuevamente la fila desde el 2do formulario.

Esto claro está siempre y cuando el orden de ejecución es siempre el mismo: primero el 1ro y luego el 2do (valga la redundancia ;)

Entonces aquí retira la línea que marco de negrita:

Private Sub CommandButton1_Click()

Sheets("sheet1").Activate
ActiveSheet.Cells(2, 4).Select
Selection.EntireRow.Insert
ActiveSheet.Cells(2, 4) = TextBox3
ActiveSheet.Cells(2, 5) = ComboBox6

Sdos y comentame ...

Elsa, buen día, ya había probado con borrar lo que resaltas en negrita, pero no m carga los datos en la fila que quiero (que es la fila en donde están los datos de la useform1), sino que reemplaza los datos y quedan siempre en la fila "H2:Z2"

Muchas gracias por todo!

Las imagenes reflejan tu solicitud:

-Un primer form que vuelca datos en las col A:C (en mi caso utilicé Textbox) insertando previamente una fila.

-se llama al 2do UF que vuelca datos en las col D:F, ya sin insertar filas.

Las columnas de destino son las que tenían tus códigos... si necesitas que sea a partir de H debes cambiarlas en las líneas del 2do UF:

ActiveSheet.Cells(2, 4) = TextBox3    y así con todas.

Estos son los códigos utilizados en el primer UF (utilicé otro nombre de hoja):

Private Sub CommandButton1_Click()
Sheets("Hoja1").Activate
ActiveSheet.Cells(2, 1).Select
Selection.EntireRow.Insert
ActiveSheet.Cells(2, 1) = TextBox1 'ajustar nombres de controles
ActiveSheet.Cells(2, 2) = TextBox2
ActiveSheet.Cells(2, 3) = TextBox3
'ComboBox1 = Empty
'ComboBox2 = Empty
'ComboBox3 = Empty
TextBox1.SetFocus
End Sub
Private Sub CommandButton2_Click()
'llama al 2do form
UserForm2.Show
End Sub

Y este en el segundo:

Private Sub CommandButton1_Click()
Sheets("Hoja1").Activate
'ActiveSheet.Cells(2, 4).Select
'Selection.EntireRow.Insert
ActiveSheet.Cells(2, 4) = TextBox1  'col D
ActiveSheet.Cells(2, 5) = TextBox2
ActiveSheet.Cells(2, 6) = TextBox3
End Sub

Sdos y no olvides valorar la respuesta si el tema quedó comprendido.

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas