Problema con boton de formulario y control ActiveX

23/10/2009 - 22:55 por Jorge | Informe spam
Hola. Quisiera ayuda con el siguiente problema: tengo dos macros: una me
imprime determinadas partes de una hoja y otra me archiva determinados
rangos. Ambas fueron creadas por Hector Miguel, según hilos de fecha 1/9/09
"Macro para imprimir rangos" y 18/8/09 "Archivar solo ciertos registros". Lo
que hice fue crear un boton de comando ActiveX y junte las dos macros
quedando asi:
Private Sub CommandButton1_Click()

ExecuteExcel4Macro "PRINT(1,,,1,,,,,,,,2,,,TRUE,,FALSE)"

Dim Fila As Integer, Salto As Byte, Grupo As Byte, Registros As Byte, _
Datos, Fecha, modCalc
Salto = 42
Grupo = 28
With Application
.ScreenUpdating = False
modCalc = .Calculation
.Calculation = xlCalculationManual
With Worksheets("estado diario")
Fecha = .Range("f4")
For Fila = 10 To .Range("c65536").End(xlUp).Row Step Salto
With .Range("c" & Fila).Resize(Grupo)
Registros = Evaluate("count('" & .Parent.Name & "'!" & .Address &
")")
If Registros > 0 Then
Datos = .Resize(Registros).Value
With Worksheets("historico").Range("a65536").End(xlUp).Offset(1)
.Resize(Registros).Value = Fecha
.Offset(, 1).Resize(Registros).Value = Datos
End With
End If
End With
Next
End With
.Calculation = modCalc
End With
End Sub

Al hacer click en el comando, funciona perfectamente, es decir, me imprime
solo las "hojas" que contienen datos y guarda los datos existentes, pero el
problema que es que el comando ActiveX tiene pocas posibilidades de diseñarlo
en cuanto a su imagen, razón por la cual, cree un boton con la Ficha
Insertar, rectangulo, cuadro de texto y le di colores, etc. Luego, en la
ficha Programador, Modo Diseño, click sobre el boton, Ver Código, copie esa
macro, pero solo me imprime y no guarda los datos. ¿Como lo soluciono o debo
quedarme con el Boton ActiveX?
Otra cosa ¿como se hace para que se habilite esta macro, sin necesidad que
me pregunte cada vez que inicio el Libro respectivo? Probe con archivar como
libro habilitado para macros, pero me crea otros problemas. Gracias de
antemano.-

Preguntas similare

Leer las respuestas

#1 Héctor Miguel
24/10/2009 - 03:07 | Informe spam
hola, Jorge !

1) si el codigo que expones, NO es (exactamente) tal y como queda despues de "copiado" al nuevo objeto incrustado...
(probablemente) "algo" de lo que no esta funcionando, tampoco ha quedado expuesto en esta consulta (?)
(en que tipo de modulo ?, cuales son las instrucciones exactas ?, ???)

2) al control activex (commandbutton1) le puedes establecer diversas propiedades (imagenes, colores, etc.)
(probablemente no sea necesario buscar alternativas por otro tipo de objetos ?)

3) en la version 2007, si quieres que el libro tenga macros, deberas guardarlo como "libro habilitado para macros" (*.xlsm)
o guardarlo con compatibilidad para versiones 97-2003 (pierdes las caracteristicas nuevas a 2007)

4) y no... (hasta donde se) no hay forma de evitar que excel "pregunte" si habilitas las macros (son opciones de cada usuario)

saludos,
hector.

__ OP __
Lo que hice fue crear un boton de comando ActiveX y junte las dos macros quedando asi:
Private Sub CommandButton1_Click()
ExecuteExcel4Macro "PRINT(1,,,1,,,,,,,,2,,,TRUE,,FALSE)"
Dim Fila As Integer, Salto As Byte, Grupo As Byte, Registros As Byte, _
Datos, Fecha, modCalc
Salto = 42
Grupo = 28
With Application
.ScreenUpdating = False
modCalc = .Calculation
.Calculation = xlCalculationManual
With Worksheets("estado diario")
Fecha = .Range("f4")
For Fila = 10 To .Range("c65536").End(xlUp).Row Step Salto
With .Range("c" & Fila).Resize(Grupo)
Registros = Evaluate("count('" & .Parent.Name & "'!" & .Address & ")")
If Registros > 0 Then
Datos = .Resize(Registros).Value
With Worksheets("historico").Range("a65536").End(xlUp).Offset(1)
.Resize(Registros).Value = Fecha
.Offset(, 1).Resize(Registros).Value = Datos
End With
End If
End With
Next
End With
.Calculation = modCalc
End With
End Sub

Al hacer click en el comando... me imprime solo las "hojas" que contienen datos y guarda los datos existentes
pero el problema que es que el comando ActiveX tiene pocas posibilidades de disenarlo en cuanto a su imagen
razon por la cual, cree un boton con la Ficha Insertar, rectangulo, cuadro de texto y le di colores, etc.
Luego, en la ficha Programador, Modo Diseno, click sobre el boton, Ver Codigo, copie esa macro
pero solo me imprime y no guarda los datos. Como lo soluciono o debo quedarme con el Boton ActiveX?
Otra cosa como se hace para que se habilite esta macro, sin necesidad que me pregunte cada vez que inicio el Libro respectivo?
Probe con archivar como libro habilitado para macros, pero me crea otros problemas...
Respuesta Responder a este mensaje
#2 Jorge
24/10/2009 - 18:14 | Informe spam
Hola Hector Miguel. Como siempre, gracias. Te cuento en primer lugar que si
guardo el archivo en Excel 2007 con Habilitado para macros, deja de funcionar
la conversión de números a letras (columna d de la hoja que subí hace algún
tiempo atras), lo que no sucede con archivo para Excel en modo
compatibilidad. Claro que a su vez al guardar en este último formato, me
arroja un mensaje indicando que existen datos fuera de los limites de celdas
y columas, marcando de amarillo, las celdas donde supuestamente existe el
error.Estas marcas solo ocurren a partir de mi "hoja" 2, y alternadas, es
decir, filas 52, 54, 56, etc. Estoy absolutamente seguro de que no existen
datos que excedan el número de columnas ni filas.-
En segundo lugar, en cuanto al tipo de modulo e instrucciones exactas, dada
mi ignorancia en el tema, tratare de explicarte en mis palabras, que quizas
no correspondan a lo tecnico: si voy a la ficha Programador, selecciono modo
diseño, y hago click en Ver Código, me muestra "todos" los códigos que tengo
en mis tres botones, es decir, para imprimir y guardar; solo imprimir y solo
guardar, mas el código del boton que cree y que en realidad es el que trato
de reemplazar, copiando el de imprimir y guardar. Para mas claridad, los
copio todos a continuación:
Private Sub CommandButton1_Click()

ExecuteExcel4Macro "PRINT(1,,,1,,,,,,,,2,,,TRUE,,FALSE)"

Dim Fila As Integer, Salto As Byte, Grupo As Byte, Registros As Byte, _
Datos, Fecha, modCalc
Salto = 42
Grupo = 28
With Application
.ScreenUpdating = False
modCalc = .Calculation
.Calculation = xlCalculationManual
With Worksheets("estado diario")
Fecha = .Range("f4")
For Fila = 10 To .Range("c65536").End(xlUp).Row Step Salto
With .Range("c" & Fila).Resize(Grupo)
Registros = Evaluate("count('" & .Parent.Name & "'!" & .Address &
")")
If Registros > 0 Then
Datos = .Resize(Registros).Value
With Worksheets("historico").Range("a65536").End(xlUp).Offset(1)
.Resize(Registros).Value = Fecha
.Offset(, 1).Resize(Registros).Value = Datos
End With
End If
End With
Next
End With
.Calculation = modCalc
End With
End Sub

Private Sub CommandButton2_Click()
ExecuteExcel4Macro "PRINT(1,,,1,,,,,,,,2,,,TRUE,,FALSE)"
End Sub

