Creare un ciclo



  • Creare un ciclo
    di Alessandro (utente non iscritto) data: 12/10/2012 18:29:41

    Salve a tutti i frequentatori di questo forum, avrei bisogno di esperti del vba excel (io uso il 2007), per sapere se è possibile realizzare quanto vorrei fare.
    Innanzitutto guardate questa immagine qui:

    imageshack.us/a/img834/9420/vbamacroexcel.jpg

    è quanto sono riuscito a creare fino ad ora: premendo il tasto 1 dell'immagine (Aggiorna Alcuni) mi si apre la UserForm1 indicata come 2 nell'immagine. Questa Userform ha al suo interno molti checkbox selezionabili o meno. Il mio scopo è quello di fare in modo che l'utente scelga quali campionati aggiornare selezionando (spuntando) i relativi checkbox e dopo premendo il tasto indicato nella figura con il 3 (aggiorna Selezionati) dovrebbe partire l'aggiornamento dei soli campionati scelti.
    La Userform1 viene chiamata con la pressione del tasto Aggiorna Alcuni la cui macro associata è:

    Sub AGGIORNA_ALCUNI()
    UserForm1.Show
    End Sub

    Nella Userform1 ho 24 di questi codici:

    Private Sub CheckBox1_Activate()
    End Sub
    [...]
    Private Sub CheckBox24_Activate()
    End Sub

    Inoltre sempre nella Userform1 associato al tasto Aggiorna Selezionati (il cui nome è CommandButton1), sto provando a scrivere un codice del genere, ma mi da errore:

    Private Sub CommandButton1_Click()
    For k = 1 To 24
    If CheckBoxk.Value = True Then
    Sheets(k + 1).Select
    AGGIORNA_FOGLIO
    End If
    Next k
    Sheets("RIEPILOGO").Select
    Range("B2").Select
    End Sub

    Cioè vorrei intendere se la checkbox(kesima) con k da 1 a 24 è selezionata (spuntata) allora mi vai nel foglio al posto k+1 e mi esegui la macro Aggiorna_Foglio, ripeti il procedimento per tutte le checkbox spuntate (selezionate) e poi ti fermi, vai al foglio Riepilogo e ti posizioni sulla cella B2.
    La macro Aggiorna_Foglio è

    Sub AGGIORNA_FOGLIO()
    ActiveSheet.Select
    Cells(4, 3).Activate
    ActiveCell.QueryTable.Refresh
    Cells(4, 18).Activate
    ActiveCell.QueryTable.Refresh
    Cells(4, 46).Activate
    ActiveCell.QueryTable.Refresh
    Range("B2").Select
    End Sub

    Chi mi sa dare un consiglio in merito su come far funzionare il tutto? Grazie e ciao



  • di Vecchio Frac data: 12/10/2012 18:46:17

    Devi cambiare la firma della Sub aggiorna_foglio perchè riceva in argomento il foglio da aggiornare.

    Sub aggiorna_foglio(sh as sheet)
    sh.cells(4,3).activate
    eccetera
    End Sub

    in pratica devi qualificare in questa sub ogni riferimento a celle anteponendo "sh." che è il foglio corrente.
    E la richiamerai con qualcosa del genere nel commandbutton1:
    aggiorna_foglio sheets(k+1).name





  • di Alessandro (utente non iscritto) data: 13/10/2012 01:33:08

    Ciao e grazie per la risposta, allora ho fatto come hai scritto, ma mi da errore (me lo faceva anche prima) nel commandbutton1 e mi dice: "Errore di compilazione Next senza For" ma io il for l'ho inserito, quindi non capisco dove sbaglio...



  • di Vecchio Frac data: 13/10/2012 09:08:07

    Fai così: sostituisci ad "aggiorna_foglio" tutto il codice corrispondente e lancia. Vediamo che cosa succede.
    Magari gli dà fastidio richiamare una sub all'interno di un If che a sua volta è all'interno di un ciclo For.

    Per inciso, invece di:
    ActiveSheet.Select
    Cells(4, 3).Activate
    ActiveCell.QueryTable.Refresh

    puoi scrivere una riga sola che è funzionalmente identica:
    activesheet.cells(4, 3).querytable.refresh





  • di Alessandro (utente non iscritto) data: 13/10/2012 11:12:11

    Ciao Vecchio Frac
    Purtroppo sempre lo stesso errore... credo che bisogna riformulare per intero il codice del CommandButton1, creando un ciclo che mi dica (assumendo per es. come k la variabile): per ognuna delle 24 checkbox selezionate portati al foglio (k+1) ed esegui la macro AGGIORNA_FOGLIO...
    e poi prima della End Sub vabbè lo aggiungo da me
    Sheets("RIEPILOGO").Select
    Range("B2").Select



  • di Vecchio Frac data: 13/10/2012 11:37:47

    C'è qualcosa che non mi convince. Non dovrebbe segnalarti errore sul ciclo For.
    Riesci a creare un file con dati fittizi e la tua macro originale e allegarlo qui (meglio se zippato)?





  • di HarryBosch data: 13/10/2012 11:42:50

    Ho capito cosa intendi... e andava quasi bene, nessuna riformulazione;
    solo un piccolo aggiustamento per unire i K del ciclo alle Check:
    .
    If Controls("CheckBox" & k) = True Then
    .

    Il .Value puoi anche toglierlo; il check o è Vero o è Falso.

     
    Private Sub CommandButton1_Click()
        For k = 1 To 24
            If Controls("CheckBox" & k) = True Then
                Sheets(k + 1).Select
                AGGIORNA_FOGLIO
            End If
        Next k
        Sheets("Riepilogo").Select
        Range("B2").Select
    End Sub
    



  • di Alessandro (utente non iscritto) data: 13/10/2012 12:10:22

    Grazie, grazie e ancora grazie a tutti e due per l'immensa disponibilità.
    HarryBosch la tua correzione mi funziona perfettamente.

    Adesso fa quello che chiedevo di fare, ultimissima cosa e poi spunto come risolto, è possibile fare in modo che la userform1 (quella contenente i checkbox), dopo aver spinto il commandbutton1 si chiuda da sola, così devo andare sulla X in alto a destra per chiudarla... ma è solo un di più che vorrei fare, non volgio approffitare della vostra pazienza oltre...



  • di Vecchio Frac data: 13/10/2012 12:41:13

    Unload Me
    subito prima dell'End Sub del Command button.

    Il punto è che non ho capito il messaggio di errore legato "Next senza For"... oppure il messaggio era diverso e tu non l'hai riportato esatto :)





  • di Alessandro (utente non iscritto) data: 13/10/2012 13:18:45

    Perfetto Vecchio Frac anche questo risolto
    In verità i messaggi di errore che mi dava (non tutti insieme ma uno per volta) erano diversi in base a come toccavo il codice, tra i quali il "Next senza For", credo che mi spiegassi male io, anche perchè è da pochissimi giorni che mi cimento nella creazione di codice VBA e non conosco la terminologia esatta. Ma siete stati sia tu che HarryBosch disponibilissimi e gentilissimi. Ciao e ancora grazie. Spunto come risolto



  • di Vecchio Frac data: 13/10/2012 15:47:32

    cit. " If Controls("CheckBox" & k) = True Then "
    --> LOL, è la seconda volta che Vanni mi batte portandomi via la cosa più evidente da sotto il naso ^_^

    Sono contento che hai risolto.
    Continua così ma quando chiedete qualcosa (mi rivolgo a tutti in generale) siate sempre il più precisi possibile per non farci tirare a indovinare, la nostra sfera di cristallo è sempre in riparazione :P