Condividi:        

ListBox (Modifiche & Co)

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

ListBox (Modifiche & Co)

Postdi BG66 » 19/12/21 20:47

Ciao a tutti,
come d'abitudine mi sono spinto oltre le mie capacità!!
https://www.dropbox.com/s/zlbpdrqsqkyltal/Form%20con%20menu.rar?dl=0

Al momento partendo da un file d'archivio del mitico @Marius44 ,ho solo sviluppato l'userform Formazione
Immagine

Vorrei imparare a:
1) Adattare la dimensione delle colonne nella ListBox
2) Filtrare risultato tenendo conto della categoria ( in pratica se apro la userform Formazione la listbox mi fa vedere solo le righe con la categoria Formazione
Immagine

3) Cliccando sul Frame1 (quello con l'immagine) aprire il collegamento ipertestuale ad un file che può avere estensioni differenti (principalmente excel, filemaker, word)
Immagine

4) Quello meno importante inserire delle icone accanto alla descrizione
Immagine

Grazie per l'aiuto
Gene
BG66
Excel2010
Avatar utente
BG66
Utente Senior
 
Post: 320
Iscritto il: 20/08/16 07:44

Sponsor
 

Re: ListBox (Modifiche & Co)

Postdi Anthony47 » 20/12/21 01:55