Private Sub CommandButton3_Click()
Dim Fila As Integer, Salto As Byte, Grupo As Byte, Registros As Byte, _
Datos, Fecha, modCalc
Salto = 42
Grupo = 28
With Application
.ScreenUpdating = False
modCalc = .Calculation
.Calculation = xlCalculationManual
With Worksheets("estado diario")
Fecha = .Range("f4")
For Fila = 10 To .Range("c65536").End(xlUp).Row Step Salto
With .Range("c" & Fila).Resize(Grupo)
Registros = Evaluate("count('" & .Parent.Name & "'!" & .Address &
")")
If Registros > 0 Then
Datos = .Resize(Registros).Value
With Worksheets("historico").Range("a65536").End(xlUp).Offset(1)
.Resize(Registros).Value = Fecha
.Offset(, 1).Resize(Registros).Value = Datos
End With
End If
End With
Next
End With
.Calculation = modCalc
End With
End Sub



Private Sub Worksheet_SelectionChange(ByVal Target As Range)

End Sub

Solo existen dos modulos: modulo1 para imprimir y moduloparaarchivar datos

Finalmente, es cierto que los controles activex tienen algunas propiedades,
pero al parecer no permiten caracteristicas como biselado, sombra, color
metalico, degradado, etc. Ahora, si se pudiera "usar" la "imagen" del boton
creado y pegarla en el control activex, sería la solución, pero ¿como se
hace?. Gracias y disculpa la lata. Saludos

"Héctor Miguel" escribió:

hola, Jorge !

1) si el codigo que expones, NO es (exactamente) tal y como queda despues de "copiado" al nuevo objeto incrustado...
(probablemente) "algo" de lo que no esta funcionando, tampoco ha quedado expuesto en esta consulta (?)
(en que tipo de modulo ?, cuales son las instrucciones exactas ?, ???)

2) al control activex (commandbutton1) le puedes establecer diversas propiedades (imagenes, colores, etc.)
(probablemente no sea necesario buscar alternativas por otro tipo de objetos ?)

3) en la version 2007, si quieres que el libro tenga macros, deberas guardarlo como "libro habilitado para macros" (*.xlsm)
o guardarlo con compatibilidad para versiones 97-2003 (pierdes las caracteristicas nuevas a 2007)

4) y no... (hasta donde se) no hay forma de evitar que excel "pregunte" si habilitas las macros (son opciones de cada usuario)

saludos,
hector.

__ OP __
> Lo que hice fue crear un boton de comando ActiveX y junte las dos macros quedando asi:
> Private Sub CommandButton1_Click()
> ExecuteExcel4Macro "PRINT(1,,,1,,,,,,,,2,,,TRUE,,FALSE)"
> Dim Fila As Integer, Salto As Byte, Grupo As Byte, Registros As Byte, _
> Datos, Fecha, modCalc
> Salto = 42
> Grupo = 28
> With Application
> .ScreenUpdating = False
> modCalc = .Calculation
> .Calculation = xlCalculationManual
> With Worksheets("estado diario")
> Fecha = .Range("f4")
> For Fila = 10 To .Range("c65536").End(xlUp).Row Step Salto
> With .Range("c" & Fila).Resize(Grupo)
> Registros = Evaluate("count('" & .Parent.Name & "'!" & .Address & ")")
> If Registros > 0 Then
> Datos = .Resize(Registros).Value
> With Worksheets("historico").Range("a65536").End(xlUp).Offset(1)
> .Resize(Registros).Value = Fecha
> .Offset(, 1).Resize(Registros).Value = Datos
> End With
> End If
> End With
> Next
> End With
> .Calculation = modCalc
> End With
> End Sub
>
> Al hacer click en el comando... me imprime solo las "hojas" que contienen datos y guarda los datos existentes
> pero el problema que es que el comando ActiveX tiene pocas posibilidades de disenarlo en cuanto a su imagen
> razon por la cual, cree un boton con la Ficha Insertar, rectangulo, cuadro de texto y le di colores, etc.
> Luego, en la ficha Programador, Modo Diseno, click sobre el boton, Ver Codigo, copie esa macro
> pero solo me imprime y no guarda los datos. Como lo soluciono o debo quedarme con el Boton ActiveX?
> Otra cosa como se hace para que se habilite esta macro, sin necesidad que me pregunte cada vez que inicio el Libro respectivo?
> Probe con archivar como libro habilitado para macros, pero me crea otros problemas...


