Adaptar macro para ingreso de datos en celdas vacías

Tengo la siguiente macro que al ingresar un dato lo ubica en la última celda de la columna B que se encuentre sin datos. Necesito lo mismo pero incluyendo desde la columna A. Es decir, al ingresar datos, comience por A, y luego siga por B, posteriormente por A y luego B...

Option Explicit

Private Sub CommandButton1_Click()
If TextBox1 = "" Then Exit Sub
Hoja2.Cells(Rows.Count, "b").End(xlUp).Offset(1) = CDbl(TextBox1)
TextBox1 = ""
TextBox1.SetFocus
End Sub

1 Respuesta

Respuesta
2

Para que te busque la primer fila libre según col A, coloca esa letra en la siguiente instrucción:

Hoja2. Cells(Rows.Count, "A").End(xlUp). Offset(1) = CDbl(TextBox1)

Ahora, si tendrás 2 controles y colocarás su contenido en A y B la macro buscará la fila libre según A y será la misma para las 2 col... o las col que tengas:

Private Sub CommandButton1_Click()
If TextBox1 = "" Then Exit Sub
With Hoja2
    x = .Cells(Rows.Count, "A").End(xlUp).Offset(1)
   .Cells(x, "A") = CDbl(TextBox1)
   .Cells(x, "B") = TextBox2
End With
TextBox1 = "": TextBox2 = ""
TextBox1.SetFocus
End Sub

No se si es esto lo que buscabas, sino aclarame un poco más la situación.

Hola Elsa!.

Intento probar la macro y me tira error 1004 en esta línea

.Cells(x, "A") = CDbl(TextBox1)

La idea es utilizar el mismo TextBox1 para ambas columnas, e ir registrando datos en las filas vacías

Private Sub CommandButton1_Click()
If TextBox1 = "" Then Exit Sub
On Error resume next
With Hoja2
    x = .Cells(Rows.Count, "A").End(xlUp).Row + 1
    .Cells(x, "A") = CDbl(TextBox1)
    .Cells(x, "B") = CDbl(TextBox1)
End With
On Error Goto 0
TextBox1 = ""
TextBox1.SetFocus
End Sub

En tu macro tenías la instrucción con la función CDBL. Esto te daría error si el contenido fuese texto o estuviese vacío. Aunque esta situación ya la controlas al inicio. Por eso le agregué el On Error.

Así es cómo lo interpreté. En las 2 celdas el mismo Textbox. Probala y me comentás con un ejemplo en imagen de lo que necesitarías.

Sdos!

La idea es:

Considerando las columnas A y B. Ingreso un número en Textbox, la macro comprueba la ultima celda disponible sin datos de la fila en dichas columnas y escribe el dato. El proximo número ingresado si el anterior se escribió en A, entonces el siguiente se ubicará en B... Y así con las demás filas.

Entonces cambia la macro por esta otra:

Private Sub CommandButton1_Click()
If TextBox1 = "" Then Exit Sub
On Error Resume Next
With Hoja2
'se evalua si col B, de la ultima fila ocupada, aún está vacía
    x = .Cells(Rows.Count, "A").End(xlUp).Row
    If .Cells(x, "B") = "" Then
        'se coloca en col B
        .Cells(x, "B") = CDbl(TextBox1)
    Else
        'se coloca en fila sgte, col A
        .Cells(x + 1, "A") = CDbl(TextBox1)
    End If
End With
On Error GoTo 0
TextBox1 = "": TextBox1.SetFocus
End Sub

Sdos!

Hola!.

No logro que funcione. 

En el codigo de Hoja2 tengo lo siguiente:

Option Explicit

Private Sub CommandButton1_Click()
UserForm1.Show
End Sub

Y luego, dentro de un UserForm1, en el Textbox1 va la macro que comienza con Option Explicit. 

Luego de ello, coloqué la macro indicada, lo primero que me dice es que no está declarada la variable.

Si tu Editor requiere de la declaración de variables, notarás que cada módulo y cada Userform inicia con el texto: Option Explicit

Y en ese caso cada subrutina necesita declarar las variables que utilizará. En este caso quedaría así:

Private Sub CommandButton1_Click()
Dim x As Long     'AGREGAR ESTA LÍNEA 
If TextBox1 = "" Then Exit Sub
On Error Resume Next
With Hoja2

Sdos!

Creo que fue desde la versión 2019 o quizás 2016, que ya no viene de modo predeterminado la obligatoriedad de declarar variables.

Es decir, que si un módulo no inicia con esa instrucción, olvidate de declararlas. Pero si aparece, debes declararlas en cada subrutina, o al inicio del módulo si se tratará de varibles que se utilizarán en todas las macros de ese módulo.

También se puede modificar este aspecto del Editor desde el menú Herramientas, Opciones, quitando el tilde como se observa en la imagen:

Sdos!

Muchas gracias Elsa!.

Probé la macro en un nuevo libro, y compruebo que funciona, sólo que inicia completando desde B y te quería solicitar si podría comenzar desde A (siempre y cuando ya no exista dato).

Saludos!

Si lo que necesitas es que cada vez que se abre el formulario inicie el registro en A (no importando que en la última fila ocupada quedó vacía la celda en B), debes agregar los cambios que comento a continuación.

Dejo imagen de las posibles situaciones. También contemplo si tiene título o empieza en fila 1. Si no es así como lo interpreto entonces x favor también deja alguna imagen o muestra de lo que necesitas para dar por finalizado ya este tema.

En el formulario todas estas instrucciones deben ser colocadas, al margen de que tengas algunas otras en los mismos eventos.

Option Explicit
Dim vez As Byte
Private Sub CommandButton1_Click()
Dim x As Long
If TextBox1 = "" Then Exit Sub
On Error Resume Next
With Hoja2               'ATENCIÓN CON EL NOMBRE DE HOJA
    'se evalúa si es el primer registro de la sesión
    If vez = 0 Then
        'se busca la primer fila libre en A
        x = .Cells(Rows.Count, "A").End(xlUp).Row + 1
        'si x = 2 puede ser q tenga un título o fila 1 está vacía y puede ocuparse
        If x = 2 And .Range("A" & x - 1) = "" Then x = x - 1
        'se guarda marca en la variable
        .Cells(x, "A") = CDbl(TextBox1)
        vez = 1
    Else
        'se evalua si col B, de la ultima fila ocupada, aún está vacía
        x = . Cells(Rows.Count, "A").End(xlUp). Row
        If .Cells(x, "B") = "" Then
            'se coloca en col B
            .Cells(x, "B") = CDbl(TextBox1)
        Else
            'se coloca en fila sgte, col A
            .Cells(x + 1, "A") = CDbl(TextBox1)
        End If
    End If
End With
On Error GoTo 0
TextBox1 = "": TextBox1.SetFocus
End Sub
Private Sub UserForm_Initialize()
vez = 0    'esto indica que debe comenzar en col A
'otras posibles instrucciones que tengas en este evento
'...............
End Sub

Sdos!

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas