troppo codice



  • troppo codice
    di bcgeppo data: 22/04/2014 14:13:59

    Buongiorno Forum, ho creato un foglio per gestire i vari scarichi di materiale dal magazzino alle varie commesse, lo scopo è di avere a monitor solo le commesse interessate ed ho creato nell'elenco commesse due macro per ogni commessa dove scopre e nasconde la relativa colonna nel foglio degli articoli di magazzino in allegato un file per capire meglio quello che vorrei fare (EsempioBC1.xlsm). Così come è funziona anche, il problema è che bisogna scrivere molto codice e essendo con altre funzioni e fogli nidificati il file comincia a diventare pesante da gestire anche a causa di tutto questo codice e numero di pulsanti, magari un consiglio su come impostare una macro che mi apra e chiuda in base la selezione del cursore o qualcosa del genere.
    spero di essermi spiegato.
    Ciao


  • Impostare una cella come una finta checkbox
    di Giubox (utente non iscritto) data: 22/04/2014 14:50:55

    Buongiorno a tutti ragazzi,

    apro questa discussione per discutere con voi forse del più intricato problema che abbia mai avuto con Excel e VBA in generale e delle possibili soluzioni da poter trovare. Provo a spiegarvi nel minimo dettaglio tutto sperando di essere il più chiaro possibile.

    Ho 2 fogli excel di uno stesso documento: uno con i dati generali e l'altro vuoto con solo le voci che identificano ciascuna colonna.
    Attraverso una macro, secondo determinati criteri di ricerca che ho impostato, viene compilato il foglio2 prendendo i dati che mi servono dal foglio1.
    Su alcune righe delle colonne H ed I del foglio2, sempre all'interno di questa macro, ho disegnato con i bordi delle finte checkbox. Non ho voluto mettere delle vere checkbox in quanto questo foglio può essere sempre modificato dalla macro (una sorta di piccolo motore di ricerca sul quale poi compiere una azione di scelta, YES su colonna H, NO su colonna I, dove l'una esclude l'altra, ponendo anche una X), e Dio sa quanto è difficile e laborioso togliere una checkbox una volta messa, specie quando poi il documento creato, come nel mio caso, non è fisso ma varia sempre.

    Ecco vorrei pertanto impostare su una riga del foglio, sulle celle poste sulle colonne H e I delle sorte di checkbox di scelta, la cui selezione dell'una esclude l'altra (opzione YES/NO).

    Mi piacerebbe poi che le scelte fatte vengano riportate e memorizzate infine su una colonna del foglio1, in modo tale da completare la lista totale con l'azione finale da compiere (o la YES o la NO).

    Spero di essere stato il più chiaro possibile e che ci sia quanto meno la possibilità di impostare la cella come una falsa checkbox, sarebbe già un gran bel passo avanti.
    Spero inoltre di riuscire a postare un'immagine con il foglio interessato in modo tale da dare anche un aiuto visivo a chiunque mi voglia aiutare. Ed inoltre per ulteriori dettagli, qualora servano, non esitate a chiederli!

    Grazie in anticipo a tutti!!



  • di Giubox (utente non iscritto) data: 22/04/2014 14:56:11

    Scusa BCGeppo, volevo aprire una nuova discussione e invece l'ho messa come mia risposta alla tua, chiedo scusa per il disguido.



  • di Giubox (utente non iscritto) data: 22/04/2014 15:05:41

    Comunque vedendo il tuo file molte cose combaciano anche con la mia richiesta, provo a lavorarci su, anche se non sono per niente un esperto di VBA ma un semplice autodidatta.



  • di Zer0Kelvin data: 22/04/2014 15:12:26

    Ciao.
    Ho allegato un file con una soluzione equivalente.
    Ho cancellato tutti i pulsanti ed utilizzato l'evento Worksheet_SelectionChange per richiamare una singola procedura con due parametri per eseguire il lavoro.
    Questo è tutto il codice utilizzato
     
    ,## nel codice del foglio "Commesse" ##
    Private Sub Worksheet_SelectionChange(ByVal Target As Range)
    Dim Hide As Boolean
       If Not Intersect(Target, Range("E:F")) Is Nothing Then
          If Target.Row > 1 And Target.Cells.Count = 1 Then 'controlla che la selezione sia una sola cella in colonna E o F
             Hide = Target.Column = 6 'colonna F nasconde, altrimenti mostra
             Riga_On_Off Target.Row, Hide ' richiama la sub col numero di riga della cella cliccata, nasconde/mostra
          End If
       End If
    End Sub
    
    
    ' ## in Modulo1 ##
    Sub deleteShapes() 'utilizzata una sola volta per eliminare tutte le forme (pulsanti) dal foglio
    Dim i As Long
       For i = 1 To Foglio10.Shapes.Count
           Foglio10.Shapes.Item(1).Delete
       Next i
    End Sub
    
    
    Public Sub Riga_On_Off(Riga As Long, Hide As Boolean)
    Dim v As String
       Application.ScreenUpdating = False
       v = Sheets("Commesse").Cells(Riga, 1) & ":" & Sheets("Commesse").Cells(Riga, 1)
       With Sheets("Movimenti Magazzino")
          .Unprotect Password:=12
          Sheets("Movimenti Magazzino").Columns(v).EntireColumn.Hidden = Hide
          .Protect Password:=12
       End With
       If Hide Then
          Sheets("Commesse").Range("G" & Riga) = "Chiusa"
       Else
          Sheets("Commesse").Range("G" & Riga) = "Aperta"
       End If
       Application.ScreenUpdating = True
    End Sub
    



  • di Zer0Kelvin data: 22/04/2014 15:15:15

    Ho inserito un secondo file con una piccola correzione.
    Il file è:
    Corretto - EsempioBC1 by 0°K.xlsb



  • di Lucas87 data: 22/04/2014 15:25:25

    @bcgeppo
    Ciao

    1-Continuare a selezionare il foglio rallenta le operazioni. Scrivendo sheets("tuo_foglio").... ottieni lo stesso risultato
    2-Invece di continuare a sbloccare e bloccare il foglio puoi inserire in ThisWorkbook per l'evento open questo:
    Worksheets("tuo_foglio").Protect Password:="password", userinterfaceonly:=True
    Che blocca il foglio da modifiche manuali ma permette comunque quelle da codice
    3-Sarebbe più semplice se come pulsanti fossero usati i controlli Activex. Con il codice sotto, premendo il pulsante viene ricavata la riga su cui si trova il pulsante e successivamente viene richiamata la macro. In questo modo riduci notevolmente le righe di codice
     
    Private Sub CommandButton1_Click()
    r = Split(CommandButton1.TopLeftCell.Address(, 0), "$")(1)  'indica la riga su cui si trova l'angolo in alto a sx del pulsante
    riga_297_On (r)     'richiama la macro passando il valore della riga
    End Sub
    
    Sub riga_297_On(riga As Long)
        v = Sheets("Commesse").Cells(riga, 1)
        Sheets("Movimenti Magazzino").Columns(v).EntireColumn.Hidden = False
        Cells(riga, 6) = "Aperta"
    End Sub



  • di bcgeppo data: 23/04/2014 06:45:00

    Buongiorno forum,

    per Zer0Kelvin: i due file che hai inserito non sono scaricabili, forse perche hanno lo stesso nome, comunque ho provato il codice che hai indicato e funziona alla grande, grazie. La piccola correzione di cosa si trattava?

    Lucas87: Ho provato il codice e anche questo funziona, i tuoi consigli mi sembrano molto interessanti, ma il punto 2 non riesco a metterlo in pratica, non so dove sbaglio. come hai scritto tu ho inserito il codice in ThisWorkbook
    Worksheets("foglio1").Protect Password:="12", userinterfaceonly:=True
    continua a darmi errore compilazione:non valido all'esterno di una routine
    porta pazienza ma da solo non ce la posso fare e mi piacerebbe capire come far funzionare sta cosa che potrei applicare a diversi fogli.
    Grazie e buona giornata



  • di Lucas87 data: 23/04/2014 08:05:40

    Ciao.
    devi prima togliere dai tuoi codici la parte che blocca e sblocca il foglio.
    controlla che il foglio sia senza protezione.
    inserisci il mio codice in thisworkbook per l'evento open.
    Quando il file viene aperto il foglio specificato (solo quello) verrà protetto, ma solamente dalle modifiche manuali, permettendo le modifiche da codice.
    Il codice sotto serve a bloccare tutti i fogli
     
    Private Sub Workbook_Open()
    For Each ws In ThisWorkbook.Worksheets
        ws.Protect password:"12" , userinterfaceonly:=True
    Next
    End Sub
    



  • di bcgeppo data: 23/04/2014 10:13:18

    avevo gia risposto ma non so dove sia andata a finire, se qualcuno la trova in giro per il forum ignoratemi, detto questo Lucas87 ho seguito le tue istruzioni, il codice che protegge il foglio singolo funziona, l'ultimo codice scritto che protegge tutti i fogli mi da errore gia quando lo incollo (diventa rosso) dove sbaglio?



  • di Lucas87 data: 23/04/2014 10:17:10

    Scusa mancava un =
     
    Private Sub Workbook_Open()
    For Each ws In ThisWorkbook.Worksheets
        ws.Protect Password:="12", userinterfaceonly:=True
    Next
    End Sub
    



  • di bcgeppo data: 23/04/2014 11:18:24

    Grazie, Grazie



  • di Giubox (utente non iscritto) data: 23/04/2014 15:17:24

    Questa discussione mi è stata molto utile e mi ha aiutato a risolvere in parte quello che volevo fare. Mi piacerebbe tuttavia fare qualche altro miglioramento.

    Se qualcuno di voi volesse aiutarmi sarei molto grato. Ecco qui in basso il titolo della discussione che ho aperto io:

    "Impostare delle celle come delle finte checkbox"

    Grazie a chiunque voglia aiutarmi!