muchas gracias
si las imagenes las puedes obtener con un bucle por la celdas... -> cells(x,y)
lo "ideal" seria que modifiques la "secuencia numerada" de tus controles al mismo orden
y... asumiendo que xy100 es el nombre de un formulario y sus controles de imagen son las XYnn -?-
podrias usar el mismo bucle con algo +/- asi:
with xy100
for n = 1 to ??????
.controls("xy" & n).picture = loadpicture(??? cells(x,y))
next
end with
de lo contrario, necesitaras armar variables de tipo array(... para la secuencia de tus controles -?-
si cualquier duda (o informacion adicional)... comentas ?
saludos,
hector.
__ OP __
> pero como hag variar (xy1000.XY17.Picture =) se puede simplificar??
si las imagenes las puedes obtener con un bucle por la celdas... -> cells(x,y)
lo "ideal" seria que modifiques la "secuencia numerada" de tus controles al mismo orden
y... asumiendo que xy100 es el nombre de un formulario y sus controles de imagen son las XYnn -?-
podrias usar el mismo bucle con algo +/- asi:
with xy100
for n = 1 to ??????
.controls("xy" & n).picture = loadpicture(??? cells(x,y))
next
end with
de lo contrario, necesitaras armar variables de tipo array(... para la secuencia de tus controles -?-
si cualquier duda (o informacion adicional)... comentas ?
saludos,
hector.
__ OP __
> estas instrucciones como las puedo simplificar?
> xy1000.XY17.Picture = LoadPicture(RUTAPLA & "A.WMF")
> xy1000.XY18.Picture = LoadPicture(RUTAPLA & "B.WMF")
> xy1000.XY19.Picture = LoadPicture(RUTAPLA & "C.WMF")
> xy1000.XY20.Picture = LoadPicture(RUTAPLA & "D.WMF")
> xy1000.XY13.Picture = LoadPicture(RUTAPLA & "E.WMF")
> xy1000.XY14.Picture = LoadPicture(RUTAPLA & "F.WMF")
> xy1000.XY15.Picture = LoadPicture(RUTAPLA & "G.WMF")
> xy1000.XY16.Picture = LoadPicture(RUTAPLA & "H.WMF")
> xy1000.XY9.Picture = LoadPicture(RUTAPLA & "I.WMF")
> xy1000.XY10.Picture = LoadPicture(RUTAPLA & "J.WMF")
> xy1000.XY11.Picture = LoadPicture(RUTAPLA & "K.WMF")
> xy1000.XY12.Picture = LoadPicture(RUTAPLA & "L.WMF")
> xy1000.XY5.Picture = LoadPicture(RUTAPLA & "M.WMF")
> xy1000.XY6.Picture = LoadPicture(RUTAPLA & "N.WMF")
> xy1000.XY7.Picture = LoadPicture(RUTAPLA & "O.WMF")
> xy1000.XY8.Picture = LoadPicture(RUTAPLA & "P.WMF")
> xy1000.XY1.Picture = LoadPicture(RUTAPLA & "Q.WMF")
> xy1000.XY2.Picture = LoadPicture(RUTAPLA & "R.WMF")
> xy1000.XY3.Picture = LoadPicture(RUTAPLA & "S.WMF")
> xy1000.XY4.Picture = LoadPicture(RUTAPLA & "T.WMF")
pero ahora se me ocurre que se inserten los objetos OLE en una hoja y luego
cargarles las imagenes.. las coordenadas de los objetos estan tabuladas pero
el objeto dice que no admite la propiedad o metodo... que hago?
este es el codigo que tengo
Sub Macro1()
rutapla = ActiveWorkbook.Path & "\"
With ActiveSheet
For n = 1 To 4
ActiveSheet.OLEObjects.Add(ClassType:="Forms.Image.n", Link:=False, _
DisplayAsIcon:=False, Left:=61.5, Top:=104.25, Width:=59.25,
Height:= _
55.5).Select
ActiveSheet.Controls("image" & n).Picture = LoadPicture(rutapla &
"planchas\" & Cells(n, 3) & ".wmf")
Next n
End With
End Sub
..
yy otra cosa hay forma de darle nombre al objeto OLE que se esta insertando?
muchas gracias ...
Fredy
1) probabemente dependera de la "real" necesidad de incrustar n_controles de imagen en una hoja
y que (mas segura que probablemente) pondrian en riesgo la integridad del archivo (exceso de objetos)
ya que las imagenes cargadas seran convertidas a *.bmp al momento de guardarlo (muy "pesadas")
y (ademas) de cuantas veces ejecutes dicha macro (y quiza mas imponderables) -???-
2) no puedes modificar "el tipo/nombre de la clase" al incrustar objetos ole: -> "Forms.Image.1" <-> "Forms.Image.n"
y considera que tambien deberas hacer "variable" la posicion y dimensiones de cada control (left, top, width, height)
3) si puedes dar nombre a cada objeto desde el momento de insertarlo y SIN "pasarlo" por un .Select (p.e.)
with .oleobjects.add(......)
.name = "abc"
.picture = loadpicture(......)
end with
o... si lo seleccionas, podrias aprovechar SIN nombrarlo +/- como sigue:
activesheet.oleobjects.add(......).select
selection.name = "abc"
selection.picture = loadpicture(......)
-> solo (re)considera los comentarios de los puntos anteriores y..
si cualquier duda (o informacion adicional)... comentas ?
saludos,
hector.
__ 1 __
> pero ahora se me ocurre que se inserten los objetos OLE en una hoja y luego cargarles las imagenes...
__ 2 __
> las coordenadas de los objetos estan tabuladas pero el objeto dice que no admite la propiedad o metodo... que hago?
> este es el codigo que tengo
> Sub Macro1()
> rutapla = ActiveWorkbook.Path & "\"
> With ActiveSheet
> For n = 1 To 4
> ActiveSheet.OLEObjects.Add(ClassType:="Forms.Image.n", Link:=False, _
> DisplayAsIcon:=False, Left:=61.5, Top:=104.25, Width:=59.25, Height:= _
> 55.5).Select
> ActiveSheet.Controls("image" & n).Picture = LoadPicture(rutapla & "planchas\" & Cells(n, 3) & ".wmf")
> Next n
> End With
> End Sub
__ 3 __
como hago para conocer el nombre del objeto seleccionado?
muchas gracias
Fredy
y = 100
x = 100
For Image = 1 To 4
alto = 100
ancho = alto
ActiveSheet.OLEObjects.Add(ClassType:="Forms.Image.1", _
DisplayAsIcon:=False, Left:=x, Top:=y, Width:=ancho,
Height:= _
alto).Select
Selection.Name = Cells(Image, 3)
Selection.Picture = LoadPicture(rutapla & "planchas\" & Cells(Image, 3)
& ".wmf")
x = x + 100
Next Image
End Sub
muchas gracias
Fredy
> la necesidad real es insertar 20 objetos en forma de cuadricula (4 x 5), la posicion top ,left se obtiene de una tabla...
> la idea es que al escoger una de las 20 (es necesario que al seleccionarlo se conozca el nombre esto como se hace?)
> para asi poder descargar las 20 iniciales y volver a cargar otras 20 (estas ultimas dependiendo del nombre de la seleccion)
> y se cargan otras imagenes (los nombre de estas nuevas imagenes estan en una tabla)...
> como hago para conocer el nombre del objeto seleccionado?
1) no pierdas de vista los comentarios anteriores en relacion con el numero de objetos incrustados y el efecto del *.BMP
2) (hasta donde se) los controles de formulario ("forms.image.1") no se pueden "seleccionar" (solo en tiempo de diseno)
para conocer "el seleccionado" por el usuario, necesitas los eventos del modulo de codigo de "la hoja" donde estan incrustados
y los mas "recomendables" podrian ser: _click, _dblclick, _mousedown, _mousemove, _mouseup
pero no creo que quieras "escribir" codigo de eventos cada vez que incrustes (in)determinados "forms.images" en tu hoja -?-
3) (me parece que) si estas tratando de disenar algun "muestrario, catalogo de productos, ..."
va siendo hora de exponer unos cuantos detalles mas... "especificos" (de preferencia, +/- exactamente)
(probablemente) existan una o dos formas menos "consume-recursos" -???-
saludos,
hector.
__ previos __
>> 1) probabemente dependera de la "real" necesidad de incrustar n_controles de imagen en una hoja
>> y que (mas segura que probablemente) pondrian en riesgo la integridad del archivo (exceso de objetos)
>> ya que las imagenes cargadas seran convertidas a *.bmp al momento de guardarlo (muy "pesadas")
>> y (ademas) de cuantas veces ejecutes dicha macro (y quiza mas imponderables) -???-
>>
>> 2) no puedes modificar "el tipo/nombre de la clase" al incrustar objetos ole: -> "Forms.Image.1" <-> "Forms.Image.n"
>> y considera que tambien deberas hacer "variable" la posicion y dimensiones de cada control (left, top, width, height)
>>
>> 3) si puedes dar nombre a cada objeto desde el momento de insertarlo y SIN "pasarlo" por un .Select (p.e.)
>> with .oleobjects.add(......)
>> .name = "abc"
>> .picture = loadpicture(......)
>> end with
>>
>> o... si lo seleccionas, podrias aprovechar SIN nombrarlo +/- como sigue:
>>
>> activesheet.oleobjects.add(......).select
>> selection.name = "abc"
>> selection.picture = loadpicture(......)
>>
>> -> solo (re)considera los comentarios de los puntos anteriores y..
>>
>> si cualquier duda (o informacion adicional)... comentas ?
>>
> me sle un error (el objeto no admite esta propiedad o metodo) que estoy haciendo mal?
- cual es la linea precisa donde salta el error ?
- si usas: ActiveWorkbook.Path se trata de un archivo ya guardado ?
- cual es el contenido de las celdas del rango [C1:C4] ?
- considera que la propiedad ".Name" es para referencia al control EN la interfaz con el usuario
(NO es lo mismo que el nombre -CodeName- de cada control en el modulo de codigo de "la hoja")
saludos,
hector.
Sub pruebahm()
rutapla = ActiveWorkbook.Path & "\"
Dim nombre As String
y = 100
x = 100
For Image = 1 To 4
alto = 100
ancho = alto
ActiveSheet.OLEObjects.Add(ClassType:="Forms.Image.1", _
DisplayAsIcon:=False, Left:=x, Top:=y, Width:=ancho,
Height:= _
alto).Select
Selection.Name = Cells(Image, 3)
nombre = Selection.Name
With ActiveSheet.OLEObjects(nombre).Object
.Picture = LoadPicture(rutapla & "planchas\" & Cells(Image, 3) & ".wmf")
.PictureSizeMode = 1
End With
x = x + 100
Next Image
End Sub
ahora teniendo acrgadas todas las imagenes.. y al seleccionar una
cualquiera... como puedo saber el nombre de la que seleccione?
muchas gracias
Fredy
ActiveSheet.OLEObjects.Add(ClassType:="Forms.Image.1", _
DisplayAsIcon:=False, Left:=x, Top:=y, Width:=ancho,
Height:= _
alto).Select
Selection.Name = Cells(Image, 3)
nombre = Selection.Name
With ActiveSheet.OLEObjects(nombre).Object
.Picture = LoadPicture(rutapla & "planchas\" & Cells(Image, 3) & ".wmf")
.PictureSizeMode = 1
End With
x = x + 100
With ActiveSheet.OLEObjects(nombre).Object
.Select
End With
'macro text
Code = "Private Sub a_Click()" & vbCrLf
Code = Code & "Call Tester" & vbCrLf
Code = Code & "End Sub"
'add macro at the end of the sheet module
With ActiveWorkbook.VBProject.VBComponents(ActiveSheet.Name).CodeModule
.insertlines .CountOfLines + 1, Code
End With
Next Image
End Sub
Sub Tester()
MsgBox "You have click on the test button"
End Sub
_______________________________________
probando el basico... si funciona
Sub CreateButton()
Dim Obj As Object
Dim Code As String
Sheets("hoja2").Select
'macro text
Code = "Sub ñeñeñe_Click()" & vbCrLf
Code = Code & "Call Tester" & vbCrLf
Code = Code & "End Sub"
'create button
Set Obj = ActiveSheet.OLEObjects.Add(ClassType:="Forms.CommandButton.1", _
Link:=False, DisplayAsIcon:=False, Left:=200, Top:=100, Width:=100,
Height:=35)
Obj.Name = "ñeñeñe"
'buttonn text
'ActiveSheet.OLEObjects(1).Object.Caption = "Test Button"
'add macro at the end of the sheet module
With ActiveWorkbook.VBProject.VBComponents(ActiveSheet.Name).CodeModule
.insertlines .CountOfLines + 1, Code
End With
End Sub
____________________
pero no entiendo porque en el primer codigo no funciona...
muchas gracias
Fredy
pd: esta activado el " confiar en el acceso a proyectos de visual basic"
:)
- si usas: ActiveWorkbook.Path se trata de un archivo ya guardado ?
sies un archivo ya guardado.
- cual es el contenido de las celdas del rango [C1:C4] ?
a, b, c, d... es el nombre de cada imagen que estoy cargando
- considera que la propiedad ".Name" es para referencia al control EN la
interfaz con el usuario
(NO es lo mismo que el nombre -CodeName- de cada control en el modulo de
codigo de "la hoja")
ActiveSheet.OLEObjects.Add(ClassType:="Forms.Image.1", _
DisplayAsIcon:=False, Left:=x, Top:=y, Width:=ancho,
Height:= _
alto).Select
Selection.Name = Cells(Image, 3)
nombre = Selection.Name
With ActiveSheet.OLEObjects(nombre).Object
.Picture = LoadPicture(rutapla & "planchas\" & Cells(Image, 3) & ".wmf")
.PictureSizeMode = 1
End With
x = x + 100
With ActiveSheet.OLEObjects(nombre).Object
Next Image
End Sub
Sub CreateButton()
muchas gracias
Fredy
... lo pego de nuevo porque no quedo en orden ( discuspas por la repetidera)
> ahora teniendo acrgadas todas las imagenes.. y al seleccionar una cualquiera...
> como puedo saber el nombre de la que seleccione?
para este asunto, "te remito" a una de las "ramificaciones" de este hilo (que ya esta bastante "disperso"
concretamente la que dice:
=====
2) (hasta donde se) los controles de formulario ("forms.image.1") no se pueden "seleccionar" (solo en tiempo de diseno)
para conocer "el seleccionado" por el usuario, necesitas los eventos del modulo de codigo de "la hoja" donde estan incrustados
y los mas "recomendables" podrian ser: _click, _dblclick, _mousedown, _mousemove, _mouseup
pero no creo que quieras "escribir" codigo de eventos cada vez que incrustes (in)determinados "forms.images" en tu hoja -?-
=====
de todas formas, te sugiero que des una vueltecita por ese mensaje (por si "pescas" algo adicional)
saludos,
hector.
__ el resto de la consulta __
> mira asi me funciono... siguiendo tus consejos.. y por ahi una que otra cosita...
>
> Sub pruebahm()
> rutapla = ActiveWorkbook.Path & "\"
> Dim nombre As String
> y = 100
> x = 100
> For Image = 1 To 4
> alto = 100
> ancho = alto
> ActiveSheet.OLEObjects.Add(ClassType:="Forms.Image.1", _
> DisplayAsIcon:=False, Left:=x, Top:=y, Width:=ancho, Height:= _
> alto).Select
> Selection.Name = Cells(Image, 3)
> nombre = Selection.Name
> With ActiveSheet.OLEObjects(nombre).Object.Picture = LoadPicture(rutapla & "planchas\" & Cells(Image, 3) & ".wmf")
dame un tiempecito para "masticar" el codigo de esta consulta :))
(esperando que alguien mas tenga mejores oportunidades de revisarlo) :D
saludos,
hector.
__ OP __
(creo que) es necesario (y te conviene) iniciar un nuevo hilo partiendo de tus mas recientes avances -?-
saludos,
hector.
> probando el basico... si funciona
> pero no entiendo porque en el primer codigo no funciona...
> pd: esta activado el " confiar en el acceso a proyectos de visual basic"
del codigo (primero) que dices no estar funcionando... esta es la prueba que me ha funcionado:
comenta cual es la version de excel y si tienes habilitada la referencia a la libreria:
-> microsoft visual basic for applications extensibility (y que numero de version)
saludos,
hector.
Sub pruebahm()
rutapla = ActiveWorkbook.Path & "\"
Sheets("brand").Select
y = 100
x = 100
For Image = 1 To 1
alto = 100
ancho = alto
With ActiveSheet.OLEObjects.Add( _
ClassType:="Forms.Image.1", _
DisplayAsIcon:=False, _
Left:=x, Top:=y, Width:=ancho, Height:=alto)
.Name = Cells(Image, 3)
.Object.Picture = LoadPicture(rutapla & Cells(Image, 3) & ".wmf")
.Object.PictureSizeMode = 1
End With
' add macro at the end of the sheet module
With ActiveWorkbook.VBProject.VBComponents(ActiveSheet.Name).CodeModule
.insertlines .CountOfLines + 1, _
"private sub " & Cells(Image, 3).Text & "_click()" & vbCr & _
" call tester" & vbCr & "end sub"
End With
Next
muchas gracias
Fredy
Fredy
> la macro la ejecute y sale un error (subindice fuera del intervalo) y no subraya nada en amarillo
> es decir no se donde puede estar el error... active la referencia a la libreria:
> microsoft visual basic for applications extensibility 5.3; la version de mi excel es la 2003 SP3.
el error por "subindice fuera del intervalo" (generalmente) se debe a referencias a objetos que no existen
(p.e.) sheets("nombre de hoja con algun error tipografico")......
(creo que) la referencia a la libreria (... extensibility x.0) solo se requiere para "eliminar" codigo o modulos
(obviamente) mi entorno (arbol de directorios) es diferente del tuyo, asi que utilice una ruta de "mi" DD
y el siguiente codigo (que es el mismo anterior) si me ha funcionado (tambien xl-2003 SP3)...
saludos,
hector.
- referencias en el proyecto de vba:
Mcrosoft Visual Basic For Applications
Microsoft Excel 11.0 Object Library
Microsoft Forms 2.0 Object Library
OLE Automation
- el codigo utilizado:
Sub pruebahm()
' rutapla = ActiveWorkbook.Path & "\"
' Sheets("brand").Select
rutapla = "c:\archivos de programa\archivos comunes\microsoft shared\clipart\cagcat50\"
Sheets("hoja1").Select