Formulario escribe en la primera fila y me borra el primer dato

Hice un formulario que captura datos para después utilizarlos en una gráfica.

El problema es que el formulario ingresa los datos en la parte superior de la tabla, así que puse un código para que al terminar la captura se ordenen los datos en forma ascendente.

El problema es que cuando regreso a capturar me borra el primer registro pues al ordendarlos los lleva hasta el encabezado.

Me puede apoyar alguien para que el formulario ingrese los datos en el ultimo registro en vez del primero.

O la otra opción seria llevar directamente los datos a la gráfica, que tiene los datos en forma horizontal.

Mucas gracias por el apoyo que puedan brindarme

No se visual basic, en realidad el formulario es un código bastante sencillo pero me atore con ese problema.

Respuesta
2

Colocá aquí el código que tenés para el botón o evento que ingresa los datos.

Para que te coloque al final, a continuación de la última celda ocupada se necesita establecer justamente cuál es la última ocupada.

Con esto, miro en col A (tiene que ser en la col que tenga datos hasta el final)

finx = Range("A" & Rows.count).end(xlup).row + 1

Y luego esa variable finx es la que te indicará dónde colocar los nuevos datos.

Pero hay que quitar la que te está enviando al inicio... si no la encontrás dejá copiado aquí el código y así lo puedo ajustar.

Elsa Muchas gracias, no enontre donde adjuntar el archivo pero pego aqui el codigo que me dices. y donde puedo ver los ejemplos que tu haz creado ?

Private Sub TextBox1_Change()
Range(" B4").Select
ActiveCell.FormulaR1C1 = TextBox1
Range(" G4").Select
ActiveCell.FormulaR1C1 = TextBox1

End Sub
Private Sub TextBox2_Change()
Range(" C4").Select
ActiveCell.FormulaR1C1 = TextBox2
Range(" H4").Select
ActiveCell.FormulaR1C1 = TextBox2

End Sub

Private Sub TextBox3_Change()
Range(" D4").Select
ActiveCell.FormulaR1C1 = TextBox3
Range(" I4").Select
ActiveCell.FormulaR1C1 = TextBox3

End Sub
Private Sub TextBox4_Change()
Range(" E4").Select
ActiveCell.FormulaR1C1 = TextBox4

End Sub
Private Sub TextBox5_Change()
Range(" J4").Select
ActiveCell.FormulaR1C1 = TextBox5

End Sub

*******************************************

*******************************************

Aqui adjunto el codigo para el boton GUARDAR:

Private Sub CommandButton1_Click()
Selection.EntireRow.Insert
TextBox1 = Empaty
TextBox2 = Empaty
TextBox3 = Empaty
TextBox4 = Empaty
TextBox5 = Empaty
MsgBox "Alta exitosa.", vbInformation, "EXCELeINFO"
Unload Me
' ordenar Macro
'
Range("B2:E50").Select
ActiveWindow.SmallScroll Down:=-45
ActiveWorkbook.Worksheets("Datag").Sort.SortFields.Clear
ActiveWorkbook.Worksheets("Datag").Sort.SortFields.Add Key:=Range("B3:B50"), _
SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:= _
xlSortTextAsNumbers
With ActiveWorkbook.Worksheets("Datag").Sort
.SetRange Range("B2:E50")
.Header = xlYes
.MatchCase = False
.Orientation = xlTopToBottom
.SortMethod = xlPinYin
.Apply
End With
Range("B1:E1").Select
End Sub

Aquí en el foro no podés adjuntar archivos, pero podrías enviarmelos a alguno de los correos que se observan en mi sitio que dejo al pie (aplicaexcel). Allí también verás otras macros, ejemplos para descargar, manuales y el link a mis videos.

Bien, pasando a tu código.

1- En el evento Initialize, colocá la instrucción que busca cuál es la primer fila libre. Además debes declararla al inicio del Userform para que sea de uso de todas las subrutinas.

