Optimizar espacio en Impresora 3D con Macros

por | Ago 6, 2020 | Excel, Macros, Visual Basic | 0 Comentarios

Imaginemos que trabajamos en una empresa de impresoras 3D y cada una tendrá unas dimensiones distintas, la idea es realizar una simulación de las mismas dibujando el área de una determinada impresora 3D, obteniendo los parámetros del largo y del ancho por parte del usuario.

Posteriormente vamos a ir dibujando el número de piezas que queremos introducir en ella pero simplemente con la condición de que si la suma de los anchos de las piezas que se van introduciendo superan el área del ancho total, no introducirá ninguna pieza más.

Esto podemos complicarlo todo lo que queramos y seguir imponiendo criterios para ir introduciendo las piezas, como aprovechar el espacio del área de la impresora 3D al máximo.

1. Aspecto inicial del documento

El aspecto que tenemos en el documento inicial será el siguiente:

Podemos comprobar que tenemos dos iconos a los cuales asignaremos las macros que vamos a desarrollar a continuación, una de ellas será para dibujar el área de la impresora y las piezas y la otra será para reiniciar el proceso.

En el área que vemos que tenemos pintado con lineas más gruesas irán cada una de las piezas con sus características, de manera que se reflejen sus parámetros también en el documento.

2. Declaración de variables

En primer lugar procedemos a declarar las variables que van a ser usadas y que se irá viendo según avance el ejercicio para que será usada cada una:

Dim Ancho As Single
Dim Largo As Single
Dim Anchoarea As Single
Dim Largoarea As Single
Dim Preg1 As String
Dim Preg2 As String
Dim Preg3 As String
Dim Preg4 As String
Dim Preg5 As String
Dim Preg6 As String
Dim Auxancho As Single
Dim piezasfab As Integer
Dim nombre As String
Dim Auxcomp As Single

3. Inicialición de variables

Después se definen las variables correspondientes a las preguntas que se le realizará al usuario.

Preg1 = "Introduce el Largo del área"
Preg2 = "introduce el ancho del área"
Preg3 = "¿Cuantas piezas desea fabricar?"
Preg4 = "Introduce el largo de la pieza"
Preg5 = "Introduce el ancho de la pieza"
Preg6 = "Nombre de la pieza"

También se inicializará la variable auxiliar Auxancho que nos irá almacenando el sumatorio del ancho de las piezas introducidas para saber si superamos el ancho del área.

Auxancho = 0

4. Preguntas iniciales al usuario

Ahora nos preguntará por el número de piezas que vamos a querer introducir, así como por el ancho y el largo del área de fabricación de la impresora.

piezasfab = InputBox(Preg3)
Largoarea = InputBox(Preg1)
Anchoarea = InputBox(Preg2)

Entramos en la parte del código que dibujará el área en la hoja de cálculo. Simularemos que cada unidad del área es una celda, por tanto implementaremos un bucle que vaya recorriendo tantas celdas como ancho del área, definido por la variable Anchoarea, y como largo del área, definido por la variable Largoarea, hayamos establecido.


Seleccionaremos la celda que corresponda a la iteración del bucle y usaremos la función Selection.Borders(xlEdgeLeft) para dibujar una línea por el lado izquierdo de la celda, también escribiremos parámetros relacionados con el formato de la línea a dibujar con las funciones LineStyle, ColorIndex, TintAndShade y Weight.

5. Dibujar el área de la impresora

Se mostrará el código usado para dibujar el borde lateral izquierdo del área.

For i = 1 To Anchoarea
Cells(i + 5, 2).Select
  With Selection.Borders(xlEdgeLeft)
   .LineStyle = xlContinuous
   .ColorIndex = xlAutomatic
   .TintAndShade = 0
   .Weight = xlThick
 End With
Next i

El código para el borde lateral derecho será similar, solo cambiarán las celdas que en las que se dibujará distando una distancia igual valor del largo introducido en la variable Largoarea.

For i = 1 To Anchoarea
Cells(i + 5, 2 + Largoarea).Select 'Se observa que las columnas están desplazadas justo el valor del Largo
 With Selection.Borders(xlEdgeLeft)
  .LineStyle = xlContinuous
  .ColorIndex = xlAutomatic
  .TintAndShade = 0
  .Weight = xlThick
 End With
Next i

Ahora se dibujará el borde superior. Se diferenciará de los otros bucles que dibujaban los otros lados del área en las celdas en las que se dibujará, y en la función Selection.Borders(xlEdgeTop), en la cual se dibujará en la parte de arriba de la celda, en vez de en la parte izquierda.

For i = 1 To Largoarea
Cells(6, i + 1).Select
 With Selection.Borders(xlEdgeTop)
  .LineStyle = xlContinuous
  .ColorIndex = xlAutomatic
  .TintAndShade = 0
  .Weight = xlThick
 End With
Next i

Igual pasará con el borde inferior, será similar al borde superior pero se dibujará distando una distancia igual valor del ancho introducido en la variable Anchoarea.

For i = 1 To Largoarea
Cells(6 + Anchoarea, i + 1).Select
 With Selection.Borders(xlEdgeTop)
  .LineStyle = xlContinuous
  .ColorIndex = xlAutomatic
  .TintAndShade = 0
  .Weight = xlThick
 End With
