Devi provare, purtroppo, non posso provare sulla rete, pero dovrebbe andare
bene :-)
Devi incollare la macro nel foglio in cui vuoi vuoi la protezione. Questa
macro annula l'azione se la persona non è l'utente autorizato.
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
If Target.Column = 1 Or Target.Column = 2 Or Target.Column = 3 Then
If Environ("USERNAME") = "PINCO" Then
'MsgBox ("ok")
Else
MsgBox ("no")
Application.EnableEvents = False
Application.Undo
Application.EnableEvents = True
End If
End If
If Target.Column = 4 Then
If Environ("USERNAME") = "PANCO" Then
' MsgBox ("ok")
Else
MsgBox ("no")
Application.EnableEvents = False
Application.Undo
Application.EnableEvents = True
End If
End If
End Sub
Ciao. Rémi.
--
Alcuni esempi VBA Excel
http://remigueudelot.free.fr/
Spero di aver risposto bene alla tua domanda.
Rémi.
"BGM" <B...@discussions.microsoft.com> a écrit dans le message de
news:C9CED638-273B-4D5D...@microsoft.com...
'----------------------------------------
Ciao Rémi,
Penso che ci siano alcuni problemi con il codice suggerito.
Secondo il tuo codice se l'utente non è PINCO o PANCO, non dovrebbe potere
scrivere (o cambiare) i dati in colonne A:D.
Provi questa prova semplice:
Nelle celle G1:G100 scriva "PIPPO".
Prova trascinando G1:G100 fino a A1:A100.
Momentaneamente, le celle A1:G100 contengono "PIPPO" ma Application.Undo
ristabilisce i dati originali.
Adesso, selezionarti la cella A1.
Di nuovo, le celle A1:G100 contengono "PIPPO".
Salva la cartella. Tutti i dati originali in A1:D100 Tutti i dati originali
in A1:D100 sono stati cambiati - permanente.
---
Regards,
Norman
"Rémi" ha scritto:
> Innanzitutto molte grazie per la risposta e per il codice.
> L'ho provato ed in effetti il codice funziona in parte.
> Come fatto notare da Norman, il codice protegge le colonne A B C dalla
> scrittura dell'utente Pippo , ma quando provo a scrivere su questa colonna
> il
> codice mi fa perdere l'ultima operazione eseguita.
> C'è un modo per aggirare questo problema?
> Invece di fare "undo" si piò negare solo la scrittura?
> Se la cartella di lavoro ha più fogli devo applicare la macro su ogni
> foglio
> ( anche su quelli che verranno aggiunti in futuro ) o posso applicarla
> alla
> cartella ?
> Grazie ancora.
> Ciao
> BGM
-------------------------------
Ciao BGM,
Cancellare il tuo codice e prova:
'===============>>
Private Sub Workbook_Open()
Dim WS As Worksheet
For Each WS In Me.Worksheets
With WS
.Unprotect Password:="PIPPO"
.Cells.Locked = False
If Environ("USERNAME") = "PINCO" Then
.Range("D:D").Cells.Locked = True
ElseIf Environ("USERNAME") = "PANCO" Then
.Range("A:C").Cells.Locked = True
Else
.Range("A:D").Cells.Locked = True
End If
WS.Protect Password:="PIPPO", _
UserInterfaceOnly:=True
End With
Next
End Sub
'<<===============
Questo è un procedura di evento ed il codice dovrebbe essere incollato nel
modulo di ThisWorkbook - non in un modulo standard e non in un modulo del
foglio di lavoro.
Bisogna cambiare la parola d'accesso ed i nomi d'utente!
---
Regards,
Norman
Norman sei un grande ! proteggi tutti i fogli con una procedura unica !
Comunque, sono contento di sapere che la funzione environ(USERNAME) funziona
bene con la rete.
Approfito per rubare il tuo codice per il mio sito (se non vedi problema) .
Ciao. Rémi.
--
Alcuni esempi VBA Excel
http://remigueudelot.free.fr/
Spero di aver risposto bene alla tua domanda.
Rémi.
"Norman Jones" <norma...@whereforartthou.com> a écrit dans le message de
news:ev1gt6h1...@TK2MSFTNGP12.phx.gbl...
> Approfito per rubare il tuo codice per il mio sito (se non vedi
> problema) .
Non vedo problema. Tutto č nel public domain.
Tuttavia, sarebbe piů utile se doveste rubare da qualcuno piů capaci!
---
Regards,
Norman
> Tuttavia, sarebbe piů utile se doveste rubare da qualcuno piů capaci!
Tuttavia, sarebbe piů utile se dovesse rubare...
Chiedo scusa!
---
Regards,
Norman
"Rémi" ha scritto:
> Ciao,
"BGM" ha scritto:
Stavi pensando di:
Application.Username
--
Regards,
Norman
Private Sub Workbook_Open()
Dim WS As Worksheet
For Each WS In Me.Worksheets
With WS
.Unprotect Password:="password"
.Cells.Locked = False
'Per PC Win95
If Application.UserName = "Pippo" Or Application.UserName =
"Pluto Then
AllowInsertingRows = True
.Range("F:F").Cells.Locked = True
'Per PC Windows XP o 2000
ElseIf Environ("USERNAME") = "Pinco" Then
.Range("A:E").Cells.Locked = True
'Per Utente Amministratore
ElseIf Environ("USERNAME") = "amministratore" Then
.Range("A:F").Cells.Locked = False
Else
.Range("A:F").Cells.Locked = True
End If
WS.Protect Password:="password", _
UserInterfaceOnly:=True
End With
Next
End Sub
Così com'è fatto il codice non permette di inserire nessuna riga.
Come posso fare?
Grazie
Ciao
BGM
"Norman Jones" ha scritto:
> Ciao BGM,
> >> La funzione va a controllare l'utente con cui è registrato il
> >> programma e cioè quello che si trova nel menù
> >> Strumenti - Opzioni sulla linguetta generale c'è Nome utente:
> Ciao Norman,
[Cut]
> Posso chiederti un ulteriore aiuto?
> Se nel foglio cosě protetto dovessi inserire una nuova riga non
> Cosě com'č fatto il codice non permette di inserire nessuna riga.
> Come posso fare?
> Grazie
> Ciao
> BGM
'----------------------------
Ciao BGM,
Se la procedura dovesse essere usata esclusivamente con xl2002 ==>, si
potrebbe provare:
'==============>>
Private Sub Workbook_Open()
Dim WS As Worksheet
Const PWORD As String = "ABCD" '<<=== CAMBIARE!
For Each WS In Me.Worksheets
With WS
.Unprotect Password:="password"
.Cells.Locked = False
'Per PC Win95
If Application.UserName = "Pippo" _
Or Application.UserName = "Pluto" Then
.Range("F:F").Cells.Locked = True
'Per PC Windows XP o 2000
ElseIf Environ("USERNAME") = "Pinco" Then
.Range("A:E").Cells.Locked = True
'Per Utente Amministratore
ElseIf Environ("USERNAME") = "amministratore" Then
.Range("A:F").Cells.Locked = False
Else
.Range("A:F").Cells.Locked = True
End If
WS.Protect Password:=PWORD, _
AllowInsertingRows = True, _
UserInterfaceOnly:=True
End With
Next
End Sub
'==============>>
Dato che l'argomento 'AllowInsertingRows' non sia disponibile per le
versioni prima di xl2002, potrebbe essere meglio aggiungere un tasto ad una
barra. Poi assegni la seguente macro al tasto:
'In un modulo standard
'==============>>
Sub InsertRows()
Const PWORD As String = "ABCD" '<<== CAMBIARE!
With ActiveSheet
.Unprotect Passrord:=PWORD
Selection(1).EntireRow.Insert
.Protect password:=PWORD, _
UserInterfaceOnly:=True
End With
End Sub
'<<==============
---
Regards,
Norman
> ad una barra. Poi assegni....
avrebbe dovuto essere:
ad una barra degli strumenti
Spero che fosse comunque chiaro
---
Regards,
Norman
scusate, intervengo nel vostro thread
dato che ho anch'io un problema collegato a questo
thread.
ho utilizzato il codice suggerito. le colonne
A:D nn sono modificabili.
prima di inserire il codice (a livello di ThisWorkbook)
ho inserito dei numeri nelle celle, derivanti da formule
(banali operazioni).
chiedo: č possibile avere la protezione, e poter inoltre evitare
all'utente la "visualizzazione" delle formule contenute
nelle celle, nel momento in cui seleziono una cella
delle colonne A:D?
Ex.: la cella A1 č =B1+C1 --> č possibile selezionare la cella
ma evitare di vedere =B1+C1 ?
grazie molte,
ap98
'---------------------------------------
Prova:
'===============>>
Private Sub Workbook_Open()
Dim WS As Worksheet
Dim rng As Range
For Each WS In Me.Worksheets
With WS
.Unprotect Password:="PIPPO"
.Cells.Locked = False
.Cells.FormulaHidden = False
If Environ("USERNAME") = "PINCO" Then
Set rng = .Range("D:D")
ElseIf Environ("USERNAME") = "PANCO" Then
Set rng = .Range("A:C").Cells
Else
Set rng = .Range("A:D").Cells
End If
End With
With rng.Cells
.FormulaHidden = True
.Locked = True
End With
WS.Protect Password:="PIPPO", _
UserInterfaceOnly:=True
Next WS
End Sub
'<<===============
---
Regards,
Norman
Oppure:
'===============>>
Private Sub Workbook_Open()
Dim WS As Worksheet
Dim rng As Range
Const PWORD As String = "PIPPO"
For Each WS In Me.Worksheets
With WS
.Unprotect Password:=PWORD
.Cells.Locked = False
.Cells.FormulaHidden = False
If Environ("USERNAME") = "PINCO" Then
Set rng = .Range("D:D")
ElseIf Environ("USERNAME") = "PANCO" Then
Set rng = .Range("A:C").Cells
Else
Set rng = .Range("A:D").Cells
End If
End With
With rng.Cells
.FormulaHidden = True
.Locked = True
End With
WS.Protect Password:=PWORD, _
UserInterfaceOnly:=True
Next WS
End Sub
'<<===============
---
Regards,
Norman
"Norman Jones" <norma...@whereforartthou.com> wrote in message
news:ulD$x4X2FH...@TK2MSFTNGP12.phx.gbl...
> Ciao GreetingsFromAsburyPark73,
>
> scusate, intervengo nel vostro thread
> dato che ho anch'io un problema collegato a questo
> thread.
> ho utilizzato il codice suggerito. le colonne
> A:D nn sono modificabili.
> prima di inserire il codice (a livello di ThisWorkbook)
> ho inserito dei numeri nelle celle, derivanti da formule
> (banali operazioni).
> chiedo: è possibile avere la protezione, e poter inoltre evitare
> all'utente la "visualizzazione" delle formule contenute
> nelle celle, nel momento in cui seleziono una cella
> delle colonne A:D?
> Ex.: la cella A1 è =B1+C1 --> è possibile selezionare la cella
End With
End Sub
Legato a questo probelma poi volevo farti un ulteriore domanda.
Se l'utente per errore dovesse cancellare una cella o riga, ho verificato
che l'opzione annulla ultima operazione non è attiva.
Io pensavo di aggiungere un ulteriore bottone per permettere all'utente di
annullare l'ultima operazione fatta.
E' possibile fare questo?
La funzione Undo non funziona con le macro.Cosa posso usare?
Grazie ancora per il prezioso aiuto.
ciao
BGM
"Norman Jones" ha scritto:
> Ciao BGM.
Legato a questo probelma poi volevo farti un ulteriore domanda.
Se l'utente per errore dovesse cancellare una cella o riga, ho verificato
che l'opzione annulla ultima operazione non è attiva.
Io pensavo di aggiungere un ulteriore bottone per permettere all'utente
di annullare l'ultima operazione fatta.
E' possibile fare questo?
La funzione Undo non funziona con le macro.Cosa posso usare?
Grazie ancora per il prezioso aiuto.
ciao
BGM
'----------------------------------
Ciao BGM,
> La funzione Undo non funziona con le macro.
Accade spesso che l'attività di una macro distrugga la 'catena' di Undo. Ciò
è inevitabile!
> Io pensavo di aggiungere un ulteriore bottone per permettere
> all'utente di annullare l'ultima operazione fatta.
Allora, non è tanto facile! Comunque, prova:
Sostituisca la macro XYZ con il seguente codice:
'In un modulo standard (nuovo o vuoto)
'================>>
Option Explicit
Public rw As Long
Public aSH As Worksheet
Const PWORD As String = "ABCD" '<<===== CAMBIARE!
'----------------------->>
Sub InsertRows()
Selection(1).EntireRow.Insert
End Sub
'----------------------->>
Sub DeleteRows()
Dim i As Long
Dim WB As Workbook
Dim delRng As Range
Dim rng As Range
Dim ws As Worksheet
Set WB = ActiveWorkbook
Set aSH = ActiveSheet
Set rng = aSH.UsedRange
Set delRng = Selection(1).EntireRow
Application.ScreenUpdating = False
If Not SheetExists("Copia") Then
aSH.Copy , after:=WB.Sheets(aSH)
With ActiveSheet
.Name = "Copia"
.Visible = xlVeryHidden
End With
End If
aSH.Activate
Application.ScreenUpdating = True
rng.Copy Destination:=Sheets("Copia"). _
Range(rng.Address)
rw = delRng.Row
delRng.Delete
aSH.Protect password:=PWORD, _
UserInterfaceOnly:=True
End Sub
'----------------------->>
Sub UndoBGM()
Dim ws As Worksheet
Dim rng As Range
Dim sStr As String
Dim iPos As Long
sStr = "Chiedo scusa! Non è possibile ristabilire una riga!"
If rw = 0 Then
MsgBox sStr 'Non c'è niente nella memoria!
Exit Sub
End If
Application.ScreenUpdating = False
With aSH
.Unprotect password:=PWORD
iPos = aSH.Index
.Cells.ClearContents
Set ws = Sheets("Copia")
ws.Cells.Copy .UsedRange.Cells(1)
Application.ScreenUpdating = True
.Protect password:=PWORD, _
UserInterfaceOnly:=True
End With
End Sub
'----------------------->
Function SheetExists(SheetName As Variant, _
Optional aBook As Workbook) As Boolean
Dim WB As Workbook
Set WB = IIf(aBook Is Nothing, ThisWorkbook, aBook)
On Error Resume Next
SheetExists = CBool(Len(WB.Worksheets _
(SheetName).Name) > 0)
End Function
'<<====================
Poi assegni la macro UndoBGM al terzo bottone.
---
Regards,
Norman
>Sostituisca la macro XYZ con il seguente codice:
Avrebbe dovuto essere:
Sostituisca la macro InsertRows con il seguente codice:
(Ho usato XYZ per la mia prova!)
---
Regards,
Norman