Sviluppare funzionalita su Microsoft Office con VBA excel 2016 codice per impedire apertura file se utilizzato da altro utente

Login Registrati
Stai vedendo 12 articoli - dal 1 a 12 (di 12 totali)
  • Autore
    Articoli
  • #46587 Score: 0 | Risposta

    gagen

      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

      #46592 Score: 0 | Risposta

      scossa
      Partecipante
        37 pts

        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 Sub
        

        dovrebbe funzionare.

        #46599 Score: 0 | Risposta

        gagen

          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

          #46618 Score: 0 | Risposta

          vecchio frac
          Senior Moderator
            272 pts

            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.

            #46622 Score: 0 | Risposta

            alexps81
            Moderatore
              58 pts

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

              #46638 Score: 0 | Risposta

              scossa
              Partecipante
                37 pts

                vecchio frac ha scritto:

                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.

                #46640 Score: 0 | Risposta

                vecchio frac
                Senior Moderator
                  272 pts

                  Scusa scossa, dal tuo codice non avevo dedotto tutto questo ragionamento che e' naturalmente corretto.

                  #46650 Score: 0 | Risposta

                  gagen
                  Partecipante

                    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 With

                    i 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

                    #46651 Score: 0 | Risposta

                    Marius44
                    Moderatore
                      58 pts

                      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

                      #46676 Score: 0 | Risposta

                      gagen
                      Partecipante

                        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 Function
                        #46677 Score: 0 | Risposta

                        alexps81
                        Moderatore
                          58 pts

                          Ciao @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 Boolen

                          Cosa vuol dire? Praticamente che dopo che ha svolto tutti i sui calcoli, ti dovrà restituire Vero o Falso (True o False)...così come puoi notare nel rigo di codice dov'è scritto FileAperto = 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 Function
                          
                          

                          mi raccomando modifica la variabile nomeFile. Ci sono le indicazioni.

                          #46678 Score: 0 | Risposta

                          gagen

                            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   

                          Login Registrati
                          Stai vedendo 12 articoli - dal 1 a 12 (di 12 totali)
                          Rispondi a: excel 2016 codice per impedire apertura file se utilizzato da altro utente
                          Gli allegati sono permessi solo ad utenti REGISTRATI
                          Le tue informazioni: