Valutazione 4.87/ 5 (100.00%) 5838 voti

Condividi:        

applicazione excel vba

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

applicazione excel vba

Postdi dgianmarco » 02/02/20 13:10

ciao a tutti,
ho questo problema che non so come risolverlo, posto il codice

Codice: Seleziona tutto
Public blnexit As Boolean

Private Sub Workbook_Open()
Application.OnKey "{ESC}", ""
With Application
Sheets("home").ScrollArea = "A1:AC28"
    .WindowState = xlNormal
    .Left = 110
    .Top = 50
    .Width = 773
    .Height = 392
End With
    If Val(Application.Version) < 12 Then
        'Excel 97 - 2003
        Dim I As Integer
        Set Barre = Application.CommandBars
        For I = 1 To Application.CommandBars.Count
        Barre(I).Enabled = False
        Next I
    Else
        'Excel 2007
        Application.ExecuteExcel4Macro "SHOW.TOOLBAR(""Ribbon"",False)"
    End If
   
    With ActiveWindow
        .DisplayWorkbookTabs = False 'fogli
        .DisplayHeadings = False 'intestazioni
        .DisplayGridlines = False 'griglia
        .Caption = "" 'nome file
        .DisplayHorizontalScrollBar = False 'barra di scorrimento orizzontale
        .DisplayVerticalScrollBar = False 'barra di scorrimento verticale
    End With
   
    With Application
        .DisplayFormulaBar = False 'barra della formula
        .DisplayStatusBar = False 'barra di stato
        .ShowWindowsInTaskbar = False 'barra delle applicazioni di Windows
        .Caption = "                                           "
    End With

End Sub

Private Sub Workbook_BeforeClose(Cancel As Boolean)
If Chiudi = 0 Then
    Application.OnKey "{ESC}"
    If blnexit Then Application.OnKey "{ESC}"
    Cancel = Not blnexit
    Worksheets("home").Select
    MsgBox "Usa il pulsante ESCI DAL PROGRAMMA"
End If
End Sub

Private Sub Workbook_BeforeSave(ByVal SaveAsUI As Boolean, Cancel As Boolean)
    Application.DisplayAlerts = False
    Application.EnableEvents = False
    ActiveWorkbook.Save
    bln = False
    If Workbooks.Count = 1 Then
        Application.Quit
    Else
        ThisWorkbook.Close
        Application.EnableEvents = True
    End If
End Sub


questo è in questa_cartelle_di_lavoro

Codice: Seleziona tutto
Public Chiudi As Integer
Sub SalvaChiudi()
Chiudi = 1
'ActiveWorkbook.Save
ActiveWindow.Close
'Application.Quit

End Sub


questo in un modulo per salvare e chiudere

il problema è che al primo click della X nella barra in alto viene fuori il messaggio e non chiude l'applicazione, ma appena provo a cliccare una seconda volte è come se inibisce il Workbook_BeforeClose e mi compare la finestra di excel che mi chiedere se voglio chiudere.
vorrei che tutte le volte che viene premuta la X ripete lo stesso messaggio finchè non viene correttamente chiuso dal pulsante SalvaChiudi

Come potrei risolverlo?

https://drive.google.com/open?id=1QjYdJHsBQzFwQOwtRjlCMMRu8tX81Swz
dgianmarco
Utente Junior
 
Post: 12
Iscritto il: 02/02/20 12:53

Sponsor
 

Re: applicazione excel vba

Postdi Anthony47 » 02/02/20 20:33

Intanto "Benvenuto nel forum".

Pero' perdona, ma quando vedo queste automazioni mi chiedo sempre perche' qualcuno ha la pretesa di cambiare l'interfaccia standard di Excel sul mio pc, tra l'altro lasciandolo in una situazione diversa da come l'aveva trovato e perdipiu' menomato.

Cio' detto, l'errore che vedo e' nella sequenza ThisWorkbook.Close / Application.EnableEvents = True all'interno della Workbook_BeforeSave; deve essere invertita:
Codice: Seleziona tutto
    Else
        Application.EnableEvents = True
        ThisWorkbook.Close
''        Application.EnableEvents = True


Vedo poi una dichiarazione Public blnexit As Boolean all'interno del modulo questa_cartella_di_lavoro; io non so chi usa la blnexit ma ti sia chiaro che la sua visibilita' e' limitata all'interno del modulo in cui l'hai dichiarata (perche' questa_cartella_di_lavoro e' un "Modulo di Classe", non un "Modulo standard")

Ciao
Avatar utente
Anthony47
Moderatore
 
Post: 17003
Iscritto il: 21/03/06 16:03
Località: Ivrea

Re: applicazione excel vba

Postdi dgianmarco » 03/02/20 08:18

Ciao e grazie per il benvenuto,
vado per punti relativamente al tuo prezioso aiuto:
riguardo all'inversione di Application.EnableEvents = True che ho messo prima di ThisWorkbook.Close non mi cambia la situazione nel senso che alla primo click sulla X viene fuori correttamente il message box che avvisa di usare il pulsante per uscire, chiudo la message box e appena premo nuovamente la X a questo punto non mi ripropone la mia message box ma compare la finestra di excel chiedendomi se voglio salvare prima di uscire. io vorrei che la message box compaia sempre se viene premuta la X in modo tale da usare solo i pulsanti.

secondo punto riguardo il cambio interfaccia è che ciò che ho creato è stato fatto per usare completamente i pulsanti, form e tutto quello che necessità al corretto funzionamento evitando che l'utente possa accidentalmente fare operazioni non corrette.
quidni secondo te è corretto che al Workbook_BeforeSave richiamo la macro per riattivare fogli griglia intestazioni ecc ecc?

terzo punto: e perdona la mia poca preparazione in quanto autodidatta, in merito alla dichiarazione Public blnexit As Boolean cosa mi consiglieresti?

grazie mille per l'aiuto
dgianmarco
Utente Junior
 
Post: 12
Iscritto il: 02/02/20 12:53

Re: applicazione excel vba

Postdi Anthony47 » 03/02/20 12:06

Gli utenti vanno istruiti su come comportarsi, perche' ragionando allo stesso modo potrebbero scrivere 35 invece che 3,5 e i dati sarebbero "perfetti ma sbagliati".

Comunque nella mia simulazione la chiusura del foglio e' possibile solo tramite la macro SalvaChiudi; il tentativo tramite il tasto X provoca sistematicamente il messaggio e la non chiusura, i comandi File /Sala oppure File /Chiudi non sono invece disponibili.

Pero' nella Sub Workbook_BeforeClose viene usata la variabile BLNEXIT e io non so come viene manipolata nel tuo codice.

Insomma prova a pubblicare il tuo file dimostrativo e vedremo cosa fare.
Per le istruzioni su come allegare un file:
viewtopic.php?f=26&t=103893&p=605487#p605487

secondo te è corretto che al Workbook_BeforeSave richiamo la macro per riattivare fogli griglia intestazioni ecc ecc?
Secondo me e' opportuno che tutte le volte che il file in discussione diventa "non attivo" le impostazioni di Excel siano ripristinate come erano in origine; per questo puoi utilizzare gli eventi Workbook_Deactivate e Workbook_Activate

in merito alla dichiarazione Public blnexit As Boolean cosa mi consiglieresti?
Dipende dall'uso che ne fai; se la utilizzi in un Modulo Standard allora devi dichiararla Public in testa a un modulo standard (come hai fatto con la variabile Chiudi); se invece l'uso e' limitato al modulo Questa_cartella_di_lavoro allora va bene come hai fatto, anche se la dichiarazione Public e' inutile (basta la sola Dim)

Ciao
Avatar utente
Anthony47
Moderatore
 
Post: 17003
Iscritto il: 21/03/06 16:03
Località: Ivrea

Re: applicazione excel vba

Postdi dgianmarco » 04/02/20 13:45

posso mandarti il file in privato?
dgianmarco
Utente Junior
 
Post: 12
Iscritto il: 02/02/20 12:53

Re: applicazione excel vba

Postdi Anthony47 » 04/02/20 17:38

