Risolto Convalida dati e formule o ComboBox e VBA?

Rothdar

Utente junior
13 Settembre 2020
42
8
365 ProPlus
2
Buonasera a tutti,
mi sono sempre approcciato ad Excel in maniera abbastanza superficiale, ma è qualche anno che ne ho scoperto le funzionalità infinite "sommerse". Da qualche giorno bazzico su questo bellissimo forum, in cerca di risposte a "piccoli" quesiti, grazie alle cui risposte ho imparato qualcosa di nuovo, ma credo di avere ancora un po' di confusione riguardo l'approccio da utilizzare per questo mio piccolo progetto che porto avanti da un paio di anni e che modifico sporadicamente (solitamente in questo periodo).

PREMESSA
Si tratta di una sorta di gestionale per aste del Fantacalcio, la premessa è necessaria per spiegare chiaramente il mio problema. Sostanzialmente la cartella excel si collega a un CSV in cloud del maggiore fornitore di servizi per il Fantacalcio, effettua una query ed aggiorna, ad ogni apertura del file, gli elenchi relativi ai giocatori divisi per ruolo. Ci sono 4 tabelle distribuite su 4 pagine (Tabella_Portieri su foglio Portieri, Tabella_Difensori su foglio Difensori, Tabella_Centrocampisti su foglio Centrocampisti, Tabella_Attaccanti su foglio Attaccanti).

Il mio progetto è sicuramente un passatempo, ma essendo molto in voga mi piacerebbe aiutare tutti coloro che vogliono organizzare un'asta con un gestionale non troppo difficile da utilizzare e quanto più automatizzato possibile.

Il famoso fornitore di servizi per il Fantacalcio da la possibilità a differenza degli scorsi anni di importare le rose relative alle singole squadre utilizzando un file CSV che contenga consecutivamente nome della squadra, giocatore acquistato e crediti spesi per l'acquisto. Ovviamente è necessario per compilare correttamente tale CSV avere nella pagina principale dei valori conservati in delle celle.

OBIETTIVO
La struttura della pagina principale dovrebbe permettere la selezione per ogni partecipante, di un giocatore da un menu a tendina (popolato dalle tabelle dinamiche sulle altre pagine), magari fornito di ricerca e di autocompletamento partendo dalle iniziali. Inoltre ogni giocatore dovrebbe essere selezionabile una singola volta, per poi sparire dal menu a tendina.

PROBLEMA
Nel mio caso è più indicato l'utilizzo di un Convalida dati, di una ComboBox "Controlli Modulo" o di una ComboBox "Controlli ActiveX" ?

Spero di aver posto la domanda nella sezione più idonea, essendo un quesito "interdisciplinare"... Credo sia meglio farsi consigliare da chi ha un quadro più ampio piuttosto che vagare nel vuoto (essendomi approcciato da poco alle Macro e al VBA) sperando di trovare la soluzione con diversi tentativi.

Grazie mille in anticipo, mi scuso per la quantità di discussioni aperte in questi giorni. Spero di poter ricambiare tanta pazienza mettendo a disposizione di quanti vorrano il file terminato nell'apposita sezione.
 

ges

Excel/VBA Expert
Amministratore
21 Giugno 2015
27.720
1.865
Como
2011MAC 365WIN
774
Ciao,
Nel mio caso è più indicato l'utilizzo di un Convalida dati, di una ComboBox "Controlli Modulo" o di una ComboBox "Controlli ActiveX" ?
da quel che ho capito penso che siano tutti idonei allo scopo anche se i controlli activex sono i più completi avendo a disposizione numerose proprietà.
 
  • Like
Reactions: Rothdar

Rothdar

Utente junior
13 Settembre 2020
42
8
365 ProPlus
2
Buonasera ges @ges , scegliendo di partire da ComboBox "Controlli ActiveX", dovrei creare tante CB quante sono le celle del tabellone da riempire? Oppure c'è un modo di "attivare" la CB (che in questo caso immagino sarebbe una) al click della casella da riempire?
 

ges

