intervalli con password



  • intervalli con password
    di ire data: 08/01/2015 10:00:05

    Salve, avrei una piccola dritta da chiedervi! =)
    Io avrei bisogno di concedere l'accesso e la modifica di alcune colonna solo a determinati utenti, o meglio le stesse colonne per ogni foglio.
    Mi servirebbe capire come fare a esprimere l'intervallo. Mi spiego meglio! Riporto qui di seguito il codice presente nel mio workbook per esprimere gli intervalli interessati. Di seguito è presente il mio codice presente sul mio userform con la quale l'utente ha accesso inserendo la password corretta. Nel mio codice, nella parte ASSEGNANOME, vorrei sapere quale delle due modalità da me scritte, è la migliore...
    Nel mio codice c'è qualcosa che non va, perchè, mi fa leggere il file SOLO in modalità di lettura.
    Grazie mille!!!
    Se preferite vi posso fare avere una copia del mio file...
     
    Sub AssegnaNome()
    GG = ActiveSheet.Name
    Range("V:V , AP: AP ").Select ""
    NOME = "spedizioni"
    ActiveWorkbook.Names.Add Name:=NOME, RefersTo:=Selection
    End Sub
    
    Sub AssegnaNome1()
    GG = ActiveSheet.Name
    Range("F4:F25, G4:G25, L4:L25, M4:M25, T4:T25, AA4:AA25, AB4:AB25, AF4:AF25,AG4:AG25,AN4:AN25").Select
    NOME = "collaudo"
    ActiveWorkbook.Names.Add Name:=NOME, RefersTo:=Selection
    End Sub
    Sub ASSEGNANOME2()
    Cells(3, 2).Select
    NOME = "GIORNO"
    ActiveWorkbook.Names.Add Name:=NOME, RefersTo:=Selection
    End Sub
    
    Private Sub Workbook_BeforeClose(Cancel As Boolean)
    Cells.Locked = True
    ThisWorkbook.Save
    End Sub
    
    Private Sub Workbook_Open()
    For Each ws In Worksheets
        ws.Protect Password:="psw", userinterfaceonly:=True
    Next
    Cells.Locked = True
    UserForm1.Show
    End Sub
    _________________________________________________________________________________________
    
    
    Private Sub UserForm_QueryClose(Cancel As Integer, CloseMode As Integer)
    If CloseMode = vbFormControlMenu Then
        Cancel = 1
    End If
    End Sub
    
    Private Sub CommandButton1_Click()
    If TextBox1.Text <> "" Then
        Select Case TextBox1.Text
            Case "Admin"
                Cells.Locked = False
                Unload Me
            Case "collaudo"
                Range("collaudo").Locked = False
                Unload Me
            Case "spedizioni"
                Range("spedizioni").Locked = False
                Unload Me
            Case Else
                MsgBox "Nome utente errato.", vbCritical, "Errore utente"
                TextBox1.Text = ""
                TextBox1.SetFocus
        End Select
    Else
        MsgBox "Nome utente errato.", vbCritical, "Errore utente"
        TextBox1.Text = ""
        TextBox1.SetFocus
    End If
    End Sub
    
    Private Sub CommandButton2_Click()
    ThisWorkbook.Close (0)
    End Sub
    
    
    
    



  • di Lucas87 data: 08/01/2015 11:39:46

    Ciao
    Non serve selezionare l'intervallo per eseguire l'operazione

    ActiveWorkbook.Names.Add Name:="spedizioni", RefersTo:=Range("v:ap")

    Le 3 modalità sono diverse: la prima fa riferimento all'intera colonna, la seconda a un intervallo di celle, la terza a una cella singola. Non puoi confrontare i metodi.
    Dato che l'assegnazione del nome è un'operazione preliminare che viene fatta una sola volta, credo sia più semplice farla manualmente: selezioni le celle che ti interessano e scrivi il nome nella barra dell'indirizzo...fatto.
    Che il file venga aperto in sola lettura (c'è scritto "sola lettura" sulla barra del titolo) non c'entra nulla con il codice.
    All'apertura del file i fogli vengono protetti, ma le celle vengono bloccate solo sul foglio attivo. ws.Cells.Locked = True va messo dentro il ciclo for.



  • di ire (utente non iscritto) data: 08/01/2015 12:07:08

    Grazie mille! =)
    Io ho 5 fogli con i giorni della settimana da lunedì a venerdì e, per ognuno di questi, ho bisogno della trattamento.
    Così ho inserito in assegnaNOME una variabile che mi inserisca il nome del foglio attivo su cui sto lavorando, come riportato nel codice seguente. Non capisco dove stia l'inghippo perchè la mia variabile viene riconosciuta, come 'martedì' per esempio, ma quando sono nel foglio martedì nessuna cella è bloccata!
    Magari una sciocchezza che io non conosco! =(
    Grazie
     
    Sub AssegnaNome()
    Dim GG As String
    GG = ActiveSheet.Name
    Worksheets(GG).Range("V4:V25 , AP4: AP25 ").Select
    NOME = "spedizioni"
    ActiveWorkbook.Names.Add Name:=NOME, RefersTo:=Selection
    End Sub



  • di ire (utente non iscritto) data: 08/01/2015 12:13:39

    Per spiegarmi meglio, si sblocca solamente il mio primo foglio, ovvero il lunedì, perchè tutti gli altri fogli rimangono bloccati in ogni sua cella.
    Ho messo di seguito il mio file, se vuoi dargli un occhio, lucas87.
    Grazie mille. sempre gentilissimo!
    h t t p : / / w w w . filedropper.com/programmasettimanale



  • di scossa data: 08/01/2015 12:17:08

    Dovresti spostare l'istruzione Cells.Locked = True all'interno del ciclo.



    scossa's web site
    Se tu hai una mela, ed io ho una mela, e ce le scambiamo, allora tu ed io abbiamo sempre una mela per uno.
    Ma se tu hai un'idea, ed io ho un'idea, e ce le scambiamo, allora abbiamo entrambi due idee. (George Bernard Shaw)

     
    Private Sub Workbook_Open()
    For Each ws In Worksheets
        Cells.Locked = True
        ws.Protect Password:="psw", userinterfaceonly:=True
    Next
    



  • di Lucas87 data: 08/01/2015 12:24:59

    Credo tu stia facendo un po' di confusione.
    Le 3 macro "assegnanome" servono (appunto) ad assegnare un nome ad un intervallo di celle. Il sistema viene usato per fare riferimento in maniera più semplice ad un intervallo. In quel codice non vengono bloccate le celle.

    Quando apri il file, parte Workbook_Open che va a mettere la protezione a tutti i fogli attraverso il ciclo FOR. Fuori dal ciclo FOR trovi l'istruzione Cells.Locked = True, che imposta la proprietà "bloccata" su tutte le celle, ma solo del foglio attivo (per bloccare tutte le celle di tutti i fogli devi fare quello che ho detto prima). A questo punto viene aperto il form dove si trova una textbox in cui inserire la password, un pulsante per confermare e uno per chiudere.
    Premendo il pulsante viene letta la textbox e con il select case viene stabilita l'operazione da eseguire. Per l'admin, giustamente, le celle vengono sbloccate (ATTENZIONE: il foglio è ancora protetto, ma le celle sbloccate non risentono della protezione). Per altri casi vengono sbloccati gli intervalli definiti con determinati nomi (collaudo, spedizioni, giorno), quindi sarà possibile modificare solo le celle appartenenti a quel determinato intervallo, le altre saranno bloccate.
    In Workbook_BeforeClose le celle vengono nuovamente bloccate e il file salvato. È un'operazione che non serve in quanto all'apertura le celle verranno comunque bloccate.



  • di ire data: 09/01/2015 09:00:57

    okey, ho capito! Grazie per la spiegazione super dettagliata...
    La mia domanda era che avrei voluto assegnare il nome alle stesse celle per ogni foglio dal lunedì al venerdì.
    Cioè non so se mettendo solo
    ________
    Sub AssegnaNome1()
    Range("F4:F25, G4:G25, L4:L25, M4:M25, T4:T25, AA4:AA25, AB4:AB25, AF4:AF25,AG4:AG25,AN4:AN25").Select
    NOME = "collaudo"
    ActiveWorkbook.Names.Add Name:=NOME, RefersTo:=Selection
    End Sub
    _______
    il mio range interessa le celle sopra indicate per ogni foglio?

    Ho un altro problema inserendo, come mi hai indicato gentilmente tu, il Cells.Locked = True all'interno del ciclo For, mi da 'errore di run time '1004' impossibile impostare la proprietà Locked per la classe Range..
    Scusami per le mille domanda e ti ringrazio per la pazienza!



  • di Lucas87 data: 09/01/2015 10:29:05

    Il nome di un intervallo è univoco. Non possono esistere intervalli con lo stesso nome, nemmeno su fogli diversi.
    Abbandonando il tentativo con i nomi, prova a modificare il select case così.

    Per l'altro problema:
    devi inserire
    ws.Cells.Locked = True

    In alternativa allega il file così da capire in che situazione ci si trova
     
    Select Case TextBox1.Text
        Case "Admin"
             For Each sh In Worksheets
                sh.Cells.Locked = False
            Next
        Case "collaudo"
            For Each sh In Worksheets
                sh.Range("F4:F25, G4:G25, L4:L25, M4:M25, T4:T25, AA4:AA25, AB4:AB25, AF4:AF25,AG4:AG25,AN4:AN25").Locked = False
            Next
        Case "spedizioni"
            For Each sh In Worksheets
                sh.Range("V:V , AP: AP").Locked = False
            Next
        Case Else
            MsgBox "Nome utente errato.", vbCritical, "Errore utente"
            TextBox1.Text = ""
            TextBox1.SetFocus
            Exit Sub
    End Select
    Unload Me



  • di ire data: 09/01/2015 11:30:19

    Perfetto funziona tuttoo!!!!!!! Sei un Grande! =)
    Ho risolto tutti i miei problemi.
    Spero di concludere il lavoro autonomamente, altrimenti vi scriverò ancora...
    Sempre gentilissimi! Un grazie speciale a Lucas87...
    Buona giornata a tuttiiiiii! =)