Vorrei imparare a:
1) Adattare la dimensione delle colonne nella ListBox
2) Filtrare risultato tenendo conto della categoria ( in pratica se apro la userform Formazione la listbox mi fa vedere solo le righe con la categoria Formazione
[...]
3) Cliccando sul Frame1 (quello con l'immagine) aprire il collegamento ipertestuale ad un file che può avere estensioni differenti (principalmente excel, filemaker, word)


Cerco di seguire il filo delle richieste...

Nel tuo codice, l'impostazione "larghezza colonne" viene fatta con una stringa precompilata:
Codice: Seleziona tutto
    ListBox1.ColumnWidths = "50;50;50;100;150;120;60;50;50;50;50;50;50;50;50;50;50;50"

Dobbiamo sostituire questa stringa con dei valori diversi. Ho immaginato che vuoi proporzionarli a quanto sono larghe le colonne del DataBase (con la notevole considerazione che nelle celle il testo puo' andare a capo, nel listbox no)

Ho creato la stringa delle larghezze con questa seqeanza:
Codice: Seleziona tutto
'Creazione stringa larghezza colonne:
wCoeff = 1                          '<<< mah...
For I = 1 To rng.Columns.Count
    wStr = wStr & ";" & Int(rng.Columns(I).Width * wCoeff)
Next I
wStr = Mid(wStr, 2)

Useremo poi wStr per impostare ColumnWidths

Se la larghezza delle colonne non e' fissa allora andranno riposizionate anche le label di intestazione, e l'ho fatto con questa sequanza:
Codice: Seleziona tutto
'Gestione posizionamento Label del Listbox:
LabArr = Array("Label10", "Label13", "Label15")     '<<< TUTTE le label, in sequenza
mySplit = Split(wStr, ";", , vbTextCompare)         'calcolo largezza di ogni colonna
PosiX = Me.ListBox1.Left                            'Posizione iniziale a sx
For I = 0 To UBound(LabArr)                         'Assegna posizione a ogni label
    Me.Controls(LabArr(I)).Left = PosiX + 10
    PosiX = PosiX + CSng(mySplit(I))
    If I > UBound(mySplit) Then Exit For           'Prudenziale
Next I
Nota che l'Array LabArr non contiene TUTTE le tue label, ma non dubito che hai capito come compilarlo

Per filtrare ho usato un Array che popolo col contenuto del DB solo se la descrizione collima con quella desiderata, col seguente codice:
Codice: Seleziona tutto
'Creazione Lista di caricamento ListBox
categ = "Formazione"
ReDim myList(1 To rng.Columns.Count, 1 To rng.Rows.Count)
For I = 1 To UBound(myList, 2)
    For j = 1 To UBound(myList)
        If UCase(rng.Cells(I, 2).Value) = UCase(categ) Then
            If j = 1 Then myind = myind + 1
            myList(j, myind) = rng.Cells(I, j)
        End If
    Next j
Next I
ReDim Preserve myList(1 To rng.Columns.Count, 1 To myind)

Useremo poi myList per popolare il listbox

Mettendo tutte queste cose insieme, la userform_initialize e' diventata:
Codice: Seleziona tutto
Private Sub UserForm_Initialize()
Dim I As Long, wStr As String, wCoeff As Single
Dim LabArr, mySplit, myList(), PosiX As Single

'    ListBox1.ColumnWidths = "50;50;50;100;150;120;60;50;50;50;50;50;50;50;50;50;50;50"
    Dim wks1 As Worksheet
    Dim uRow As Long
    Dim rng As Range
   
    Set wks1 = ThisWorkbook.Worksheets("DB")
    Set rng = wks1.Range("A1").CurrentRegion
'Creazione stringa larghezza colonne:
wCoeff = 1                          '<<< mah...
For I = 1 To rng.Columns.Count
    wStr = wStr & ";" & Int(rng.Columns(I).Width * wCoeff)
Next I
wStr = Mid(wStr, 2)
'Gestione posizionamento Label del Listbox:
LabArr = Array("Label10", "Label13", "Label15")     '<<< TUTTE le label, in sequenza
mySplit = Split(wStr, ";", , vbTextCompare)         'calcolo largezza di ogni colonna
PosiX = Me.ListBox1.Left                            'Posizione iniziale a sx
For I = 0 To UBound(LabArr)                         'Assegna posizione a ogni label
    Me.Controls(LabArr(I)).Left = PosiX + 10
    PosiX = PosiX + CSng(mySplit(I))
    If I > UBound(mySplit) Then Exit For           'Prudenziale
Next I
'Creazione Lista di caricamento ListBox
categ = "Formazione"
ReDim myList(1 To rng.Columns.Count, 1 To rng.Rows.Count)
For I = 1 To UBound(myList, 2)
    For j = 1 To UBound(myList)
        If UCase(rng.Cells(I, 2).Value) = UCase(categ) Then
            If j = 1 Then myind = myind + 1
            myList(j, myind) = rng.Cells(I, j)
        End If
    Next j
Next I
ReDim Preserve myList(1 To rng.Columns.Count, 1 To myind)
   
    With Me.ListBox1
        .ColumnCount = rng.Columns.Count
        .ColumnWidths = wStr
'        .List = rng.Value
        .List = Application.WorksheetFunction.Transpose(myList)
    End With
    Ricerca_txt.SetFocus
End Sub


Quanto all'hyperlink, il mio suggerimento e' che usi le Api di Windows per chiedere di aprire un certo file con la sua applicazione di default.
A questo scopo inserirai IN TESTA al modulo dove userai questa prestazione la seguente dichiarazione:
Codice: Seleziona tutto
#If VBA7 Then
   Private Declare PtrSafe Function ShellExecute Lib "shell32.dll" Alias "ShellExecuteA" ( _
        ByVal hwnd As LongPtr, ByVal lpOperation As String, ByVal lpFile As String, _
        ByVal lpParameters As String, ByVal lpDirectory As String, ByVal nShowCmd As Long) As LongPtr
#Else
   Private Declare Function ShellExecute Lib "shell32.dll" Alias "ShellExecuteA" ( _
        ByVal hwnd As Long, ByVal lpOperation As String, ByVal lpFile As String, _
        ByVal lpParameters As String, ByVal lpDirectory As String, ByVal nShowCmd As Long) As Long
#End If

Poi quando serve userai istruzioni di questo tipo:
Codice: Seleziona tutto
    ftopen =Userform1. TextBox4.Text                   '<<< E' un Esempio!
    lngX = ShellExecute(vbNull, "Open", ftopen, "", "", vbMaximizedFocus)


Quanto alla richiesta di avere delle icone accanto (credo di aver capito) al "menu" che si apre cliccando su Form non ti so aiutare, perche' non ho le abilita' per creare "menus déroulants"; vedo che e' derivato da un lavoro di Michel Pierron ma googlando (senza dannarmi) non ho trovato nulla che mi illuminasse

Ciao
Avatar utente
Anthony47
Moderatore
 
Post: 19228
Iscritto il: 21/03/06 16:03
Località: Ivrea

Re: ListBox (Modifiche & Co)

Postdi BG66 » 21/12/21 22:17

Ciao Anthony,
ho provato ad applicare tutte le tue indicazioni ma sono in difficoltà sulla parte hyperlink.
In pratica (vedi file allegato), spero di:
1) aver correttamente inserito lo script "#If VBA7 Then..etc "all'inizio del modulo Formaz.
2) non ho capito cosa intendi e quindi come rendere operativa la parte:
Anthony47 ha scritto:Poi quando serve userai istruzioni di questo tipo:
ftopen =Userform1. TextBox4.Text '<<< E' un Esempio!
lngX = ShellExecute(vbNull, "Open", ftopen, "", "", vbMaximizedFocus)

Devo creare un pulsante o legarlo al Frame1 ma come?

https://www.dropbox.com/s/07oljasagkol3cy/prove_forum.rar?dl=0


PS La colonna categoria ha tanto spazio. Come la sistemo??
Immagine


Grazie per la pazienza!!
Gene
BG66
Excel2010
Avatar utente
BG66
Utente Senior
 
Post: 320
Iscritto il: 20/08/16 07:44

Re: ListBox (Modifiche & Co)

Postdi Anthony47 » 21/12/21 23:41

Non so che interfaccia utente hai disegnato; visto che siamo su una userform immagino che la visualizzazione del documento sia legato a un qualche click su qualche controllo, es Frame1 (come avevi scritto), usando il suo evento "Click":
Codice: Seleziona tutto
Private Sub Frame1_Click()
    ftopen = UserForm1.TextBox4.Text                   '<<< E' un Esempio!
    lngX = ShellExecute(vbNull, "Open", ftopen, "", "", vbMaximizedFocus)
End Sub

Magari puoi usare ControlTipText del frame per "suggerire" di cliccare per visualizzare il documento.

Ma non escludo che possa essere piu' efficace un pulsante aggiunto da qualche parte; vedo che Textbox4 ha come etichetta "Nome file", se e' quello il file da aprire magari metti il pulsante lì accanto.

La dichiarazione e' inserita correttamente.

PS La colonna categoria ha tanto spazio. Come la sistemo??
Avevi chiesto come "Adattare la dimensione delle colonne nella ListBox" e ti ho mostrato come puoi adattarle alla larghezza delle colonne del Database; quindi se la colonna nel listbox e' troppo larga e' perche' anche nel database quella colonna e' moolto larga. Se la restringi (sul foglio DB) si restringera' anche sul listbox

Ciao
Avatar utente
Anthony47
Moderatore
 
Post: 19228
Iscritto il: 21/03/06 16:03
Località: Ivrea

Re: ListBox (Modifiche & Co)

Postdi BG66 » 24/12/21 06:31

Ciao Anthony e BUON quasi NATALE...,
speravo che l'allontanamento da excel per un certo periodo mi avesse arrugginito.... invece inizio a pensare che il problema sia un rinco...galoppante :evil:

In pratica ho provato sia dal frame che creando un pulsante apposito a far aprire un file di prova ma senza esito:
Questo è il tuo esempio:
Anthony47 ha scritto:
Codice: Seleziona tutto
Private Sub Frame1_Click()
    ftopen = UserForm1.TextBox4.Text                   '<<< E' un Esempio!
    lngX = ShellExecute(vbNull, "Open", ftopen, "", "", vbMaximizedFocus)
End Sub



Contestualizzato sarebbe cosi:
Codice: Seleziona tutto
Private Sub cmbApri_Click()
ftopen = Formaz.TextBox5.Text                   '<<<
    lngX = ShellExecute(vbNull, "Open", ftopen, "", "", vbMaximizedFocus)
End Sub

https://www.dropbox.com/scl/fi/q437hw3o5cdkbaz3uitdq/Menu-v.4.1.1.xlsm?dl=0&rlkey=0uwbg3qzzcwjbqfozmuh4e1im

