Incluir ultimos archivos en menu personalizado

09/10/2006 - 00:33 por Ivan | Informe spam
hola a todos

estoy creando una barra de menus personalida via codigo. En ella hay
algunos controles integrados que parecen funcionar sin problemas, pero
no consigo que se reflejen los ultimos libros con los que se ha
trabajado, como ocurre en el menu archivo normal, a pesar de asignar el
'Id' (creo que) correspondiente con la siguiente instruccion:

Set opMenu = MenuGeneral.Controls.Add(Type:=msoControlButton, ID:ƒ1)
'Archivo reciente

pensaba que ocurrira como con los demas controles integrados, que
automaticamente haria lo mismo que en la aplicacion 'padre' e incluiria
estos nombres de archivo en mi nuevo menu ( que se llama 'General'),
pero de momento solo consigo que me refleje el caption del control
(&Recent File Name Goes Here)

¿quiza haya que 'incluirlos con el OnAction del mismo menu? si es asi,
¿que instruccion deberia usar para reflejar pej. los 4 ultimos libros
trabajados-he creado sus respectivos 4 controles-?

como datos, por si pudieran estar influyendo, la barra se crea al abrir
el libro (_Open), se oculta/muestra al activar/desactivar y se elimina
en Beforeclose

bueno, de momento solo se me ocurre lo de incluirlos al desplegarse el
menu contenedor (¿con el OnAction de este?), pero no se como
buscarlos/incluirlos

si podeis ayudarme os lo agradezco

un saludo y hasta pronto
Ivan

Preguntas similare

Leer las respuestas

#1 Ivan
09/10/2006 - 02:55 | Informe spam
hola de nuevo,

disculpad que sea un pesado, pero he probado el siguiente codigo y no
acabo de entender por que no hace nada, ni siquiera da error:

Sub UltimosArchivos()
Dim inA As Single
With Application.FileSearch
.NewSearch
.LookIn = "C:\Mis documentos"
.SearchSubFolders = True
.Filename = "*.xls"
.FileType = msoFileTypeExcelWorkbooks
If .Execute(SortBy:=msoSortByLastModified, _
SortOrder:=msoSortOrderAscending) > 0 Then
For inA = 1 To 4
CommandBars("MenuGeneral").Controls("opArchivo" & inA) _
.Caption = "&" & inA & " " & .FoundFiles(inA)
Next
End If
End With
End Sub

esta asociado al OnAction del menu contenedor (MenuGeneral) y mi
intencion con el es sustituir el caption de 4 controles (opArchivo1,
opArchivo2,...) por el nomdre y la ruta de los 4 ultimos archivos
'usados'.

si alguien ve donde estoy metiendo la pata, le agradeceria que me lo
indicara

un saludo y hasta pronto
Ivan
Respuesta Responder a este mensaje
#2 Héctor Miguel
09/10/2006 - 03:43 | Informe spam
hola, Ivan !

1) [hasta donde se]... la funcionalidad de la lista de archivos 'mas usados recientemente' [MRU Most Recently Used]
a) solo esta disponible desde la barra [de menus, que no es lo mismo que barras de controles] integrada de excel
b) NO se 'actualiza'... si un archivo es abierto a traves de codigo :-((
a menos que lo abras con el parametro correspondiente: -> Workbooks.Open FileName:="x.xls", AddToMRU:=True
c) todos los 'botones' con el nombre de los libros abiertos tienen el mismo 'ID' -> 831
y [si el archivo se ha cerrado]... la aplicacion se encarga de 'completar' el nombre con la ruta/ubicacion/... en el disco

2) -posibles- alternativas de solucion ?...
a) 'conservar' la barra [de menus] 'original'... habilitar la lista de los mas usados... personalizar 'el resto' de los comandos :))
b) agregar una barra personalizada [de menus] y aumentar un modulo 'de clase' [para los eventos de la aplicacion]
[para estar en condiciones de 'detectar' cuando se abre/cierra/graba/... un libro 'cualquiera'] :))
c) cambiar el 'punto de vista' ? utiizar otro tipo de controles y procedimientos ? ???

si cualquier duda [o informacion adicional]... comentas ?
saludos,
hector.

