Condividi:        

Aggiungere menù a tendina da lista variabile

Vuoi potenziare i tuoi documenti Word? Non sai come si fa una macro in Excel? Devi creare una presentazione in PowerPoint?
Oppure sei passato a OpenOffice e non sei sicuro di come lavorare al meglio?

Moderatori: Anthony47, Flash30005

Aggiungere menù a tendina da lista variabile

Postdi systemcrack » 03/07/24 16:31

Buongiorno a tutti,
continuando a lavorare per cercare di velocizzare l'immissione dei dati nello schema protocollo che utilizzo per registrare le pratiche.

Al momento quando l'operatore scarica manualmente il documento (lista colli) dalla email, lo salva in una specifica cartella con un nome prestabilito.

Le modifiche che sto apportando dovrebbero far visualizzare una lista a tendina con tutti i nomi dei files contenuti nella cartella, in modo che l'operatore ne possa selezionare una e vi possa fare sopra doppio click per creare il collegamento ipertestuale.

Per fare ciò ho inserito una macro che mi aiuta a creare la lista di file contenuti in un specifica cartella che riporto di seguito:
Codice: Seleziona tutto
Public Function Elenca_File(ByVal sFolderPath As String, Optional sEstensione As String = "pdf") As Variant

    Dim oFile As Object

    Dim oFSO As Object

    Dim oFolder As Object

    Dim oFiles As Object

    Dim arrFile() As Variant

    Dim sFileExt As String

    Dim i As Long

 

    Set oFSO = CreateObject("Scripting.FileSystemObject")

    Set oFolder = oFSO.GetFolder(sFolderPath)

    Set oFiles = oFolder.Files

    For Each oFile In oFiles

        sFileExt = oFSO.GetExtensionName(oFile)

        If sFileExt Like sEstensione Then

            i = i + 1

            ReDim Preserve arrFile(1 To i)

            arrFile(i) = oFile.Name

         End If

    Next oFile

    Elenca_File = Application.Transpose(arrFile)

End Function


Ora inserendo nella cella prescelta, (da cui si vuole far partire la lista), la seguente formula:
Codice: Seleziona tutto
=Elenca_File(D20;"pdf")

E nella cella D20 l'indirizzo sul pc della cartella interessata, nel mio caso:
Codice: Seleziona tutto
Q:\SCANNERTR...\DOC UFF ....\PRATICHE


Immagine

Si ottiene la lista automatica.
A questo punto vorrei che la lista fosse appunto a tendina nella cella D5.. è possibile anche se la fonte dei dati deriva da una macro?
Io ho fatto qualche prova, ma ricevo degli errori oppure i nomi dei files scompaiono ed al loro posto compare la dicitura
Codice: Seleziona tutto
#VALORE
Avatar utente
systemcrack
Utente Senior
 
Post: 400
Iscritto il: 27/07/17 09:40

Sponsor
 

Re: Aggiungere menù a tendina da lista variabile

Postdi Anthony47 » 03/07/24 19:02

Se la formula =Elenca_File(D20;"pdf") fosse in H1, puoi impostare una Convalida "da Elenco", e come "Origine" dell'elenco scrivere =H1#

Ma tutto questo per evitare il il GetOpenFilename?
In piu' l'elenco creato dalla formula rischia di non aggiornarsi mai, perche' si ricalcola quando cambiano i "precedenti", cioe' quando cambia D20, o manualmente forzi la formula (tipo F2 + Enter)
Se trovi una cella che si aggiorna dopo che un nuovo file e' stato memorizzato su disco allora possiamo aggiungerlo ai "precedenti" per costringere al ricalcolo dell'elenco. Ovviamente piu' ricalcoli e piu' file vuol dire piu' tempo per creare l'elenco...
Avatar utente
Anthony47
Moderatore
 
Post: 19326
Iscritto il: 21/03/06 16:03
Località: Ivrea

Re: Aggiungere menù a tendina da lista variabile

Postdi systemcrack » 04/07/24 07:40

Buongiorno Anthony,
Anthony47 ha scritto:Se la formula =Elenca_File(D20;"pdf") fosse in H1, puoi impostare una Convalida "da Elenco", e come "Origine" dell'elenco scrivere =H1#

Ma tutto questo per evitare il il GetOpenFilename?

Non era per evitarlo.. sono le mie scarse conoscenze del vba a spingermi in alcune direzioni :D

Anthony47 ha scritto:In piu' l'elenco creato dalla formula rischia di non aggiornarsi mai, perche' si ricalcola quando cambiano i "precedenti", cioe' quando cambia D20, o manualmente forzi la formula (tipo F2 + Enter)
Se trovi una cella che si aggiorna dopo che un nuovo file e' stato memorizzato su disco allora possiamo aggiungerlo ai "precedenti" per costringere al ricalcolo dell'elenco. Ovviamente piu' ricalcoli e piu' file vuol dire piu' tempo per creare l'elenco...

Si effettivamente ho dovuto sperimentare e riflettere un pò sull'aspetto aggiornamento lista, sempre tenendo conto della mia situazione "conoscitiva" ho agito così:
per il momento ho risolto aggiungendo una macro
Codice: Seleziona tutto
Sub copia()
Range("C20").Copy Range("D20")
End Sub

che copia la cella C20, in cui è riportato lo stesso dato
Codice: Seleziona tutto
Q:\SCANNERTR...\DOC UFF ....\PRATICHE

e lo copia in D20 (quella interessata).
Poi ho collegato la macro ad un pulsante con la dicitura "AGGIORNA PRATICHE" e così si aggiorna.
So che è una soluzione/accrocchio poco elegante, al limite della sciatteria e di sicuro prossimamente legherò la macro ad un evento worksheet change.

Immagine
Avatar utente
systemcrack
Utente Senior
 
Post: 400
Iscritto il: 27/07/17 09:40

Re: Aggiungere menù a tendina da lista variabile

Postdi systemcrack » 04/07/24 08:47

Ma quindi non è possibile far apparire il menù a tendina in D5 con il procedimento/confusione che ho imbastito?
Avatar utente
systemcrack
Utente Senior
 
Post: 400
Iscritto il: 27/07/17 09:40

Re: Aggiungere menù a tendina da lista variabile

Postdi Anthony47 » 04/07/24 09:17

Non ho capito...
Se crei un elenco dei file usando la formula =Elenca_File(D20;"pdf") poi quell'elenco puo' essere usato per una "convalida dati" usando "Consenti: da Elenco" e indicando come Origine la cella dove l'elenco e' inserito piu' il simbolo #, es =H1#, che equivale a dire "tutto l'elenco dinamico che comincia nella cella H1
Avatar utente
Anthony47
Moderatore
 
Post: 19326
Iscritto il: 21/03/06 16:03
Località: Ivrea

Re: Aggiungere menù a tendina da lista variabile

Postdi systemcrack » 04/07/24 09:22

Anthony47 ha scritto:Non ho capito...
Se crei un elenco dei file usando la formula =Elenca_File(D20;"pdf") poi quell'elenco puo' essere usato per una "convalida dati" usando "Consenti: da Elenco" e indicando come Origine la cella dove l'elenco e' inserito piu' il simbolo #, es =H1#, che equivale a dire "tutto l'elenco dinamico che comincia nella cella H1

Eh perchè vedo che continui a parlare di H1 mentre a me serve D5 :P
Ora faccio qualche prova e poi torno a disturbarti ;) :lol:

2min dopo:
Ok ho visto che se non uso come cella di partenza la 1 restituisce errore.
Avatar utente
systemcrack
Utente Senior
 
Post: 400
Iscritto il: 27/07/17 09:40

Re: Aggiungere menù a tendina da lista variabile

Postdi Anthony47 » 04/07/24 09:36

Tu crei un leneco di file; non hai detto dove crei questo elenco e io ho risposto circa "supponiamo che l'elenco sia creato in H1"; quindi =H1# punta a dove si trova l'elenco dei nome file.
Quindi la convalida (che crea il menu a tendina) mettila dove ti serve (anche in D5 :D ), e come origine dell'elenco gli metterai
Codice: Seleziona tutto
=IndirizzoCellaCheContieneLaFormulaCheGeneraLElencoDeiFile#
(es =H1# se l'elenco si genera in H1)
Avatar utente
Anthony47
Moderatore
 
Post: 19326
Iscritto il: 21/03/06 16:03
Località: Ivrea

Re: Aggiungere menù a tendina da lista variabile

Postdi systemcrack » 04/07/24 12:58

Anthony47 ha scritto:Tu crei un leneco di file; non hai detto dove crei questo elenco e io ho risposto circa "supponiamo che l'elenco sia creato in H1"; quindi =H1# punta a dove si trova l'elenco dei nome file.
Quindi la convalida (che crea il menu a tendina) mettila dove ti serve (anche in D5 :D ), e come origine dell'elenco gli metterai
Codice: Seleziona tutto
=IndirizzoCellaCheContieneLaFormulaCheGeneraLElencoDeiFile#
(es =H1# se l'elenco si genera in H1)

:lol: :lol: :lol: grazie Anthony per avermi fatto fare due risate, ma soprattutto per il consiglio.
Ho optato per aggiungere un foglio al progetto che ho chiamato "SCHEDATECNICA" e ho generato lì quello che serviva.. ora ho il menù a tendina in D5!!! ;)
Ne approfitto ( :lol: ) per chiederti.. ma c'è un modo per aumentare un pò la dimensione del font nella tendina?
Immagine
Avatar utente
systemcrack
Utente Senior
 
Post: 400
Iscritto il: 27/07/17 09:40

Re: Aggiungere menù a tendina da lista variabile

Postdi Anthony47 » 04/07/24 16:41

ma c'è un modo per aumentare un pò la dimensione del font nella tendina?
La risposta facile e' No

Una alternativa e' usare un controllo tipo "Casella di riepilogo" del gruppo ActiveX.
A questo punto:
a) crei il controllo e lo posizioni sopra D5 circa
b) crei un "Intervallo nominato" cui assegni il nome EFILE (per esempio), con ambito di validità=Cartella di lavoro, e che come riferimento gli dai =SCHEDATECNICA!IndirizzoCellaCheContieneLaFormulaCheGeneraLElencoDeiFile#, esempio =SCHEDATECNICA!$H$1# (i simboli $ sono obbligatori)
c) imposti le Proprietà della Casella di Riepilogo:
--Font, a piacere
--LinkedCell, D5
--ListFillRange, EFILE
d) inserisci questo codice nel modulo vba del foglio SCHEDA (siamo sul foglio SCHEDA, giusto?)
Codice: Seleziona tutto
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
If Target.Address = "$D$5" Then
    Me.ListBox1.Top = Target.Top
    Me.ListBox1.Left = Target.Left
    Me.ListBox1.Visible = True
    Me.ListBox1.Width = Target.Width * 2        '<<<
    Me.ListBox1.Height = Target.Height * 10     '<<<
Else
    Me.ListBox1.Visible = False
End If
End Sub

Private Sub ListBox1_DblClick(ByVal Cancel As MSForms.ReturnBoolean)
Range("D7").Select
End Sub

Vedi se quei *2 e *10 (righe marcate <<<) ti soddisfano, eventualmente cambia con oculatezza

A questo punto succedera che:
-quando selezioni D5 la Casella di riepilogo viene visualizzata, posizionata e ridimensionata per un piu' facile scorrimento
-quando clicchi su una voce, questa viene scritta in D5
-quando fai doppioclick su una voce, questa viene confermata in D5, il controllo viene nascosto e la selezione passa su D7

Attenzione pero' ad eventuali Sub Worksheet_Change che potrebbero intervenire quando viene compilata D5, o a Sub Worksheet_SelectionChange gia' presenti che va armonizzata con le funzioni contenute in questa aggiunta
Avatar utente
Anthony47
Moderatore
 
