Passato il Natale tra i soliti riti pagani, i giorni di festa mi hanno consentito di riprendere anche questo argomento rimasto indietro...
Il tuo messaggio privato ha chiarito alcune cose, salvo che hai continuato a parlare di una cosa che io non ho seguito e quindi non conosco (la "soluzione Alfredo"). Ho anche un grosso dubbio su quali siano i tuoi dati di partenze e che cosa vuoi ottenere.
Volendo pero' evitare di tornare a chiedere ti do' qualche suggerimento a caso che indirizzano cose che non quadrano qua e la', sperando che siano un utile spunto.
Mi pare che UPFE2 sia il file piu' vicino alla tua situazione, quindi ignorero' gli altri due file; come pure mi pare che parliamo di quanto gira attorno alla UserForm1, pertanto ignorero' la userform Straordinari.
Con queste premesse, a caso alcuni commenti:
1-Non ho capito perche' si e' scelto di usare un textbox e un listbox, e non direttamente un ComboBox che per definizione e' l'unione tra i due.
2-Se usi un listbox (o un combobox) multicolonne allora il caricamento deve avvenire su tutte le colonne.
3-Nella Private Sub UserForm_Activate non ha senso fare un caricamento tramite la mCaricaListBox e poi caricare usando la proprieta' RowSource; la seconda (multicolonna) rende inutile la prima (monocolonna)
4-Avendo fatto la scelta tramite la listbox (o la combobox) e' inutile (anzi dannoso) popolare poi l'elenco usando la Application.WorksheetFunction.VLookup; si prendera' invece direttamente il contenuto della riga selezionata.
Alla luce di questi commenti, tralasciando il n° 1 (che suggerirebbe di ridisegnare la userform adattando tutte le macro all'uso di un ComboBox) e quindi rimanendo col Textbox e il ListBox, gli interventi che propongo sono:
A- Inserire sulla Userform1 (GestionDati) un pulsante che attiva l'inserimento sul foglio della voce selezionata nella ListBox; questo consente all'utente di Selezionare una voce, esaminare la scelta fatta, e (se la scelta lo convice) inserire la voce sull'elenco di Foglio3. Tutto cio' in sostituzione dell'uso dell'evento ListBox1_Click, che secondo me non consente nemmeno di capire quale voce e' stata cliccata; le azioni ora previste nella Sub ListBox1_Click vengono quindi spostate sul click del CommandButton, mentre in una nuova Sub ListBox1_Click viene solo inserita l'abilitazione del Commandbutton di inserimento, che nel mio test e' stato chiamato CBPrendi:
- Codice: Seleziona tutto
Private Sub ListBox1_Click()
CBPrendi.Enabled = True
End Sub
B- Considerando quanto appena detto al punto A e al punto 4 prima, al CommandButton viene associata la seguente MACRO:
- Codice: Seleziona tutto
Private Sub CBPrendi_Click()
Dim J As Long
'
Application.EnableEvents = False
Range("B1000").End(xlUp).Offset(1, 0).Select
ActiveCell.Value = UserForm1.ListBox1.List(UserForm1.ListBox1.ListIndex, 0)
ActiveCell.Offset(0, -1).Value = UserForm1.ListBox1.List(UserForm1.ListBox1.ListIndex, 1)
For J = 2 To UserForm1.ListBox1.ColumnCount - 1
ActiveCell.Offset(0, J - 1).Value = UserForm1.ListBox1.List(UserForm1.ListBox1.ListIndex, J)
Next J
UserForm1.TextBox1.Value = ""
UserForm1.Hide
Application.EnableEvents = True
End Sub
C- Eliminare dalla Private Sub UserForm_Activate il caricamento tramite mCaricaListBox, limitandosi al solo uso della RowSource:
- Codice: Seleziona tutto
Private Sub UserForm_Activate()
Dim ur As Long
ur = Sheets("Foglio4").Range("A65536").End(xlUp).Row
ListBox1.RowSource = "Foglio4!A1:J" & ur
ListBox1.ColumnWidths = "67;30;40;90;35;42;40;40;40"
End Sub
D- Poiche' la Sub mCaricaListBox e' progettata per inserire dati in un controllo monocolonna (mentre il listbox e' multicolumn) la eliminiamo, e inseriamo all'interno della Sub TextBox1_Change il necessario per ripopolare il listbox multicolumn.
- Codice: Seleziona tutto
Private Sub TextBox1_Change()
Dim lastR As Long, myList(), I As Long, J As Long, JJ As Long
'
If Len(TextBox1.Text) > 0 Then
CBPrendi.Enabled = False
Else
CBPrendi.Enabled = True
End If
With ThisWorkbook.Worksheets("Foglio4")
lastR = .Cells(Rows.Count, 1).End(xlUp).Row
ReDim myList(1 To 10, 1 To lastR)
For I = 2 To lastR
If InStr(1, .Cells(I, 1).Value, UserForm1.TextBox1.Text, vbTextCompare) > 0 Then
JJ = JJ + 1
For J = 1 To 10
myList(J, JJ) = .Cells(I, J)
Next J
End If
Next I
End With
ReDim Preserve myList(1 To 10, 1 To JJ)
ListBox1.RowSource = ""
ListBox1.List = Application.WorksheetFunction.Transpose(myList)
End Sub
Si noti che in questo modo, le colonne che indicano degli orari potrebbero risultare praticamente illegibili (visualizzate come numeri decimali, secondo lo standard Excel di rappresentazioe delle ore); se queste colonne sono importanti per determinare la scelta da fare allora bisognera' modificare sia il caricamento nel listbox che nell'elenco di foglio3; se invece fossero superflue bastera' nascondere queste colonne dal listbox. In ambedue i casi quindi e' previsto un qualche intervento, che al momento non ho fatto.
La nuova userform1 e' descritta in questi file:
https://www.dropbox.com/s/gp3zg0yh6gwbg ... 1.frm?dl=0https://www.dropbox.com/s/j4z8hk3q22pst ... 1.frx?dl=0Scaricali sul tuo Pc, quindi rimuovi (in
una copia del tuo file UPFE2.xls) la userform1 e importa il file 4ENRICO_UserForm1.frm che creera' la NUOVA userform col suo codice.
Nel modulo di codice della userform c'e' anche una Sub m() che ho lasciato perche' non so a che serve
Prova quanto detto e vediamo se andiamo nella direzione giusta...