VBA Excel - Problema con un código que al darle click registra la información de mi formulario en una tabla de forma desordenada

Estoy haciendo un formulario que al darle click en el CommandButton1 llena lista en excel con los datos en el siguiente espacio vacío debajo del último registro. La hoja a registrar se llama "MatrizMod" y el encabezado de los títulos de los campos empieza en A4, y de A5 para abajo se almacenan los registros en distintos campos de la fila.

He tanteado el siguiente código, lo malo es que al darle click al CommandButton1 lo registra en un espacio y no en la siguiente fila vacía del último registro. ¿Qué estoy haciendo mal?

Private Sub CommandButton1_Click()

Dim emptyRow As Long

Sheets(1).Activate    

emptyRow = WorksheetFunction.CountA(Range("A4", Range("H1048576").End(xlUp))) + 1

Cells(emptyRow, 1).Value = TextBox1.Value
Cells(emptyRow, 2).Value = TextBox6.Value
Cells(emptyRow, 3).Value = TextBox2.Value
Cells(emptyRow, 4).Value = TextBox3.Value
Cells(emptyRow, 6).Value = TextBox7.Value

If OptionButton1.Value = True Then
Cells(emptyRow, 9).Value = OptionButton1.Caption
Else
Cells(emptyRow, 6).Value = "Estable"
TextBox1.Value = ""
TextBox2.Value = ""
TextBox3.Value = ""
TextBox4.Value = ""
TextBox5.Value = ""
TextBox6.Value = ""
TextBox7.Value = ""
ComboBox2.Value = ""
End If

End Sub

2 Respuestas

Respuesta
4

Para encontrar la siguiente fila vacía después de la última celda con datos, te recomiendo utilizar la siguiente instrucción:

emptyRow = Range("A" & Rows.Count).End(xlUp).Row + 1

Ya que la instrucción de contar, si existen celdas vacías, entonces el número de datos no corresponderá con el número de filas.

También te recomiendo que valides el campo de la columna "A" verificando que siempre tenga dato.

La macro quedarías así:

Private Sub CommandButton1_Click()
    '
    Dim emptyRow As Long
    If TextBox1.Value = "" Then
        MsgBox "Debes caprutar un dato en el textbox1"
        TextBox1.SetFocus
        Exit Sub
    End If
    '
    Sheets(1).Activate
    emptyRow = Range("A" & Rows.Count).End(xlUp).Row + 1
    '
    Cells(emptyRow, 1).Value = TextBox1.Value
    Cells(emptyRow, 2).Value = TextBox6.Value
    Cells(emptyRow, 3).Value = TextBox2.Value
    Cells(emptyRow, 4).Value = TextBox3.Value
    Cells(emptyRow, 6).Value = TextBox7.Value
    '
    If OptionButton1.Value = True Then
        Cells(emptyRow, 9).Value = OptionButton1.Caption
    Else
        Cells(emptyRow, 6).Value = "Estable"
        TextBox1.Value = ""
        TextBox2.Value = ""
        TextBox3.Value = ""
        TextBox4.Value = ""
        TextBox5.Value = ""
        TextBox6.Value = ""
        TextBox7.Value = ""
        ComboBox2.Value = ""
    End If
End Sub

Nota: Revisa tu código ya que estás escribiendo en la columna 6 el contenido del textbox7, pero más adelante lo puedes sobreescribir con la palabra "Estable".


'.[Sal u dos. Dante Amor. No olvides valorar la respuesta. 
'.[Avísame cualquier duda

¡Gracias! 
Muchas gracias, me ha ayudado mucho su solución. Mis mejores deseos :)

Una últlima consulta, en el código

Sheets(1).Activate

Quiero ponerle así, que es el nombre de la hoja.

Sheets("MatrizMod").Activate

Pero no me reconoce, no graba en la hoja ni en ninguna otra.

¿cómo puedo seleccionar la hoja del nombre que yo desee especificar así cuando agreguen una nueva hoja no tomen en cuenta la primera según la fórmula sino la del nombre específico?

Sheets("MatrizMod").select
Respuesta
3

Prueba con esta macro

Private Sub CommandButton1_Click()
Set datos = Range("a4").CurrentRegion
With datos
    r = .Rows.Count
    Set campos = .Rows(r + 1).Resize(1, 9)
    With campos
        .Cells(1, 1).Value = TextBox1.Value
        .Cells(1, 2).Value = TextBox6.Value
        .Cells(1, 3).Value = TextBox2.Value
        .Cells(1, 4).Value = TextBox3.Value
        .Cells(1, 6).Value = TextBox7.Value
        If OptionButton1 Then
        .Cells(1, 9).Value = OptionButton1.Caption
        Else
        .Cells(1, 6).Value = "Estable"
        For i = 1 To 7
            UserForm1.Controls("textbox" & i) = Empty
        Next i
        ComboBox1.Value = Empty
        End If
    End With
End With
End Sub

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas