CURSO DE PROGRAMACION TEMARIO PROGRAMACION EXCEL FOR AUTOCAD VBA. A. Introducción Las macros son un grupo de instrucciones programadas bajo entorno vba (visual basic para aplicaciones), cuya tarea principal es la automatización de tareas repetitivas y la resolución de cálculos complejos. El lenguaje vba, es un lenguaje de programación basado en el visual Basic, enfocado a la realización de programas sobre las herramientas Excel, Access, Word...., mediante macros en vba podemos crear nuevas funciones para nuestras hojas Excel, personalizar estilos y formatos, crear programas para la resolución de cálculos complejos, automatizar tareas... Una vez realizado el código vba, podemos ejecutar el programa mediante la creación de botones, nuevos menús... de tal forma que la aplicación creada resulte intuitiva y de fácil manejo. Mediante macros vba podemos crear múltiples aplicaciones que realicen los cálculos automáticamente y obtengamos resultados en apenas unos segundos. Las macros vba trabajan en diversos programas, los mas conocidos son los programas que se incluyen en el paquete Office (Excel ,Word, Access...) pero además las macros vba también trabajan en diversos programas como SolidWorks, Autocad...(software creado para el diseño de ingeniería) lo cual proporciona una enorme versatilidad de utilización, así como una comunicación entre diversos programas. A continuación se muestra una serie de ejemplos en los cuales se utilizan macros vba 1. Macros Vba con Excel. Creación de nuevas funciones- como por ejemplo la función "código" que convierte dígitos alfanuméricos a dibujos basados en codificación de código de barras. Automatización de tareas repetitivas- realización de informes automáticos, conexión con bases de datos y otros programas. Resolución de cálculos complejos e iterativos Creación de programas, planificación..... 2. como gestores documentales, software de Macros Vba con AutoCad. Mediante macros vba podemos comunicar nuestras hojas Excel con los planos dibujados en autocad. Creación de informes automáticos sobre los datos contenidos en los planos, información de los cajetines, información de los puntos, líneas y figuras contenidos en los planos... Parametrización y creación de planos a través de una hoja Excel... Creación de nuevas funciones para autocad...... B. Configuración de la ficha programador y manejo de librerías Para configura la ficha programador seguiremos los siguientes pasos ARCHIVO OPSIONES PERSONALIZAR CINTA DE OPSIONES MARCAMOS DESAROLLADOR CONFIGURACION DE LIBRERIA ENTRAMOS A DESAROLLADOR PICAMOS EN VISUAL BASIC PICAMOSEN HERRAMIENTAS PICAMOSEN REFERENCIAS MARCAMOS LOS TRES CASILLEROS Autocad 2019 Type Library Autocad Focus Control for VBA Type Library Autocad Map Mpolygon Type Library C. Explicación de Variables 1. Byte Se utiliza para guardar números positivos enteros desde 0 a 255. Ocupa 1 byte en la memoria. 2. Boolean Sólo puede almacenar dos valores: Verdadero (1) o Falso (0). Ocupa 2 bytes en la memoria 3. Integer Este tipo de variable también ocupa 2 bytes pero puede almacenar un rango de números enteros muy alto: desde -32.768 hasta 32.767. 4. Long También almacena números enteros desde -2.147.483.648 hasta 2.147.483.647. 5. Currency Se utiliza para cálculos donde intervienen monedas. Puede almacenar un rango desde -922.334.203.685.477,5808 922.337.203.685.477,5807. Ocupa 8 bytes en memoria. hasta 6. Single Se suele utiliza para almacenar números fraccionarios periódicos. Abarca desde -3,4028235E+38 a -1,401298E-45 para números negativos y 1,401298E-45 a 3,4028235E+38 para números positivos. Ocupa 4 bytes en memoria. 7. Double Similar al anterior pero con mucha más capacidad. Ocupa 8 bytes en memoria y comprende desde -1,79769313486231570E+308 a 4,94065645841246544E-324 para los valores negativos y desde 4,94065645841246544E-324 a 1,79769313486231570E+308 para los valores positivos. 8. Date Almacena fechas y horas como números de serie. Estos números funcionan igual que en Excel: la parte positiva del número corresponde al día y la parte decimal corresponde a la hora, de forma que 04/04/1986 a las 16:32:15, está representado por el número 31506,6890625. 9. String Almacena cadenas de caracteres desde uno solo a unos dos mil millones aproximadamente. El espacio ocupado por este tipo de variable depende de la longitud de la cadena guardada. 10. Object Almacena cualquier referencia a objetos. Ocupa 4 bytes en memoria. 11. Variant Es un tipo de variable especial que puede almacenar cualquier tipo de dato (numéricos, textos o fechas). Ocupan un espacio variable en la memoria (un tamaño fijo de 22 bytes + la longitud de los datos). Si una variable no se declara como un tipo de los anteriores, se supone que es una Variant D. Explicación de funciones y subrutinas Lo primero es explicar en qué consiste una función y en qué se diferencia de un procedimiento o macro. Una función es un proceso que ejecuta un código programado y devuelve un valor. La diferencia fundamental entre una función y una macro es que la primera requiere una o varias variables de entrada para realizar una serie de operaciones con ellas y después devolver un resultado. Una macro sin embargo, no requiere una variable de entrada, y puede realizar multitud de procesos (ej. Crear una hoja nueva en el documento) sin necesidad de devolver un resultado. E. Ejemplo de Creación de función a. EJEMPLO 1 – CALCULO DEL ÁREA DE UN RECTÁNGULO Function AREA (base As Double, altura As Double) As Double AREA = base * altura End Function b. EJEMPLO 2 – Crear una función para evaluar si un número es mayor a 100, de ser el caso que la función de cómo resultado CANTIDAD GRANDE y si es menor que dé como resultado CANTIDAD PEQUEÑA Function nEvaluar(j As Integer) As String nEvaluar = IIf(j >= 1000, "Cantidad Grande", "Cantidad Pequeña") End Function F. Ejemplo de creación de Subrutina EJEMPLO 1 – Indicar mediante una subrutina la Hora en la celda A1 Sub writeDataEHora() Range("A1") = Now End Sub EJEMPLO 2 – Crear una subrutina que sume la celda A1 y A2 y que calcule el resultado en la celda A3 Sub SUMAR() Dim a As Double Dim b As Double a = Range("A1") b = Range("A2") Range("A3") = a + b End Sub G. Ejercicio de Función a. Ejercicio Nº 01 – CALCULO DEL AREA DE UN CIRCULO b. Ejercicio Nº 02 – CALCULO DEL AREA DE ACERO H. Ejercicio de Subrutina a. Ejercicio Nº 01 – CALCULO DEL AREA DE UN CIRCULO b. Ejercicio Nº 02 – CALCULO DEL AREA DE ACERO CURSO DE PROGRAMACION SESIÓN N° 02 (Duración 2.5 horas) Explicación de propiedades de objetos Los objetos ActiveX que proporciona AutoCAD 19 para su manejo desde programas VBA están divididos según una jerarquía que deberemos seguir a la hora de llamarlos o referirnos a ellos. La plantilla que se muestra a continuación nos será muy útil a la hora de programar, ya que establece dicha jerarquía. En Visual Basic es factible añadir al entorno nuevos objetos creados por nosotros para luego ser utilizados. Lo que se ha hecho en VBA es precisamente eso. Estos objetos tienen sus propiedades y métodos, al igual que los demás. Existen objetos de entidades individuales de dibujo (líneas, círculos, arcos...) con sus propiedades (color, capa, tipo de línea...) y métodos (copiar, mover, escalar). También se han definido otros objetos no gráficos como son el Espacio Modelo, el Espacio Papel y los bloques. Estos se consideran una colección de objetos de entidades individuales de dibujo y tienen también sus propiedades para, por ejemplo, saber cuántas entidades simples contienen, y sus métodos para, por ejemplo, añadir nuevas entidades a la colección. El propio documento actual de AutoCAD está definido como un objeto y tiene sus propiedades (camino de acceso, límites...) y métodos (guardar, regenerar...). Dentro de él se encuentran los mencionados anteriormente, además de otras colecciones como el conjunto de capas, de estilos de texto, etcétera, cada una con propiedades y métodos. Y todo ello está incluido en el objeto más exterior, que es la aplicación de AutoCAD Creación de Objeto tipo línea Ejemplo Nº 01.- se muestra un ejemplo de código que crea una línea desde el punto (0, 0, 0) hasta el punto (100, 100, 0). Sub Linea() ' Declaración de las variables Dim Punto1 (0 To 2) As Double Dim Punto2 (0 To 2) As Double Dim Linea As AcadLine ' Inicialización de los puntos extremos Punto1(0) = 0: Punto1(1) = 0: Punto1(2) = 0 Punto2(0) = 100: Punto2(1) = 100: Punto2(2) = 0 ' Creación de la línea Set Linea = AutoCAD.Application.ActiveDocument.ModelSpace.AddLine(Punto1, Punto2) End Sub Ejercicio Nº 01.- Crear una triangulo, utilizando líneas, cuyos vértices se encuentran en las siguientes coordenadas A (0, 0, 0), B(0, 100, 0) y C(200, 0, 0) Sub EJERCICIO1() ' Declaración de las variables Dim Punto1(0 To 2) As Double Dim Punto2(0 To 2) As Double Dim Punto3(0 To 2) As Double Dim Lado1 As AcadLine Dim Lado2 As AcadLine Dim Lado3 As AcadLine Punto1(0) = 0: Punto1(1) = 0: Punto1(2) = 0 Punto2(0) = 0: Punto2(1) = 100: Punto2(2) = 0 Punto3(0) = 200: Punto3(1) = 0: Punto3(2) = 0 ' Creación de las lados Set Lado1 = AutoCAD.Application.ActiveDocument.ModelSpace.AddLine(Punto1, Punto2) Set Lado2 = AutoCAD.Application.ActiveDocument.ModelSpace.AddLine(Punto2, Punto3) Set Lado3 = AutoCAD.Application.ActiveDocument.ModelSpace.AddLine(Punto1, Punto3) End Sub Creación de Objeto tipo polilínea En otros casos, como al adicionar polilíneas, todas las coordenadas se almacenas en la misma variable de arreglo. En el siguiente ejemplo se muestra el código para crear una polilínea que forme un triángulo rectángulo. Sub Polilinea() ' Declaración de las variables Dim Puntos(0 To 11) As Double Dim Polilinea As AcadPolyline ' Inicialización de los vértices Puntos(0) = 0: Puntos(1) = 0: Puntos(2) = 0 Puntos(3) = 40: Puntos(4) = 0: Puntos(5) = 0 Puntos(6) = 40: Puntos(7) = 30: Puntos(8) = 0 Puntos(9) = 0: Puntos(10) = 0: Puntos(11) = 0 ' Creación de la polilínea Set Polilinea = AutoCAD.Application.ActiveDocument.ModelSpace. AddPolyline(Puntos) End Sub En esta parte simplificaremos el código con ayuda de la propiedad closed Sub Polilinea() ' Declaración de las variables Dim Puntos(0 To 8) As Double Dim Polilinea As AcadPolyline ' Inicialización de los vértices Puntos(0) = 0: Puntos(1) = 0: Puntos(2) = 0 Puntos(3) = 40: Puntos(4) = 0: Puntos(5) = 0 Puntos(6) = 40: Puntos(7) = 30: Puntos(8) = 0 Puntos(9) = 0: Puntos(10) = 0: Puntos(11) = 0 ' Creación de la polilínea Set Polilinea = AutoCAD.Application.ActiveDocument.ModelSpace. AddPolyline(Puntos) Polilinea.Closed = True End Sub Creación de Objeto tipo círculo Otro grupo importante de elementos, dentro de los dibujos más comunes en AutoCAD, lo constituyen las entidades curvas (arcos, circunferencias, elipses...). Para crear estas entidades, el modelo de objetos de AutoCAD dispone de los siguientes métodos: AddCircle: Crea una circunferencia dados el punto central y el radio. • AddArc: Crea un arco de circunferencia, especificando el punto central, el radio,el ángulo inicial y el ángulo final. • AddEllipse: Crea una elipse dados su centro, un punto extremo del eje principal y la relación entre las longitudes de los ejes. Creación de Objeto tipo Circulo Sub circulo() ' Declaración de variables Dim Punto1(0 To 2) As Double Dim Radio As Double Dim circulo As AcadCircle ' Inicialización de los puntos centrales Punto1(0) = 50: Punto1(1) = 20: Punto1(2) = 0 Radio = 10 Set circulo = AutoCAD.Application.ActiveDocument.ModelSpace.AddCircle(Punto1, Radio) End Sub Creación de Objeto tipo arco Sub Arcos() ' Declaración de variables Dim Punto1(0 To 2) As Double Dim Punto2(0 To 2) As Double Dim Radio As Double Dim Angulo1 As Double, Angulo2 As Double Dim Arco1 As AcadArc, Arco2 As AcadArc ' Inicialización de los puntos centrales Punto1(0) = 50: Punto1(1) = 20: Punto1(2) = 0 Punto2(0) = 50: Punto2(1) = 40: Punto2(2) = 0 ' Inicialización del radio y los ángulos Radio = 10 Angulo1 = 3.1416 * (-90) / 180 Angulo2 = 3.1416 * (90) / 180 ' Creación del primer arco Set Arco1 = AutoCAD.Application.ActiveDocument .ModelSpace.AddArc(Punto1, Radio, Angulo1, Angulo2) ' Creación del segundo arco Set Arco2 = AutoCAD.Application.ActiveDocument.ModelSpace. AddArc(Punto2, Radio, Angulo2, Angulo1) End Sub Ejercicio Nº 01.- Crear una circunferencia con la unión de arcos de 90ª, el radio de los arcos será igual a 20 UND. Creación de Objeto tipo Layer Ejemplo Nº 01.- Creación de una capa de nombre “CAPA1” Sub capa() Dim layer As AcadLayer Set layer = AutoCAD.Application.ActiveDocument.Layers.Add("CAPA1") End Sub Ejemplo Nº 02.- asignar el color azul a la capa creada. Sub capa() Dim layer As AcadLayer Set layer = AutoCAD.Application.ActiveDocument.Layers.Add("CAPA1") layer.Color = acBlue End Sub Ejercicio de aplicación Crear un código para generar e siguiente dibujo x:+0.000 Y:+17.97 x:-2.940 Y:+1.790 R22.1200 R20.0000 R3.4000 R17.8800 x:+2.940 Y:+1.790 x:-15.485 Y:-8.8500 x:+15.485 Y:-8.8500 x:+0.000 Y:-3.310 CURSO DE PROGRAMACION SESIÓN N° 02 (Duración 2.5 horas) Utilizacion de la herramienta msgbox Con Msgbox en VBA para Excel podemos mandar de manera muy sencilla mensajes a los usuarios cuando estamos utilizando VBA bien en una macro normal o bien en un evento. Este mensaje aparece en la pantalla del usuario como una ventana y puede tener varios elementos de configuración. SINTAXIS DE MSGBOX EN VBA La función Msgbox tiene una sintaxis bastante sencilla, pero podemos complicarla mucho, casi tanto como se quiera. Básicamente esta función lanza un pop-up con un mensaje. Este pop-up tiene los siguientes argumentos: Mensjae: una cadena de texto que se mostrará al usuario. Título: es opcional. También una cadena de texto que deberá ser breve para mostrar al usuario. Botones: es opcional, por defecto aparecerá «Aceptar». Los botones pueden ser algunos de los siguientes: vbOKonly, vbCancelOnly, vbYesNo, vbCritical,vbExclamation, vbQuestion… 1. EJEMPLO1: SÓLO EL MENSAJE. Sub Mensaje() MsgBox "Bienvenidos al curo de porgramacion!" End Sub Como puede verse en el código que hemos escrito, el mensaje tiene que ir escrito entre comillas dobles. 2. EJEMPLO2: MENSAJE CON UNA EXCLAMACIÓN DE TÍTULO Sub Mensaje_con_botón() MsgBox "Bienvenidos a esta web!", vbExclamation End Sub Este mensaje además de ser muy visual, lanza una alerta sonara típica de windows. Como ves, el botón es el de aceptar, pero en esta ocasión hay un símbolo de exclamación que hace más “pro” el mensaje. 3. EJEMPLO3: MENSAJE CON BOTONES DE YES , NO Y TÍTULO Como puede verse en el siguiente ejemplo hemos añadido un ejemplo con los tres componentes principales de un Msgbox. No es muy complejo hacerlo pero aún podemos complicarlo un poco más. Fíjate que el título ha cambiado, ya no pone «Microsoft Excel» sino que pone «Mi título» Sub Mensaje_con_título() MsgBox "Bienvenidos a esta web!", vbYesNo, "Mi título" End Sub 4. EJEMPLO4: COMBINAR DOS TIPOS DE BOTONES En este ejemplo vamos a combinar el botón de vbYesNo para que aparezca como en la anterior imagen con el de la exclamación del ejemplo 2. Sub Mensaje_con_dos_botones() MsgBox "Bienvenidos a esta web!", vbYesNo + "Mi título" End Sub vbExclamation, 5. EJEMPLO5: OBTENER LA RESPUESTA SI O NO DEL MSGBOX En el ejemplo siguiente, VBA preguntará al usuario si está seguro de querer poner en rojo la celda A1 de este libro. Sub Obtener_valor_del_mensaje() 'primero pongo la pregunta resultado = MsgBox("¿Quieres pintar de rojo la celda A1?", vbYesNo, "Colorear A1") 'ahora manejo el resultado a mi antojo If resultado = vbYes Then Range("A1").Interior.Color = vbRed End If End Sub Utilización de la herramienta Inputbox Se utiliza para la entrada de datos. Sub ingresar_dato() Dim dato As String dato = InputBox("Ingrese Palabra", "ENTRADA DE DATOS" Range("A1") = dato End Sub EJEMPLO DE APLICACIÓN hacer un código que automatice el dibujo de un rectángulo, utilizando las herramientas de msgbox e inputbox Sub Dibujar_rectangulo() MsgBox "Programa creado para el Dibujo" & Chr(13) & "de un rectangulo" ladoa = InputBox("Ingrese longitud del lado A ", "ENTRADA DE DATOS") ladob = InputBox("Ingrese longitud del lado B ", "ENTRADA DE DATOS") MsgBox "Pique la ubicacion del rectangulo" ptocad = AutoCAD.Application.ActiveDocument.Utility.GetPoint Dim perimetro As AcadPolyline Dim pto(0 To 11) As Double pto(0) = ptocad(0): pto(1) = ptocad(1): pto(2) = 0 pto(3) = ptocad(0): pto(4) = ptocad(1) + ladob: pto(5) = 0 pto(6) = ptocad(0) + ladoa: pto(7) = ptocad(1) + ladob: pto(8) = 0 pto(9) = ptocad(0) + ladoa: pto(10) = ptocad(1): pto(11) = 0 Set perimetro = AutoCAD.Application.ActiveDocument.ModelSpace.AddPolyline(pto) perimetro.Closed = True End Sub EJERCICIO DE APLICACIÓN Hacer un código que automatice el dibujo de una viga, crear capas para el contorno y para el acero, además usar las herramientas de Msgbox e inputbox para la entrada de datos. Imagen Referencial. Sub Dibujar_viga() MsgBox "Programa creado para el Dibujo" & Chr(13) & "de automatizado de una viga" luz = InputBox("Ingrese luz de la viga (m)", "ENTRADA DE DATOS") peralte = InputBox("Ingrese peralte dela viga (m) ", "ENTRADA DE DATOS") r = InputBox("Ingrese recubrimiento (m) ", "ENTRADA DE DATOS") MsgBox "Indique la ubicacion en el plano de la viga" ptocad = AutoCAD.Application.ActiveDocument.Utility.GetPoint Dim perimetro As AcadPolyline Dim acero As AcadPolyline 'vertices de la viga Dim pto(0 To 11) As Double 'vertices del acero superior Dim ptoasp(0 To 11) As Double ' creacion de capas Dim capa_contorno As AcadLayer Dim capa_acero As AcadLayer Set capa_contorno = AutoCAD.Application.ActiveDocument.Layers.Add("VIGA") capa_contorno.Color = acBlue CURSO DE PROGRAMACION SESIÓN N° 04 (Duración 2.5 horas) BUCLES Las estructuras tipo bucle permiten ejecutar una o varias líneas de código repetidamente. Puede repetir las instrucciones en una estructura de bucle hasta que una condición sea True , hasta que una condición sea False , un número especificado de veces o una vez por cada elemento de una colección. En la ilustración siguiente se muestra una estructura de bucle que ejecuta un conjunto de instrucciones hasta que una condición se vuelve verdadera: BUCLE TIPO FOR NEXT El bucle FOR NEXT en VBA nos permite en Excel (o cualquier otro lenguaje de programación) repetir una acción un número de veces dado. Su sintaxis es la siguiente: Ejemplo Nº 01.- En este primer ejemplo tenemos el bucle FOR NEXT en VBA. El bucle contara del 1 a 20 e ira poniendo en una columna el valor del contador. Sub CONTAR() Dim i As Double For i = 1 To 20 fila = i Cells(fila, 1) = i Next End Sub Ejemplo Nº 02.- Para este ejemplo añadimos la propiedad “step 2” que sirve para incrementar el contador de 2 en 2. Es decir, inicialmente el contador valdrá 1, luego 3, luego 5 y así sucesivamente, hasta completar la condición To 20 Sub CONTARESTEP() Dim i As Double For i = 1 To 20 Step 2 fila = i Cells(fila, 2) = i Next End Sub Ejemplo Nº 03.- Partiremos del ejemplo Nª 02, ahora queremos que se impriman los valores en celdas sucesivas sin dejar celdas en blanco. Sub CONTARESTEP2() Dim i As Double For i = 1 To 20 Step 2 fila = (i + 1) / 2 Cells(fila, 3) = i Next End Sub BUCLE TIPO DO WHILE El funcionamiento del bucle Do While en VBA es muy sencillo, repetiremos una acción tantas veces que sea necesario siempre y cuando se evalúe una condición. Ejemplo Nº 01.- Realizaremos el ejercicio Nº 01 de FOR NEXT pero ahora usaremos DO WHILE Sub CONTAR() Dim i As Double i = 1 Do While i <= 20 fila = i Cells(fila, 1) = i i = i + 1 Loop End Sub Ejemplo Nº 02.- Realizaremos el ejercicio Nº 03 de FOR NEXT pero ahora usaremos DO WHILE Sub CONTAR() Dim i As Double i = 1 Do While i <= 20 fila = (i+1)/2 Cells(fila, 1) = i i = i + 2 Loop End Sub EJEMPLOS DE APLICACIÓN USANDO EL BUCLE For Nex Sub CIRCULOS_VARIABLE() Dim limite As Integer limite = InputBox("Ingrese ultimo valor") For i = 1 To limite Dim texto As AcadText Dim circulo As AcadCircle ptocad = AutoCAD.Application.ActiveDocument.Utility.GetPoint Dim pto(0 To 2) As Double pto(0) = ptocad(0) pto(1) = ptocad(1) pto(2) = ptocad(2) Dim ptot(0 To 2) As Double ptot(0) = ptocad(0) ptot(1) = ptocad(1) + 2 ptot(2) = 0 Set texto = AutoCAD.Application.ActiveDocument.ModelSpace.AddText(i, pto, 4) texto.Alignment = acAlignmentCenter texto.TextAlignmentPoint = pto Set circulo = AutoCAD.Application.ActiveDocument.ModelSpace.AddCircle(ptot, 8) Next End Sub EJEMPLOS DE APLICACIÓN USANDO EL BUCLE Do While Sub CIRCULOS_VARIABLE() n = 1 Dim limite As Integer limite = InputBox("Ingrese ultimo valor") Do While n <= limite Dim texto As AcadText Dim circulo As AcadCircle ptocad = AutoCAD.Application.ActiveDocument.Utility.GetPoint Dim pto(0 To 2) As Double pto(0) = ptocad(0) pto(1) = ptocad(1) pto(2) = ptocad(2) Dim ptot(0 To 2) As Double ptot(0) = ptocad(0) ptot(1) = ptocad(1) + 2 ptot(2) = 0 Set texto = AutoCAD.Application.ActiveDocument.ModelSpace.AddText(n, pto, 4) texto.Alignment = acAlignmentCenter texto.TextAlignmentPoint = pto Set circulo = AutoCAD.Application.ActiveDocument.ModelSpace.AddCircle(ptot, 5) n = n + 1 Loop End Sub Ejercicio Nº 01.- Crear una Rutina para dibujar líneas paralelas verticales de longitud variable y separadas entre sí un valor de x, usar la herramienta inputbox. (Resolver usando el BUCLE For Next y el BUCLE Do While)