Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

Protezione foglio in base all'utente di rete

61 views
Skip to first unread message

BGM

unread,
Oct 20, 2005, 10:46:12 AM10/20/05
to
Ciao a tutti,
volevo chiedevi se esiste il modo di proteggere una crtella di lavoro in
base all'utente logato al PC ( utente di rete nel mio caso visto che esite un
dominio ).
Ho un foglio excel utilizzato ed aggiornato da due reparti.
Le prime tre colonne sono esclusive di un reparto e quindi solo loro possono
scriverci.La quarta colonna è esclusiva del secondo.
Ora il foglio è aperto a tutti però vorrei che sulle prime tre colonne ci
andasse a scrivere solo l'utente PINCO mentre sulla quarta solo l'utente
PANCO.
E' una cosa possibile?
Mi aiutate se esite del codice per farlo?
Grazie mille
ancora ciao
BGM

Rémi

unread,
Oct 20, 2005, 5:45:40 PM10/20/05
to
Ciao,

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...

Norman Jones

unread,
Oct 20, 2005, 10:48:28 PM10/20/05
to
Rémi Ha scritto:

'----------------------------------------

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


BGM

unread,
Oct 21, 2005, 3:28:03 AM10/21/05
to
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

"Rémi" ha scritto:

Norman Jones

unread,
Oct 21, 2005, 5:05:58 AM10/21/05
to
"BGM" 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


Rémi

unread,
Oct 21, 2005, 1:32:23 PM10/21/05
to
Ciao,

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...

Norman Jones

unread,
Oct 21, 2005, 1:48:41 PM10/21/05
to
Ciao Rémi,

> 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


Norman Jones

unread,
Oct 21, 2005, 1:56:32 PM10/21/05
to
Ciao Rémi,

> Tuttavia, sarebbe piů utile se doveste rubare da qualcuno piů capaci!

Tuttavia, sarebbe piů utile se dovesse rubare...

Chiedo scusa!

---
Regards,
Norman


BGM

unread,
Oct 24, 2005, 3:46:02 AM10/24/05
to
Una precisazione.
La funzione environ(USERNAME) che tu mi avevi consigliato funziona ma non
proprio con l'utente di rete.
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:
Il controllo viene fatto su questo.
Per me può andare bene anche così.
Ti ringrazio ancora.
Ciao
BGM

"Rémi" ha scritto:

> Ciao,

BGM

unread,
Oct 24, 2005, 5:24:03 AM10/24/05
to
Non considerare la precisazione.
Ho SBAGLIATO in pieno....
La funzione che mi hai dato funziona e funziona anche bene...
Ho sbagliato io con i codici, prendendo un pò qua e un pò là alla fine ho
fatto confusione.
Scusami ancora.
Ciao
BGM

"BGM" ha scritto:

Norman Jones

unread,
Oct 24, 2005, 6:21:56 AM10/24/05
to
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:

Stavi pensando di:

Application.Username

--
Regards,
Norman


BGM

unread,
Oct 25, 2005, 5:10:02 AM10/25/05
to
Ciao Norman,
grazie ancora per il codice.La protezione funziona benissimo.
A titolo informativo preciso che la protezione in base all'utente di rete
sui PC windows 95 non funziona e perciò ho dovuto optare per la protezione in
base all'utente dell'applicazione.Da qui la confusione con il codice.
Ho usato infatti per i client Win95 Application.Username mentre per gli
altri ho usato Environ ( "USERNAME")...
Posso chiederti un ulteriore aiuto?
Se nel foglio così protetto dovessi inserire una nuova riga non me lo fa fare.
come posso fare in modo che alcuni utenti possono inserire nuove rigne sul
foglio?
Io avevo pensato di ussare la funzione AllowInsertingRows = True.
Ecco il codice:

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:

Norman Jones

unread,
Oct 25, 2005, 6:20:29 AM10/25/05
to
BGM ha scritto:

> 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


Norman Jones

unread,
Oct 25, 2005, 6:28:57 AM10/25/05
to
Ciao BGM.

> ad una barra. Poi assegni....

avrebbe dovuto essere:

ad una barra degli strumenti

Spero che fosse comunque chiaro

---
Regards,
Norman


asburypark98

unread,
Oct 25, 2005, 11:02:19 AM10/25/05
to

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

Norman Jones

unread,
Oct 25, 2005, 12:07:25 PM10/25/05
to
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


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


Norman Jones

unread,
Oct 25, 2005, 12:15:57 PM10/25/05
to
Ciao GreetingsFromAsburyPark73,

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

asburypark98

unread,
Oct 25, 2005, 12:23:27 PM10/25/05
to
tutto ok norman!
glory day!

asburypark98

unread,
Oct 25, 2005, 12:23:31 PM10/25/05
to
tutto ok norman!
glory day!

asburypark98

unread,
Oct 25, 2005, 12:23:37 PM10/25/05
to
tutto ok norman!
glory day!

BGM

unread,
Oct 26, 2005, 5:25:08 AM10/26/05
to
Sei stato chiarissimo.Grazie mille.
Ho sfruttato le tue indicazioni per inserire nella barra due bottoni.
Il primo per aggiungere righe ed il secondo per rimuovere righe ( in caso di
inserimento errato di una riga ).Ecco il codice:
Sub DeleteRows()
Const PWORD As String = "password"
With ActiveSheet
.Unprotect Password:=PWORD
If Application.UserName = "PIPPO Then
Selection(1).EntireRow.Delete
Else
MsgBox "Utente non autorizzato"
End If
.Protect Password:=PWORD, _
UserInterfaceOnly:=True

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.

Norman Jones

unread,
Oct 26, 2005, 1:03:36 PM10/26/05
to
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


Norman Jones

unread,
Oct 26, 2005, 1:17:22 PM10/26/05
to
Ciao BGM.

>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


0 new messages