__ la consulta original __
estoy creando una barra de menus personalida via codigo... hay algunos controles integrados que parecen funcionar sin problemas
pero no consigo que se reflejen los ultimos libros con los que se ha trabajado, como ocurre en el menu archivo normal
a pesar de asignar el 'Id' (creo que) correspondiente con la siguiente instruccion:
Set opMenu = MenuGeneral.Controls.Add(Type:=msoControlButton, ID:ƒ1) 'Archivo reciente
pensaba que ocurrira como con los demas controles integrados, que automaticamente haria lo mismo que en la aplicacion 'padre'
e incluiria estos nombres de archivo en mi nuevo menu (... 'General'), pero de momento solo consigo que me refleje el caption del control
(&Recent File Name Goes Here)
quiza haya que 'incluirlos con el OnAction del mismo menu? si es asi,
que instruccion deberia usar para reflejar pej. los 4 ultimos libros trabajados-he creado sus respectivos 4 controles-?
como datos, por si pudieran estar influyendo, la barra se crea al abrir el libro (_Open), se oculta/muestra al activar/desactivar
y se elimina en Beforeclose
... de momento solo se me ocurre lo de incluirlos al desplegarse el menu contenedor (con el OnAction de este?)
pero no se como buscarlos/incluirlos...
Respuesta Responder a este mensaje
#3 Héctor Miguel
09/10/2006 - 03:51 | Informe spam
hola, Ivan !

... he probado el siguiente codigo y no acabo de entender por que no hace nada, ni siquiera da error:



si no te 'incomoda'... que 'te mande a buscar'... +/- 30 mensajes antes que este :D
el dia de ayer hubo una consulta de Carlos con asunto de: -> Abrir varios libros
[tiene que ver con el objeto 'Application.FileSearch']

si cualquier duda... comentas ?
saludos,
hector.

__ la consulta __
Sub UltimosArchivos()
Dim inA As Single
With Application.FileSearch
.NewSearch
.LookIn = "C:\Mis documentos"
.SearchSubFolders = True
.Filename = "*.xls"
.FileType = msoFileTypeExcelWorkbooks
If .Execute(SortBy:=msoSortByLastModified, _
SortOrder:=msoSortOrderAscending) > 0 Then
For inA = 1 To 4
CommandBars("MenuGeneral").Controls("opArchivo" & inA) _
.Caption = "&" & inA & " " & .FoundFiles(inA)
Next
End If
End With
End Sub
esta asociado al OnAction del menu contenedor (MenuGeneral) y mi intencion con el es sustituir el caption de 4 controles
(opArchivo1, opArchivo2,...) por el nomdre y la ruta de los 4 ultimos archivos 'usados'...
Respuesta Responder a este mensaje
#4 Francisco Parrilla
09/10/2006 - 07:11 | Informe spam
Hola ...!!!

Anexo un codigo que te lista los nombres de los archivos recientemente
usados por la aplicacion incluyendo el path del archivo:
Dim i As Integer
With "Nombrebarra"
For i = 1 To Application.RecentFiles.Count
.AddItem Application.RecentFiles(i).Name
Next
End With
Adaptalo a tus necesidades de la barra... la cantidad de archivos recientes
dependera de como tengas configurada esta opcion dentro de excel.

Saludos
Respuesta Responder a este mensaje
#5 Ivan
09/10/2006 - 17:03 | Informe spam
hola Hector Miguel, muchas gracias de nuevo

permiteme comentarte un poco a lo largo de tus respuestas:

a) ...solo esta disponible desde la barra [de menus + a)
'conservar' la barra [de menus] 'original'... habilitar la lista de los
mas usados... personalizar 'el resto' de los comandos :))

->en caso de decantarme por esta opcion: ¿si solo dejo algunos de los
otros comandos de la barra integrada, el resto estarian disponibles
desde 'Personalizar' o similar? me interesaria que no fuera asi

a) bis.de menus, que no es lo mismo que barras de controles...

->gracias, en general tiendo a hacerme un cacao con la terminologia,
mucho mas todavia con las barras de menus/controles/herramientas y con
los menus/controles/comandos uff, no acabo de enterarme donde
acaban/estan los unos/as y donde los otros/as. Me viene muy bien la
aclaracion.

