¿Te parecen difíciles de modificar o reformar ciertos trabajos repetitivos que no aportan valor añadido?
Mediante esta página web te vamos a ayudar a realizar automatizaciones en diferentes programas con pocos comandos y sin conocimientos avanzados de informática.
¡Despliega el menu para ver las diferentes posibilidades!
Microsoft Excel es una aplicación de Microsoft Office para hojas de cálculo que sirve para calcular cualquier fórmula matemática y/o lógica y que se suele utilizar en tareas financieras y contables.
Visual Basic para Aplicaciones usa el lenguaje de programación de Visual Basic integrándolo en las aplicaciones de Microsoft Office. Esto permite que sea sencillo realizar automatizaciones en estos programas y así se mejore sustancialmente la productividad de cualquier empresa.
El entorno integrado se llama Editor de Visual Basic y es una ventana independiente de las aplicaciones de Microsoft Office con el mismo aspecto que estas.
El lenguaje de programación es orientado a objetos, sus instrucciones se basan en variables, propiedades,… Todos los elementos con sus propiedades y características se encuentran contenidos en los objetos.
En el mercado existen muchos libros que explican todo en detalle, este es uno de ellos bastante bueno para empezar en version digital:
VBA Excel: Guía Esencial
En formato libro fisico os recomiendo:
Excel for Masters . Macros y Aplicaciones VBA
En cualquier caso, aqui explicaremos los puntos basicos principales para poder programar.
Características principales en los objetos:
Son las características, formas, aspectos o atributos del objeto.
Ejemplo: Hace referencia al valor de la celda C1:
Range("C1").Value
Es una acción que tiene efectos sobre un objeto.
Ejemplo: Activa y selecciona la celda C1:
Range("C1").Select
Es el resultado de una acción y como queda el objeto tras ello. Esas acciones son producidas por los métodos.
Ejemplos: Seleccionada una celda, abierto un libro, seguir un hipervínculo,…
Es un grupo de objetos contenidos en otro objeto cuyas características son comunes a los objetos componentes.
Ejemplo: Un libro es una colección de hojas de cálculo.
Puntos básicos con los que se pueden realizar prácticamente todo tipo de programaciones y mejoras (obviamente, con conocimientos más avanzados se puede optimizar todas las programaciones que se van a mostrar aquí, pero eso va a exigir un esfuerzo mayor).
Existen dos formas de programar mediante Visual Basic en Excel, con la Grabadora de macros o con la Programación directa en editor.
La grabadora sirve para pasar a código visual las acciones que se realicen cuando se pulsa grabar sin tener conocimientos de programación. En cualquier caso, no permite hacer todo lo que se puede de forma manual, pero es un muy buen punto de partida para programar.
Antes de utilizarla hay que pensar exactamente qué es lo que se quiere hacer para no generar código innecesario y cargar la memoria sin necesidad.
Para eliminar una macro previamente guardada se pulsa en la ficha "Programador" el botón macros (o Alt F8), se elige y se pulsa "Eliminar".
Para modificar y ver el código en Visual Basic se pulsa en la ficha "Programador" el botón macros (o Alt F8), se elige y se pulsa "Modificar". Aparece la ventana de Visual Basic y entre "Sub nombredelamacro()" y "End Sub" se encuentra el código generado por las acciones realizadas durante la grabación de la macro.
Mediante la programación directa en el editor de Visual Basic se pueden hacer muchas más automatizaciones que con la Grabadora de macros pero es necesario tener un conocimiento más avanzado.
Aquí es donde se encuentra todo el código de nuestro programa (tanto si se ha hecho mediante la Grabadora de macros como de forma directa).
No vamos a entrar a explicar cada una de las partes de esta ventana, solo nos tenemos que quedar con que el código lo tenemos que meter en un "módulo" para que se pueda ejecutar en cualquier parte del libro y no solo en una hoja. Clicando 2 veces sobre un módulo aparece la ventana con su código.
Dentro de los módulos se meten los procedimientos. Existen varios tipos pero los más empleados son Function y Sub.
Este procedimiento suele devolver un valor y es utilizado para crear una función de cálculo en Excel como "SUMA, BUSCARV, MAX,…". La sintaxis es:
Function nombrefuncion ()
…código…
End Function
Este otro procedimiento puede devolver uno o varios valores y es el más usado para programar. La sintaxis es:
Sub nombre ()
…código…
End Sub
En esta página web vamos a ver únicamente los comandos más útiles. Con ellos se podrán realizar muchísimas automatizaciones sin tener que entrar en otros más complicados ni dedicar mucho tiempo a formarse.
Con este comando se crea una ventana que sale por pantalla con el texto que queramos.
Se puede utilizar el operador & para concatenar varios textos o valores de variables.
Ejemplo:
Sub EjMsgBox()
MsgBox("Prueba de que hoy " & Date & " funciona" & " muy bien.")
End Sub
Este comando sirve para coger el valor que el usuario introduce por el teclado. Para ello se puede asignar a una variable que posteriormente se usará en el programa como queramos.
Ejemplo:
Sub EjInputBox()
variableejemplo = InputBox("Introduce tu nombre")
MsgBox("Te llamas " & variableejemplo & ".")
End Sub
Con este comando se pueden modificar bastantes elementos de una celda o rango de celdas (valores, formato, fuente,…). De ellos, lo más normal es utilizar o modificar el valor y se hace con la sintaxis: Range("Celda o Rango").Value.
Ejemplo:
Sub EjRange()
Range("A1").Value = 200
Range("A2:B3").Value = 500
End Sub
También es muy útil .Activate para activar la celda o .Select para seleccionarla. En ambos casos te posicionas en la celda o rango de celdas.
Truco: Para saber otros comandos aplicables como color, fuente, subrayado,… es posible utilizar la grabadora de macros y mediante la realización de ciertas acciones podremos conocer el código.
Con este comando se puede modificar una celda determinada. Es similar a Range pero solo para una celda y se indica mediante el número de fila y número de columna.
Ejemplo:
Sub EjCells()
Cells(1,1).Value = 200
End Sub
Este comando indica lo que está seleccionado y con los atributos se pueden realizar múltiples operaciones. Aparte del .Value de los casos anteriores se suele utilizar mucho el .Clear para borrar el contenido, relleno, formato,… de las celdas que se encuentran en esa selección.
Ejemplo:
Sub EjSelection()
Range("C2:D4").Value = 200
Range("C2:D4").Select
Selection.Clear
End Sub
Este quizás es el más utilizado de todos. La celda es la que está activa y con los atributos se pueden realizar también múltiples operaciones. La diferencia con Selection es que en este caso solo es para una única celda. Además de los atributos anteriores, se usa muchísismo .Offset y sirve para desplazarse un numero determinado de filas y columnas (especialmente útil para bucles como veremos más adelante).
Ejemplo:
Sub EjActiveCell()
Range("C2").Activate
ActiveCell.Offset (1, 2)
End Sub
Este comando permite saltar a otra parte del procedimiento sin ejecutar lo que hay en medio. Para ello se llama a una "bandera" cuyo nombre elegimos nosotros. Es bastante bueno para utilizarlo en bucles y realizar interrupciones bajo una determinada condición sin tener que pensar mucho.
Ejemplo: Salta de D2 al Offset sin pasar por E2 ni F2:
Sub EjGoTo()
Range("C2").Activate
Range("D2").Activate
GoTo salto
Range("E2").Activate
Range("F2").Activate
salto:
ActiveCell.Offset (1, 2)
End Sub
Este comando devuelve la fecha actual del sistema.
Ejemplo:
Sub EjDate()
MsgBox ("Hoy es " & Date & ".")
End Sub
Este comando convierte a mayúsculas todas las letras de un texto. Viene muy bien cuando no sabes si el usuario ha metido un texto en minúsculas, mayúsculas o ambos y tienes que compararlo con algo programado (ej: SI, si, Si)
Ejemplo:
Sub EjUcase()
variable1 = InputBox ("Pon un texto")
variable1 = Ucase(variable1)
MsgBox(variable1)
End Sub
Este comando convierte una variable o argumento en número. Es útil para asegurarse que lo que se ha captado es un número. Si el argumento indicado es un texto le asigna un 0.
Ejemplo:
Sub EjVal()
variable1 = Inputbox("Indica un número cualquiera")
Val(variable1)
MsgBox(variable1)
End Sub
Activando o desactivando este comando podemos hacer que la pantalla se actualice con cada comando del código o no. Es útil desactivarlo para que la ejecución sea más rápida en códigos largos o con muchos bucles y además evita el pestañeo típico de la pantalla.
Ejemplo:
Sub EjScreenUpdating ()
Application.ScreenUpdating = False
Range("A1").Value = 200
Range("A2:B3").Value = 500
Range("B1").Value = 200
Range("B2:D3").Value = 500
Range("M1").Value = 200
Range("N2:S3").Value = 500
Application.ScreenUpdating = True
End Sub
Activando o desactivando este comando podemos hacer que aparezcan ventanas con avisos durante la ejecución de la macro o no.
Ejemplo:
Sub EjDisplayFileAlerts()
Application.DisplayAlerts = False
...resto de codigo...
Application.DisplayAlerts = True
End Sub
Activando o desactivando este comando podemos hacer que se pida la actualización de links externos o no.
Ejemplo:
Sub EjAskToUpdateLinks()
Application.AskToUpdateLinks = False
...resto de codigo...
Application.AskToUpdateLinks = True
End Sub
Aquí solo vamos a destacar With…EndWith.
Mediante esta estructura de control podemos hacer unas cuantas ejecuciones sobre un objeto sin tener que llamarlo constantemente. Se hace mediante With…End With.
Ejemplo: Hacer unos cuantos cambios sobre la celda C2 llamándola solo una vez:
Sub EjWith()
Range("C2").Select
With Selection
.Value = 200
.Interior.Pattern = xlSolid
.Interior.ColorIndex = 4
End With
End Sub
De las que hay la más empleadas es sin duda If…Then…Else…Endif.
Esta estructura permite evaluar una condición y, según su repuesta (verdad o falso), ejecutar unas instrucciones u otras.
Si (if) se cumple una condición Entonces (Then) ejecutamos estas acciones, Sino (Else) ejecutamos estas otras Fin (Endif).
Ejemplo:
Sub EjIf()
Range("C2").Activate
If ActiveCell.Value = 200 Then
ActiveCell.Offset(1, 0)
ActiveCell.Value = "La celda anterior tiene un valor de 200"
Else
ActiveCell.Offset(0, 1)
ActiveCell.Value = "La celda de la izquierda no tiene un valor de 200"
Endif
End Sub
De las que hay las más empleadas son For…To…Next y While…Wend.
Con esta estructura se realizan un numero de repeticiones (bucles) conocidos. Para ello se define una variable con un punto inicial y un punto final.
Para (For) una variable de valor inicial X Hasta (To) el valor final Y hace unas acciones y Pasa al siguiente valor de la variable (Next)
Ejemplo: Pone el valor de x (1,2,3…10) en celdas de filas consecutivas desde la C2:
Sub EjFor()
Range("C2").Activate
For x = 1 To 10
ActiveCell.Value = x
ActiveCell.Offset(1, 0)
Next x
End Sub
Truco: Es posible poner más de un For dentro de otro para por ejemplo hacer matrices de datos.
Con esta estructura se realizan repeticiones (bucles) hasta que se deje de cumplir una condición determinada. Es importante que nos aseguremos de que en algún momento va a fallar la condición, sino entraríamos en un bucle infinito y el ordenador se quedará colgado un rato (pulsando Ctrl+Pause paramos la ejecución).
Mientras (While) una condición sea cierta hace unas acciones Fin (Wend).
Ejemplo: Pone el valor de x (1,2,3…10) en celdas de filas consecutivas desde la C2:
Sub EjWhile()
Range("C2").Activate
x = 1
While x < 10
ActiveCell.Offset(1, 0)
ActiveCell.Value = x + 1
x = x + 1
Wend
End Sub
Los objetos en Excel (y resto de programas) tienen una jerarquía y son:
1. Application. El más alto en la jerarquía y vale para llamar a una aplicación de Excel, Word, Outlook,…. Se puede obviar y poner los siguientes.
2. Workbook. Hace referencia a un libro de Excel.
3. Worksheet. Hace referencia a una hoja.
4. …aquí irían propiedades o comandos que hemos visto.
Se pueden ir encadenando para llamarlos.
Ejemplo:
Application.Workbooks("Libro1.xlsm").Worksheets("Hoja1").Select
Con esto se pueden saltar a diferentes libros, hojas o incluso aplicaciones mientras se ejecuta el código de forma que podemos programar acciones en diferentes sitios.
Ejemplo:
Sub EjObjetos ()
Application.Workbooks("Libro1.xlsm").Worksheets("Hoja1").Activate
Range("A1").Value = 200
Application.Workbooks("Libro1.xlsm").Worksheets("Hoja2").Activate
Range("B1").Value = 200
End Sub
Relacionándolos con los comandos vistos, los más utilizados son ActiveWorkbook, ActiveSheet, .Activate, .Name (para usar el nombre de ese elemento), .Add (para añadir un elemento), .Save (para guardar un libro), .Path (para poner la ruta donde está el libro).
Aqui encontrareis diversos ejemplos completos realizados con las explicaciones de las anteriores secciones. Podeis copiar y pegar los codigos en vuestro editor de visual basic para probarlos.
En este ejemplo se van a eliminar las filas que tengan vacias o con 0 las celdas de la columna de stock. Esto es útil para limpiar una tabla muy grande (se podria hacer con el filtro tambien eh). Para ello partimos de la siguiente tabla:
Referencia | Precio | Stock |
as-0002 | 10,00 € | 1000 |
as-0003 | 25,00 € | 100 |
as-0004 | 1,00 € | 5 |
as-0005 | 25,00 € | 200 |
as-0006 | 12,00 € | 250 |
as-0007 | 12,50 € | 325 |
as-0008 | 5,00 € | |
as-0009 | 6,00 € | 6896 |
as-0010 | 8,00 € | 52 |
as-0011 | 9,00 € | 41 |
as-0012 | 10,00 € | 11 |
as-0013 | 10,00 € | 0 |
as-0014 | 10,00 € | 59 |
as-0015 | 50,00 € | 84 |
as-0016 | 30,00 € | 98 |
as-0017 | 21,00 € | 3 |
as-0018 | 33,00 € | 0 |
as-0019 | 25,00 € | 0 |
as-0020 | 25,00 € | 98 |
as-0021 | 25,00 € | 98 |
Nota: Podeis añadir todas las filas o columnas que querais ya que el programa va a ir hasta el ultimo valor, sea el que sea.
Cuando ejecuteis el programa tendría que eliminar las filas que tienen la referencia as-0008, as-0013, as-0018 y as-0019.
Código:
Sub Eliminarfilas()
'Nos posicionamos en la primera celda:
Range("A1").Activate
'Empezamos el bucle hasta que no haya ninguna referencia:
While ActiveCell.Value <> ""
'Vamos a la columna de stock:
ActiveCell.Offset(0, 2).Select
'Comprobamos si está vacía o tiene 0:
If ActiveCell.Value = 0 Or ActiveCell.Value = "" Then
'En caso afirmativo, eliminamos la fila y volvemos a la primera columna:
Selection.Delete
ActiveCell.Offset(0, -2).Activate
Else
'En caso negativo, vamos a la siguiente fila y primera columna:
ActiveCell.Offset(1, -2).Activate
End If
Wend
End Sub
Resultado:
Referencia | Precio | Stock |
as-0002 | 10,00 € | 1000 |
as-0003 | 25,00 € | 100 |
as-0004 | 1,00 € | 5 |
as-0005 | 25,00 € | 200 |
as-0006 | 12,00 € | 250 |
as-0007 | 12,50 € | 325 |
as-0009 | 6,00 € | 6896 |
as-0010 | 8,00 € | 52 |
as-0011 | 9,00 € | 41 |
as-0012 | 10,00 € | 11 |
as-0014 | 10,00 € | 59 |
as-0015 | 50,00 € | 84 |
as-0016 | 30,00 € | 98 |
as-0017 | 21,00 € | 3 |
as-0020 | 25,00 € | 98 |
as-0021 | 25,00 € | 98 |
En este ejemplo se van a hacer varias copias de una hoja y se le van a dar nombres definidos por el usuario (mediante un inputbox). Además, si la hoja que se indica no existe o el numero de copias es 0 o un texto te avisa. Para ello partimos de la siguiente hoja (Almacen):
Cuando ejecuteis el programa tiene que pediros la cantidad de copias y el nombre de cada una.
Código:
Sub Copiahojas()
'Preguntamos al usuario el nombre de la hoja a copiar
nombrehoja = InputBox("Escribe el nombre de la hoja a copiar:")
'Revisa todas las hojas y si no existe, avisamos y paramos el programa:
existelahoja = False
For i = 1 To Worksheets.Count
If Worksheets(i).Name = nombrehoja Then
existelahoja = True
End If
Next i
If existelahoja = False Then
MsgBox ("La hoja " & nombrehoja & " no existe.")
GoTo fin
End If
'Preguntamos al usuario el numero de copias:
numerocopias = InputBox("Indica el numero de copias:")
'Si el numero de copias no es correcto, avisamos y paramos el programa:
If Val(numerocopias) <= 0 Then
MsgBox ("El numero de copias introducido es incorrecto.")
GoTo fin
End If
'Preguntamos al usuario los nombres de cada copia y la hacemos:
For i = 1 To Val(numerocopias)
repetir:
nombrecopia = InputBox("Indica el nombre de la hoja para la copia " & i & ":")
'Vemos si existe y en ese caso avisamos y volvemos a preguntar:
existelahojaacopiar = False
For j = 1 To Worksheets.Count
If Worksheets(j).Name = nombrecopia Then
existelahojaacopiar = True
End If
Next j
If existelahojaacopiar = True Then
MsgBox ("La hoja " & nombrecopia & " ya existe, indica otro nombre.")
'Vuelve a preguntar:
GoTo repetir
End If
'Seleccionamos la hoja a copiar y hacemos la nueva:
Sheets(nombrehoja).Select
Sheets(nombrehoja).Copy Before:=Sheets(1)
ActiveSheet.Name = nombrecopia
Next i
fin:
End Sub
Resultado (poniendo 2 copias con nombre stockMadrid y stockBarcelona):
En este ejemplo se van a copiar algunos valores de un libro a otro. Vamos a copiar las personas que entran más tarde de las 8:30. Para ello partimos de que ambos libros están creados y el de origen tiene la tabla siguiente:
Persona | Hora entrada | Hora salida |
Maria A. | 8:31 | 17:05 |
David S. | 8:15 | 17:22 |
Moises F. | 8:01 | 17:04 |
John W. | 9:05 | 18:15 |
Ian M. | 7:52 | 17:02 |
David F. | 8:33 | 17:48 |
Ana D. | 8:05 | 17:25 |
Martin E. | 8:04 | 18:35 |
Dean M. | 8:25 | 18:00 |
Lucas G. | 8:44 | 18:04 |
Cuando ejecuteis el programa tiene que pediros el nombre del libro de destino.
Código:
Sub Horarios()
'Guardamos el nombre del libro actual y de la hoja de partida:
nombrelibroorigen = ActiveWorkbook.Name
nombrehojaorigen = ActiveSheet.Name
'Preguntamos al usuario el nombre del libro de destino:
nombrelibrodestino = InputBox("Escribe el nombre del libro (con la extensión) donde vas a copiar las personas con horario de entrada mayor de 8:30:")
'Verifica si el libro de destino existe y sino avisa:
existeellibro = False
For i = 1 To Workbooks.Count
If Workbooks(i).Name = nombrelibrodestino Then
existeellibro = True
End If
Next i
If existeellibro = False Then
MsgBox ("El libro de destino " & nombrelibrodestino & " no existe.")
GoTo fin
End If
'Preguntamos al usuario el nombre de la hoja de destino o si lo deja en blanco crea una del mismo nombre que la anterior:
nombrehojadestino = InputBox("Escribe el nombre de la hoja de destino donde vas a copiar (en blanco para el mismo nombre que el origen:")
'Revisa todas las hojas del libro destino y si no existe, crea una nueva:
existelahoja = False
Workbooks(nombrelibrodestino).Activate
For i = 1 To Workbooks(nombrelibrodestino).Worksheets.Count
If Workbooks(nombrelibrodestino).Worksheets(i).Name = nombrehojadestino Then
existelahoja = True
End If
Next i
If existelahoja = False Then
Workbooks(nombrelibrodestino).Worksheets.Add
ActiveSheet.Name = nombrehojadestino
End If
'Volvemos al libro y hoja origen y empezamos a copiar:
Workbooks(nombrelibroorigen).Activate
Worksheets(nombrehojaorigen).Activate
'Empezamos copiando el encabezado:
Rows(1).Copy
Workbooks(nombrelibrodestino).Activate
Worksheets(nombrehojadestino).Activate
Rows(1).PasteSpecial xlPasteAll
'Indicamos la fila vacia siguiente:
filadestino = 2
'Volvemos al libro y hoja origen y seguimos copiando:
Workbooks(nombrelibroorigen).Activate
Worksheets(nombrehojaorigen).Activate
'Nos posicionamos en la columna de hora de entrada:
Range("B2").Select
'Empezamos el bucle de comparativa y copia:
While ActiveCell.Value <> ""
'Comprobamos si es mayor que 8:30 (pasado a numerico):
If ActiveCell.Value > 0.354166667 Then
'En caso afirmativo, copiamos la fila:
filaacopiar = ActiveCell.Row
Rows(filaacopiar).Copy
Workbooks(nombrelibrodestino).Activate
Worksheets(nombrehojadestino).Activate
Rows(filadestino).PasteSpecial xlPasteAll
'Indicamos que la fila vacia es la siguiente:
filadestino = filadestino + 1
'Volvemos al libro y hoja origen:
Workbooks(nombrelibroorigen).Activate
Worksheets(nombrehojaorigen).Activate
'Pasamos a la siguiente fila:
ActiveCell.Offset(1, 0).Activate
Else
'En caso negativo, vamos a la siguiente fila y misma columna:
ActiveCell.Offset(1, 0).Activate
End If
Wend
fin:
End Sub
Resultado:
Persona | Hora entrada | Hora salida |
John W. | 9:05 | 18:15 |
David F. | 8:33 | 17:48 |
Lucas G. | 8:44 | 18:04 |
Pulsa uno de los ejemplos superiores para verlo
Es posible aplicar VBA a ambos programas y hacer que interactuen. Con ello las posibilidades se multiplican como veremos.
Para ello solo es necesario añadir algún concepto mas a lo que hay en la sección de EXCEL y en la de CATIA V5.
Es necesario que antes de ver esta sección, se miren primero la de Excel y la de CATIA V5 dado que en ellas se explican algunos conceptos que se utilizan aqui.
Aqui vamos a ver algunos ejemplos sobre como pasar datos de Excel a CATIA.
Nota: Siempre partimos de un programa vba en CATIA.
En este ejemplo se van a crear puntos en 2D dentro de un sketch determinado partiendo de las coordenadas X e Y existentes en un fichero de Excel. Tambien elegimos el nombre de los puntos.
En este ejemplo se van a modificar los nombres de la geometria en un sketch desde un fichero Excel.
Pulsa uno de los ejemplos superiores para verlo
Aqui vamos a ver algunos ejemplos sobre como pasar datos de CATIA V5 a Excel.
Nota: Siempre partimos de un programa vba en CATIA.
En este ejemplo se van a obtener las coordenadas de todos los puntos de un sketch y se van a listar en un archivo Excel.
Debemos partir de CATIA y ejecutar la macro allí.
Código:
Sub Sacacoordenadaspuntos()
'Indicamos que va a hacer la macro:
MsgBox ("Macro para obtener las coordenadas de todos los puntos de un sketch de CATIA y pasarlos a Excel." & vbCrLf & "Debemos tener abierto el archivo CATIA (se ejcuta en éste) y los puntos se deben llamar comenzando por Point.")
'Establecemos los objetos CATIA y Excel:
Dim CATIA As Object
Dim Excel As Object
'Establecemos una variable vector para las coordenadas:
Dim coords(2)
'Primero vamos a Excel, creamos el archivo, lo hacemos visible y añadimos una hoja nueva:
Set Excel = CreateObject("Excel.Application")
Excel.Visible = True
Set Hoja = Excel.ActiveWorkbook.Sheets(1)
Hoja.Name = "Coordenadas CATIA"
'Asignamos el nombre del archivo a una variable para luego acceder facilmente:
nombreficheroexcel = Excel.ActiveWorkbook.Name
'Pedimos al usuario donde introduciremos los valores de las coordenadas:
Set Rango = Excel.InputBox("Seleccionar la celda de la hoja Excel donde empezar a poner las coordenadas obtenidas de CATIA", Type:=8)
'Cogemos la aplicación de CATIA existente, quitamos el aviso de alertas e inicializamos los objetos Part y Body:
Set CATIA = GetObject(, "CATIA.Application")
CATIA.DisplayFileAlerts = False
Set PiezaCATIA = CATIA.ActiveDocument
Set Pieza = PiezaCATIA.Part
Set Cuerpos = Pieza.Bodies
'Pedimos al usuario el nombre del Body y Skecth sobre los que actuaremos:
nombrepart = InputBox("Indique el nombre del Body que contiene el Sketch: ", "¿PartBody?", "PartBody")
nombresketch = InputBox("Indique el nombre del Skecth con los puntos a obtener sus coordenadas:", "¿Sketch?", "Sketch.1")
'Elegimos el Body y Skecth indicados por el usuario:
Set cuerpo1 = Cuerpos.Item(nombrepart)
Set sketches = cuerpo1.Sketches
Set sketch1 = sketches.Item(nombresketch)
'Iniciamos tambien los elementos geometricos, en ellos estan los puntos entre otros:
Set geometricElements1 = sketch1.GeometricElements
'Vemos cuantos elementos geometricos hay y asignamos el valor a una variable:
numerogeometrias = geometricElements1.Count
'Barremos todos los elementos geometricos para sacar sus coordenadas. Usamos una variable j para usar solo los Point:
j = 1
For i = 1 To numerogeometrias
Set punto = geometricElements1.Item(i)
'Si el nombre del elemento comienza por Point entonces coge sus coordenadas y las pasa a Excel redondeando a un decimal:
If Left(punto.Name, 5) = "Point" Then
punto.GetCoordinates coords
nombrepunto = punto.Name
Excel.Workbooks(nombreficheroexcel).Activate
Rango(j, 1).Value = Round(coords(0), 1)
Rango(j, 2).Value = Round(coords(1), 1)
Rango(j, 3).Value = nombrepunto
'Añadimos 1 ud a j para el siguiente punto:
j = j + 1
End If
Next i
'Ponemos titulos pero abajo de la tabla por si acaso no esta claro:
Rango(j, 1).Value = "Coord X"
Rango(j, 2).Value = "Coord Y"
Rango(j, 3).Value = "Point Name"
'Indicamos que se muestren alertas al terminar:
CATIA.DisplayFileAlerts = True
End Sub
En este ejemplo se van a listar las caracteristicas principales de todos los agujeros de un Part (nombre, rosca, diametro, tipo,...) en un archivo Excel.
Debemos partir de CATIA y ejecutar la macro allí.
Código:
Sub Sacadatosagujeros()
'Indicamos que va a hacer la macro:
MsgBox ("Macro para listar las caracteristicas principales de todos los agujeros de un Part de CATIA y pasarlos a Excel." & vbCrLf & "Debemos tener abierto el archivo CATIA (se ejcuta en éste) y los agujeros se deben llamar comenzando por Hole.")
'Establecemos los objetos CATIA y Excel:
Dim CATIA As Object
Dim Excel As Object
'Establecemos una variable vector para las coordenadas de los agujeros (X, Y, Z):
Dim coords(3)
'Primero vamos a Excel, creamos el archivo, lo hacemos visible y añadimos una hoja nueva:
Set Excel = CreateObject("Excel.Application")
Excel.Visible = True
Set Hoja = Excel.ActiveWorkbook.Sheets(1)
Hoja.Name = "Agujeros CATIA"
'Asignamos el nombre del archivo a una variable para luego acceder facilmente:
nombreficheroexcel = Excel.ActiveWorkbook.Name
'Pedimos al usuario donde introduciremos los valores:
Set Rango = Excel.InputBox("Seleccionar la celda de la hoja Excel donde empezar a poner las caracteristicas obtenidas de CATIA", Type:=8)
'Cogemos la aplicación de CATIA existente, quitamos el aviso de alertas e inicializamos los objetos Part y Body:
Set CATIA = GetObject(, "CATIA.Application")
CATIA.DisplayFileAlerts = False
Set PiezaCATIA = CATIA.ActiveDocument
Set Pieza = PiezaCATIA.Part
Set Cuerpos = Pieza.Bodies
'Barremos todos los cuerpos del Part, cogiendo todas las formas Usamos una variable j para usar solo los Hole luego:
j = 1
For Each cuerpo In Cuerpos
Set Formas = cuerpo.Shapes
'Ponemos en una variable el nombre del body:
holebodyname = "" & cuerpo.Name
'Hacemos otro barrido sobre todas las formas para buscar los agujeros:
For i = 1 To Formas.Count
Set hole = Formas.Item(i)
'Si el nombre del elemento comienza por Hole entonces coge sus caracteristicas y las pasa a Excel:
If Left(hole.Name, 4) = "Hole" Then
'Coordenadas, Nombre, Tipo de agujero, con o sin rosca, diametro:
hole.GetOrigin coords
holename = "" & hole.Name
holetype = "" & hole.Type
'Ponemos el tipo de agujero en lugar del valor numerico del indice:
If holetype = 0 Then
holetype = "Simple"
Else
If holetype = 1 Then
holetype = "Tapered"
Else
If holetype = 2 Then
holetype = "Counterbored"
Else
If holetype = 3 Then
holetype = "Countersunk"
Else
holetype = "Counterdrilled"
End If
End If
End If
End If
holeThreadingMode = hole.ThreadingMode
'Ponemos el tipo de rosca en lugar del valor numerico del indice:
If holeThreadingMode = 0 Then
holeThreadingMode = "Threaded"
Else
holeThreadingMode = "Not threaded"
End If
holediameter = "" & Round(hole.Diameter.Value, 1)
'Si tiene rosca, profundidad, métrica y paso:
If holeThreadingMode = "Threaded" Then
holethreaddepth = "" & Round(hole.ThreadDepth.Value, 1)
holemetric = "" & hole.HoleThreadDescription.Value
holepitch = "" & hole.ThreadPitch.Value
Else
holethreaddepth = "---"
holemetric = "---"
holepitch = "---"
End If
'Tipo de finalización del agujero:
holebottomtype = "" & hole.BottomType
'Lo pasamos a Excel:
Excel.Workbooks(nombreficheroexcel).Activate
Rango(j, 1).Value = holename
Rango(j, 2).Value = Round(coords(0), 1)
Rango(j, 3).Value = Round(coords(1), 1)
Rango(j, 4).Value = Round(coords(2), 1)
Rango(j, 5).Value = holetype
Rango(j, 6).Value = holeThreadingMode
Rango(j, 7).Value = holediameter
Rango(j, 8).Value = holethreaddepth
Rango(j, 9).Value = holemetric
Rango(j, 10).Value = holepitch
Rango(j, 11).Value = holebottomtype
Rango(j, 12).Value = holebodyname
j = j + 1
End If
Next i
Next cuerpo
'Ponemos titulos pero abajo de la tabla por si acaso no esta claro:
Rango(j, 1).Value = "Hole name"
Rango(j, 2).Value = "X coord"
Rango(j, 3).Value = "Y coord"
Rango(j, 4).Value = "Z coord"
Rango(j, 5).Value = "Type"
Rango(j, 6).Value = "Thread?"
Rango(j, 7).Value = "Diameter"
Rango(j, 8).Value = "Th depth"
Rango(j, 9).Value = "Th metric"
Rango(j, 10).Value = "Th pitch"
Rango(j, 11).Value = "Bottom"
Rango(j, 12).Value = "Body"
'Indicamos que se muestren alertas al terminar:
CATIA.DisplayFileAlerts = True
End Sub
Pulsa uno de los ejemplos superiores para verlo
CATIA V5 es una aplicación de Dassault para multitud de tareas de diseño 3D y 2D. Aqui nos centraremos en el modulo "Mechanical Design" y mas concretamente en Sketcher, Part y Product, que son los mas habituales en diseño mecánico.
Visual Basic para Aplicaciones usa el lenguaje de programación de Visual Basic integrándolo en las aplicaciones de Microsoft Office y tambien en otras aplicaciones externas como CATIA V5. Esto permite que sea sencillo realizar automatizaciones en estos programas y así se mejore sustancialmente la productividad de cualquier empresa.
En CATIA V5 se dispone de un editor de Visual Basic y es una ventana independiente. A el se accede desde la pestaña "Tools", pulsando en "Macros" y "Visual Basic Editor".
El lenguaje de programación es orientado a objetos, sus instrucciones se basan en variables, propiedades,… Todos los elementos con sus propiedades y características se encuentran contenidos en los objetos.
En este caso, en el mercado no existen muchos libros que explican todo, este que os pongo está en ingles pero es muy util:
CATIA V5: Macro Programming with Visual Basic Script (English Edition)
En cualquier caso, aqui explicaremos los pasos mas basicos para poder programar.
Sirven para almacenar las macros de CATIA. Existen 3 posibilidades para ello:
1) Folders: vbscript y CATScript
2) Project files: catvba
3) Files: CATParts/CATProducts
Se puede crear o añadir haciendo lo siguiente:
1) Pulsar "Tools", "Macro" y "Macros":
2) Pulsar "Macro Libraries":
3) Pulsar "Add Existing library" para añadir una existente o "Create New library" para crearla:
4) Seleccionar la carpeta donde está la libreria en caso de añadir o indicar donde se quiere crear la carpeta que contendrá esa nueva libreria
Existen dos formas de programar mediante Visual Basic en CATIA V5, con Grabadora de macros o con la Programación directa en editor.
La grabadora sirve para pasar a código visual las acciones que se realicen cuando se pulsa grabar sin tener conocimientos de programación. En cualquier caso, no permite hacer todo lo que se puede de forma manual, pero es un muy buen punto de partida para programar.
Antes de utilizarla hay que pensar exactamente qué es lo que se quiere hacer para no generar código innecesario y cargar la memoria sin necesidad.
Para modificar y ver el código en Visual Basic se pulsa en "Tools", "Macros", se elige y se pulsa "Edit":
Aparece la ventana de Editor correspondiente (Visual Basic o script) y entre "Sub nombredelamacro()" y "End Sub" se encuentra el código generado por las acciones realizadas durante la grabación de la macro.
Mediante la programación directa en el editor de Visual Basic se pueden hacer muchas más automatizaciones que con la Grabadora de macros pero es necesario tener un conocimiento más avanzado.
Aquí es donde se encuentra todo el código de nuestro programa (tanto si se ha hecho mediante la Grabadora de macros en formato catvba, como de forma directa).
No vamos a entrar a explicar cada una de las partes de esta ventana, solo nos tenemos que quedar con que el código lo tenemos que meter en un "módulo" para que se pueda ejecutar en cualquier parte de CATIA. Clicando 2 veces sobre un módulo aparece la ventana con su código.
Dentro de los módulos se meten los procedimientos. Existen varios tipos pero el más empleado para CATIA es Sub.
Este procedimiento puede devolver uno o varios valores y es el más usado para programar. La sintaxis es:
Sub nombre ()
…código…
End Sub
En esta página web vamos a ver únicamente los comandos más útiles. Con ellos se podrán realizar muchísimas automatizaciones sin tener que entrar en otros más complicados ni dedicar mucho tiempo a formarse.
Con este comando se crea una ventana que sale por pantalla con el texto que queramos.
Se puede utilizar el operador & para concatenar varios textos o valores de variables.
Ejemplo:
Sub EjMsgBox()
MsgBox("Prueba de que hoy " & Date & " funciona" & " muy bien.")
End Sub
Este comando sirve para coger el valor que el usuario introduce por el teclado. Para ello se puede asignar a una variable que posteriormente se usará en el programa como queramos.
Ejemplo:
Sub EjInputBox()
variableejemplo = InputBox("Introduce tu nombre")
MsgBox("Te llamas " & variableejemplo & ".")
End Sub
Este comando indica lo que está seleccionado y con los atributos se pueden realizar múltiples operaciones.
Ejemplo:
Sub EjSelection()
Set Seleccion = PiezaCATIA.Selection
Seleccion.Clear
End Sub
Este comando permite saltar a otra parte del procedimiento sin ejecutar lo que hay en medio. Para ello se llama a una "bandera" cuyo nombre elegimos nosotros. Es bastante bueno para utilizarlo en bucles y realizar interrupciones bajo una determinada condición sin tener que pensar mucho.
Ejemplo: Salta de Formas1 a Formas2 sin pasar por numeroshapes:
Sub EjGoTo()
Set Formas1 = cuerpo.Shapes
GoTo salto
numeroshapes = Formas1.Count
salto:
Set Formas2 = cuerpo.Shapes
End Sub
Este comando devuelve la fecha actual del sistema.
Ejemplo:
Sub EjDate()
MsgBox ("Hoy es " & Date & ".")
End Sub
Este comando convierte una variable o argumento en número. Es útil para asegurarse que lo que se ha captado es un número. Si el argumento indicado es un texto le asigna un 0.
Ejemplo:
Sub EjVal()
variable1 = Inputbox("Indica un número cualquiera")
Val(variable1)
MsgBox(variable1)
End Sub
Activando o desactivando este comando podemos hacer que la pantalla se actualice con cada comando del código o no. Es útil desactivarlo para que la ejecución sea más rápida en códigos largos o con muchos bucles y además evita el pestañeo típico de la pantalla.
Ejemplo:
Sub EjScreenUpdating ()
CATIA.ScreenUpdating = False
...resto de codigo...
CATIA.ScreenUpdating = True
End Sub
Activando o desactivando este comando podemos hacer que aparezcan ventanas con avisos durante la ejecución de la macro o no.
Ejemplo:
Sub EjDisplayFileAlerts()
CATIA.DisplayFileAlerts = False
...resto de codigo...
CATIA.DisplayFileAlerts = True
End Sub
Aquí solo vamos a destacar With…EndWith.
Mediante esta estructura de control podemos hacer unas cuantas ejecuciones sobre un objeto sin tener que llamarlo constantemente. Se hace mediante With…End With.
Ejemplo:
Sub EjWith()
Set Limiteagujero= hole.BottomLimit
With Limiteagujero
.Dimension.Value = 11
.LimitMode = catOffsetLimit
End With
End Sub
De las que hay la más empleadas es sin duda If…Then…Else…Endif.
Esta estructura permite evaluar una condición y, según su repuesta (verdad o falso), ejecutar unas instrucciones u otras.
Si (if) se cumple una condición Entonces (Then) ejecutamos estas acciones, Sino (Else) ejecutamos estas otras Fin (Endif).
Ejemplo:
Sub EjIf()
estadoplanos = 0
If estadoplanos = 1 Then
estadoplanos = 0
Else
estadoplanos = 1
Endif
End Sub
De las que hay las más empleadas son For Each…Next, For…To…Next y While…Wend.
Con esta estructura se realizan un numero de repeticiones (bucles) que dependen de la cantidad de objetos que haya en una determinada coleccion.
Para cada (For Each) variable dentro de una coleccion, hace unas acciones y pasa al siguiente valor de la variable (Next)
Ejemplo:
Sub EjForEach()
Set Cuerpos = Pieza.Bodies
For Each cuerpo In Cuerpos
Set Formas = cuerpo.Shapes
numeroshapes = Formas.Count
Next cuerpo
End Sub
Con esta estructura se realizan un numero de repeticiones (bucles) conocidos. Para ello se define una variable con un punto inicial y un punto final.
Para (For) una variable de valor inicial X Hasta (To) el valor final Y hace unas acciones y Pasa al siguiente valor de la variable (Next)
Ejemplo:
Sub EjFor()
Set Cuerpos = Pieza.Bodies
Set Formas = cuerpo.Shapes
numeroshapes = Formas.Count
For I = 1 To numeroshapes
Set hole = Formas.Item("Hole." & I & "")
hole.Diameter.Value = 10
Next I
End Sub
Truco: Es posible poner más de un For dentro de otro para por ejemplo hacer matrices de datos.
Con esta estructura se realizan repeticiones (bucles) hasta que se deje de cumplir una condición determinada. Es importante que nos aseguremos de que en algún momento va a fallar la condición, sino entraríamos en un bucle infinito y el ordenador se quedará colgado un rato (pulsando Ctrl+Pause paramos la ejecución).
Mientras (While) una condición sea cierta hace unas acciones Fin (Wend).
Ejemplo:
Sub EjWhile()
contador = 0
While contador < 10
contador = contador + 1
Wend
Msgbox("Valor del contador: " & contador & ".")
End Sub
Los objetos en Excel (y resto de programas) tienen una jerarquía y son:
1. Application. El más alto en la jerarquía y vale para llamar a una aplicación de CATIA, Excel, Word, Outlook,…. Se puede obviar y poner los siguientes.
2. Product. Hace referencia a un conjunto (Product).
3. Part. Hace referencia a una pieza (Part).
4. …aquí irían propiedades o comandos que hemos visto.
Se pueden ir encadenando para llamarlos.
Ejemplo:
Application.Product("Ejemplo.CATProduct").Part("Part1.CATPArt").Select
Aqui encontrareis diversos ejemplos completos realizados con las explicaciones de las anteriores secciones. Podeis copiar y pegar los codigos en vuestro editor de visual basic para probarlos.
En este ejemplo se van a contar y listar todos los elementos que tiene un product a primer nivel.
Debe estar activo el Product para que funcione.
Código:
Sub Contarylistarelementosprimernivel()
'Indicamos que no se muestren alertas durante la ejecución:
CATIA.DisplayFileAlerts = False
'Iniciamos el Documento de CATIA activo:
Set ProdDoc = CATIA.ActiveDocument
'Iniciamos el Product:
Set Prod = ProdDoc.Product
'Contamos el numero total de elementos y los metemos en una variable:
numerodeproducts = Prod.Products.Count
'Creamos otra variable de texto para luego meter el listado de nombres:
nombredelproduct = ""
'Barremos todos los elementos del product para obtener sus nombres:
For j = 1 To numerodeproducts
'Iniciamos cada elemento (Item):
Set Elem = Prod.Products.Item(j)
'Si la variable de texto estaba vacia, pone directamente el nombre, sino añade una coma para que visualmente quede mejor:
If nombredelproduct = "" Then
nombredelproduct = Elem.Name
Else
nombredelproduct = nombredelproduct & ", " & Elem.Name
End If
'Pasamos al siguiente elemento, volviendo a repetir el bucle si la j es menor que numerodeproducts:
Next j
'Tras finalizar el bucle For, creamos y mostramos el mensaje con todo junto, numero total y nombres de elementos:
MsgBox ("Numero total de elementos dentro de este product: " & numerodeproducts & "." & vbCrLf & "Sus nombres son: " & nombredelproduct & ".")
'Indicamos que se muestren alertas al terminar:
CATIA.DisplayFileAlerts = True
End Sub
En este ejemplo se van a eliminar todos los agujeros de cualquier body de una pieza (Part) cuyo nombre comience por Hole. y siendo el primero Hole.1.
Dejara sus sketch de posición y patterns vacios si los hay.
Inicialmente:
Código:
Sub Borraragujeros()
'Indicamos que no se muestren alertas durante la ejecución:
CATIA.DisplayFileAlerts = False
'Iniciamos el Documento de CATIA activo:
Set PiezaCATIA = CATIA.ActiveDocument
'Iniciamos la seleccion:
Set Seleccion = PiezaCATIA.Selection
'Nos aseguramos de que se borra cualquier elemento de la selección:
Seleccion.Clear
'Iniciamos el Part:
Set Pieza = PiezaCATIA.Part
'Iniciamos los cuerpos (bodies):
Set Cuerpos = Pieza.Bodies
'Barremos todos los cuerpos de la pieza para eliminar en todos ellos los agujeros:
For Each cuerpo In Cuerpos
'Iniciamos las formas que tiene ese cuerpo:
Set Formas = cuerpo.Shapes
'Creamos una variable con el numero total de formas que tiene el cuerpo:
numeroshapes = Formas.Count
'Barremos todas las formas buscando los agujeros:
For I = 1 To numeroshapes
'Iniciamos el agujero:
Set hole = Formas.Item("Hole." & I & "")
'Si no existe, pasamos a la siguiente orden sin parar la ejecución:
On Error Resume Next
'Lo añadimos a la selección si existe, si no existe añade vacio así que tambien vale:
Seleccion.Add hole
'Pasamos a la siguiente forma, volviendo a repetir el bucle si la I es menor que numeroshapes:
Next I
'Tras finalizar el bucle For, eliminamos toda la selección de ese cuerpo (agujeros):
Seleccion.Delete
'Pasamos al siguiente cuerpo (body) si hay:
Next cuerpo
'Indicamos que se muestren alertas al terminar:
CATIA.DisplayFileAlerts = True
End Sub
Resultado:
En este ejemplo se van a eliminar todos los redondeos y chaflanes de cualquier body de una pieza (Part) cuyo nombre comience por Edge. o Chamfer. y siendo el primero Edge.1 y Chamfer.1 respectivamente.
Inicialmente:
Código:
Sub Borrarredondeosychaflanes()
'Indicamos que no se muestren alertas durante la ejecución:
CATIA.DisplayFileAlerts = False
'Iniciamos el Documento de CATIA activo:
Set PiezaCATIA = CATIA.ActiveDocument
'Iniciamos la seleccion:
Set Seleccion = PiezaCATIA.Selection
'Nos aseguramos de que se borra cualquier elemento de la selección:
Seleccion.Clear
'Iniciamos el Part:
Set Pieza = PiezaCATIA.Part
'Iniciamos los cuerpos (bodies):
Set Cuerpos = Pieza.Bodies
'Barremos todos los cuerpos de la pieza para eliminar en todos ellos los redondeos y chaflanes:
For Each cuerpo In Cuerpos
'Iniciamos las formas que tiene ese cuerpo:
Set Formas = cuerpo.Shapes
'Creamos una variable con el numero total de formas que tiene el cuerpo:
numeroshapes = Formas.Count
'Primero barremos todas las formas buscando los redondeos:
For I = 1 To numeroshapes
'Iniciamos el redondeo:
Set Redondeo = Formas.Item("EdgeFillet." & I & "")
'Si no existe, pasamos a la siguiente orden sin parar la ejecución:
On Error Resume Next
'Lo añadimos a la selección si existe, si no existe añade vacio así que tambien vale:
Seleccion.Add Redondeo
'Pasamos a la siguiente forma, volviendo a repetir el bucle si la I es menor que numeroshapes:
Next I
'Tras finalizar el bucle For, eliminamos toda la selección de ese cuerpo (redondeos):
Seleccion.Delete
'Ahora barremos todas las formas buscando los chaflanes:
For I = 1 To numeroshapes
'Iniciamos el chaflan:
Set Chaflan = Formas.Item("Chamfer." & I & "")
'Si no existe, pasamos a la siguiente orden sin parar la ejecución:
On Error Resume Next
'Lo añadimos a la selección si existe, si no existe añade vacio así que tambien vale:
Seleccion.Add Chaflan
'Pasamos a la siguiente forma, volviendo a repetir el bucle si la I es menor que numeroshapes:
Next I
'Tras finalizar el bucle For, eliminamos toda la selección de ese cuerpo (chaflanes):
Seleccion.Delete
'Pasamos al siguiente cuerpo (body) si hay:
Next cuerpo
'Indicamos que se muestren alertas al terminar:
CATIA.DisplayFileAlerts = True
End Sub
Resultado:
En este ejemplo se ocultan o muestran en función de su estado todos los planos de referencia de la pieza (Part), es decir, planos XY, YZ y ZX:
Inicialmente:
Código:
Sub OcultaMuestraplanosreferencia()
'Indicamos que no se muestren alertas durante la ejecución:
CATIA.DisplayFileAlerts = False
'Iniciamos el Documento de CATIA activo:
Set PiezaCATIA = CATIA.ActiveDocument
'Iniciamos la seleccion:
Set Seleccion = PiezaCATIA.Selection
'Nos aseguramos de que se borra cualquier elemento de la selección:
Seleccion.Clear
'Iniciamos el Part:
Set Pieza = PiezaCATIA.Part
'Iniciamos las propiedades visuales de la seleccion para luego ver el estado y ocultar:
Set PropiedadesVisuales = Seleccion.VisProperties
'Iniciamos los elementos de origen (planos de referencia):
Set Elementosdeorigen = Pieza.OriginElements
'Creamos variables con cada plano de referencia para facilitar la gestion posterior:
Set Plano1 = Elementosdeorigen.PlaneXY
Set Plano2 = Elementosdeorigen.PlaneYZ
Set Plano3 = Elementosdeorigen.PlaneZX
'Los añadimos a la selección:
Seleccion.Add Plano1
Seleccion.Add Plano2
Seleccion.Add Plano3
'Asignamos a una variable estadoplanos si están ocultos o visibles los planos:
PropiedadesVisuales.GetShow estadoplanos
'Cambiamos el estado al contario mediante un If:
If estadoplanos = 1 Then
PropiedadesVisuales.SetShow 0
Else
PropiedadesVisuales.SetShow 1
End If
'Limpiamos la selección:
Seleccion.Clear
'Indicamos que se muestren alertas al terminar:
CATIA.DisplayFileAlerts = True
End Sub
Resultado:
En este ejemplo se va a cambiar al mismo valor todos los diametros de los agujeros de cualquier body de una pieza (Part) cuyo nombre comience por Hole. y siendo el primero Hole.1.
Inicialmente:
Código:
Sub Diametrosagujerosiguales()
'Indicamos que no se muestren alertas durante la ejecución:
CATIA.DisplayFileAlerts = False
'Iniciamos el Documento de CATIA activo:
Set PiezaCATIA = CATIA.ActiveDocument
'Iniciamos el Part:
Set Pieza = PiezaCATIA.Part
'Iniciamos los cuerpos (bodies):
Set Cuerpos = Pieza.Bodies
'Pedimos el valor al usuario y lo asignamos a una variable:
nuevodiametrostring = InputBox("Indique el nuevo diametro de todos los agujeros: ", "Cambio de diametros")
'COnvertimos la anterior variable a numero y la metemos en otra:
nuevodiametro = Val(nuevodiametrostring)
'Si el nuevo diametro es 0 o negativo, avisa y para la macro:
If nuevodiametro <= 0 Then
respuesta = MsgBox("Nuevo diametro introducido no valido: " & nuevodiametrostring, vbCritical)
'Indicamos que se muestren alertas ya que vamos a parar la macro:
CATIA.DisplayFileAlerts = True
'Paramos la macro totalmente, no solo el If:
End
'Si el nuevo diametro es válido, barremos todos los cuerpos de la pieza y sus formas:
Else
For Each cuerpo In Cuerpos
'Iniciamos las formas que tiene ese cuerpo:
Set Formas = cuerpo.Shapes
'Creamos una variable con el numero total de formas que tiene el cuerpo:
numeroshapes = Formas.Count
'Barremos todas las formas buscando los agujeros:
For I = 1 To numeroshapes
'Iniciamos el agujero:
Set hole = Formas.Item("Hole." & I & "")
'Si no existe, pasamos a la siguiente orden sin parar la ejecución:
On Error Resume Next
'Iniciamos el diametro:
Set Diametro = hole.Diameter
'Cambiamos su valor al nuevo:
Diametro.Value = nuevodiametro
'Pasamos a la siguiente forma, volviendo a repetir el bucle si la I es menor que numeroshapes:
Next I
'Pasamos al siguiente cuerpo (body) si hay:
Next cuerpo
'Actualizamos la pieza:
Pieza.Update
End If
'Indicamos que se muestren alertas al terminar:
CATIA.DisplayFileAlerts = True
End Sub
Resultado:
Pulsa uno de los ejemplos superiores para verlo
Si necesitas ayuda con alguna programacion, enviame un mail. Contacto -  
Además, si quieres ayudarme con esta pagina, puedes donarme bitcoins o dogecoins a esta dirección:
Bitcoin (BTC): 3D9938F7mNZzsMAZ8Lwnqgca5QRYSnGdVn
Dogecoin (DOGE): DSAv4Ri4eqN7YseEcicC5akZGLC2nNa9BA
Cualquier ayuda es bien recibida. ¡Y no te olvides de enviarme un mail para agradecertelo!