Dim finx As Long     'es la variable que guardará la fila a ocupar
Private Sub UserForm_Initialize()
finx = ActiveSheet.Range("B" & Rows.Count).End(xlUp).Row + 1
End Sub

2- Cada textbox cuando envía la información a la hoja lo hará indicando la columna y la fila según la variable. Por ejemplo:

Private Sub TextBox1_Change()
Range("B" & finx) = TextBox1
Range("G" & finx) = TextBox1
End Sub
'No hace falta seleccionar la celda ni mucho menos colocar FormulaR1C1

3- En el botón de guardar quitale la primer instrucción:

Private Sub CommandButton1_Click()
      'Selection. EntireRow.Insert   'esta no va más

Y como se cierra el formulario no hace falta volver a calcular cuál es la fila a ocupar ya que solo se ejecuta para 1 registro.

Armalo y si te ofrece alguna dificultad enviame el libro.

Si se te presentan nuevas dudas o problemas deja nuevas consultas en el tablón con su título correspondiente.

Elsa ya funciono, escribe en la ultima fila

pero tengo el problema que no las graba sin embargo el codigo reconoce que ya escribio ahi.

queme faltara ? y no encontre tu email, por eso escribi aqui otra vez. lo que me habias requierido eliminar solo lo puse como comentario, ya despues lo elimino. y nuevamente muchas gracias

pongo codigo:

'< Boton Guardar >
Private Sub CommandButton1_Click()
'Selection.EntireRow.Insert
TextBox1 = Empaty
TextBox2 = Empaty
TextBox3 = Empaty
TextBox4 = Empaty
TextBox5 = Empaty
MsgBox "Alta exitosa.", vbInformation, "EXCELeINFO"
Unload Me
' ordenar Macro
'
Range("B2:E50").Select
ActiveWindow.SmallScroll Down:=-45
ActiveWorkbook.Worksheets("Datag").Sort.SortFields.Clear
ActiveWorkbook.Worksheets("Datag").Sort.SortFields.Add Key:=Range("B3:B50"), _
SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:= _
xlSortTextAsNumbers
With ActiveWorkbook.Worksheets("Datag").Sort
.SetRange Range("B2:E50")
.Header = xlYes
.MatchCase = False
.Orientation = xlTopToBottom
.SortMethod = xlPinYin
.Apply
End With
Range("B1:E1").Select
End Sub

Private Sub UserForm_Initialize()
finx = ActiveSheet.Range("B" & Rows.Count).End(xlUp).Row + 1
End Sub
Private Sub CommandButton2_Click()
TextBox1 = Empaty
TextBox2 = Empaty
TextBox3 = Empaty
TextBox4 = Empaty
TextBox5 = Empaty
Unload Me

End Sub


Private Sub TextBox1_Change()
Range(" B" & finx) = TextBox1
'ActiveCell.FormulaR1C1 = TextBox1
Range(" G" & finx) = TextBox1
'ActiveCell.FormulaR1C1 = TextBox1
End Sub

Private Sub TextBox2_Change()
Range(" C" & finx) = TextBox2
'ActiveCell.FormulaR1C1 = TextBox2
Range(" H" & finx) = TextBox2
'ActiveCell.FormulaR1C1 = TextBox2

End Sub

Private Sub TextBox3_Change()
Range(" D" & finx) = TextBox3
'ActiveCell.FormulaR1C1 = TextBox3
Range(" I" & finx) = TextBox3
'ActiveCell.FormulaR1C1 = TextBox3

End Sub
Private Sub TextBox4_Change()
Range(" E" & finx) = TextBox4
'ActiveCell.FormulaR1C1 = TextBox4

End Sub
Private Sub TextBox5_Change()
Range(" J" & finx) = TextBox5
'ActiveCell.FormulaR1C1 = TextBox5

End Sub

Dejo imagen de la portada de mi sitio y marcados mis correos (y entra al sitio que no muerde... no hay publicidad ni nada que moleste... solo material de estudio ! )

No olvides recordarme tu alias y que el libro contenga la macro con mis instrucciones.

Sdos!

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas