Usar botón de comando para bajar línea
Quiero introducir los datos en una factura desde un formulario, pero lo que no se hacer es para que al pulsar el botón de siguiente línea, me baje a la siguiente línea, para seguir escribiendo . Os pongo una captura
Estoy mirando tu imagen y código y noto que al ingresar cada dato ya lo estás moviendo a la hoja... entonces no necesitas un botón para 'bajar de línea' sino solamente para limpiar los controles.
Private Sub CommandButton1_Click() 'botón limpiar
'x Elsamatilde
'limpia controles
TextBox1 = "": TextBox2 = "": TextBox3 = ""
'pasa el foco al primer control
TextBox1.SetFocus
End Sub
'la fila la indica la primer col (en este caso B) que se asume siempre con datos.
Private Sub TextBox1_Change()
'primer fila libre según col B
filx = Range("B65536").end(xlup).Row +1
Range("B" & filx)= TextBox1
End Sub
Private Sub TextBox2_Change()
'primer fila libre según col B
filx = Range("B65536").end(xlup).Row +1
Range("D" & filx)= TextBox2
End Sub
Private Sub TextBox3_Change()
'primer fila libre según col B
filx = Range("B65536").end(xlup).Row +1
Range("E" & filx)= TextBox3
End Sub
El hecho de evaluar siempre la col B es por si algún control queda vacío (no realizas ningún control de contenido) y en ese caso obligo a que todos los datos queden en la misma fila.
PD) Desde la sección Macros de mi sitio podes encontrar otras instrucciones de ejemplo para obtener las primeras filas libres.
Sdos y no olvides valorar esta respuesta.
Elsa
Hola Elsa, gracias por responderme, pero no te he entendido he puesto en el botón de línea siguiente el código que me has puesto, y si me limpia el formulario, pero también me borra lo añadido en la fila B.
El resto del código que me has puesto no se muy bien si debo de borrar lo que tengo yo en los text box y pegar tus códigos pero lo he hecho solamente en el text box 2 y me da error . A ver si me lo puedes explicar donde poner cada cosa . Gracias Elsa
Cada Private Sub... End Sub que te dejé marcado en negrita debes colocar en tu formulario quitando los tuyos.
Si te marca algún error debes indicarme cual y en qué línea, quizás solo falte que declares la variable:
Dim filx as Long en cada subrutina que la utilice:
Private Sub TextBox1_Change()
'primer fila libre según col B
Dim filx as Long
filx = Range("B65536").end(xlup).Row +1 '(*)
Range("B" & filx)= TextBox1
End Sub
No se si tendrás más código o más controles, en ese caso sería conveniente que me envíes en un libro vacío el Userform para ajustarlo. Mis correos aparecen en la portada de mi sitio.
(*) Hay más modos de buscar la fila libre, esta es la forma más clara de comprender: Se busca la primer fila ocupada desde el final de la hoja y se suma 1 para bajar a la vacía.
Sdos!
Hola Elsa he sustituido todo el código de mis text box por el tuyo y no funciona bien, te pongo un enlace a mega donde he subido una copia del archivo.
https://mega.co.nz/#!AcV2WZYJ!s44fHrqewDR9sdm2WZaP2Uqs6aWTW_kDeso8oSKJ1OE
A ver que tengo por ahí liado, Gracias una vez más.
Definitivamente tendrás más de un problema pasando los datos directamente. Una factura debe contener datos precisos, así que el botón te debe servir para verificar que todos los datos estén y que además sean correctos.
Quitá todo el código y coloca estos. Estoy evaluando que los datos sean numéricos, que no falte ninguno y recién entonces se guarda en la col B.
Private Sub TextBox1_Exit(ByVal Cancel As MSForms.ReturnBoolean)
'se controla que el dato sea numérico
If TextBox1 = "" Then Exit Sub
If Not IsNumeric(TextBox1) Then Cancel = True
End Sub
Private Sub TextBox3_Exit(ByVal Cancel As MSForms.ReturnBoolean)
'se controla que el dato sea numérico
If TextBox3 = "" Then Exit Sub
If Not IsNumeric(TextBox3) Then Cancel = True
End Sub
Private Sub CommandButton1_Click()
'x Elsamatilde
'primero se controlan contenidos
If TextBox1 = "" Or TextBox2 = "" Or TextBox3 = "" Then
MsgBox "Faltan datos"
TextBox1.SetFocus
Exit Sub
End If
'primer fila libre según col B
filx = Range("B65536").End(xlUp).Row + 1
'se guardan los datos
Range("B" & filx) = Val(TextBox1) 'por ser valor numérico
Range("D" & filx) = TextBox2
Range("E" & filx) = CDbl(TextBox3) 'por ser valor decimal
'limpia controles
TextBox1 = "": TextBox2 = "": TextBox3 = ""
'pasa el foco al primer control
TextBox1.SetFocus
End Sub
Al texto del botón le podes poner algo como GUARDAR - SIGUIENTE LÍNEA, modificando la propiedad WordWrap a True.
Si necesitas tu libro solicitamelo a mi correo.
Sdos
Elsa
Hola Elsa, funciona casi perfecto, solo en la línea primera en concepto lo deja en blanco, me lo puedes revisar .Te pongo una captura, cuanto puedas y tengas tiempo bastante me estas ayudando ya.
Gracias
No, no hay ningún problema con el código, te dejo la imagen de mis pruebas. Selecciona esa celda(D14) y observa en la barra de fórmula el texto que aparece, quizás solo tengas la fuente de color blanca que no te permite verlo.
Si tienes más macros también debes revisarlas por si alguna interfiere en este proceso.
Sdos!
Perdona Elsa pero como no me pegaste el código del text box, pues no funcionaba, he copiado el código del text box 3 0 del 1 es el mismo, pero me da error en el text box 2 porque me pide un dato numérico y hay voy a introducir texto y números . por ejemplo, caja lapiceros 24 UD
Un saludo
- Compartir respuesta
1 respuesta más de otro experto
Hola he colocado en el botón de comando y no funciona no, hace lo que yo quiero que es que borre los datos del formulario y vuelva a poder poner otro articulo en la línea de abajo :
Esto es lo que tengo puesto en el formulario:
Private Sub CommandButton1_Click()
TextBox2.SetFocus
End Sub
Private Sub Label1_Click()
End Sub
Private Sub TextBox1_Change()
Range("B14").Select
ActiveCell.FormulaR1C1 = TextBox1
End Sub
Private Sub TextBox2_Change()
Range("D14").Select
ActiveCell.FormulaR1C1 = TextBox2
End Sub
Private Sub TextBox3_Change()
Range("E14").Select
ActiveCell.FormulaR1C1 = TextBox3
End Sub
Si termino de escribir en E14 que es la primera línea, quiero que al pulsar el botón siguiente línea, se borren los datos de el formulario para introducir otros y se ponga para volver a escribir en la columna B pero en la fila siguiente.
No se si me entendéis.
Un saludo
- Compartir respuesta