› Sviluppare funzionalita su Microsoft Office con VBA › excel 2016 codice per impedire apertura file se utilizzato da altro utente
-
AutoreArticoli
-
ben ritrovati a tutti
i colleghi stanno lavorando con il file che grazie a voi ho fatto con il vba per automatizzare gli inserimenti.
Ora ovviamente essendo collocato in un server con l'indirizzo condiviso per aprirlo, se uno ci sta lavorando l'altro che tenta di aprirlo riceve il classico popup di avviso che ti fa scegliere se aprirlo in sola lettura, avere una notifica o abbandonare
ci sono stati dei casi di colleghi poco esperti che l'ho hanno aperto in sola lettura e poi non salvando i dati o comunque non aspettando la notifica, non lo hanno aggiornato correttamente
esiste un codice vba da inserire per bloccare completamente a monte l'apertura del file se appunto è già in uso da altro utente? non deve essere permesso lavorarci così evitiamo errori se non sono il primo utilizzatore
grazie
Ciao,
non posso testarlo, ma prova a mettere questo codice nel modulo "ThisWorkbook":
Private Sub Workbook_Open() If ThisWorkbook.ReadOnly Then MsgBox "il file viene chiuso in quanto" & vbCrLf & "aperto da altro utente!", vbCritical Me.Close SaveChanges:=False End If End Subdovrebbe funzionare.
ti ringrazio ma non funziona
al secondo utente appare sempre il popup con la scelta "sola lettura" "notifica" "annulla" e può fare la sua scelta il file si apre
Una cosa che mi viene in mente di proporre è: all'apertura viene creato un piccolo file di lock in una cartella condivisa e accessibile a tutti. Basta aprire un file di testo, non serve scriverci dentro niente, anche a zero byte va bene (è un po' il meccanismo del file .laccdb di Access). Questo indica che un utente ha avuto accesso al file Excel e lo ha aperto.
Il file Excel sempre nell'evento Open deve prima controllare che quel piccolo file di lock non esista già e/o sia aperto (il tentativo di eliminazione fallisce). Se il file esiste e non può essere eliminato allora avvisa l'utente e si chiude. Altrimenti procede ad aprire il file di lock e permette all'utente di modificarlo. All'uscita naturalmente deve chiudere ed eliminare il file di lock.
Nel mio ufficio avevo creato un File che, posto sul server, non può essere aperto contemporaneamente da altri utenti. Devo controllare appena posso.
Riguardo al file di lock...mi domando se questo tipo di controllo non possa essere insito al file stesso...magari sfruttato un Names (anche nascosto addirittura).
Una cosa che mi viene in mente di proporre è: all'apertura viene creato un piccolo file di lock in una cartella condivisa e accessibile a tutti.
Il codice che ho proposto nasceva proprio dal fatto che nella cartella dove è aperto il file excel (p.e.: ESEMPIO.xlsm) viene automaticamente creato il file ~$ESEMPIO.xlsm e la prova che ho fatto (per dire che poteva funzionare) è stata:
- copiare, a file ESEMPIO.xlsm aperto, il file ~$ESEMPIO.xlsm in una cartella diversa
- chiudere il file ESEMPIO.xlsm (ovviamente ~$ESEMPIO.xlsm viene eliminato automaticamente)
- copiare il file ~$ESEMPIO.xlsm dall'altra cartella, nella cartella dove c'è il file ESEMPIO.xlsm
- aprire il file ESEMPIO.xlsm
ovviamente ho ottenuto il messagio di avviso di file aperto ed il file si è chiuso.
Evidentemente, se non funziona, bisogna controllare la directory dove risiede il file e verificare la situazione.
Scusa scossa, dal tuo codice non avevo dedotto tutto questo ragionamento che e' naturalmente corretto.
al momento soluzione parziale con il codice di Rollis da un altro topic simile simile a quello di Scossa che probabilmente avrebbe funzionato uguale se nel test avessi attivato le macro excel sul secondo pc che apre il file
With ThisWorkbook If .ReadOnly = True Then MsgBox "il file viene chiuso in quanto" & vbCrLf & "aperto da altro utente!", vbCritical .Close End If End Withi problemi sono che tutti i colleghi devono avere excel con le macro attivate e soprattutto che comunque all'aperture del file da parte del secondo utente il popup classico di "sola lettura" "notifica" appare comunque, salvo poi se fatta una delle due scelte, apparire il popup del codice sopra che chiude il file
l'ideale sarebbe che il popup di excel con la scelta non appaia per niente
Buongiorno a tutti
Anche se datato, prova a dare un'occhiata a questo indirizzo:
https://www.hwupgrade.it/forum/showthread.php?t=2010867#:~:text=xls%22%20If%20FileAperto(nomeFile),MsgBox%20%22File%20gi%C3%A0%20aperto%20!%22
Ovviamente sarebbe da adattare con opportuno messaggio.
Ciao,
Mario
grazie appena posso provo anche se non ho capito bene come inserire il codice dell'esempio
va bene così in Thisworkbook
Private Function FileAperto(pathNomeFile As String) As Boolean On Error Resume Next Open pathNomeFile For Binary Access Read Write Lock Read Write As #1 Close #1 If Err.Number <> 0 Then FileAperto = True Err.Clear End If Dim nomeFile As String nomeFile = "indirizzo del file" If FileAperto(nomeFile) = True Then MsgBox "File già aperto !" End FunctionCiao @gagen,
fermo restando che avrai comunque il problema delle macro da attivare (senza il codice non funziona), questo codice non è corretto scritto così.
Innanzitutto lo devi affidare a un evento specifico di ThisWorkbook. L'evento in questione è Workbook_Open()
Comunque, per farti capire, un Function restituisce un valore. In questa che stai tentando tu di far funzionare, deve restituire un valore Booleno (Vero o Falso). Infatti te ne accorgi perché alla fine del primo rigo c'è scritto
As BoolenCosa vuol dire? Praticamente che dopo che ha svolto tutti i sui calcoli, ti dovrà restituire Vero o Falso (
TrueoFalse)...così come puoi notare nel rigo di codice dov'è scrittoFileAperto = True. Quindi se Numero Errore <> 0 allora dammi Vero.A tutto questo però la Function vuole un parametro, come descritto nel primo rigo tra le parentesi tonde
(pathNomeFile As String).Ovvero vuole tutto il percorso dove risiede il file e nome file compreso di estensione.
Ora le funzioni devono essere chiamate, infatti dovrà essere utilizzato un Sub che chiama questa Function a cui gli passiamo il parametro richiesto dalla Function stessa.
------------------------------------------------------------------------------------------------
Questo nell'evento Open di ThisWorkbook (Questa_cartella_di_lavoro):
Option Explicit Private Sub Workbook_Open() Dim nomeFile As String nomeFile = "metti qui tutto il percorso dove risiede il file + nome file.xlsm" If FileAperto(nomeFile) = True Then MsgBox "File già aperto !" End Sub '---------------------------------------------------------------------------- Private Function FileAperto(pathNomeFile As String) As Boolean On Error Resume Next Open pathNomeFile For Binary Access Read Write Lock Read Write As #1 Close #1 If Err.Number <> 0 Then FileAperto = True Err.Clear End If End Functionmi raccomando modifica la variabile nomeFile. Ci sono le indicazioni.
chiaro, esaustivo e istruttivo come sempre
grazie!!!
per concludere quindi il problema delle macro attivate su tutti i pc che tentano l'accesso dopo l'apertura del file da primo utente non è risolvibile
-
AutoreArticoli
