¿Cómo saber el nombre de una autoforma generada por macros? Y como guardar el nombre
Tengo la siguiente instrucción que me genera una autoforma el cual es el siguiente:
ActiveSheet.Shapes.AddShape(msoShapeBevel, 0#, 0#, 72#, 36.75).Select
Selection.Characters.Text = Range("A1")
¿Mi duda es como puedo saber el nombre de la autoforma que se genero?
¿Y cómo lo puedo almacenar en una variable para usarla después?, dado que genero varias autoformas y debo de poder usar esa variable en otras instrucciones, como por ejemplo colocar un aviso antes de imprimir que diga "cargar la hoja X", donde X es el nombre de la autoforma, pero no el texto, sino su nombre.
1 Respuesta
Escribe después de tus líneas, la siguiente línea
nombre = Selection.Name
Saludos. Dam
Si es lo que necesitas.
Esa parte funciona perfectamente bien, quedando el macro de esta forma:
Sub crear_boton() 'por.dam - explicada x Elsamatilde 'se crea un objeto o shape y se lo deja seleccionado 'tipo de botón, posiciones: izquierda, superior, ancho y alto ActiveSheet.Shapes.AddShape(msoShapeBevel, 0#, 0#, 72#, 36.75).Select 'se le asigna como texto el contenido de la celda A1 Selection.Characters.Text = Range("A1") nombre = Selection.Name 'al objeto seleccionado se le asignan propiedades: Mover y cambiar de tamaño, No imprimir With Selection .Placement = xlMoveAndSize .PrintObject = False 'se le asigna la macro llamada 'imprime' .OnAction = "imprime" Sheets("Hoja64").Select Range("A2").Select ActiveCell.Value = nombre End With End Sub
Por lo tanto en la variable nombre tengo el nombre del botón, pero el macro "imprime" no puede leer esa variable?, ya que necesito que al darle click al botón que se creó lea el el texto del botón, y que en base a este texto despliegue un dialogo que diga "Coloque la hoja con Folio XXXXX" donde las XXXXX son el texto que tiene el botón, y cuando le des aceptar selecciones como área de impresión de la hoja actual de la celda a1:ab100 y que mande a imprimir.
El macro imprime lo tengo de la siguiente manera:
Sub imprime() 'x Elsamatilde 'guarda el texto del control (si supiera el nombre) ActiveSheet.Shapes.Range("nobmre").Select botext = Selection.Characters.Text 'o toma el texto de la celda A1 'botext = ActiveSheet.Range("A1") 'envía mensaje para colocar la hoja sino = MsgBox("Colocar la hoja con cédula " & botext & " y cuando esté lista la impresora presionar este botón para Aceptar el mensaje.", vbOKCancel, "ATENCIÓN") 'si opta x cancelar el proceso finaliza If sino <> vbOK Then Exit Sub 'selecciona la hoja que se imprimirá Sheets("Hoja1").Select 'establece área de impresión ActiveSheet.Range("A1:Z100").PrintArea 'indica cantidad de copias ActiveSheet.PrintOut copies:=1 End Sub
El problema es q al dar click en este macro no me lee la variable nombre del valor guardado en el macro anterior.
Alguna forma en que pueda hacer lo que quiero? gracias.
No he entendido muy bien lo que necesitas, pero dime, ¿por qué quieres leer el texto que tiene el botón?
El texto lo tienes en "A1", con esta instrucción le estás pasando de la celda "A1" el texto al botón.
Selection.Characters.Text = Range("A1")
¿Por qué no lees nuevamente el texto de "A1"?
Por ejemplo:
sino = MsgBox("Colocar la hoja con cédula " & sheets("tu_nombre_de_hoja").range("A1")
Si quieres leer el texto del botón, podrías poner al principio de todas las macros lo siguiente:
Public nombre as string
Ambas macros crear_boton e imprime deben estar en el mismo módulo.
Cambia esta línea
ActiveSheet.Shapes.Range("nobmre").Select
por esta
ActiveSheet.Shapes.Range(nombre).Select
Otra cosa que no entiendo es por qué tienes esto
Sheets("Hoja64").Select
Range("A2").Select
ActiveCell.Value = nombre
Saludos. DAM
Para qué hacer las cosas fáciles si las puedes hacer difíciles. Por. DAM
Las ultimas lineas era para verificar que en efecto la variable nombre tenia el nombre del botón, leer el nombre del botón de la celda A1 de la hoja es solo para ejemplificar lo que quiero, Necesitaría la instrucción para asignarle al botón creado el texto que esta en otra hoja, por ejemplo en la hoja Inventario en la celda A1, cosa que no se hacer, si eso se puede me ahorrarías mas trabajo.
Ahora lo que me di cuenta es que mi macro de imprime no me sirve de la forma en que esta, debe de imprimir la hoja actual donde esta el botón, pero de forma general, es decir si tengo 5 botones uno en cada hoja de la 1 a la 5, si le doy click al botón de la hoja 1 debe de seleccionar el rango de impresión en la hoja 1, pero si estoy en la hoja 5 debe de seleccionar el rango de impresión en la hoja 5, de la misma forma el botón 1 se llama B1 el dos B2 y asi, si le doy click al botón de la hoja 1 que es B1 debe de decir un mensaje asi: Coloque la hoja B1 por la cara frontal y de click en aceptar.
No se si me explico bien, no pego mi código completo ya que es muy largo, pero todo esto va dentro de un ciclo que se repite n veces donde n es una cantidad de nombres en una lista, por cada nombre en la lista se crea una hoja nueva con el nombre de esa persona, se copian todos los formatos de una hoja base y dentro de cada hoja se deben de crear los botones que quiero, ya logre todo lo anterior solo me falta hacer mas general el macro de impresión para que haga lo que explico arriba.
No pido ayudas de forma muy particular para mi caso por que sino no aprendo, me gusta que me den las formulas general y asi aprendo la lograr usarlas en mi caso particular.
Mil gracias y espero de nuevo tu pronta respuesta.
Prueba lo siguiente, agregué una línea para poner un texto (hoja inventario, celda A1), en el botón y otra línea para ponerle nombre al botón.
Sub crear_boton() 'por.dam - explicada x Elsamatilde 'se crea un objeto o shape y se lo deja seleccionado 'tipo de botón, posiciones: izquierda, superior, ancho y alto ActiveSheet.Shapes.AddShape(msoShapeBevel, 0#, 0#, 72#, 36.75).Select 'al objeto seleccionado se le asignan propiedades: Mover y cambiar de tamaño, No imprimir With Selection .Placement = xlMoveAndSize .PrintObject = False 'se le asigna la macro llamada 'imprime' .OnAction = "imprime" 'se asigna un nombre al botón .Name = "asi_quiero_que_se_llame" 'se le asigna como texto el contenido de la celda A1 de la hoja inventario .Characters.Text = Sheets("inventario").Range("A1") End With End Sub
Para imprimir la hoja activa
Sub imprime() ActiveSheet.Range("A1:Z100").PrintArea ActiveSheet.PrintOut copies:=1 End Sub
Prueba y me comentas
Saludos. Dam
Hola probé el macro de imprime y se acerca a lo que quiero según veo pero al darle click al botón me da un error me dirige al código del macro de imprimir y me selecciona la siguiente linea de color amarillo
ActiveSheet.Range("A1:Z100").PrintArea
Con el error 438 y dice que el objeto no admite esa propiedad.
Al macro de imprimir le falta generar una dialog box que diga "Colocar la hoja con folio XXXX" donde XXXX es el nombre del botón.
Gracias y por ejemplo hay forma de buscar todas las autoformas en la hoja 1? por que creo q eso podría ayudar para generar el dialog box que necesito.
Lo que colocaste del botón para asignarle yo el nombre no lo probé, ya que los botones ya se generaban bien con el macro anterior, si crees que ponerle un nombre personalizado me podría ayudar lo podría contemplar.
Otra duda hay forma de crear el macro "imprime" desde otro macro? y asi crearía n macros de imprime? uno por cada botón? es eso posible?
Gracias
Me parece que nos estamos desviando de la pregunta original que hiciste:
"Mi duda es como puedo saber el nombre de la autoforma que se genero?"
Esto lo resolví desde la primer respueta.
Como no me has explicado qué es lo que necesitas, pues te estoy enviando respuestas parciales a lo que pides, pero no puedo darte la solución completa, porque además dices esto:
"No pido ayudas de forma muy particular para mi caso por que sino no aprendo"
Por eso la macro imprime no lleva todo, tienes que armarla a tu necesidad. Prueba las siguientes macros completas, creo que se acerca a lo que pretendes:
Sub crear_boton() 'por.dam - explicada x Elsamatilde 'se crea un objeto o shape y se lo deja seleccionado 'tipo de botón, posiciones: izquierda, superior, ancho y alto ActiveSheet.Shapes.AddShape(msoShapeBevel, 0#, 0#, 72#, 36.75).Select 'al objeto seleccionado se le asignan propiedades: Mover y cambiar de tamaño, No imprimir With Selection .Placement = xlMoveAndSize .PrintObject = False 'se le asigna la macro llamada 'imprime' .OnAction = "imprime" 'se asigna un nombre al botón .Name = "asi_quiero_que_se_llame" 'se le asigna como texto el contenido de la celda A1 de la hoja inventario .Characters.Text = Sheets("inventario").Range("A1") End With End Sub Sub imprime() ActiveSheet.Shapes.Range("asi_quiero_que_se_llame").Select botext = Selection.Characters.Text If MsgBox("Colocar la hoja con cédula: " & botext & vbCr & vbCr & _ "Presiona Si para imprimir, No para cancelar ", _ vbQuestion + vbYesNo, "ATENCIÓN") = vbYes Then ActiveSheet.PageSetup.PrintArea = "$A$1:$Z$100" ActiveWindow.SelectedSheets.PrintOut Copies:=1, Collate:=True End If End Sub
Si en el msgbox te pone el texto que tienes en el botón, eso es lo qué necesitas?
Prueba y me comentas y si es así por favor, podrías finalizar la pregunta.
Pues no es lo que quiero, pero la culpa es mia por no pegar mi código completo, te agradezco tu ayuda y cierro la pregunta por que como dices la pregunta que hice quedo resuelta, trate de explicar varias veces que era lo que quería pero logre darme a entender, no creo que fuera viable pegar 2 hojas de código nada mas para resolver una parte final.
Te agradezco tu ayuda.
Suerte.
- Compartir respuesta