Ho provato anche inserendo alla fine un
Codice: Seleziona tutto
unload me
perchè avevo il dubbio che la userform aperta creasse un conflitto.

Non capisco dove sbaglio!

Grazie se puoi
Gene
BG66
Excel2010
Avatar utente
BG66
Utente Senior
 
Post: 320
Iscritto il: 20/08/16 07:44

Re: ListBox (Modifiche & Co)

Postdi Anthony47 » 24/12/21 13:11

A me funziona correttamente:
-Con le tue istruzioni, se in TextBox5 c'e' un percorso valido, il pulsante visualizza quel percorso aprendo Esplora risorse
-Se metto in TextBox4 anche un nome file e modifico il codice in
Codice: Seleziona tutto
ftopen = Formaz.TextBox5.Text & Me.TextBox4.Text               
allora mi apre il file nominato in TextBox4; provato con varie estensioni.

OVVIAMENTE deve esistere un Separatore tra Percorso e NomeFile; es D:\DDownloads\Allegato_2021-08-26_15-38-59_A.pdf
Se manca, allora il comando non fa nulla senza ulteriori messaggi (bisognerebbe interpretare la variabile lngX per determinare l'esito)
Ti si accende qualche lucina?

Ciao
Avatar utente
Anthony47
Moderatore
 
Post: 19228
Iscritto il: 21/03/06 16:03
Località: Ivrea

Re: ListBox (Modifiche & Co)

Postdi BG66 » 25/12/21 21:39

Anthony47 ha scritto:OVVIAMENTE deve esistere un Separatore tra Percorso e NomeFile; es D:\DDownloads\Allegato_2021-08-26_15-38-59_A.pdf
Se manca, allora il comando non fa nulla senza ulteriori messaggi (bisognerebbe interpretare la variabile lngX per determinare l'esito)
Ti si accende qualche lucina?


Purtroppo la lucina mi si era accesa e avevo provato a mettere "\" in differenti incroci:
1) alla fine del percorso nella textbox 4: C:\Users\DirStab\Desktop\Form con menu\prove\
con la textbox 5 : prova.xlsm
2) toglierla alla fine del percorso nella textbox 4: C:\Users\DirStab\Desktop\Form con menu\prove
inserirla nella textbox 5 : \prova.xls

Prove tutte infruttuose. Ottengo l'apertura della cartella ma non del file :oops:

Quindi per il momento...Buon Natale e Buon Anno ..al buio :lol:
Gene
BG66
Excel2010
Avatar utente
BG66
Utente Senior
 
Post: 320
Iscritto il: 20/08/16 07:44

Re: ListBox (Modifiche & Co)

Postdi Anthony47 » 26/12/21 12:13

Forse una lucina si e' accesa in me...
Non so che S.O. usi, ma ricordo che in passato avevo problemi con percorsi che avevano degli Spazi, cosa che non mi succede con Win10

Prova a modificare ftopen = etc etc in questo modo:
Codice: Seleziona tutto
ftopen = Chr(34) & Formaz.TextBox5.Text & Me.TextBox4.Text & Chr(34)
Magari...

Buone feste
Avatar utente
Anthony47
Moderatore
 
Post: 19228
Iscritto il: 21/03/06 16:03
Località: Ivrea

Re: ListBox (Modifiche & Co)

Postdi BG66 » 26/12/21 20:06

Ciao Anthony,
anch'io ho W10 ma anche con la modifica non apro il file....
Per qualche giorno sarò senza PC e quindi ci penserò al ritorno.

Buone feste anche a te.

Grazie e alla prossima.
Gene
BG66
Excel2010
Avatar utente
BG66
Utente Senior
 
Post: 320
Iscritto il: 20/08/16 07:44


Torna a Applicazioni Office Windows


Topic correlati a "ListBox (Modifiche & Co)":

Annullamento modifiche
Autore: ianus
Forum: Software Windows
Risposte: 5

Chi c’è in linea

Visitano il forum: Nessuno e 76 ospiti