Post: 19326
Iscritto il: 21/03/06 16:03
Località: Ivrea

Re: Aggiungere menù a tendina da lista variabile

Postdi systemcrack » 04/07/24 19:15

Grazie per la dritta Anthony, essendo una cosa estetica e non di facile riuscita (per me), mi riservo la possibilità di ritornare su questo argomento in futuro quando magari la "struttura" del file sarà un pò più formata ed io avrò più le idee chiare. Per il momento mi sto concentrando sull'usabilità. Buona serata e grazie ancora. ;)
Avatar utente
systemcrack
Utente Senior
 
Post: 400
Iscritto il: 27/07/17 09:40

Re: Aggiungere menù a tendina da lista variabile

Postdi systemcrack » 09/07/24 13:23

Ciao Anthony, mi chiedevo.. ora nell'elenco viene fuori anche il tipo di file (.pdf) e mi chiedevo c'è un modo per non mostrare l'estensione (e che quindi non venga riportato in cella in caso di selezione)?
Faccio un esempio per semplificare.. ora nell'elenco compare:
Codice: Seleziona tutto
pratica/01.pdf
pratica/02.pdf
pratica/03.pdf

mentre io vorrei che venisse fuori
Codice: Seleziona tutto
pratica/01
pratica/02
pratica/03

Credo (e tengo a precisare anche in modo molto timido) che la parte di codice nella macro, che inizialmente ho fornito per l'elenco, da modificare sia questa:
Codice: Seleziona tutto
sFileExt = oFSO.GetExtensionName(oFile)

A questo punto se non sto sbagliando, mi basta omettere questa riga o va proprio modificata con altri valori?

2 min dopo:
Mi accorgo solo ora che quella parte viene richiamata successivamente da un IF
Codice: Seleziona tutto
 If sFileExt Like sEstensione Then

            i = i + 1

            ReDim Preserve arrFile(1 To i)

            arrFile(i) = oFile.Name

         End If

    Next oFile
Avatar utente
systemcrack
Utente Senior
 
Post: 400
Iscritto il: 27/07/17 09:40

Re: Aggiungere menù a tendina da lista variabile

Postdi Anthony47 » 09/07/24 15:41

Prima di rispondere vorrei capire quale sarebbe il vantaggio di questa cosa, perche' se non sbaglio il nome viene poi utilizzato per inserire il collegamento ipertestuale, dove serve il nome file completo
Avatar utente
Anthony47
Moderatore
 
Post: 19326
Iscritto il: 21/03/06 16:03
Località: Ivrea

Re: Aggiungere menù a tendina da lista variabile

Postdi systemcrack » 09/07/24 15:55

Anthony47 ha scritto:Prima di rispondere vorrei capire quale sarebbe il vantaggio di questa cosa, perche' se non sbaglio il nome viene poi utilizzato per inserire il collegamento ipertestuale, dove serve il nome file completo

Avere un testo più corto in quel campo e non avere "dati inutili" come il formato del file. Quello che interessa è la pratica.
Anche perchè il collegamento ipertestuale avviene tramite doppio click e non da selezione del menù.
Avatar utente
systemcrack
Utente Senior
 
Post: 400
Iscritto il: 27/07/17 09:40

Re: Aggiungere menù a tendina da lista variabile

Postdi Anthony47 » 09/07/24 17:21

Mah...
Nella Function Elenca_File fai questa aggiunta:
Codice: Seleziona tutto
                ReDim Preserve arrFile(1 To i)
                arrFile(i) = oFile.Name
                'Aggiungere queste 3 righe:
                If Right(arrFile(i), 4) = "." & sEstensione Then
                    arrFile(i) = Left(arrFile(i), Len(arrFile(i)) - 4)
                End If
                '<<Fine aggiunta
             End If
Avatar utente
Anthony47
Moderatore
 
Post: 19326
Iscritto il: 21/03/06 16:03
Località: Ivrea

Re: Aggiungere menù a tendina da lista variabile

Postdi systemcrack » 10/07/24 12:20