Excel/VBA Expert
Amministratore
21 Giugno 2015
27.720
1.865
Como
2011MAC 365WIN
774
Direi che avere tante combobox non è il massimo, si potrebbe fare che su determinate celle che ti serve al click si attiva la combobox e ti fa scegliere.
 
  • Like
Reactions: Rothdar

Rothdar

Utente junior
13 Settembre 2020
42
8
365 ProPlus
2
OBIETTIVO
La struttura della pagina principale dovrebbe permettere la selezione per ogni partecipante, di un giocatore da un menu a tendina (popolato dalle tabelle dinamiche sulle altre pagine), magari fornito di ricerca e di autocompletamento partendo dalle iniziali. Inoltre ogni giocatore dovrebbe essere selezionabile una singola volta, per poi sparire dal menu a tendina.
ges @ges per caso ha consigli in merito su progetti da cui partire? O "argomenti" del VBA da studiare? Diciamo che per studiare ogni singolo pezzo di progetto è necessario che io parta dal cercare "quello che voglio fare" capire "come si chiama la tecnica utilizzata" ed infine "capire il funzionamento della tecnica" :confusostelle:

Chiedo scusa per il disorientamento da neofita MiInchino
 

alfrimpa

VBA Expert
Supermoderatore
18 Dicembre 2015
29.883
1.845
67
Napoli
2019 Pro Plus
821
Rothdar @Rothdar

Direi che non è necessario inserire tante combobox ne può bastare una e farla spostare sulla cella attiva come ti ho giá fatto vedere nella precedente discussione (ti sei studiato un po’ il codice per capire come funziona?).

Poi i modi come diceva ges @ges possono diversi.

Poi bisogna gestire tale combobox con il VBA.
 
Ultima modifica:
  • Like
Reactions: Rothdar

Rothdar

Utente junior
13 Settembre 2020
42
8
365 ProPlus
2
Direi che non è necessario inserire tante combobox ne può bastare una e farla spostare sulla cella attiva come ti ho giá fatto vedere nella precedente discussione (ti sei studiato un po’ il codice per capire come funziona?).
Sì sì, ho snocciolato il codice, e ne ho capito il funzionamento (nello specifico per il popolamento). Tuttavia rimaneva il mio dubbio in merito alla possibilità di collegare una singola CB a più celle da riempire, visto che dalle proprietà è possibile selezionare solo una cella associata. Ovviamente immagino la soluzione sia individuabile nell'utilizzo del VBA come da lei suggerito.

Tra l'altro ho ricercato altri modi di popolare la CB tra cui questo:

Visual Basic:
Private Sub ComboBox1_GotFocus()
ComboBox1.ColumnCount = 1

Dim myTable As ListObject
Dim myArray As Variant

Set myTable = Worksheets("Portieri").ListObjects("Tabella_Portieri")

myArray = myTable.ListColumns(5).DataBodyRange

ComboBox1.List = myArray
End Sub
Mi sono reso conto che concettualmente non avevo ben chiara la logica della CB, venendo da un lungo utilizzo del "Convalida dati" (ove i dati, una volta selezionati vengono automaticamente stipati nella cella associata), pertanto avevo necessità di chiarimenti riguardo la idoneità d'utilizzo delle CB nello specifico contesto (nella mia mente, proprio come nel convalida dati, ogni menu doveva corrispondere a una cella).

Grazie mille della disponibilità come sempre!
 

alfrimpa

VBA Expert
Supermoderatore
18 Dicembre 2015
29.883
1.845
67
Napoli
2019 Pro Plus
821
Non c’è bisogno di collegare una o più celle alla combobox.

Basta selezionare la cella dove si vuole inserire il calciatore e da codice dire di inserire il valore scelto nella combo nella cella attiva.

Rimane da risolvere il problema dell’eliminazione nella combo di un nome già scelto; al momento non ho ancora trovato il modo.
 
  • Like
Reactions: Rothdar

Rothdar

