Pulsante di blocco



  • Pulsante di blocco
    di Vale (utente non iscritto) data: 27/03/2014 17:26:47

    Ciao a tutti,
    avrei bisogno di sapere come fare ad inserire un pulsante su un foglio di Excel che, una volta cliccato, mi permetta di passare dal Foglio 1 al Foglio 2 solo se alcune celle del Foglio 1 sono compilate.
    Se una o più di queste celle del Foglio 1 non sono compilate, la macro dovrebbe bloccare il passaggio al Foglio 2 evidenziando le celle del Foglio 1 non compilate.



  • di Vecchio Frac data: 27/03/2014 18:33:52

    In Foglio2, puoi intercettare l'evento Activate del Foglio, tornando sul foglio1 se si verifica la condizione da te impostata.
    Il codice del command button semplicemente tenta di attivare il foglio2 e qui si scatena l'evento Activate.
    Il pezzetto di codice seguente non evidenzia le celle vuote, ma puoi farlo tu con una semplice formattazione condizionale ad esempio con "se valore vuoto colora la cella di rosso".
     
    'codice del foglio2
    Option Explicit
    
    Private Sub Worksheet_Activate()
    Dim r As Range, v As Variant
    
        Application.ScreenUpdating = False
        With Foglio1
            Set r = Application.Union(.Range("A1:A10"), .Range("D1"), .Range("F1:H10"))   ' <<< aggiustare i range desiderati
        End With
        If Application.CountBlank(r) <> 0 Then
            Foglio1.Activate
            MsgBox "Campi obbligatori da compilare, impossibile lasciare il foglio in questo momento."
        End If
        Application.ScreenUpdating = True
            
    End Sub
    






  • di vale (utente non iscritto) data: 28/03/2014 08:43:52

    io non sono molto esperta quindi scusate l'ignoranza.
    IO ho creato un pulsante sul Foglio1 registrando una macro che, schiacciando il pulsante, fa andare direttamente al foglio2. Poi nel codice di quel pulsante ho inserito la stringa di codice che mi hai dato ma la riga
    If Application.CountBlank(r) <> 0 Then
    mi da errore!!!!!!!!!HELP



  • di lepat (utente non iscritto) data: 28/03/2014 08:53:24

    prova
    If Application.WorksheetFunction.CountBlank(r) <> 0 Then



  • di vale (utente non iscritto) data: 28/03/2014 09:03:29

    nemmeno...ma il percorso che ho fatto è giusto?



  • di Vecchio Frac data: 28/03/2014 10:10:22

    cit. "Poi nel codice di quel pulsante ho inserito la stringa di codice che mi hai dato"
    ---> No, attenzione, il codice che ho scritto va messo nell'area codice del foglio2 (lo avevo scritto nel commento al codice).
    Il pulsante sul foglio1 va bene, visto che lo hai registrato sicuramente funzionerà.
    Adesso quindi vai così:
    - premi Alt-F11 (apre l'editor di codice)
    - premi Ctrl-R (si posiziona sulla finestra progetti)
    - doppio clic su Foglio2 (apre l'area codice del foglio2)
    - incolla il codice che ti ho indicato
    - aggiusta i range interessati (ovviamente! io ho messo solo dei range di esempio per farti vedere come funziona)
    - premi Alt-F4 (chiude l'editor di codice e torna a Excel)
    - adesso vai sul foglio1, lascia in bianco i campi che devono essere compilati, premi il tuo pulsante e guarda che cosa succede.

    p.s. "Application.CountBlank(r)" , "Worksheetfunction.CountBlank(r)" e "Application.Worksheetfunction.CountBlank(r) " sono sinonimi.





  • di nichicanta (utente non iscritto) data: 28/03/2014 10:48:51

    Buongiorno a tutti, ciao V.Frac, ho cercato di utilizzare il tuo codice ( per mie esigenze) seguendoo le tue ultime istruzioni ma mi dà errore in questa riga:If Application.CountBlank(r) <> 0 Then.
    Ho sostituiti questa riga di codice con le altre da te suggerite ( anche utilizzando quella di lepat) sempre nel post ma il risultato non cambia ( anzi mi compare un altro msg di errore)
    L'errore che VBA mi segnala (con il tuo codice) è il seguente:errore di run-time 13 - tipo non corrispondente.
    P.S. utilizzo excel 2010.
    Grazie e buona giornata a tutti.



  • di vale (utente non iscritto) data: 28/03/2014 10:53:23

    stessa cosa dice a me!!!!!!!!!!



  • di totygno71 (utente non iscritto) data: 28/03/2014 11:09:40

    prova il file allegato...



  • di nichicanta (utente non iscritto) data: 28/03/2014 11:14:53

    Ciao totygno71,che bello rivederti presente sul forum, mi fai ridere tanto quando crei quei pulsanti con le dicitura.cliccamelo;schiacciamelo, premilo ecc.
    Il tuo file funziona bene, hai provato a capire perchè il codiec di V.Frac dà quell'errore?
    Mitico,grande e simpatico.



  • di totygno71 (utente non iscritto) data: 28/03/2014 11:22:29

    Secondo il mio parere la funzione counblank mal digerisce i range multipli...Ma aspettiamo il parere illustre di VF
    Il problema potrebbe anche essere aggredito con un ciclo che cerchi le celle vuote in un determinato range e appena ne trova una esce dal ciclo e seleziona la cella da riempire aiutando l'utente alla corretta compilazione del foglio.



  • di vale (utente non iscritto) data: 28/03/2014 11:30:47

    FUNZIONA.... ma il messaggio mi appare solo se passo dal Foglio2 al Foglio1.
    a me servirebbe il contrario.
    forse mi ero spiegata male o forse ho sbagliato nel codice



  • di totygno71 (utente non iscritto) data: 28/03/2014 11:47:53

    Vale vedi bene che non è come dici...
    Non puoi passare al Foglio2 se tutte le celle del range(A1:a10 e B1:B10) del Foglio1 non sono tutte piene
    Benritrovato Nichi



  • di vale (utente non iscritto) data: 28/03/2014 11:50:37

    lo so!
    io sono sul Foglio 2 e clicco per andare nel fogliio1 e mi compare il msg!
    è come se non potessi nemmeno riempirlo il foglio1



  • di totygno71 (utente non iscritto) data: 28/03/2014 11:53:26


    Ma stai usando il mio file?



  • di vale (utente non iscritto) data: 28/03/2014 11:55:26

    il tuo funziona!
    ma ho dovuto copiare il codice nel mio
    ahahahha o non dovevo?? booooooooooooooo



  • di totygno71 (utente non iscritto) data: 28/03/2014 11:59:29

    Probabilmente nel tuo file il foglio2 corrisponde al foglio1 magari perchè hai cancellato/spostato il foglio1.
    Se non si forniscono indicazioni corrette non si può pensare di ricevere risposte corrette.
    Cambia nel codice i riferimenti ai fogli mettendo i tuoi!



  • di vale (utente non iscritto) data: 28/03/2014 13:32:46

    si grazie scusami. ora ho risolto.
    posso chiedere un'ultima cosa?
    hai idea del perché quando clicco ok nel msg di avviso poi mi vada a finire nel foglio8 di quel file Excel?
    grazie mille



  • di totygno71 data: 28/03/2014 13:41:18

    perche il tuo foglio8 corrisponde al foglio1 del codice ^_^



  • di Vecchio Frac data: 28/03/2014 13:54:32

    Mi ero fissato con Union, ma la soluzione di Totygno è più elegante ^_^

    a = Application.CountBlank(Foglio1.Range("A1:A10", "B1:B10")) '<------- range scelti
    If a <> 0 Then
    ...






  • di totygno71 data: 28/03/2014 13:58:33

    Per capirci:
    Ogni nuova cartella di Excel mostra per default tre fogli. Ogni foglio di lavoro è rappresentato nella sezione inferiore dell'interfaccia con una linguetta che ne mostra il nome. La prima linguetta è Foglio1. La seconda è Foglio2. L'ultima è Foglio3.

    I vari fogli di lavoro di cartella sono raccolti in una collezione denominata Worksheets.

    Nella maggior parte dei casi, è possibile usare questa collezione ed ogni foglio di lavoro può essere individuato tramite un indice sia numerico che letterario. L'indice numerico comincia a 1 per cui si ha che il primo foglio di lavoro ha un indice di 1, il secondo foglio di lavoro ha un indice di 2 e così via. L'indice letterario è invece distinto da un nome alfanumerico univoco che per default ha il valore "Foglio1", Foglio2", "Foglio3", ecc.

    Ne consegue che in VBA possiamo riferirci ai singoli fogli chiamandoli Sheets(1), Sheets(2), ecc oppure Sheets("Foglio1"), Sheets("Foglio2"), ecc.

    Spiegazione presa da sito internet Mikevba



  • di vale (utente non iscritto) data: 28/03/2014 14:17:14

    SI SI AVEVO CAPITO
    ma funziona anche ho le celle unite????



  • di vale (utente non iscritto) data: 28/03/2014 14:32:48

    SE METTO COSì NON mi fa andare avanti nemmeno se y14 è compilata
    invece funziona con solo a17
     
    Option Explicit
    
    Private Sub Worksheet_Activate()
    Dim a As Integer
       
    a = Application.WorksheetFunction.CountBlank(Foglio2.Range("A17", "Y14"))
    If a <> 0 Then
    Foglio2.Activate
    MsgBox "Impossibile lasciare il foglio in questo momento. Non sono state inserite tutte le informazioni necessarie "
    End If
    Application.ScreenUpdating = True
    
    End Sub
    
    



  • di totygno71 (utente non iscritto) data: 28/03/2014 14:59:57

    ma quali sono le celle da controllare?
     
    
    
    



  • di totygno71 (utente non iscritto) data: 28/03/2014 15:08:43

    Se sono solo due ("A17", "Y14") puoi semplicemente fare così...
    Tieni conto che Foglio1 corrisponde al folgio dove risiedono le celle da controllare mentre il codice va inserito nel foglio2... cioè quello in cui voui andare se entrambe le celle sono piene
     
    Private Sub Worksheet_Activate()
       
    If Foglio1.Cells(17, 1) = "" Or Foglio1.Cells(14, 25) = "" Then
    Foglio1.Activate
    MsgBox "Impossibile lasciare il foglio in questo momento. Non sono state inserite tutte le informazioni necessarie "
    End If
    
    End Sub



  • di VALE (utente non iscritto) data: 28/03/2014 15:09:59

    TUTTE QUESTE
    A17:L17", "M17:X17"
    "Y17:AJ17",
    "A23:L23"
    "Y17:AJ17",
    "A20:L20",
    "A23:L23",
    "M26:X26"
    "Y23:AJ23"
    "Y26:AJ26"
    Q60



  • di vale (utente non iscritto) data: 31/03/2014 08:02:44

    ho provato a creare più variabili come " a" ed a ripetere la stessa stringa di codice ma non funziona. Quando ho tante celle sparse da dover bloccare se rimangono vuote che comando posso usare?
    Grazie



  • di totygno71 (utente non iscritto) data: 31/03/2014 08:24:53

    Se i range sono corretti (dubito anche di questo a questo punto... ^_^)
    prova il file pulsante di bloccociclo
    ciao



  • di vale (utente non iscritto) data: 31/03/2014 11:09:48

    facendo cosi, la cosa strana è che mentre aggiungo le varie stringhe funziona, poi quando le ho messe tutte e provo a cancellare qualche dato in una delle celle controllate, non va più!
     
    Option Explicit
    
    Private Sub Worksheet_Activate()
    Dim a As Integer
       
    a = Application.WorksheetFunction.CountBlank(Foglio2.Range("A17", "A20")) '<------- range scelti
    a = Application.WorksheetFunction.CountBlank(Foglio2.Range("A23", "A26"))
    a = Application.WorksheetFunction.CountBlank(Foglio2.Range("M17", "M26"))
    a = Application.WorksheetFunction.CountBlank(Foglio2.Range("Y14", "Y17"))
    a = Application.WorksheetFunction.CountBlank(Foglio2.Range("AL17"))
    a = Application.WorksheetFunction.CountBlank(Foglio2.Range("Y23", "Y26"))
    a = Application.WorksheetFunction.CountBlank(Foglio2.Range("Q60", "AE1"))
    a = Application.WorksheetFunction.CountBlank(Foglio2.Range("AE1"))
    If a <> 0 Then
    Foglio2.Activate
    MsgBox "Campi obbligatori da compilare, impossibile lasciare il foglio in questo momento. I Range(A1:A10, B1:B10) del Foglio1 devono essere tutti pieni"
    End If
    Application.ScreenUpdating = True
    
    End Sub



  • di totygno71 (utente non iscritto) data: 31/03/2014 11:14:16

    Hai provato il nuovo file che ho allegato?
    Come immaginavo i range sono ancora diversi da quelli che hai detto.

    cit"TUTTE QUESTE
    A17:L17", "M17:X17"
    "Y17:AJ17",
    "A23:L23"
    "Y17:AJ17",
    "A20:L20",
    "A23:L23",
    "M26:X26"
    "Y23:AJ23"
    "Y26:AJ26"
    Q60

    sono diversi da:
    ("A17", "A20")) '<------- range scelti
    a = Application.WorksheetFunction.CountBlank(Foglio2.Range("A23", "A26"))
    a = Application.WorksheetFunction.CountBlank(Foglio2.Range("M17", "M26"))
    a = Application.WorksheetFunction.CountBlank(Foglio2.Range("Y14", "Y17"))
    a = Application.WorksheetFunction.CountBlank(Foglio2.Range("AL17"))
    a = Application.WorksheetFunction.CountBlank(Foglio2.Range("Y23", "Y26"))
    a = Application.WorksheetFunction.CountBlank(Foglio2.Range("Q60", "AE1"))
    a = Application.WorksheetFunction.CountBlank(Foglio2.Range("AE1"))

    Mi spiace... Io lascio... fai perdere un sacco di tempo inutilmente!
    Ciao



  • di Vecchio Frac data: 31/03/2014 11:14:18

    Ma così solo l'ultima riga in cui assegni qualcosa ad "a" viene presa in considerazione.
    Assegnare ad ogni riga un valore ad "a" equivale a perdere il valore precedente.
    I Range da controllare vanno messi tutti insieme.
     
    a = Application.WorksheetFunction.CountBlank(Foglio2.Range("A17", "A20", "A23", "A26", .......)) 'eccetera






  • di vale (utente non iscritto) data: 31/03/2014 11:17:47

    sto facendo varie prove e ogni volta cambio i range per provare e vedere se funziona. quando non sei esperta non sai se una virgola può cambiare il senso, se non chiederei!
    Comunque non voglio farti perdere altro tempo
    grazie ciao totygno71



  • di vale (utente non iscritto) data: 31/03/2014 11:32:52

    vecchio Frac se metto come dici tu mi dice che immesso troppi argomenti!



  • di Vecchio Frac data: 31/03/2014 11:39:38

    Allora unisci le condizioni sommando il risultato del conteggio. In fondo basta una cella vuota per far scattare l'avvertimento: se il numero di celle vuote è zero significa che sono tutte valorizzate.
    L'importante è valutare ogni espressione senza perdere il valore precedente.

    Il simbolo di underscore ("_") serve ad indicare al compilatore che l'istruzione non è finita e che continua alla riga successiva).

     
    Private Sub Worksheet_Activate()
    Dim a As Integer
    
    with Application.WorksheetFunction
        a = .CountBlank(Foglio2.Range("A17", "A20")) + .CountBlank(Foglio2.Range("A23", "A26")) + _
             .CountBlank(Foglio2.Range("M17", "M26")) + .CountBlank(Foglio2.Range("Y14", "Y17")) + _
             .CountBlank(Foglio2.Range("AL17")) + .CountBlank(Foglio2.Range("Y23", "Y26")) + _
             .CountBlank(Foglio2.Range("Q60", "AE1")) + .CountBlank(Foglio2.Range("AE1"))
    end with
    If a <> 0 Then
    Foglio2.Activate
    MsgBox "Campi obbligatori da compilare, impossibile lasciare il foglio in questo momento. I Range(A1:A10, B1:B10) del Foglio1 devono essere tutti pieni"
    End If
    Application.ScreenUpdating = True
    
    End Sub






  • di vale (utente non iscritto) data: 31/03/2014 12:01:00

    ORA FUNZIONA
    grazie mille per la disponibilità a pazienza e scusate il disturbo e la poca conoscenza dello strumento



  • di Vecchio Frac data: 31/03/2014 15:38:55

    Bè ora ne sai una in più :)