.

Respuesta Responder a este mensaje
#3 Héctor Miguel
24/10/2009 - 23:10 | Informe spam
hola, Jorge ! (creo que te refieres al libro "Publicacion.xls" no ?)

__ 1 __
... si guardo el archivo en Excel 2007 con Habilitado para macros, deja de funcionar la conversion de numeros a letras
... lo que no sucede con archivo para Excel en modo compatibilidad



1) esto sucede porque la version 2007 tiene mas filas y columnas que las versiones anteriores y (de algun modo)...
las celdas a las que se hace referencia en los nombres definidos tambien (de algun modo) resultan desplazadas :-((
y es facil de corregir siguiendo este procedimiento "al pie de la letra" (luego de abrir la version 2007 y habilitar las macros)

a) selecciona la celda [D10] de la hoja "Estado Diario"
b) de la cinta de opciones / (ficha) formulas / (boton) administrador de nombres... -> selecciona el nombre "_A" (sin las comillas)
c) (RE)define en la formula la referencia, que debe quedar "apuntando" a la misma fila de una columna anterior, o sea a: [C10]
d) toma buena nota de que la referencia debe ser RELATIVA e iniciando con el signo ' ! '
la formula debiera quedar +/- asi: -> =texto(!c10,"000000000000000.00")&repetir("",0*hoy())

__ 2 __
... a su vez al guardar en este ultimo formato, me arroja un mensaje indicando que existen datos fuera de los limites de celdas
y columas, marcando de amarillo, las celdas donde supuestamente existe el error.
Estas marcas solo ocurren a partir de mi "hoja" 2, y alternadas, es decir, filas 52, 54, 56, etc.
Estoy absolutamente seguro de que no existen datos que excedan el numero de columnas ni filas.-



2) a tu archivo "original", convertido primero a la version 2007, le corri algunas pruebas y note comportamientos "bizarros" (p.e.)
a) NO permite la modificacion de los nombres desde la hoja "EnLetraSINMacrosV2"
b) la navegacion funciona como si estuviera habilitada la compatibilidad de teclas para lotus-123
c) tambien "avanza" despues del enter a la celda de abajo (aun cuando NO esta habilitada esta caracteristica)
-> es probable que (por alguna razon) "ese" archivo hubiera alcanzado un "cierto grado de corrupcion" (???)

__ 3 __
... en cuanto al tipo de modulo e instrucciones exactas... voy a la ficha Programador... modo diseno... click en Ver Codigo
me muestra "todos" los codigos que tengo en mis tres botones, es decir, para imprimir y guardar; solo imprimir y solo guardar
mas el codigo del boton que cree y que en realidad es el que trato de reemplazar, copiando el de imprimir y guardar.
Para mas claridad, los copio todos a continuacion: (...)



3) en cuanto a las macros, aun convertido a la version 2007 (tu archivo "original"), la macro sugerida funciona como se espera

__ 4 __
... es cierto que los controles activex tienen algunas propiedades, pero al parecer no permiten caracteristicas
como biselado, sombra, color metalico, degradado, etc.
Ahora, si se pudiera "usar" la "imagen" del boton creado y pegarla en el control activex, seria la solucion
pero como se hace?...



4) puedes asignar imagenes a tus botones de comando (activex) con el siguiente procedimiento:
a) primero incrusta la imagen en alguna hoja de calculo (*.jpg, *.png, *.bmp, etc.)
b) copia la imagen incrustada en la hoja de calculo (ctrl + C)
c) cambia al editor de vba, activa el modo de diseno y selecciona la hoja y el commandbutton correspondiente
d) en la ventana de propiedades (del commandbutton), selecciona la propiedad "Picture" y haces un pegado norma: ctrl + V
-> despues puedes eliminar la imagen de la hoja y modificar otras propiedades del boton como PicturePosition, BackStyle, etc.

saludos,
hector.
Respuesta Responder a este mensaje
#4 Jorge
27/10/2009 - 23:21 | Informe spam
Hola Hector Miguel: Si, me referia a ese libro. 1.- Corregido, gracias a tus
instrucciones. 2.- Realmente no se lo que pasa, pero en mi PC si tengo
habilitado avanzar a la celda de abajo, despues de Enter y respecto de las
letras a) y b), al parecer no tiene importancia porque ya archive en el modo
de habilitado para macros y no arroja el problema; 3 y 4.- Como la macro me
funcionaba de acuerdo a lo esperado y logre poner la imagen en el control
activex, quedó solucionado.
Tengo una duda con las macros de los controles Private Sub
CommandButton1_Click(); Private Sub CommandButton2_Click() y Private Sub
CommandButton3_Click(), que envie el día 24 de octubre, que consiste en lo
siguiente: defini un nombre (Datos) que selecciona los ya sabidos rangos
C10:C37;C52:C79; etc de la Hoja Estado Diario. Luego cree una macro que
consiste en seleccionar "Datos"; luego suprimir y finalmente, ubica el cursor
o selecciona como celda activa C10. Esta es la macro creada:
Sub Suprimir()
'
' Salir Macro
'
' Acceso directo: CTRL+s
'
Application.Goto Reference:="Datos"
Selection.ClearContents
Range("C10").Select
End Sub

Funciona como se espera, siempre que no "salga" de la columna C, pero si le
doy click a cualquiera de los controles Private Sub CommandButton1_Click();
Private Sub CommandButton2_Click() y Private Sub CommandButton3_Click() y
luego Ctrl+s, no funciona. Para solucionarlo, intente agregando al Código de
ComandButton 1, despues de FALSE) " y antes de END SUB, lo siguiente
Range("C10").Select con la intención de volver el cursor a la celda c10 o
seleccionar la celda C10. Lo mismo hice en ComandButton2, pero entre las
expresiones END WITH y END SUB. Evidentemente, algo esta mal ¿Como se logra
volver a la celda C10, despues de dar la instrucción de imprimir y guardar
para poder usar la macro suprimir? Gracias



"Héctor Miguel" escribió:

hola, Jorge ! (creo que te refieres al libro "Publicacion.xls" no ?)

__ 1 __
> ... si guardo el archivo en Excel 2007 con Habilitado para macros, deja de funcionar la conversion de numeros a letras
> ... lo que no sucede con archivo para Excel en modo compatibilidad

1) esto sucede porque la version 2007 tiene mas filas y columnas que las versiones anteriores y (de algun modo)...
las celdas a las que se hace referencia en los nombres definidos tambien (de algun modo) resultan desplazadas :-((
y es facil de corregir siguiendo este procedimiento "al pie de la letra" (luego de abrir la version 2007 y habilitar las macros)

a) selecciona la celda [D10] de la hoja "Estado Diario"
b) de la cinta de opciones / (ficha) formulas / (boton) administrador de nombres... -> selecciona el nombre "_A" (sin las comillas)
c) (RE)define en la formula la referencia, que debe quedar "apuntando" a la misma fila de una columna anterior, o sea a: [C10]
d) toma buena nota de que la referencia debe ser RELATIVA e iniciando con el signo ' ! '
la formula debiera quedar +/- asi: -> =texto(!c10,"000000000000000.00")&repetir("",0*hoy())

__ 2 __
> ... a su vez al guardar en este ultimo formato, me arroja un mensaje indicando que existen datos fuera de los limites de celdas
> y columas, marcando de amarillo, las celdas donde supuestamente existe el error.
> Estas marcas solo ocurren a partir de mi "hoja" 2, y alternadas, es decir, filas 52, 54, 56, etc.
> Estoy absolutamente seguro de que no existen datos que excedan el numero de columnas ni filas.-