Next i

Una vez que ya se ha dibujado el área en la hoja de cálculo, implementamos un bucle para que nos vaya preguntando por cada pieza a introducir, por tanto procedemos a establecer las características de cada pieza. Esto lo realizaremos preguntando al usuario por cada parámetro que queramos saber: nombre, ancho y largo. Los parámetros introducidos se irán escribiendo también la hoja de cálculo.

6. Escribir características de las piezas

Escribimos las preguntas en la hoja de cálculo.

Cells(1, k * 2).Value = Preg6
Cells(2, k * 2).Value = Preg4
Cells(3, k * 2).Value = Preg5

Realizamos las preguntas al usuario para saber el nombre, ancho y largo de la pieza, para guardarlo en las variables declaradas.

nombre = InputBox(Preg6)
Ancho = InputBox(Preg2)
Largo = InputBox(Preg1)

Escribimos los resultados en la hoja de cálculo.

Cells(1, (k * 2) + 1) = nombre
Cells(2, (k * 2) + 1) = Largo
Cells(3, (k * 2) + 1) = Ancho

7. Evaluación del criterio

Una vez que conocemos las características de la pieza a introducir habrá que evaluar si, con las piezas que tenemos ya introducidas, si las hubiera, cabrá alguna pieza más a lo ancho.

Usamos la variable Auxcomp , que me permite sumar el valor del ancho de la pieza que acabamos de introducir al valor del sumatorio del ancho de todas las piezas que ya teníamos y almacenadas en la variable Auxancho.

Auxcomp = Auxancho + Ancho

Ahora implementamos el condicional que evaluará si el valor de Auxcomp, variable que contiene la suma de los anchos de todas las piezas, es inferior o igual al ancho del área, definido en la variable Anchoarea , en decir, si cabe dentro del área. En caso contrario, nos avisará de que no caben más piezas y se finalizará el proceso.


También impondremos como condición que el largo de cualquiera de las piezas que insertemos sea igual o inferior al largo del área, definido en la variable Largoarea. Y en caso contrario, de forma similar, finalizará el proceso.

If Auxcomp > Anchoarea Or Largo > Largoarea Then
 mensaje1 = "No caben más piezas"
 Respuesta = MsgBox(mensaje1, vbCritical, "AVISO")
 GoTo Salir
End If

De no cumplir el condicional anteriormente impuesto, es decir, que la siguiente pieza cabe en el área, procedemos a dibujarla en el área. Cada unidad del área de la pieza será una celda, en este caso, no vamos a dibujar líneas, sino que vamos a irlas pintando según se vayan recorriendo los bucles.

8. Dibujar las piezas

La posición donde se dibujará la pieza irá definida por la variable Auxancho, que si recordamos almacena el valor del sumatorio del ancho de las piezas ya insertadas, por tanto ya sabremos el punto exacto donde debemos empezar a dibujar la siguiente pieza.

La función que se usará para colorear la celda seleccionada será With Selection.Interior de esta manera estaremos haciendo referencia al relleno de la celda, después estableceremos las características de ese relleno mediante las funciones Pattern , PatternColorIndex, PatternTintAndShade, TintAndShade, aunque la función más importante es Color, que como su nombre indica, define el color con el que vamos a pintar la celda.

Como dato, la función Color utiliza la composición RGB para definir el color, esto significa que cada color esta definido por un número, por tanto para que cada pieza sea dibujada de un color, se aprovecha la variable usada en el bucle para recorrerle, la cual en cada iteración tendrá un valor distinto, y por tanto se definirá un número distinto para cada una de estas, con lo que se adoptará un color distinto para cada pieza.

Color = k * 45625

El bucle será el siguiente:

For j = 1 To Largo
For i = 1 To Ancho
Cells(Auxancho + 5 + i, 1 + j).Select
 With Selection.Interior
  .Pattern = xlSolid
  .PatternColorIndex = xlAutomatic
  .Color = k * 45625
  .TintAndShade = 0
  .PatternTintAndShade = 0
 End With
Next i
Next j

Para finalizar se acumula el valor del ancho de la última pieza introducida en la variable Auxancho, de esta forma vamos almacenando el valor del ancho de todas las piezas introducidas. Hemos podido comprobar como anteriormente usábamos este valor para saber, entre otras cosas, si entra en el área cada pieza introducida.

Auxancho = Auxancho + Ancho

9. Reinicio del modelo

Para reiniciar la hoja e inicializar con otro área de otra impresora distinta así como con otras piezas, debemos escribir el siguiente código en otra macro distinta.

    Rows("4:310").Select
    Selection.Delete Shift:=xlUp
    Cells.Select
    Selection.ClearContents
    Range("A1").Select

De esta manera dejaremos nuestra hoja con el formato inicial.

10. Asignación de macros

Por último, asignamos las macros creadas a los iconos que habíamos insertado en la hoja, simplemente clicamos con botón derecho en los iconos y seleccionamos la opción de asignar Macro.

De esta manera, pulsando en los iconos insertados se iniciarán las macros que hemos desarrollado.

0 comentarios

Enviar un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *