Condividi:        

Macro se condizione vera allora salta comandi successivi

Vuoi potenziare i tuoi documenti Word? Non sai come si fa una macro in Excel? Devi creare una presentazione in PowerPoint?
Oppure sei passato a OpenOffice e non sei sicuro di come lavorare al meglio?

Moderatori: Anthony47, Flash30005

Macro se condizione vera allora salta comandi successivi

Postdi systemcrack » 27/08/24 13:35

Buongiorno a tutti,
sto continuando a "rifinire" il file protocollo che allego di seguito per verificarne i progressi.
protocollo

Ora mi sono accorto di un fastidioso problema causato da una macro di salvataggio automatico che non posso togliere per problemi di sicurezza e che incorre quando il file protocollo viene aperto in sola lettura perchè già aperto su un altro pc.
Perciò mi sono chiesto se non ci fosse il modo di far saltare i comandi alla macro incriminata verificando la condizione che il file non sia aperto in sola lettura.

La macro incriminata è questa:
Codice: Seleziona tutto
Private Sub Workbook_BeforeClose(Cancel As Boolean)
ActiveWorkbook.Save
Call Macro2
Dim NomeFile As String
Workbooks("pratiche-chiuse.xlsm").Close SaveChanges:=True
End Sub

Che è collegata ad un'altra macro [per avere un molteplice salvataggio anche in una cartella nascosta (mia paranoia dopo 2 attacchi hacker nel giro di pochi anni)]:
Codice: Seleziona tutto
Sub Macro2()

nomecopia = "O:\Salvataggi\" & Hour(Now()) & "." & Minute(Now()) & " " & "-" & " " & Day(Date) & "." & Month(Date) & "." & Year(Date) & " " & ThisWorkbook.Name

ThisWorkbook.SaveCopyAs nomecopia

End Sub

Ora essendo la prima macro a richiamare la seconda avevo pensato di agire sulla prima (BeforeClose) e dopo verifica,
Codice: Seleziona tutto
If ActiveWorkbook.ReadOnly Then

nel caso di farle saltare i comandi successivi. Quindi la prima diventerebbe all'incirca così:
Codice: Seleziona tutto
Private Sub Workbook_BeforeClose(Cancel As Boolean)
   If ActiveWorkbook.ReadOnly Then
            Application.DisplayAlerts = False
            Workbooks("pratiche-chiuse.xlsm").Close SaveChanges:=False
            ActiveWorkbook.Close
            Application.Quit
   End If

  ActiveWorkbook.Save
  Call Macro2
  Dim NomeFile As String
  Workbooks("pratiche-chiuse.xlsm").Close SaveChanges:=True
End Sub

Ma purtroppo ricevo un errore di Run-Time 9 "INDICE NON INCLUSO NELL'INTERVALLO" e il debug mi evidenzia questa riga:
Immagine
Avatar utente
systemcrack
Utente Senior
 
Post: 454
Iscritto il: 27/07/17 09:40

Sponsor
 

Re: Macro se condizione vera allora salta comandi successivi

Postdi Anthony47 » 27/08/24 14:31

C'e' un motivo per cui nella Sub Workbook_BeforeClose a volte usi ActiveWorkbook e altre volte Workbooks("pratiche-chiuse.xlsm")? Se fanno (dovrebbero fare) riferimento al file attivo allora usa sempre ActiveWorkbook.

Se invece vuoi far riferimento al file che contiene la macro allora meglio ancora sarebbe usare ThisWorkbook
Avatar utente
Anthony47
Moderatore
 
Post: 19432
Iscritto il: 21/03/06 16:03
Località: Ivrea

Re: Macro se condizione vera allora salta comandi successivi

Postdi systemcrack » 27/08/24 15:30

Anthony47 ha scritto:C'e' un motivo per cui nella Sub Workbook_BeforeClose a volte usi ActiveWorkbook e altre volte Workbooks("pratiche-chiuse.xlsm")? Se fanno (dovrebbero fare) riferimento al file attivo allora usa sempre ActiveWorkbook.

Se invece vuoi far riferimento al file che contiene la macro allora meglio ancora sarebbe usare ThisWorkbook

Si le macro in questione sono sul file protocollo, che apre anche il file pratiche-chiuse.
Ora per entrambi c'è il salvataggio automatico nel caso in cui l'operatore effettui delle modifiche.
Ci sono delle volte in cui un altro operatore potrebbe avere bisogno di consultare lo stesso schema, cioè protocollo, perciò procede con l'apertura del file in sola lettura.
Quando il file protocollo viene aperto in sola lettura è solo per la consultazione perciò non importa che salvi nulla, e fin qui tutto bene, solo che ora se chiudo il file protocollo (in sola lettura) non mi chiude automaticamente il file pratiche-chiuse. :aaah
Avatar utente
systemcrack
Utente Senior
 
Post: 454
Iscritto il: 27/07/17 09:40

Re: Macro se condizione vera allora salta comandi successivi

Postdi Anthony47 » 27/08/24 16:48

Non ti seguo...
Se un UTENTE apre il file PROTOCOLLO in modalità read only, che centra chiudere il file PRATICHE-CHIUSE? Infatti l'errore "INDICE NON INCLUSO NELL'INTERVALLO" dice che quel file (pratiche-chiuse) non risulta aperto: ti risulta invece che sia aperto su quel pc?
Avatar utente
Anthony47
Moderatore
 
Post: 19432
Iscritto il: 21/03/06 16:03
Località: Ivrea

Re: Macro se condizione vera allora salta comandi successivi

Postdi systemcrack » 27/08/24 19:09

Anthony47 ha scritto:Non ti seguo...
Se un UTENTE apre il file PROTOCOLLO in modalità read only, che centra chiudere il file PRATICHE-CHIUSE? Infatti l'errore "INDICE NON INCLUSO NELL'INTERVALLO" dice che quel file (pratiche-chiuse) non risulta aperto: ti risulta invece che sia aperto su quel pc?

Si il file risulta aperto sul pc. Perché il "secondo" utente (che apre il file) clicca sul medesimo collegamento al file (protocollo) sul server, che contiene la macro che apre anche il file pratiche-chiuse. Che sia in sola lettura oppure no il secondo file viene sempre richiamato.. o sbaglio?
Avatar utente
systemcrack
Utente Senior
 
Post: 454
Iscritto il: 27/07/17 09:40

Re: Macro se condizione vera allora salta comandi successivi

Postdi Anthony47 » 27/08/24 20:15

Se il file e' aperto (cioe' hai visto che risulta aperto quando la macro va in errore) allora non capisco perche' viene generato quell'errore

Tuttavia si puo' lavorare sulla Sub Workbook_Open per impedire di aprire "pratiche-chiuse.xlsm"; del tipo:
Codice: Seleziona tutto
Private Sub Workbook_Open()
Dim Ckwb As Workbook
'
If ThisWorkbook.ReadOnly = False Then
    FFName = "Q:\SCANNERTRASPORTI\DOC UFF TRASPORTI\PRATICHE\pratiche-chiuse.xlsm"                 '<<< Percorso e nome del file da aprire
    mySplit = Split(FFName, "\", , vbTextCompare)
    On Error Resume Next
        Set Ckwb = Workbooks(mySplit(UBound(mySplit)))
    On Error GoTo 0
    If Ckwb Is Nothing Then
        Workbooks.Open Filename:=FFName, ReadOnly:=False
    End If
End If
Application.Iteration = True
ThisWorkbook.Activate

Range("M1").Value = Date
End Sub
Ho aggiunto in If /End If

Poi dalla macro ora in errore elimina l'istruzione che chiude "pratiche-chiuse.xlsm"

Prova...
Avatar utente
Anthony47
Moderatore
 
Post: 19432
Iscritto il: 21/03/06 16:03
Località: Ivrea

Re: Macro se condizione vera allora salta comandi successivi

Postdi systemcrack » 28/08/24 07:51

Anthony47 ha scritto:Se il file e' aperto (cioe' hai visto che risulta aperto quando la macro va in errore) allora non capisco perche' viene generato quell'errore

Tuttavia si puo' lavorare sulla Sub Workbook_Open per impedire di aprire "pratiche-chiuse.xlsm"; del tipo:
Codice: Seleziona tutto
Private Sub Workbook_Open()
Dim Ckwb As Workbook
'
If ThisWorkbook.ReadOnly = False Then
    FFName = "Q:\SCANNERTRASPORTI\DOC UFF TRASPORTI\PRATICHE\pratiche-chiuse.xlsm"                 '<<< Percorso e nome del file da aprire
    mySplit = Split(FFName, "\", , vbTextCompare)
    On Error Resume Next
        Set Ckwb = Workbooks(mySplit(UBound(mySplit)))
    On Error GoTo 0
    If Ckwb Is Nothing Then
        Workbooks.Open Filename:=FFName, ReadOnly:=False
    End If
End If
Application.Iteration = True
ThisWorkbook.Activate

Range("M1").Value = Date
End Sub
Ho aggiunto in If /End If

Poi dalla macro ora in errore elimina l'istruzione che chiude "pratiche-chiuse.xlsm"

Prova...

Buon giorno Anthony, purtroppo anche così ricevo errore in quanto non posso escludere completamente il comando di salvataggio del file pratiche-chiuse, contenuto in protocollo in quanto voglio tenere conto di ogni modifica quando il file non è in sola lettura.. ad ogni modo credo di avere risolto oltre che usando il tuo suggerimento, aggiungendo anche un On Error GoTo Next nella BeforeClose nella riga precedente al comando di chiusura e salvataggio vedi di seguito:
Codice: Seleziona tutto
Private Sub Workbook_BeforeClose(Cancel As Boolean)
  If ActiveWorkbook.ReadOnly Then
        Application.DisplayAlerts = False
        Application.Quit
  End If
       ActiveWorkbook.Save
       Call Macro2
       Dim NomeFile As String
On Error Resume Next
 Workbooks("pratiche-chiuse.xlsm").Close SaveChanges:=True
End Sub
Avatar utente
systemcrack
Utente Senior
 
Post: 454
Iscritto il: 27/07/17 09:40


Torna a Applicazioni Office Windows


Topic correlati a "Macro se condizione vera allora salta comandi successivi":


Chi c’è in linea

Visitano il forum: Nessuno e 25 ospiti