Utente junior
13 Settembre 2020
42
8
365 ProPlus
2
Rimane da risolvere il problema dell’eliminazione nella combo di un nome già scelto; al momento non ho ancora trovato il modo.
A proposito di ciò, per adesso, avendo più confidenza con le formule ho optato per un metodo "misto" CB/Formule.

Ho popolato la CB in questo modo

Visual Basic:
Private Sub ComboBox1_GotFocus()
ComboBox1.ColumnCount = 1

Dim myTable As ListObject
Dim myArray As Variant

Set myTable = Worksheets("Portieri").ListObjects("Tabella_Portieri")

myArray = myTable.ListColumns(5).DataBodyRange

ComboBox1.List = myArray
End Sub
Tuttavia non l'ho popolata dalla seconda colonna della tabella nella pagina "Portieri", ma da una quinta colonna inserita in coda alla colonna, riempita a partire dalla prima cella in questo modo:

=SE.ERRORE(INDICE([Giocatore];PICCOLO(SE(CONTA.SE(Tabellone!$B$8:$U$10;[Giocatore])=0;RIF.RIGA([Giocatore])-RIF.RIGA($B$2)+1);RIGHE($E$2:E2)));"")

Andando a verificare le celle già riempite nella pagina "Tabellone", se un nome viene trovato, è automaticamente escluso da quest'ultima colonna, andando così (partendo dalla colonna aggiornata) a popolare i successivi dropdown con l'intervallo ridefinito.
 

Rothdar

Utente junior
13 Settembre 2020
42
8
365 ProPlus
2
Quindi la discussione può considerarsi risolta?
Se posso permettermi di chiedere un'ultima cosa a proposito della CB, ho usato questo codice per svuotarla cliccando il tasto canc:

Visual Basic:
Private Sub ComboBox1_KeyDown(ByVal KeyCode As MSForms.ReturnInteger, ByVal Shift As Integer)

    If KeyCode = 46 Then
        Me.ComboBox1.Value = vbNullString
    End If

End Sub
Esiste un modo analogo per "confermare" il nome suggerito cliccando il tasto "Enter" ed uscire dalla CB?
 

alfrimpa

VBA Expert
Supermoderatore
18 Dicembre 2015
29.883
1.845
67
Napoli
2019 Pro Plus
821
Se 46 è il codice del tasto Canc bisogna vedere quale è quello del tasto Enter.

Usa il tuo codice visualizzando con un msgbox il codice di Enter.
 

Rothdar

Utente junior
13 Settembre 2020
42
8
365 ProPlus
2
Il keycode dovrebbe essere 13, solo che non trovo da nessuna parte un evento idoneo da associare alla pressione (per confermare e lasciare la CB). Consigli su dove ricercare?
 

Rothdar

Utente junior
13 Settembre 2020
42
8
365 ProPlus
2
Chiedo scusa per la poca chiarezza.

Cominciando a digitare un nome presente nell'elenco, l'autocompletamento mostra il nome per l'appunto grazie all'autocompletamento (Es. BUFFON) tuttavia per confermare il nome e abbandonare la ComboBox è necessario cliccare su un'altra cella ad esempio. Solo in questo caso la CB inserisce il valore "BUFFON" nella cella prescelta.

Sarebbe utile, grazie alla pressione del tasto invio confermare il valore (in modo che venga conservato nella cella) e "abbandonare" il focus della CB.


Grazie mille.
 

alfrimpa

VBA Expert
Supermoderatore
18 Dicembre 2015
29.883
1.845
67
Napoli
2019 Pro Plus
821
Prova così (è un tentativo)

Visual Basic:
Private Sub ComboBox1_KeyDown(ByVal KeyCode As MSForms.ReturnInteger, ByVal Shift As Integer)
Dim voce As String
    If KeyCode = 13 Then
        voce = Me.ComboBox1.Value
        Me.ComboBox1.Value = vbNullString
        ActiveCell.Value = voce
        ActiveCell.Select
    End If
End Sub
 

Sostieni ForumExcel

Aiutaci a sostenere le spese e a mantenere online la community attraverso una libera donazione!