Semplicemente perfetta! Grazie Anthony!
Avatar utente
systemcrack
Utente Senior
 
Post: 400
Iscritto il: 27/07/17 09:40

Re: Aggiungere menù a tendina da lista variabile

Postdi systemcrack » 19/08/24 14:12

Ciao Anthony, torno sull'argomento perchè volevo chiederti se quando si apre il menù a tendina c'è un modo per cui nella lista appare sempre in cima l'ultimo file aggiunto alla lista invece che in ordine numerico?
Avatar utente
systemcrack
Utente Senior
 
Post: 400
Iscritto il: 27/07/17 09:40

Re: Aggiungere menù a tendina da lista variabile

Postdi Anthony47 » 20/08/24 00:10

In questo caso bisogna rivedere il codice della funzione per estrarre anche la data del file e poi per ordinare l'elenco su questa informazione addizionale
Il nuovo codice:
Codice: Seleziona tutto
Public Function Elenca_File_Data(ByVal sFolderPath As String, Optional sEstensione As String = "pdf", Optional ByVal sSort As Boolean = False) As Variant
Dim oFile As Object
Dim oFSO As Object
Dim oFolder As Object
Dim oFiles As Object
Dim arrFile() As Variant
Dim sFileExt As String
Dim I As Long
Dim J As Long, Tmp1, Tmp2
'
Set oFSO = CreateObject("Scripting.FileSystemObject")
Set oFolder = oFSO.GetFolder(sFolderPath)
Set oFiles = oFolder.Files
For Each oFile In oFiles
    sFileExt = oFSO.GetExtensionName(oFile)
    If sFileExt Like sEstensione Then
        I = I + 1
        ReDim Preserve arrFile(1 To 2, 1 To I)
        arrFile(1, I) = oFile.Name
        arrFile(2, I) = oFile.DateLastModified
        'Aggiungere queste 3 righe:
        If Right(arrFile(1, I), 4) = "." & sEstensione Then
            arrFile(1, I) = Left(arrFile(1, I), Len(arrFile(1, I)) - 4)
        End If
        '<<Fine aggiunta
     End If
Next oFile
If sSort Then
'bubble sort:
    For I = 1 To UBound(arrFile, 2) - 1
        For J = I + 1 To UBound(arrFile, 2)
            If arrFile(2, I) < arrFile(2, J) Then
                Tmp1 = arrFile(1, I): Tmp2 = arrFile(2, I)
                arrFile(1, I) = arrFile(1, J)
                arrFile(2, I) = arrFile(2, J)
                arrFile(1, J) = Tmp1: arrFile(2, J) = Tmp2
            End If
        Next J
    Next I
End If
'solo NomeFile:
arrFile = Application.WorksheetFunction.Index(arrFile, 1, 0)
Elenca_File_Data = Application.Transpose(arrFile)
End Function

Va richiamata con
Codice: Seleziona tutto
= Elenca_File_Data(Directory [; Optional Extension="pdf" [; Optional Sort=False]])


Esempi
Codice: Seleziona tutto
= Elenca_File_Data("C:\prova")           'legge i file pdf da C:\prova senza ordinare
= Elenca_File_Data(G2;"; "xls")          'Legge i file excel dalla directory in G2 senza ordinare
= Elenca_File_Data(G2; ;1)               'Legge i file pdf dalla directory in G2 e ordina


Prova...
Avatar utente
Anthony47
Moderatore
 
Post: 19326
Iscritto il: 21/03/06 16:03
Località: Ivrea

Re: Aggiungere menù a tendina da lista variabile

Postdi systemcrack » 20/08/24 13:44

Funziona perfettamente!!!
GRANDE ANTHONY!!!!
Avatar utente
systemcrack
Utente Senior
 
Post: 400
Iscritto il: 27/07/17 09:40


Torna a Applicazioni Office Windows


Topic correlati a "Aggiungere menù a tendina da lista variabile":


Chi c’è in linea

Visitano il forum: Nessuno e 14 ospiti