Obiettivo di qualsiasi forum e' di diffondere la conoscenza dell'argomento; in questa ottica l'uso della comunicazione privata e' un controsenso.
Immagino che sul file ci siano informazioni riservate che non puoi diffondere, ma basta creare una copia con le sole informazioni utili a capire il problema (leggasi: l'insieme delle macro che gestiscono il fenomeno "chiusura controllata del file") e il gioco e' fatto. O no??

Ciao
Avatar utente
Anthony47
Moderatore
 
Post: 17003
Iscritto il: 21/03/06 16:03
Località: Ivrea

Re: applicazione excel vba

Postdi dgianmarco » 04/02/20 17:44

perdonami e ti do ragione, non è legato solo ad informazioni riservate, e che lo sto creando per la diffusione on line sperando in una retribuzione.
ma se questo ti crea problemi provo a ripostare i codici
dgianmarco
Utente Junior
 
Post: 12
Iscritto il: 02/02/20 12:53

Re: applicazione excel vba

Postdi Anthony47 » 04/02/20 19:28

Prova a pubblicare almeno tutto il vba coinvolto nella "chiusura controllata" del file e a descrivere come hai articolato il tutto e vedremo cosa viene fuori

Ciao
Avatar utente
Anthony47
Moderatore
 
Post: 17003
Iscritto il: 21/03/06 16:03
Località: Ivrea

Re: applicazione excel vba

Postdi dgianmarco » 04/02/20 19:33

ok ci provo
dgianmarco
Utente Junior
 
Post: 12
Iscritto il: 02/02/20 12:53

Re: applicazione excel vba

Postdi dgianmarco » 04/02/20 19:57

allora questo è il codice in questa_cartella_di_lavoro

Codice: Seleziona tutto
Private Sub Workbook_Open()
With Application
Sheets("home").ScrollArea = "A1:AC28"
    Application.OnKey "{ESC}", ""
    .WindowState = xlNormal
    .Left = 110
    .Top = 50
    .Width = 773
    .Height = 392
End With
    If Val(Application.Version) < 12 Then
        'Excel 97 - 2003
        Dim I As Integer
        Set Barre = Application.CommandBars
        For I = 1 To Application.CommandBars.Count
        Barre(I).Enabled = False
        Next I
    Else
        'Excel 2007
        Application.ExecuteExcel4Macro "SHOW.TOOLBAR(""Ribbon"",False)"
    End If
   
    With ActiveWindow
        .DisplayWorkbookTabs = False 'fogli
        .DisplayHeadings = False 'intestazioni
        .DisplayGridlines = False 'griglia
        .Caption = "GESTIONE BOLLETTINO CCP - Dr Software - Versione 1.0" 'nome file
        .DisplayHorizontalScrollBar = False 'barra di scorrimento orizzontale
        .DisplayVerticalScrollBar = False 'barra di scorrimento verticale
    End With
   
    With Application
        .DisplayFormulaBar = False 'barra della formula
        .DisplayStatusBar = False 'barra di stato
        .ShowWindowsInTaskbar = False 'barra delle applicazioni di Windows
        .Caption = "                                           "
    End With

End Sub

    Private Sub Workbook_BeforeClose(Cancel As Boolean)
    Dim blnexit As Boolean
        If CS = 0 Then Cancel = Not blnexit
        If blnexit Then Application.OnKey "{ESC}"
   End Sub
   
   Private Sub Workbook_BeforeSave(ByVal SaveAsUI As Boolean, Cancel As Boolean)
    Call attivabarrechiusura
    Application.DisplayAlerts = False
    Application.EnableEvents = False
    ActiveWorkbook.Save
    bln = False
    If Workbooks.Count = 1 Then
        Application.Quit
    Else
        ThisWorkbook.Close
        Application.EnableEvents = True
    End If
End Sub

Private Sub attivabarrechiusura()
With Application
Sheets("home").ScrollArea = ""
    .WindowState = xlMaximized
End With
If Val(Application.Version) < 12 Then
        'Excel 97 - 2003
        Dim I As Integer
        Set Barre = Application.CommandBars
        For I = 1 To Application.CommandBars.Count
            Barre(I).Enabled = True
        Next I
    Else
        'Excel 2007
        Application.ExecuteExcel4Macro "SHOW.TOOLBAR(""Ribbon"",True)"
    End If
   
    With ActiveWindow
        .DisplayWorkbookTabs = True 'fogli
        .DisplayHeadings = True 'intestazioni
        .DisplayGridlines = True 'griglia
        .Caption = "GESTIONE BOLLETTINO CCP - Dr Software - Versione 1.0" 'nome file
        .DisplayHorizontalScrollBar = True 'barra di scorrimento orizzontale
        .DisplayVerticalScrollBar = True 'barra di scorrimento verticale
    End With
   
    With Application
        .DisplayFormulaBar = True 'barra della formula
        .DisplayStatusBar = True 'barra di stato
        .ShowWindowsInTaskbar = True 'barra delle applicazioni di Windows
        .Caption = "                                           "
    End With
    End Sub


il seguente l'ho inserito in un modulo

Codice: Seleziona tutto
Public CS As Integer

Sub SalvaChiudi()
ActiveWorkbook.Save
ActiveWindow.Close
Application.Quit
End Sub

Sub Chiudi()
CS = 0
Application.OnKey
ThisWorkbook.Close SaveChanges:=False
End Sub


e dal foglio home ho il pulsante che richiama la macro SalvaChiudi.
la macro salva chiudi sembra funzionare correttamente, invece nel foglio home appena clicco la prima volta X in alto a destra non accade nulla, se lo premo una seconda volta mi compare la finestra di excel che vuole farmi chiudere il file.

io desidererei che tutte le volte che venga premuta la X avvisi l'utente con un msgbox che deve usare il pulsante corretto ESCI DAL PROGRAMMA

e se possibile questo dovrebbe accadere per tutti i fogli.
spero di essere stato chiaro e grazie mille per l'aiuto
dgianmarco
Utente Junior
 
Post: 12
Iscritto il: 02/02/20 12:53

Re: applicazione excel vba

Postdi Anthony47 » 07/02/20 02:27

Scusa la latitanza, giornate pesanti...
Allora, senza stravolgere la tua impostazione ho lasciato la tua Sub Workbook_Open, mentre per la Workbook_BeforeClose e la Workbook_BeforeSave ho modificato come segue:
Codice: Seleziona tutto
Private Sub Workbook_BeforeClose(Cancel As Boolean)
        If CS = 0 Then
            Cancel = True
        Else
            ThisWorkbook.Saved = True
        End If
End Sub


Codice: Seleziona tutto
Private Sub Workbook_BeforeSave(ByVal SaveAsUI As Boolean, Cancel As Boolean)
If CS = 0 Then
    Cancel = True
End If
End Sub



In un Modulo standard ho invece inserito:
Codice: Seleziona tutto
Public CS As Long                  'RIGOROSAMENTE IN TESTA AL MODULO

Sub SalvaChiudi()
''Stop
CS = 1
ActiveWorkbook.Save
Call attivabarrechiusura
Application.OnKey "{ESC}"
If Workbooks.Count = 1 Then
    Application.Quit
Else
    ThisWorkbook.Close
End If
End Sub


Sub Chiudi()
''Stop
CS = 1
Call attivabarrechiusura
Application.OnKey "{ESC}"
ThisWorkbook.Saved = True
If Workbooks.Count = 1 Then
    Application.Quit
Else
    ThisWorkbook.Close
End If
End Sub


Nello stesso Modulo Standard ho spostato tutta la Sub attivabarrechiusura()

Quanto a "se possibile questo dovrebbe accadere per tutti i fogli", nella tua Workbook_Open hai questa riga:
Codice: Seleziona tutto
Sheets("home").ScrollArea = "A1:AC28"

dovrai ripeterla per ognuno dei fogli presenti nel tuo file

Analogamente dovrai fare con la riga presente nel codice della Sub attivabarrechiusura
Codice: Seleziona tutto
Sheets("home").ScrollArea = ""



Vedi un po'....
Avatar utente
Anthony47
Moderatore
 
Post: 17003
Iscritto il: 21/03/06 16:03
Località: Ivrea

Re: applicazione excel vba

Postdi dgianmarco » 07/02/20 11:50

scusa ma le sub seguenti le devo inserire nei folglio home oppure rimangono dopo la sub workbook open nella mia cartella di lavoro?

Codice: Seleziona tutto
Private Sub Workbook_BeforeClose(Cancel As Boolean)
        If CS = 0 Then
            Cancel = True
        Else
            ThisWorkbook.Saved = True
        End If
End Sub


Codice: Seleziona tutto
Private Sub Workbook_BeforeSave(ByVal SaveAsUI As Boolean, Cancel As Boolean)
If CS = 0 Then
    Cancel = True
End If
End Sub
dgianmarco
Utente Junior
 
Post: 12
Iscritto il: 02/02/20 12:53

Re: applicazione excel vba

Postdi Anthony47 » 07/02/20 12:48

Queste due Sub vanno nel modulo Questa_cartella_di_lavoro, in sostituzione delle Sub che hai pubblicato tu

Ciao
Avatar utente
Anthony47
Moderatore
 
Post: 17003
Iscritto il: 21/03/06 16:03
Località: Ivrea

Re: applicazione excel vba

Postdi dgianmarco » 08/02/20 17:52

non capisco perchè non va, ti spiego:
ho impostato tutto per come hai detto, dalla ho con il pulsante esci dal programma richiamo la sub salachiudi e tutto funziona correttamente nel senso che chiude il programma riportando lo stato delle barre ecc come in origine.
sempre dalla home se premo la X in alto a destra 1volta non accade nulla, se lo premo una seconda volta mi compare la finestra di excel che vuole farmi chiudere il programma.
ma non si può che tutte le volte che viene premuta la X avvisa l'utente di usare il pulsante "esci dal programma"?
seconda domanda, la sub chiudi che funzione avrebbe?
dgianmarco
Utente Junior
 
Post: 12
Iscritto il: 02/02/20 12:53

Re: applicazione excel vba

Postdi Anthony47 » 08/02/20 19:41

Questo e' il mio file di test :
https://www.dropbox.com/s/xfkg3a9czndlr ... .xlsm?dl=0

Il codice di cui parlo e' parte in Questa_cartella_di_lavoro e l'altra parte in Modulo2

ma non si può che tutte le volte che viene premuta la X avvisa l'utente di usare il pulsante "esci dal programma"?
Nelle mie Sub Workbook_BeforeClose e Sub Workbook_BeforeSave c'e' questo blocco:
Codice: Seleziona tutto
        If CS = 0 Then
            Cancel = True

Se, in aggiunta a "cancellare" il comando Close o il comando Save (effetto del Cancel = True) vuoi altre azioni allora basta aggiungere altre istruzioni subito dopo a quel blocco; tipo
Codice: Seleziona tutto
        If CS = 0 Then
            Cancel = True
            MsgBox ("Usa solo i pulsanti presenti sul foglio")


seconda domanda, la sub chiudi che funzione avrebbe?
Questa domanda mi lascia perplesso, perche' anche il file che tu avevi pubblicato conteneva la Sub Chiudi; quindi potrei rispondere che e' la mia versione della tua Sub... Piu' seriamente, quella Sub serve a chiudere il file senza salvarlo

Ciao
Avatar utente
Anthony47
Moderatore
 
Post: 17003
Iscritto il: 21/03/06 16:03
Località: Ivrea

Re: applicazione excel vba

Postdi dgianmarco » 09/02/20 11:45

ci tengo a ringraziarti per il tuo prezioso supporto però devi spiegarmi questa cosa che ha dell'incredibile e oltre a farmi ridere non riesco a spiegarla.
con un compiler (in questo caso inno script studio) ho creato la relativa installazione di tutto cio che serve nella directory C:\ creando anchein automatico un collegamento sul desktop, ovviamente ho creato un file eseguibile che installa tutto dove voglio io.
Ecco la cosa strana, una volta che ha posizionato il tutto nella directory C:\miacartella lancio il programma ovviamente dal collegamento sul desktop e tutto funziona correttamente senza aver fatto nessuna modifica all'infuori aver eliminato la sub chiudi (che era solamente un copia incolla errato ma in realta' non mi serve). funziona tutto intendo che tutte le volte che premo la X non chiude il programma anche se la premo 100 volte, si chiude correttamente premendo il tasto esci dal programma che rixchiama la sub salvachiudi.
??????? come la spiegheresti questa cosa?
adesso aggiungo anche msgbox e poi ti aggiorno.
Domanda, quando chiudo il programma dal relativo pulsante, posso richiamare una sub che ho creato per il backup? ovviamente si trova in un'altro modulo.
dgianmarco
Utente Junior
 