2) a tu archivo "original", convertido primero a la version 2007, le corri algunas pruebas y note comportamientos "bizarros" (p.e.)
a) NO permite la modificacion de los nombres desde la hoja "EnLetraSINMacrosV2"
b) la navegacion funciona como si estuviera habilitada la compatibilidad de teclas para lotus-123
c) tambien "avanza" despues del enter a la celda de abajo (aun cuando NO esta habilitada esta caracteristica)
-> es probable que (por alguna razon) "ese" archivo hubiera alcanzado un "cierto grado de corrupcion" (???)

__ 3 __
> ... en cuanto al tipo de modulo e instrucciones exactas... voy a la ficha Programador... modo diseno... click en Ver Codigo
> me muestra "todos" los codigos que tengo en mis tres botones, es decir, para imprimir y guardar; solo imprimir y solo guardar
> mas el codigo del boton que cree y que en realidad es el que trato de reemplazar, copiando el de imprimir y guardar.
> Para mas claridad, los copio todos a continuacion: (...)

3) en cuanto a las macros, aun convertido a la version 2007 (tu archivo "original"), la macro sugerida funciona como se espera

__ 4 __
> ... es cierto que los controles activex tienen algunas propiedades, pero al parecer no permiten caracteristicas
> como biselado, sombra, color metalico, degradado, etc.
> Ahora, si se pudiera "usar" la "imagen" del boton creado y pegarla en el control activex, seria la solucion
> pero como se hace?...

4) puedes asignar imagenes a tus botones de comando (activex) con el siguiente procedimiento:
a) primero incrusta la imagen en alguna hoja de calculo (*.jpg, *.png, *.bmp, etc.)
b) copia la imagen incrustada en la hoja de calculo (ctrl + C)
c) cambia al editor de vba, activa el modo de diseno y selecciona la hoja y el commandbutton correspondiente
d) en la ventana de propiedades (del commandbutton), selecciona la propiedad "Picture" y haces un pegado norma: ctrl + V
-> despues puedes eliminar la imagen de la hoja y modificar otras propiedades del boton como PicturePosition, BackStyle, etc.

saludos,
hector.


.

Respuesta Responder a este mensaje
#5 Héctor Miguel
28/10/2009 - 05:07 | Informe spam
hola, Jorge !

op1: asegurate (en tiempo de diseno) que la propiedad "TakeFocusOnClick" de los commandbuttons este en => False

op2: no es necesario "Select(ionar)" objetos para administrar sus propiedades
prueba cambiando las instruciones en la macro Suprimir()
a una sola linea (p.e.) => Range("datos").ClearContents

saludos,
hector.

__ OP __
Tengo una duda con las macros de los controles Private Sub CommandButton1_Click()
Private Sub CommandButton2_Click() y Private Sub CommandButton3_Click()
... que consiste en lo siguiente: defini un nombre (Datos)
que selecciona los ya sabidos rangos C10:C37;C52:C79; etc de la Hoja Estado Diario.
Luego cree una macro que consiste en seleccionar "Datos"; luego suprimir
y finalmente, ubica el cursor o selecciona como celda activa C10. Esta es la macro creada:
Sub Suprimir()
' Acceso directo: CTRL+s
Application.Goto Reference:="Datos"
Selection.ClearContents
Range("C10").Select
End Sub
Funciona como se espera, siempre que no "salga" de la columna C
pero si le doy click a cualquiera de los controles Private Sub CommandButton1_Click()
Private Sub CommandButton2_Click() y Private Sub CommandButton3_Click() y luego Ctrl+s, no funciona.
Para solucionarlo, intente agregando al Codigo de ComandButton 1, despues de FALSE) " y antes de END SUB, lo siguiente
Range("C10").Select con la intencion de volver el cursor a la celda c10 o seleccionar la celda C10.
Lo mismo hice en ComandButton2, pero entre las expresiones END WITH y END SUB.
Evidentemente, algo esta mal Como se logra volver a la celda C10
despues de dar la instruccion de imprimir y guardar para poder usar la macro suprimir?
Respuesta Responder a este mensaje
Ads by Google
Help Hacer una preguntaSiguiente Respuesta Tengo una respuesta
Search Busqueda sugerida