ComboBox in Userform



  • ComboBox in Userform
    di Jellyfish data: 11/10/2012 20:12:03

    Nooooooooooooooooooo!!! So per rinunciare ad usare le UserForm!!!

    Ho una combobox con la quale scelgo un numero da 1 a 30. Il valore viene inserito in un una cella. Io uso quella cella in una formula.

    Dopo che effettuo la prima scelta la formula si cancella e mi mette il risultato.

    Se io cambio idea e seleziono un altro numero nella combo la mia formula non si aggiorna perchè non eiste più così mi ritrovo il vecchio valore

    Perchè???



  • di Vecchio Frac data: 11/10/2012 20:21:05

    LOL :)
    Ovviamente se la cella con formula viene sostituita dal valore scelto, la formula non esiste più.
    Quindi devi lasciar stare la cella con formula e valorizzare una cella diversa con il numero restituito dalla scelta della combo.
    Ti conviene, forse di più, non mettere formule nelle celle ma calcolare al volo nel codice il valore da inserire nella cella di destinazione. La formula ovviamente la devi tradurre in VBA style :)





  • di Jellyfish data: 11/10/2012 22:36:48


    Forse non mi sono spiegata o non ho capito... ma io ho messo la scelta della combo in una cella (es:A1) e poi uso la cella A1 in una formula contenuta in un'altra cella (es:A2). perche la formula nella cella A1 sparisce e rimanle solo il risultato???



  • di HarryBosch data: 12/10/2012 01:35:14

    No Jellyfish! Non rinunciare alle Form che sono così simpatiche ^_^

    Però c'è qualcosa di ritorsivo nel tuo discorso:
    - "uso la cella A1 in una formula contenuta in altra cella (A2)": quindi si deduce che usi il valore di A1 nella formula inserita in A2
    - "perché la formula nella cella A1 sparisce..": ma allora non c'è un valore in A1?! c'è una formula?

    Allora, io credo che hai due formule, sia in A1 che in A2:
    - la formula inserita in A2 ha quindi un riferimento al valore determinato dalla formula inserita in A1.

    Se così fosse (ma le mie sono ipotesi notturne, probabilmente un pò offuscate) si potrebbe risolvere:
    - o "trasferendo" la formula presente nella cella A1 all'interno della formula presente in A2
    - oppure, come già suggerito da VecchioFrac, trascrivere la formula nel VBA style (per dirla alla sua ^_^ ): non riporti il valore nella cella (che appunto ti cancella la formula!) ma lo usi direttamente nella funzione che scriverai nella combo; se ci dici tale formula vediamo di costruire il pezzettino di codice che ti serve.



  • di Jellyfish data: 12/10/2012 08:43:18

    Emmmmmm... Avete ragione! Forse era tardi anche per me.

    Non c'è nessuna formula nella cella A1 la formula è nella A2

    Nella A1 ci va il valore della combo

    Nella A2 ci va una formula che usa il valore della A1

    Alla prima scelta A1 viene riempita e A2 calcola ma mi mette solo il risultato, la formula sparisce.

    La cosa strana è che ho un caso come questo nella stessa form con combo diverse e formule diverse e celle diverse, lì funziona e nel caso che vi ho detto no!!!

    L'unica differenza è che nel caso che non funziona il risultato della formula viene mostrato nella form con un TextBox nell'altro caso no... potrebbe essere lì il problema?

    potrei mettere la formula nella TextBox in "vba style"

    La formula è questa:

    =IFERROR(HLOOKUP(K8;Processi_numerosità;5;0);"")

    Io continuo le mie prove... non mi arrendo!




  • di Jellyfish data: 12/10/2012 09:00:46

    SI credo che il problema sia che voglio mostrare il risultato di quella formula nell Textbox e forse anche che quella Textbox dipende dalla combobox.

    Sbaglio ad usare la textbox? cosa posso usare? un label? ma come lo linko alla cella?



  • di HarryBosch data: 12/10/2012 10:42:41

    L'uso della textbox andrebbe benissimo (quando hai diversi dati, soprattutto incolonnati, anche le listbox diventano utili).

    Puoi postare l'estratto del codice che riporta il valore nella cella A1?
    Così risolviamo il problema alla fonte :)

    Perchè se assegni semplicemente il valore della combo alla cella A1 non interferisci in nessun modo con la formula presente in A2; probabilmente, è come accenni adesso, ovvero, quando tenti di mostrare (nella textbox) il valore determinato dalla formula di A2, c'è qualcosa che va a sovrascrivere la cella in questione.



  • di Jellyfisk (utente non iscritto) data: 12/10/2012 11:54:06

    Per la celle A1 il riferimento l'ho messo in proprietà del Combo box in "Control Source"
    Per la cella A2 il riferimento l'ho messo in proprietà del TextBox in "Control Source"

    Gli unici codice che ci sono in riferimento alla form sono
     
    Private Sub UserForm_Initialize()
    
    Dim OrdineRBP As Integer
    Dim LivelloScelto As Integer
    
    OrdineRBP = Array("1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15", "16", "17", "18", "19", "20")
    
    LivelloScelto = Array("1", "2", "3", "4", "5", "6", "7", "8")
    
    For Each Combo In Me.Controls
        If LCase(Left(Combo.Name, 8)) = "combobox" Then
            Combo.List = OrdineRBP
        End If
    Next
    
    For Each Combo In Me.Controls
        If LCase(Left(Combo.Name, 8)) = "boxcombo" Then
            Combo.List = LivelloScelto
        End If
    Next
    
    For Each check In Me.Controls
        If LCase(Left(check.Name, 8)) = "checkbox" Then
            check = 0
        End If
    Next
    
    
    'Non mostrare la combo quando non c'è il flag
    
        If CheckBox1 = 0 Then
        ComboBox1.Visible = False
        Else
        ComboBox1.Visible = True
        End If
        
        If CheckBox2 = 0 Then
        ComboBox2.Visible = False
        Else
        ComboBox2.Visible = True
        End If
        
        If CheckBox3 = 0 Then
        ComboBox3.Visible = False
        Else
        ComboBox3.Visible = True
        End If
    
    PER 24 volte!!!
    
    
    e euste PRIVATE SUB sempre per 24 volte
    
    Private Sub CheckBox1_Click()
    
    If CheckBox1 = 0 Then
    ComboBox1.Visible = False
    Boxcombo1.Visible = False
    Else
    ComboBox1.Visible = True
    Boxcombo1.Visible = True
    End If
    
    End Sub
    
    Private Sub CheckBox2_Click()
    
    If CheckBox2 = 0 Then
    ComboBox2.Visible = False
    Boxcombo2.Visible = False
    Else
    ComboBox2.Visible = True
    Boxcombo2.Visible = True
    End If
    
    End Sub



  • di Vecchio Frac data: 12/10/2012 12:00:34

    Temo che, con una certa cortese sollecitudine, dovrò illustrarti la tecnica delle classi per simulare gli array di controlli ^_^
    Nota tecnica: se sono numeri quelli che metti negli Array, ometti pure le virgolette, risparmi digitazione e tempo :)

    Per intanto però ricordati che puoi sostituire il lungo e pedante codice

    If CheckBox1 = 0 Then
    ComboBox1.Visible = False
    Else
    ComboBox1.Visible = True
    End If

    con questo, più semplice:

    ComboBox1.Visible = (CheckBox1 = 0)

    che fa la stessa cosa (ma te lo avevo già illustrato).







  • di HarryBosch data: 12/10/2012 13:41:33

    Adesso è chiaro :) Hai usato una proprietà del controllo.
    COUNTROL SOURCE può essere utile se vuoi visualizzare nel form un valore che si trova sempre nella stesa cella: ma se modifichi il valore
    all'interno del controllo stesso, questo si ripercuoterà nella cella sul foglio, andando di conseguenza a sovrascrivere
    tutto quello che trova, quindi anche la formula precedentemente inserita.

    Scusami, ma non avevo pensato che usavi questo tipo di controllo per riferirti alle celle; io per esempio non lo uso mai.
    Prova questo piccolo esempio:
    - sempre con il tuo esempio, in A1 scrivi un valore, e in A2 una formula che utilizza questo valore
    - poi, inserisci una userform con due textbox e riporta le due routine sotto
    - la textbox 2 non riuscirai a modificarla, ma la textbox1 si, e in base al valore inserito vedrai i dati sul foglio modificarsi
     
    Private Sub UserForm_Initialize()
    TextBox1 = [a1]
    TextBox2 = [a2]
    TextBox2.Locked = True
    End Sub
    
    
    Private Sub TextBox1_Change()
    [a1] = TextBox1.Value
    End Sub



  • di Vecchio Frac data: 12/10/2012 14:39:46

    Questo thread di JellyFish è collegato all'altro thread?
    La porzione di codice in Userform_Initialize può essere compattata: i tre For Eeach distinti possono diventare uno solo e fare i tre controlli simultaneamente; sui combobox visibili/non visibili ho già detto; sugli array di controlli il tempo che mi serve per preparare il trattatello è più lungo del previsto ;)
    Magari chiederò a Vanni un aiuto materiale per correggere la bozza a quattro mani e magari creare un post riassuntivo a nome di entrambi.





  • di Jellyfish data: 12/10/2012 14:58:53

    @HarryBosch: ora studio il tuo esempio e provo ad applicario e ti faccio sapere così ci piazziamo un bel "spunta se risolta"

    @Vecchio Frac: ora pulisco il codice secondo i tuoi suggerimenti e rimango in attesa degli array di controlli

    Cmq complimenti siete incredibili!

    Grazie mille




  • di Jellyfish (utente non iscritto) data: 12/10/2012 15:22:51

    Scusami Vecchio Frac. Si è tutto collegato.

    Il modellino dell'altra discussione è una semplificazione dei quello di cui sto attaccando il codice.

    Ho razionalizzato il codice secondo i tuoi suggerimenti. Lo allego.

    Ora provo con i suggerimenti di HarryBosch
     
    Private Sub UserForm_Initialize()
    
    Dim OrdineRBP As Variant
    Dim LivelloScelto As Variant
    
    OrdineRBP = Array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20)
    
    LivelloScelto = Array(1, 2, 3, 4, 5, 6, 7, 8)
    
    For Each Combo In Me.Controls
        If LCase(Left(Combo.Name, 8)) = "combobox" Then
            Combo.List = OrdineRBP
        End If
        
        If LCase(Left(Combo.Name, 8)) = "boxcombo" Then
            Combo.List = LivelloScelto
        End If
    Next
    
    For Each check In Me.Controls
        If LCase(Left(check.Name, 8)) = "checkbox" Then
            check = 0
        End If
    Next
    
    
    'Non mostrare le combo quando non c'è il flag
    
    ComboBox1.Visible = (CheckBox1 = 0)
    ComboBox2.Visible = (CheckBox1 = 0)
    ComboBox3.Visible = (CheckBox1 = 0)
    ComboBox4.Visible = (CheckBox1 = 0)
    ComboBox5.Visible = (CheckBox1 = 0)
    ComboBox6.Visible = (CheckBox1 = 0)
    ComboBox7.Visible = (CheckBox1 = 0)
    ComboBox8.Visible = (CheckBox1 = 0)
    ComboBox9.Visible = (CheckBox1 = 0)
    ComboBox10.Visible = (CheckBox1 = 0)
    ComboBox11.Visible = (CheckBox1 = 0)
    ComboBox12.Visible = (CheckBox1 = 0)
    ComboBox13.Visible = (CheckBox1 = 0)
    ComboBox14.Visible = (CheckBox1 = 0)
    ComboBox15.Visible = (CheckBox1 = 0)
    ComboBox16.Visible = (CheckBox1 = 0)
    ComboBox17.Visible = (CheckBox1 = 0)
    ComboBox18.Visible = (CheckBox1 = 0)
    ComboBox19.Visible = (CheckBox1 = 0)
    ComboBox20.Visible = (CheckBox1 = 0)
    ComboBox21.Visible = (CheckBox1 = 0)
    ComboBox22.Visible = (CheckBox1 = 0)
    ComboBox23.Visible = (CheckBox1 = 0)
    ComboBox24.Visible = (CheckBox1 = 0)
        
    End Sub



  • di Vecchio Frac data: 12/10/2012 15:41:54

    Alle volte posso sembrare eccessivamente pignolo, in realtà sono un tipo piuttosto distratto :)

    ComboBox1.Visible = (CheckBox1 = 0)
    Questo va bene per il primo combobox, ma non per gli altri; in particolare ogni checkbox avrà valore da 1 in poi, quindi devi controllare il valore di ognuno non solo del primo.

    Mi perdonerai se mi permetto di modificare ancora il tuo codice per correggerlo e per renderlo più snello.
     
    Option Explicit
    
    Private Sub UserForm_Initialize()
    Dim Combo as Object, i as integer
    
    For Each Combo In Me.Controls
        Select Case LCase(Left(Combo.Name, 8)) 
        Case "combobox"
            Combo.List = Array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20)
        
        Case "boxcombo"
            Combo.List = Array(1, 2, 3, 4, 5, 6, 7, 8)
    
        Case "checkbox"
            Combo = False
    
        End Select
    Next
    
    'Non mostrare le combo quando non c'è il flag
    For i = 1 to 24
        Controls("ComboBox" & i).Visible = (Controls("CheckBox" & i) = True)
    Next
        
    End Sub






  • di Vecchio Frac data: 12/10/2012 15:44:41

    Al momento, invece, per le nostre conoscenze, non c'è modo di evitare la noiosa sequenza di istruzioni per interecettare il cambio di flag delle checkbox.
    Ti tocca scriverle tutte e ventiquattro... e vai di copia-incolla :(
     
    Private Sub CheckBox1_Click()
        ComboBox1.Visible = (CheckBox1 = True)
    End Sub
    Private Sub CheckBox2_Click()
        ComboBox2.Visible = (CheckBox2 = True)
    End Sub
    Private Sub CheckBox3_Click()
        ComboBox3.Visible = (CheckBox3 = True)
    End Sub
    
    ...e così via






  • di Jellyfish data: 12/10/2012 15:45:01

    @HarryBosch

    Ho capito quello che mi stai spiegando ma non risolve il mio problema.

    - cella A1 riempita da Combobox - nessun problema ad ogni cambiamento il cambiamento si riperquuote nella cella A1

    .- cella A2 (locked) contiene una formula (es. "=A1*3"). Il risultato viene mostrato in una Textbox collecata alla cella A2

    - Prima modifica di valore della Combo:

    A1 cambia valore --- ok

    A2 viene calcolata ma la formula si trasforma in un numero e non si vede più la formula

    - Seconda modicfica della combo

    A1 cambia valore --- ok

    A2 non avendo + la formula non si aggiorna più :(

    Spero di essermi spiegata :(



  • di Vecchio Frac data: 12/10/2012 15:53:51

    Sì ti sei spiegata e HarryBosch ti ha già dato un suggerimento: sposta la formula dal foglio al codice e valorizza da qui la cella A2.
    Quando dalla combo scegli un nuovo valore, nello stesso codice di modifica della combo applichi al valore di A1 la formula (una funzione, un'espressione, quel che devi fare) e metti il risultato in A2.
    In pratica stai spostando i calcoli dal foglio al codice.
    Ed è quello che dicevo io qualche post fa (tradurre tutto in VBA style, anche se Vanni mi prende un po' in giro ^_^).






  • di Jellyfish data: 12/10/2012 16:16:11

    Ho capito ma non è una formula!!! sono 24 formule + altre 8*24 vi allego una foto della form!

    La scelta rossa cambia i calcoli dell'arancione

    La scelta verdone cambia i calcoli della verde

    Nel riferimento delle combo c'è il numero di riferimento

    Nelle texbox i risultati di mille formule che dipendono dalle scelte fatte nelle combo...



  • di Vecchio Frac data: 12/10/2012 16:31:11

    Quindi la formula in A2 c'è già (e anche in tutte le altre celle dove deve esserci una formula), non la devi ricostruire ogni volta. Il punto è che non la devi collegare alla TextBox.
    Togli alla TextBox il control source che punta ad A2; poi valorizza la TextBox ad ogni variazione della combo. Cioè:
    - cella A1 riempita da Combobox --> dopo aggiornamento di Combobox prendi il valore di A2 e mostramelo nella Textbox (che non è più collegata ad A2)
    - cella A2 (locked) contiene una formula che si ricalcola ad ogni cambiamento di Combo (che cambia A1 e cambia Textbox).





  • di Jellyfish data: 12/10/2012 16:40:37

    Esatto questo è quello che mi serve!!!

    A1 rimepita da combobox - ok

    Levare il controlsource ad A2 e a quelle dove ci sono formule --- ok

    "dopo aggiornamento di Combobox prendi il valore di A2 e mostramelo nella Textbox (che non è più collegata ad A2)" --- ??? Come si fa



  • di Vecchio Frac data: 12/10/2012 16:48:14

    Direi qualcosa del genere:

    Private Sub CheckBox1_Click()
    ComboBox1.Visible = (CheckBox1 = True)

    If ComboBox1.Visible Then TextBox1 = [A2]
    End Sub

    ...purtroppo ripetuto per tutti i 24 eventi _Click dei diversi checkbox (ma a parte la rottura di balls del copiaincolla, se ho capito il funzionamento è un passo avanti). Sempre che naturalmente i diversi TextBox abbiano nome 1, 2, 3 ecc. e che le celle di riferimento siano A2, A3, A4 e così via, altrimenti devi adattare il codice di conseguenza.
    Spero di non averti confuso le idee.

    Che mi dici del codice più compatto che ho postato prima? è più leggibile?





  • di Vecchio Frac data: 12/10/2012 16:50:53

    Probabilmente però ho preso una cantonata, cioè devi intercettare il cambiamento nella combobox e non nel checkbox.
    Il codice giusto da ripetere per 24 volte è:

    Private Sub ComboBox1_Change()
    TextBox1 = [A2]
    End Sub

    Il ragionamento già fatto però rimane valido.





  • di HarryBosch data: 12/10/2012 16:56:59

    Scusa Jelly, ma nel mio esempio, il fatto di eliminare il control source era sottointeso...
    Altrimenti è ovvio che la cella continua ad esser cancellata.

    Il piccolo esempio che ho postato "sostituiva" quel comando;
    vedi il file che allego



  • di Jellyfish data: 12/10/2012 17:01:30

    Bene,

    provo con questo ragionamento... ma sto per decidere di tornare indietro dove quello che mostro bel form era su un foglio di calcolo che non crea tuttii questi problemi :(

    Per il codice + compatto non funziona in realtà... prima funzionava ora no...

    Mi serviva per dire quando apri la form per i check pieni mostrami le combo per gli altri no

    Così non mi mostra nulla all'apertura o tutto !!! Devo tornare indietro al codice pedante :(

    Ora faccio l'ultima prova per i collegamtni formule combo ecc e vediamo altrimenti torno ai cari vecchi metodi e uso le form per cosine basic

    Vi sto facendo perdere un sacco di tempo :(



  • di Jellyfish data: 12/10/2012 17:05:02

    Herry yes!!! Capito!!! Ora scrivo così e vediamo!!!

    Sto impazzendo!!! :)



  • di Vecchio Frac data: 12/10/2012 17:23:50

    cit. " Per il codice + compatto non funziona in realtà... prima funzionava ora no... "
    --> sicuramente ci sono errori miei. Ma deve funzionare, sul modellino che mi sono fatto funziona bene e anche riguardandolo la logica c'è tutta.
    Ovviamente all'apertura non mostra le combo collegate alle checkbox perchè queste sono tutte valorizzate a False. Clicca una checkbox e la sua combo appare :)

    Il metodo dell'userform è comodo e più elegante soprattutto per l'utente: visto che hai cominciato questa strada ti esorto a proseguirla, magari usa un file con lo userform per fare queste prove e in parallelo usi il file senza userform in produzione, se funziona bene.





  • di Jellyfish data: 12/10/2012 17:41:04

    Si ma vorrei che quando salvo e riapro il file se il check c'è si vedano le combo altrimenti no... così non si vedono e basta...



  • di Vecchio Frac data: 12/10/2012 18:36:21

    Ok, ma come fai a stabilire se il checkbox deve essere flaggato o no?
    All'inizio è tutto False per forza:

    Case "checkbox"
    Combo = False

    Se così non dev'essere, perchè i valori iniziali devono essere prelevati da qualche range nel foglio, allora la cosa cambia (ricordati che sei nell'Initialize, cioè in fase di avvio del form) e il codice deve essere adattato epr prelevare i valori iniziali da questo range. Credo di aver semplificato molto ma il concetto è questo, se non è chiaro non aver paura a dirmelo.





  • di Jellyfish (utente non iscritto) data: 12/10/2012 19:24:10


    Provo a spiegarmi:

    Considera che nelle celle collegate ai check ho messo di defult tutti false

    Apro la form e le check sono vuote e le combo non si vedono

    Fleggo quello che mi interessa e le combo, dove flaggo, compaiono

    Chiudo la form e la riapro

    Vorrei rivedere la siuazione come la ho lasciata, mentre nel tuo caso la vedrei per i check come la ho lasciata ma non per la visibilità delle combo. Apparirebbero tutte o meno in base a 0 o 1.

    Poi mi interessa che se felggo e sfleggo si mostrano o meno le combo e quello lo faccio in ogni singola change dei ogni singola combo...

    Il codice che avevo postato anche se super ripetuto riusiva a fare quello che volevo...

    Spero di essermi spiegata



  • di Vecchio Frac data: 12/10/2012 20:10:42

    C'è qualcosa che non mi convince.
    Se ti riferisci al codice che dice
    ComboBox1.Visible = (CheckBox1 = 0)
    ComboBox2.Visible = (CheckBox1 = 0)
    ComboBox3.Visible = (CheckBox1 = 0)
    allora questo è concettualmente sbagliato perchè condiziona la visibilità delle combobox (di tutte) al valore vero o falso sempre e solo del primo checkbox.
    Invece il codice iniziale ragiona proprio come quello mio, più sintetico, ma funzionalmente identici, e fanno entrambi la cosa giusta: settano tutti i checkbox a zero e quindi ogni combo risulta all'avvio invisibile.
    Quando chiudi e riapri il form, i valori dei checkbox vengono prelevati dal foglio? non credo (ma se è così a questo punto allora devi prevedere il codice che si occupa di rendere visibile o meno le combo).

    Quando fai nel Select Case:
    Case "checkbox"
    Combo = False
    automaticamente rendi invisibile la combo relativa, perchè il codice successivo si occupa di fare questo.
    Cambia False con True e vedi cosa succede.





  • di Jellyfish (utente non iscritto) data: 12/10/2012 20:48:07

    @ Vecchio Frac

    è vero, il codice che ho postato era settato su un solo chechbox ma poi l'ho cambiato e il risultato non era quello che dava il mio

    non ho capito quello che devo fare ma al momento il codice che ho è quello incollato sotto. Cosa devo cambiare per renderlo più leggibile, non ho capito :( ... mi faresti un esempio per favore

    @Herry il tuo esempio era con due text box io lo ho una combo e una text

    Per la combo ho settato il riferimento con il source delle proprietà (con Combobox1 = [cella] non mi funzionava, non scriveva)

    Per la text ho fatto come mi hai detto

    'Assegnazione cella alla textbox - PROCESSI DA VALUTARE

    BoxTest1 = [M5]
    BoxTest2 = [M6]
    BoxTest3 = [M7]
    BoxTest4 = [M8]
    BoxTest5 = [M9]
    BoxTest6 = [M10]
    BoxTest7 = [M11]

    Sempre per 24 volte

    Sembra funzionare ma si vede poco perchè ci mette tempo ad aggiornarsi, troppe formule e dati

    Ho deciso di dividere la form i 2 form:

    1 - una con le selezioni fino alla seconda combo, con calcolo automatico disabilitato,

    2 - poi con un pulsante lancio il calcoloautomatico e mostro la seconda form con tutti i calcoli fatti

    Intento grazie

    Ma siete voi due a gestire questo forum?
     
    Private Sub UserForm_Initialize()
    
    Dim OrdineRBP As Variant
    Dim LivelloScelto As Variant
    
    OrdineRBP = Array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20)
    
    LivelloScelto = Array(1, 2, 3, 4, 5, 6, 7, 8)
    
    For Each Combo In Me.Controls
        If LCase(Left(Combo.Name, 8)) = "combobox" Then
            Combo.List = OrdineRBP
        End If
        
        If LCase(Left(Combo.Name, 8)) = "boxcombo" Then
            Combo.List = LivelloScelto
        End If
    Next
    
    For Each check In Me.Controls
        If LCase(Left(check.Name, 8)) = "checkbox" Then
            check = 0
        End If
    Next
    
    
    'Non mostrare la combo quando non c'è il flag
    
    If CheckBox1 = 0 Then
    ComboBox1.Visible = False
    Boxcombo1.Visible = False
    Else
    ComboBox1.Visible = True
    Boxcombo1.Visible = True
    End If
    
    If CheckBox2 = 0 Then
    ComboBox2.Visible = False
    Boxcombo2.Visible = False
    Else
    ComboBox2.Visible = True
    Boxcombo2.Visible = True
    End If
    
    X 24 VOLTE poi
    
    
    Private Sub CheckBox1_Click()
    
    If CheckBox1 = 0 Then
    ComboBox1.Visible = False
    Boxcombo1.Visible = False
    Else
    ComboBox1.Visible = True
    Boxcombo1.Visible = True
    End If
    
    End Sub
    
    Private Sub CheckBox2_Click()
    
    If CheckBox2 = 0 Then
    ComboBox2.Visible = False
    Boxcombo2.Visible = False
    Else
    ComboBox2.Visible = True
    Boxcombo2.Visible = True
    End If
    
    End Sub
    
    Private Sub CheckBox3_Click()
    
    If CheckBox3 = 0 Then
    ComboBox3.Visible = False
    Boxcombo3.Visible = False
    Else
    ComboBox3.Visible = True
    Boxcombo3.Visible = True
    End If
    
    End Sub
    
    Sempre per 24 VOLTE e funziona salvo chiudo apro situazione immutata... fa vene...
    
    



  • di Vecchio Frac data: 12/10/2012 21:33:12

    cit. " non ho capito quello che devo fare"
    --> Abbi pazienza, ma mi riservo di risponderti a mente fresca, per oggi sono arrivato alla fine :)

    cit. " Ma siete voi due a gestire questo forum? "
    --> Io e HarryBosch/Vanni siamo soltanto due appassionati che aiutano a far crescere questo forum. Due utenti normali che desiderano condividere le proprie competenze (ok, abbiamo il ruolo di moderatori ma è più un titolo onorifico ^_^). Il gestore e proprietario del sito è il nostro patron Mauro Cognolato.





  • di Vecchio Frac data: 13/10/2012 09:24:12

    cit. " Cosa devo cambiare per renderlo più leggibile "
    -> Ho controllato ancora e mi sembra che il codice più compatto da me proposto sia funzionalmente identico al tuo, solo più efficiente. Te lo ripropongo così lo puoi confrontare, con l'aggiunta del secondo combo, quelli della serie "BoxCombo...".

     
    Option Explicit
    
    Private Sub UserForm_Initialize()
    Dim Combo as Object, i as integer
    
    For Each Combo In Me.Controls
        Select Case LCase(Left(Combo.Name, 8)) 
        Case "combobox"
            Combo.List = Array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20)
        
        Case "boxcombo"
            Combo.List = Array(1, 2, 3, 4, 5, 6, 7, 8)
    
        Case "checkbox"
            Combo = False
    
        End Select
    Next
    
    'Non mostrare le combo quando non c'è il flag
    For i = 1 to 24
        Controls("ComboBox" & i).Visible = (Controls("CheckBox" & i) = True)
        Controls("BoxCombo" & i).Visible = (Controls("CheckBox" & i) = True)
    Next
        
    End Sub






  • di Jellyfish (utente non iscritto) data: 13/10/2012 13:30:09

    @ Vecchio Frac

    Grazie mille funziona perfettamente è il codice è cortissimo grazie grazie!!!

    Ho anche capito a cosa serve l'Option Explicit, mi segnala tutti gli errori :)

    Ora però vorrei provare a fare la stessa cosa del codice incollato sotto ma in maniera più corta dato che devo farne 24 * 8 + altri 24 *3

    Ho provato così:

    For i = i To 24

    Controls("TextBox" & i) = Cells("B", i + 4)

    Next

    ma nulla :(

     
    TextBox1 = [B5]
    TextBox2 = [B6]
    TextBox3 = [B7]
    TextBox4 = [B8]
    TextBox5 = [B9]
    TextBox6 = [B10]
    TextBox7 = [B11]
    TextBox8 = [B12]
    TextBox9 = [B13]
    TextBox10 = [B14]
    TextBox11 = [B15]
    TextBox12 = [B16]
    TextBox13 = [B17]
    TextBox14 = [B18]
    TextBox15 = [B19]
    TextBox16 = [B20]
    TextBox17 = [B21]
    TextBox18 = [B22]
    TextBox19 = [B23]
    TextBox20 = [B24]
    TextBox21 = [B25]
    TextBox22 = [B26]
    TextBox23 = [B27]
    TextBox24 = [B28]
    



  • di jellyfish (utente non iscritto) data: 13/10/2012 13:42:20

    1 - Correzione nel for ho messo "for i=1 to 24" ops --- cmq non va, anzi non gira prorio "errore mismatch" "run-time error '13'




  • di Vecchio Frac data: 13/10/2012 15:38:29

    cit. " Ho anche capito a cosa serve l'Option Explicit, mi segnala tutti gli errori :) "
    --> Non è esatto, ti segnala non *tutti* gli errori, ma solo quelli derivanti da variabili non dichiarate.

    For i = 1 To 24
    Controls("TextBox" & i) = Cells("B", i + 4) '<---- l'errore è qui
    Next

    In Cells non puoi avere parametri stringa (il primo valore indica la riga, il secondo la colonna, e sono tutti e due Integer, o nel caso dei nuovi Excel, Long).
    Il codice è buono e funziona, ma correggilo come sotto.

     
    For i = 1 To 24 
        Controls("TextBox" & i) = Cells(i + 4, 2)   ' <--- ricopia nelle textbox il contenuto delle celle in riga i+4, colonna 2
    Next 
    
    
    






  • di jellyfish (utente non iscritto) data: 13/10/2012 16:41:53

    Ovviamente quella che hai scritto te funziona (ossia la prima del codice incolato) e le atre no :(

    Ma perchè?????
     
    'Assegnazione cella alla textbox
    
    For i = 1 To 24
    Controls("TextBox" & i) = Cells(i + 4, 2) 'CODICE SOCIETA'
    Next
    
    For i = 25 To 48
    Controls("TextBox" & i) = Cells(i + 4, 3)   'SOCIETA'
    Next
    
    For i = 49 To 72
    Controls("TextBox" & i) = Cells(i + 4, 13)  'PROCESSI DA VALUTARE
    Next
    
    For i = 73 To 96
    Controls("TextBox" & i) = Cells(i + 4, 15)  'Numero processi per livello di profondità - LIV1
    Next
    
    For i = 97 To 120
    Controls("TextBox" & i) = Cells(i + 4, 16)  'Numero processi per livello di profondità - LIV2
    Next
    
    For i = 121 To 144
    Controls("TextBox" & i) = Cells(i + 4, 17)  'Numero processi per livello di profondità - LIV3
    Next
    
    For i = 145 To 168
    Controls("TextBox" & i) = Cells(i + 4, 18)  'Numero processi per livello di profondità - LIV4
    Next
    
    For i = 169 To 192
    Controls("TextBox" & i) = Cells(i + 4, 19)  'Numero processi per livello di profondità - LIV5
    Next
    
    For i = 193 To 216
    Controls("TextBox" & i) = Cells(i + 4, 20)  'Numero processi per livello di profondità - LIV6
    Next
    
    For i = 217 To 240
    Controls("TextBox" & i) = Cells(i + 4, 21)  'Numero processi per livello di profondità - LIV7
    Next
    
    For i = 241 To 264
    Controls("TextBox" & i) = Cells(i + 4, 22)  'Numero processi per livello di profondità - LIV8
    Next
    
    TextBox265 = [M30]                          'SOMMA PROCESSI DA VALUTARE
    



  • di HarryBosch data: 13/10/2012 18:45:22

    Wow quanti For!!
    sto scherzando....
    si caricano solo i primi Textbox perché nei successivi, il riferimento alla cella continua a spostarsi in basso, su celle sicuramente vuote.

    Cells(i+4, 3) recupera i dati dalla riga 5 alla 24 della colonna 3 e qua ci siamo;
    dal successivo, i dati non saranno più recuperati dalla riga 5 ma dalla riga 29 colonna 4 (25+4, 4)

    non abbiamo il foglio dati sotto mano, ma con la modifica che ti metto sotto dovresti ottenere il "popolamento" voluto.. 1 solo ciclo
     
    For i = 1 To 24
    Controls("TextBox" & i) = Cells(i + 4, 2) 'CODICE SOCIETA'
    Controls("TextBox" & i+24) = Cells(i + 4, 3)   'SOCIETA'
    Controls("TextBox" & i+48) = Cells(i + 4, 13)  'PROCESSI DA VALUTARE
    Controls("TextBox" & i+72) = Cells(i + 4, 15)  'Numero processi per livello di profondità - LIV1
    Controls("TextBox" & i+96) = Cells(i + 4, 16)  'Numero processi per livello di profondità - LIV2
    Controls("TextBox" & i+120) = Cells(i + 4, 17)  'Numero processi per livello di profondità - LIV3
    Controls("TextBox" & i+144) = Cells(i + 4, 18)  'Numero processi per livello di profondità - LIV4
    Controls("TextBox" & i+168) = Cells(i + 4, 19)  'Numero processi per livello di profondità - LIV5
    Controls("TextBox" & i+192) = Cells(i + 4, 20)  'Numero processi per livello di profondità - LIV6
    Controls("TextBox" & i+216) = Cells(i + 4, 21)  'Numero processi per livello di profondità - LIV7
    Controls("TextBox" & i+240) = Cells(i + 4, 22)  'Numero processi per livello di profondità - LIV8
    Next
    
    TextBox265 = [M30]   



  • di Jellyfish (sono iscritta!!!) (utente non iscritto) data: 14/10/2012 14:58:28

    OK ragazzi con i vostri suggerimenti tutto funziona.

    Ultima info e poi chiudo questa discussione per aprirne una nuova ;)

    Il codice non commentato perchè non funziona... perchè non fa la stessa cosa del codice commentato?



     
    Private Sub CheckBox1_Click()
    
    ComboBox1.Visible = CheckBox1 = True
    Boxcombo1.Visible = CheckBox1 = True
    
    ComboBox1 = "" = CheckBox1 = False
    Boxcombo1 = "" = CheckBox1 = False
    
    End Sub
    
    
    'Private Sub CheckBox1_Click()
    '
    'If CheckBox1 = 0 Then
    'ComboBox1.Visible = False
    'Boxcombo1.Visible = False
    'ComboBox1 = ""
    'Boxcombo1 = ""
    'Else
    'ComboBox1.Visible = True
    'Boxcombo1.Visible = True
    'End If
    '
    'End Sub



  • di Vecchio Frac data: 14/10/2012 15:24:15

    Perchè questo è VBA e non Python (o Ruby o C++ o altro linguaggio che supporta gli operatori ternari ^_^)
    Se imposti una proprietà che può assumere solo valore vero o falso allora puoi, come hai fatto, effettuare un confronto che restituisca un valore vero o falso. Ma non puoi, con la stessa logica, effettuare un'assegnazione condizionata (magari! feature troppo avanzata per il povero VBA).
    Il codice deve essere corretto come segue (le parentesi in Checkbox1 = True le ho messe per far capire chiaramente che assegni alla proprietà .Visible dei combo un valore chiaramente True o False, ma non sono obbligatorie).
    Nota le due assegnazioni a "" entrambe su una stessa riga, ogni istruzione è separata dai due punti. Questo epr evitare di scrivere un blocco If ... End If, ma è una scelta che in genere si sconsiglia... qui la mostro solo per ricordare che si può fare allo scopo di evitare codice prolisso quando le istruzioni sono al limite del banale.
     
    Private Sub CheckBox1_Click()
    
        ComboBox1.Visible = (CheckBox1 = True)
        Boxcombo1.Visible = (CheckBox1 = True)
    
        If CheckBox1 = False Then ComboBox1 = "": BoxCombo1 = ""
    
    End Sub






  • di Vecchio Frac data: 14/10/2012 15:28:24

    cit. " Perchè questo è VBA e non Python (o Ruby o C++ o altro linguaggio che supporta gli operatori ternari ^_^) "
    ---> a chi mi obietta che esiste IIf, rispondo che a me questa istruzione non piace e la evito perchè è fonte di confusione e mi obbliga comunque a valutare tutte le espressioni in gioco, e se una ritorna un valore errato il codice si blocca. Comunque so benissimo che l'operatore ternario esiste anche in VBA :) e la sua sintassi è:
    IIf(test, se_vero, se_falso)

    E' una specie di If tutto su una riga. Se test si verifica viene restituita la parte se_vero, altrimenti quella se_falso.

    Il codice precedente si poteva scrivere così, ma come vedi oltre a essere poco chiaro è anche quasi incomprensibile:
    ComboBox1 = IIf(CheckBox1, ComboBox1, "")
    BoxCombo1 = IIf(CheckBox1, BoxCombo1, "")





  • di Jellyfish data: 14/10/2012 15:37:05

    Ottimo funziona!!!

    Accorcio il mio codice e chiudo questa discussione...

    Grazie mille!!!