Post: 12
Iscritto il: 02/02/20 12:53

Re: applicazione excel vba

Postdi Anthony47 » 09/02/20 16:42

Mi sembra di capire che la cosa strana di cui parli sia che, nel tuo stesso file che avevi gia' usato per le prove che davano esito negativo, e' bastato cancellare la Sub Chiudi perche' il comportamento cambiasse.

Ovviamente, date le mie scarse capacita' pranoterapeutiche, non sono in grado ci elaborare nessuna ipotesi; volendo potresti allegare il tuo file di test con la Sub Chiudi ancora presente, e magari si riesce a vedere qualcosa di piu'.

Oppure ripieghi sul classico "Nescio, sed fieri sentio et excrucior"

Comunque io non eliminerei l'opzione "Chiudi senza salvare": se mi dovesse arrivare un file dove posso solo salvare e chiudere io spengo il pc e poi vado a trovare l'autore di tutto cio. Anzi aggiungerei una opzione "Salva il lavoro e continua", perche' e' buona pratica salvare periodicamente il lavoro gia' fatto.

Infine Si, prima di chiudere il file puoi richiamare un'altra macro, dovrebbe bastare inserire una Call AltraMacro subito dopo l'attuale Call attivabarrechiusura

Ciao
Avatar utente
Anthony47
Moderatore
 
