Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

simplificar proceso

118 views
Skip to first unread message

fredy

unread,
Feb 9, 2009, 6:12:02 PM2/9/09
to
buenas tardes
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")
el nombre de la imagen esta en ua tabla que con ( cells(x,y)) puedo traerlas
, pero como hag variar ( xy1000.XY17.Picture =)
se puede simplificar??

muchas gracias

Héctor Miguel

unread,
Feb 9, 2009, 6:28:17 PM2/9/09
to
hola, fredy !

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??


Héctor Miguel

unread,
Feb 9, 2009, 6:28:17 PM2/9/09
to
hola, fredy !

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")

fredy

unread,
Feb 9, 2009, 8:59:01 PM2/9/09
to
si Miguel ... como siempre muy acertado.. muchas gracias :)

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

Héctor Miguel

unread,
Feb 9, 2009, 9:45:42 PM2/9/09
to
hola, 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 __

fredy

unread,
Feb 9, 2009, 10:23:04 PM2/9/09
to
muchas gracias Hector Miguel...
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?

muchas gracias

Fredy

fredy

unread,
Feb 9, 2009, 10:48:01 PM2/9/09
to
me sle un error ( el objeto no admite esta propiedad o metodo) que estoy
haciendo mal?
Sub pruebahm()
rutapla = ActiveWorkbook.Path & "\"

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

Héctor Miguel

unread,
Feb 9, 2009, 11:02:49 PM2/9/09
to
hola, 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 ?
>>

Héctor Miguel

unread,
Feb 9, 2009, 11:15:49 PM2/9/09
to
hola, fredy !

> 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.

fredy

unread,
Feb 9, 2009, 11:44:19 PM2/9/09
to
hola Hector Miguel
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")

.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

fredy

unread,
Feb 10, 2009, 12:04:01 AM2/10/09
to
hola Hector.. estoy haciendo unas modificaciones para que las imagenes
insertadas tengan cada una una macro para otro procedimiento... pero no me
funciona .. que podria ser.. este es el codigo..
______________________

Sub pruebahm()
rutapla = ActiveWorkbook.Path & "\"
Dim nombre As String
Dim Code As String
Sheets("brand").Select

y = 100
x = 100
For Image = 1 To 1

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

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"
:)

fredy

unread,
Feb 10, 2009, 12:11:01 AM2/10/09
to
- cual es la linea precisa donde salta el error ?
no me subraya nada en amarillo simplemente muestra el finalizar...

- 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")

fredy

unread,
Feb 10, 2009, 12:14:01 AM2/10/09
to
hola Hector.. estoy haciendo unas modificaciones para que las imagenes
insertadas tengan cada una una macro para otro procedimiento... pero no me
funciona .. que podria ser.. este es el codigo..
______________________
Sub pruebahm()
rutapla = ActiveWorkbook.Path & "\"
Dim nombre As String
Dim Code As String
Sheets("brand").Select
y = 100
x = 100
For Image = 1 To 1

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

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)

Héctor Miguel

unread,
Feb 10, 2009, 12:48:45 AM2/10/09
to
hola, fredy !

> 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")

Héctor Miguel

unread,
Feb 10, 2009, 12:50:44 AM2/10/09
to
hola, fredy !

dame un tiempecito para "masticar" el codigo de esta consulta :))
(esperando que alguien mas tenga mejores oportunidades de revisarlo) :D

saludos,
hector.

__ OP __

Héctor Miguel

unread,
Feb 10, 2009, 12:53:01 AM2/10/09
to
hola, fredy !

(creo que) es necesario (y te conviene) iniciar un nuevo hilo partiendo de tus mas recientes avances -?-

saludos,
hector.


Héctor Miguel

unread,
Feb 10, 2009, 11:43:56 PM2/10/09
to
hola, fredy !

> 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

fredy

unread,
Feb 12, 2009, 9:20:00 PM2/12/09
to
hola Hector Miguel
probe la macro y sale un error ( subindice fuera del intervalo).. y no
subraya nada en amarillo es decir ... #no se donde puede estar el error",
active microsoft visual basic for applications extensibility 5.3 y mi excel
es 2003 sp3..

muchas gracias

Fredy

fredy

unread,
Feb 12, 2009, 9:22:10 PM2/12/09
to
hola Hector iguel..
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.
:)
muchas gracias

Fredy

Héctor Miguel

unread,
Feb 12, 2009, 11:49:50 PM2/12/09
to
hola, 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

0 new messages