Xwork's Blog

The lord is waiting to take your hand.

Vamos a programar #108 - Excel y algunas macros.

No hay comentarios.

Hola de nuevo a todos. El día de hoy vamos a continuar con mas programación.


 

En tiempos recientes he tenido que trabajar con hojas de cálculo, mas concretamente con Excel de Microsoft, las tareas son sencillas, simplemente llevar la cuenta de algunos elementos. Para llevar a cabo la cuenta, uno por uno se pasan por un escáner de códigos de barras y la tarea es simple: si no hay ningún elemento se anota el código que se leyó y se anota un uno en la celda de la siguiente columna.

Para hacerlo decidí agregar un formulario con una caja de texto, un botón y una marca de comprobación algo cómo la imagen siguiente:

Para que todo esto me funcione, necesito que el programa, simplemente lea el contenido de la caja, compruebe la longitud; en este caso que el contenido tenga una longitud de al menos ocho caracteres (que es lo que ocupo), pero cómo no todos los elementos necesariamente son iguales, simplemente usamos la casilla para saltarnos esa condición si es necesario.

Ya llegados a este punto, vamos a suponer que si estás leyendo esto, ya estás familiarizado con la macros y cómo usarlas. Para poder usar el código, debemos de agregar los siguientes controles:

  •  Texbox
    • (Name) "TextBox1"
  •  CommandButton
    • (Name) "cmdbtnAdd"
  •  CheckBox
    •  chkCheckSize
  •  Label
    • lblInfo.

Ahora con los controles, veamos el código que hace funcionar las cosas:

 

Option Explicit

Private Sub Count()

Application.ScreenUpdating = False

Dim TextoABuscar As String
Dim Rango As Range

TextoABuscar = TextBox1.Text

If TextoABuscar = vbNullString Then

lblInfo.Caption = "Info: Cadena vacia"
Exit Sub

End If

If Len(TextoABuscar) < 9 And chkCheckSize.Value = True Then

lblInfo.Caption = "Info: Cadena muy corta"
Exit Sub

End If



Dim lastrow As Long

lastrow = Cells(Rows.Count, "A").End(xlUp).Row
Set Rango = Range("A2:A" & lastrow).Find(TextoABuscar, LookIn:=xlValues, lookat:=xlWhole)

If Rango Is Nothing Then

Range("A" & lastrow + 1).Value = TextoABuscar
Range("A" & lastrow + 1).Offset(0, 1).Value = 1
lblInfo.Caption = "Info: Agregado en A" & lastrow + 1


Else

Rango.Offset(0, 1).Value = Rango.Offset(0, 1).Value + 1
lblInfo.Caption = "Info: Agregado"

End If

Application.ScreenUpdating = True
TextBox1.SetFocus

End Sub

Private Sub cmdbtnAdd_Click()

Count
ActiveWorkbook.Save

End Sub

Private Sub TextBox1_KeyDown(ByVal KeyCode As MSForms.ReturnInteger, ByVal Shift As Integer)

If KeyCode = vbKeyReturn Then
Count
TextBox1.Text = ""
End If

End Sub




Primero creamos la función  "Count()" en este procedimiento, primero revisamos si la cadena de texto está vacía, si es el caso, cambiamos el texto de "lblInfo" indicando que la cadena de texto está vacía y salimos del procedimiento, si no es el caso comprobamos la casilla de verificación este o no marcada, al mismo tiempo revisamos la longitud de la cadena de texto, si la comprobación de la casilla es verdadera y la longitud es menor que nueve, se cambia el texto de la etiqueta y se sale de la función. Luego declaramos una variable llamada "lastrow", luego le asignamos el valor de la ultima celda de las filas con el tango de la columna en la cual vamos a buscar, PARA MI CASO, es la columna A, si deseas hacer búsqueda en otra columna debes de cambiarla. Una vez hecho, procedemos a buscar el texto (que está almacenado en la variable TextoABuscar), para eso creamos la variable "Rango". Al ejecutar la función, vamos a comprobar si tiene algún dato, si no es el caso, asumimos que nuestro valor no se encontró por lo que procedemos a asignar el valor de nuestra cadena de texto a la última celda de la columna A, para agregar el uno (porque se supone que es la primera aparición del elemento), nos desplazaremos una celda desde la ultima que poseía un valor (lastrow + 1) y a la celda de la columna A le asignaremos la cadena de texto que buscamos y en la columna siguiente le asignaremos el valor de 1 (se supone que es la primera aparición de este elemento), para eso usaremos "Offset(0,1)" para desplazarnos cero filas y una columna, luego en la etiqueta de información mostraremos que se agrego el valor en cierta celda. Si se encuentra el valor, simplemente aumentaremos la cantidad por lo que simplemente nos desplazaremos una columna a partir de donde encontramos el valor y le sumamos uno al valor que esta posea.

Para que sea mas rápido el proceso, le devolvemos el foco al TextBox1 para que continuemos agregando valores.

En el evento "Click()" del botón, mandaremos a llamar el procedimiento "Count", pero además, guardaremos el documento.

En el evento "KeyDown" de TextBox1 comprobaremos si se presionó la tecla enter, en el escaner que uso, cuando termina de leer el código de barras, también envía una pulsación de la tecla enter, por eso comprobamos que si es igual a vbKeyReturn llamaremos a la función "count" y limpiaremos el texto de TextBox1

Con lo anterior, tendremos algo como lo que sigue. 


Dependiendo de cuantos controles uses, hay que establecer la propiedad "TabStop" de todos ellos salvo de la caja de texto principal, eso para que no pierda el foco y cuando termines de introducir el texto, de inmediato puedas agregar otro.

Y bien, por ahora es todo recuerda que si descargas un documento con macros revisa bien su fuente antes de ejecutarlo. Para probar este ejemplo, te recomiendo copiar y pegar el código.

Los leo luego. 

 

 

No hay comentarios. :

Publicar un comentario