Post: 17003
Iscritto il: 21/03/06 16:03
Località: Ivrea

Re: applicazione excel vba

Postdi dgianmarco » 09/02/20 18:54

no no tutto a cominciato a funzionare da quando con un compiler (in questo caso inno script studio) ho creato la relativa installazione di tutto cio che serve nella directory C:\ creando anche in automatico un collegamento sul desktop, ovviamente ho creato un file eseguibile che installa tutto in C:\miacartella. devo controllare le impostazioni che ho dato a inno script studio..... oddio impazzisco :-) :-)
dgianmarco
Utente Junior
 
Post: 12
Iscritto il: 02/02/20 12:53

Re: applicazione excel vba

Postdi dgianmarco » 09/02/20 18:56

non riesco a scaricare il tuo file, potresti mandarmelo su posta elettronica? d.gianmarco@gmail.com
dgianmarco
Utente Junior
 
Post: 12
Iscritto il: 02/02/20 12:53

Re: applicazione excel vba

Postdi Anthony47 » 10/02/20 13:27

Non so quanto e' complesso il tuo progetto e quali sono le prestazioni di "inno script" quindi non so valutare la situazione in cui ti sei trovato.

Quanto a scaricare il mio file, se clicchi sul link inserito nel messaggio dovresti essere reindirizzato al sito dropbox.com dove e' archiviato il mio file.
Probabilmente ti proporra' una form per "accedere" a dropbox (se hai un account), oppure per "registrarsi" e quindi creare un account; la stessa form in coda pero' propone "No grazie, continua a visualizzare", che e' l'opzione da cliccare:
Immaginepic bbcode



Vedrai ora i dettagli del file, tra cui (circolettato in rosso) l'icona "scaricare il file"
Immaginewhere can i upload pictures to share for free


Se non vedi questa interfaccia allora probabilmente essa e' nascosta e l'opzione "scarica il file" e' sul bordo destro della finestra:
Immagine

Le icone evidenziate in blu sono quelle che consentono di visualizzare /nascondere l'interfaccia dei dettagli.

Riprova con queste istruzioni...
Avatar utente
Anthony47
Moderatore
 
Post: 17003
Iscritto il: 21/03/06 16:03
Località: Ivrea

Prossimo

Torna a Applicazioni Office Windows


Topic correlati a "applicazione excel vba":


Chi c’è in linea

Visitano il forum: Nessuno e 10 ospiti