b) NO se 'actualiza'... si un archivo es abierto a traves de codigo
:-((
a menos que lo abras con el parametro correspondiente: ->
Workbooks.Open FileName:="x.xls", AddToMRU:=True
c) y [si el archivo se ha cerrado]... la aplicacion se encarga de
'completar' el nombre con la ruta/ubicacion/... en el disco

->este era el otro problema que suponia, la actualizacion de los
nombres de archivos y el completar su ruta. Por lo que creo entenderte
es posible la actualizacion si se usa el 'parametro' 'adecuado', pero
tambien creo intuir que no es una solucion que te haga mucha gracia ( y
quiza este totalmente equivocado)

2) -posibles- alternativas de solucion ?...

-> tras ver tus comentarios y los de KL del hilo recomendado 'Abrir
varios libros', definitivamente FileSearch no parece lo mas adecuado,
sobre todo por que no se en que sistemas ni versiones sera utilizado,
aunque no he tenido tiempo de estudiar mucho las opciones propuestas

->aunque se que es una pregunta que tiene muchos condicionantes ¿por
que optarias tu?

->el unico motivo de incluir los archivos es no dejar aun mas 'cegado'
al usuario, si quiere volver a un uso normal de la aplicacion sin
cerrar el archivo, aunque por otro lado no quiero que pueda acceder a
demasiadas cosas del archivo en cuestion (del que contiene la barra, no
del abierto, con el cual volveria a la interfaz normal, salvo que se
corra el riesgo de que desde esta pueda interferir en el archivo
anterior -pej.: alterar barras, mostrar hojas ocultas, etc)

-> en el menu de marras ya habia incluido Nuevo, Abrir, Guardar y Salir

Aunque posiblemente ya no lo utilice (con mas motivo viendo el post de
Francisco P.) te pongo la solucion que habia logrado ayer mas o menos a
la hora de tus mensajes, para ver si seria adaptable a alguna idea...

tras convertir los ¿comandos? en personalizados, logre 'poner' los
nombres 'cortos' en la barra usando los siguientes codigos

Dim nArchivo1 As String, nArchivo2 As String, nArchivo3 As String,
nArchivo4 As String
Private Function nArchivoCorto(ByVal nomArch As String) As String
Dim i As Byte, f As Byte, p As Byte
i = 0
For p = 1 To Len(nomArch)
If Mid(nomArch, p, 1) = "\" Then
i = i + 1
If i = 4 Then
f = p: Exit For
' curioso, he tenido que igualar a f _
' por que p no me daba un resultado valido por si mismo??
End If
End If
Next
nArchivoCorto = Right(nomArch, Len(nomArch) - f)
End Function

Sub UltimosArchivos()
Dim inA As Single, nArchivo As String
Application.ScreenUpdating = False
With Application.FileSearch
.NewSearch
.LookIn = "C:\Documents and Settings\Ivan\Mis documentos"
.SearchSubFolders = True
.Filename = "*.xls"
.FileType = msoFileTypeExcelWorkbooks
If .Execute(SortBy:=msoSortByLastModified, _
SortOrder:=msoSortOrderDescending) > 0 Then
nArchivo1 = "&1" & " " & nArchivoCorto(.FoundFiles(1))
nArchivo2 = "&2" & " " & nArchivoCorto(.FoundFiles(2))
nArchivo3 = "&3" & " " & nArchivoCorto(.FoundFiles(3))
nArchivo4 = "&4" & " " & nArchivoCorto(.FoundFiles(4))
End If
End With
Application.ScreenUpdating = True
End Sub

y en el proc. que crea la barra->

...
Call UltimosArchivos
Set opArchivo1 = MenuGeneral.Controls.Add(Type:=msoControlButton)
'Archivo reciente
opArchivo1.Caption = nArchivo1
Set opArchivo2 = MenuGeneral.Controls.Add.
...

supongo que si valiera algo asi, concatenando estos nombres a la ruta
("C:\...\...\...\")¿podria usar Open con el parametro que comentas,
para que se actualizara en la barra, o al ser personalizado ya no
valdria esta formula y habria que recurrir a proc. intermedios?

Bueno, disculpa el rollo, y si ves algo comentable sera bien recibido

Muchas gracias de nuevo

un saludo y hasta pronto
Ivan
Respuesta Responder a este mensaje
Ads by Google
Help Hacer una preguntaSiguiente Respuesta Tengo una respuesta
Search Busqueda sugerida