Userform con clessidra



  • Userform con clessidra
    di Paganiva (utente non iscritto) data: 09/06/2013 00:44:56

    Saluti a tutti
    Sono nuovo del forum e non molto esperto di VBA excel.
    E' mia intenzione di sfruttare una form che simuli una clessidra e sfruttarla in quei programmi dove i tempi di attesa per l'esecuzione delle macro, sono abbastanza lunghi. La userform e dotata di una label con una stringa che vorrei scorresse in contemporanea ai movimenti della clessidra.
    i codici commentati sono:(tutti nella form) in sequenza.

    La clessidra al momento la attivo attraverso dei command botton contenuti in un foglio, con Show e Hide
    Le sequenze dell'immagini sono contenute in una subcartella la quale è contenuta in una cartella.
    Il tutto funziona ma con delle imprecisioni.
    La form sembra chiudersi ma in realtà non lo è, perchè ciò avvenga devo dichiarare nella sub Userform1.Hide anche una Range.select
    Se clicco nella user quando è in esecuzione si ferma.
    Qualcuno sa darmi spiegazioni e correggere i codici?
    Ciao

     
    Option Explicit
    Private muovi As Boolean
    'dichiarazioni per celare tasto X chiusura
    
    Private Declare Function SetWindowLong _
    Lib "user32" _
    Alias "SetWindowLongA" ( _
    ByVal hwnd As Long, _
    ByVal nIndex As Long, _
    ByVal dwNewLong As Long) _
    As Long
    
    Private Declare Function FindWindow _
    Lib "user32" _
    Alias "FindWindowA" ( _
    ByVal lpClassName As String, _
    ByVal lpWindowName As String) _
    As Long
    
    Private Sub UserForm_Initialize()
    'nascondo il tasto di chiusura dell'userform "X"
    
    SetWindowLong FindWindow( _
    vbNullString, Me.Caption), _
    -16, -2067791744
    End Sub
    
    Private Sub UserForm_Activate()
    'ad userform avviata variabile muovi vera attivo sub Animaz
    muovi = True
    Call Animaz
    End Sub
    
    Private Sub Animaz()
    'variabili sequenza
    Dim x As Integer, y As Integer, MyTimer As Double, SavePath
    DoEvents
    x = 1
    y = 1
    MyTimer = Timer
    SavePath = ThisWorkbook.Path
    'percorso cartella e immagini in essa contenute
    SavePath = SavePath & "AnimazioneCles"
    Do
        On Error Resume Next
        ' carico nella proprietà immagine della userform l'immagine e l' estenzione
        UserForm1.Image1.Picture = LoadPicture(SavePath & x & ".GIF")
        ' se non trova l'immagine evito l'errore
        On Error GoTo 0
        Do
        'ciclo e durata frame
        Loop While Timer - MyTimer < 0.15
            If x = 12 Then
                x = 1
                Else
                x = x + 1
            End If
            MyTimer = Timer
            DoEvents
            ' ciclo animazione
        Loop While muovi
        muovi = False
    End Sub
    
    Private Sub UserForm_QueryClose(Cancel As Integer, CloseMode As Integer)
    ' Inibizione della chiusura da tasto X nel caso non lo nascondiamo e messaggio di avvertimento
     If CloseMode = 0 Then
            Cancel = True
            MsgBox "Non è possibile chiudere sino a completamento lavoro", vbCritical
        End If
    'muovi = False
    End Sub
    
    Private Sub Form_Load()
    ' Animazione scritta sorrevole del testo contenuto nella label e temporizzazione
    Label1.Caption = "Attendere ...."
    Timer1.Enabled = True
    Timer1.Interval = 300
    End Sub
    
    Private Sub Timer1_Timer()
    ' sequenza caratteri della stringa scorrevole
    Dim str As String
    str = Form1.Label1.Caption
    str = Mid(str, 2, Len(str)) & Left(str, 1)
    Form1.Label1.Caption = str
    End Sub



  • di isy data: 09/06/2013 09:29:01

    Ciao

    Cit: E' mia intenzione di sfruttare una form che simuli una clessidra e sfruttarla in quei programmi dove i tempi di attesa per l'esecuzione delle macro, sono abbastanza lunghi.

    1) Sei sicuro che qui nel Forum i tempi della macro non si possano ridurre?
    Nel caso allega la macro che chiama la clessidra e siamo qui

    2) Allega non file di esempio con Userform per testare il problema.




  • di Vecchio Frac data: 09/06/2013 11:23:47

    Secondo me una clessidra normale è in molti casi sufficiente per far capire all'utente che l'elaborazione è in corso:
    application.cursor=xlWait

    Inoltre potresti sfruttare la StatusBar per aggiungere informazioni utili:
    application.StatusBar="Attendere... " & i & "%"
    dove "i" è un contatore progressivo calcolato (o stimato) all'inizio della sub di lavorazione.

    Alla fine esistono anche ottimi esempi di ProgressBar che sono passati anche qui in forum neanche tanto tempo fa.
    Una ricerchina nelle discussioni attive dovrebbe produrre qualche risultato.

    In genere intervenire con API per modificare le finestre nell'ambiente Office non è mai una buona idea (solo esperienza personale e casini con Access ^_^).

    Per scaricare la Form dalla memoria si usa Unload; mi unisco a Isy nel chiederti un file di esempio per fare le opportune verifiche.





  • di Vecchio Frac data: 09/06/2013 11:27:45

    Ho trovato un file di esempio e lo allego.





  • di Textomb data: 09/06/2013 14:20:26

    ho trovato, rovistando tra i miei appunti, un lavoro con una progressbar dinamica...
    la allego



  • di Paganiva (utente non iscritto) data: 09/06/2013 16:41:26

    Grazie a
    Vecchio Frac e Textomb, gli esempi e le indicazioni sono funzionanti e chiare.
    Sarei interessato a quanto proposto da isy, cioè se è possibile ridurre i tempi di attesa dello sviluppo di una macro.
    Il problema è questo e posto in un'altro forum prendendo spunto da un programmino di Remi e perfezionato da Sid, cioè come comporre un calendario gare per sport di squadra.
    Da la userform1 gestisco il tutto, qui ho due button "Crea calendario gare" e "Calendario vuoto" sono due modi di compilazione nel primo compariranno gli incontri di tutti gruppi iscritti, nel secondo solo gli incontri senza i nomi dei gruppi.
    Fino a dieci squadre il tempo di attesa su un PC recente è sopportabile, oltre si può arrivare anche a 5 minuti su un PC datato.
    Volevo inoltre inserire al posto della form3 statica che avviva di "attendere", una form con sequenze dinamiche un po più accattivante come quella proposta ad inizio con la macro di Archi.
    Allego i file.
    Saluti a tutti




  • di isy (utente non iscritto) data: 09/06/2013 17:53:26

    Ciao

    Ho disabilitato il ricalcolo automatico e gli eventi del foglio...
    Sul mio Pc ho i seguenti tempi
    Crea calendario Gare richiede 0,2 secondi
    Calendario Vuoto 0,5 secondi sempre con andata e ritorno

    Ora non resta che controllare se qualche formula non risulta aggiornata disabilitando questi eventi
    Nota: Con Excel 2013 non ho a disposizione il calendario presente in Userform2
     
    Application.ScreenUpdating = False
    Application.EnableEvents = False              'New
    Application.Calculation = xlCalculationManual 'New
    
    'Qui prosegue il codice....
    
    Application.Calculation = xlCalculationAutomatic    'New
    Application.EnableEvents = True                     'New
    Application.ScreenUpdating = True



  • di Paganiva (utente non iscritto) data: 09/06/2013 18:50:43

    Ciao isy
    Ho fatto diverse prove, non dovrebbero esserci problemi il tutto si è velocizzato, apportate modifiche al programmino.
    Resterebbe da adattare il codice per form3 dinamica progressbar tempo di attesa, oppure il calciatore che palleggia.
    Grazie e saluti
     
    Private Sub CommandButton5_Click() 'CREA CALENDARIO GARE
    
    tipo = 0
    UserForm4.Show
    If tipo = 0 Then
        MsgBox "Devi scegliere il tipo di torneo", vbExclamation, "ATTENZIONE"
        Exit Sub
    End If
    Dim creo As VbMsgBoxResult
    Dim t As Date
    t = Now
    Call Scopri_tutti_fogli
    
    ' modifica Sid del 23-05-13
    If Application.WorksheetFunction.CountA(Sheets("Ordine").Range("A2:A22")) < 3 Then
        MsgBox "Devi selezionare una lista di almeno tre squadre", vbCritical: Exit Sub
    End If
    ' fine modifica
    
    Application.ScreenUpdating = False
    Application.EnableEvents = False              'isy
    Application.Calculation = xlCalculationManual 'isy
    
    
    creo = MsgBox("Vuoi davvero creare un torneo ''" & Nopt & "''?", vbYesNo + vbQuestion _
    , "CONFERMA CREAZIONE TORNEO")
    If creo = vbNo Then Exit Sub
    
    '^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ Visualizzazione form di attesa
    UserForm3.Show False
    UserForm3.Caption = "Avanzamento ... 0%"
    DoEvents
    '^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
    
    Application.ScreenUpdating = False
    
    ' ************************************
    ' cancella vecchi dati
    ' ************************************
    .... cut
    
    .... cut
    End With
    End With
    If tipo = 1 Then
        With Sheets("Risultati")
            .Columns("E:G").Hidden = True
            .Range("C1").Value = "UNICO"
            .Range("H1").Value = "DATA"
            .Range("H1").HorizontalAlignment = xlCenter
        End With
    End If
    Application.Calculation = xlCalculationAutomatic    'isy
    Application.EnableEvents = True                     'isy
    Application.ScreenUpdating = True
    'nascondo la userform3 attesa
    
    '^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ chiusura form tempo di attesa
    Unload UserForm3
    '^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
    'mostra messaggio che indica tempo trascorso per sviluppo macro
    MsgBox "Completato in: " & Format(Now - t, "HH:MM:SS"), vbInformation _
    , "CREATO CALENDARIO"
    
    End Sub



  • di paganiva (utente non iscritto) data: 09/06/2013 21:37:15

    Saluti a tutti.
    Per l'inserimento delle progressbar dovrei aver risolto.
    Ho provato invece con l'animazione del calciatore allegata ma non ottengo nulla.
    Ciao, in attesa di nuove
     
    Application.ScreenUpdating = False
    Application.EnableEvents = False              'isy
    Application.Calculation = xlCalculationManual 'isy
    
    
    creo = MsgBox("Vuoi davvero creare un torneo ''" & Nopt & "''?", vbYesNo + vbQuestion _
    , "CONFERMA CREAZIONE TORNEO")
    If creo = vbNo Then Exit Sub
    
    '^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ Visualizzazione form di attesa
    Dim Iniz As Integer
    UserForm3.Show False
    UserForm3.Caption = "Attendere prego ... "
        With UserForm3
            .Label1.Caption = "Caricamento calendari"
            .ProgressBar1.Value = 0
            .ProgressBar1.Max = 100
            
            .Repaint
        End With
    
    
        For Iniz = 1 To 5
            UserForm3.ProgressBar1.Value = (Iniz / 5) * 100
            'Label1 = "Percentuale di avanzamento   " & (Iniz / 5) * 100
            Application.Wait Now + TimeValue("00:00:01")
            DoEvents
        Next
    DoEvents
    '^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
    
    'Application.ScreenUpdating = False
    
    ' ************************************
    ' cancella vecchi dati
    ' ************************************


  • PROGRESSBAR
    di Marino (utente non iscritto) data: 13/07/2013 10:35:30

    Ciao a tutti, sono nuovo del Forum, e con l'occasione volevo chiedervi se potevate darmi qualche indicazione relativamente alla costruzione di una progressbar per il mio foglio di calcolo. Mi spiego. Ho una macro che esegue una operazione la quale richiede un po di tempo. Mi piacerebbe che durante l'esecuzione di questa macro comparisse una barra di avanzamento dell'esecuzione della macro in argomento. Ho cercato nella casella dei componenti aggiuntivi di excel ma non trovo l'oggetto "progressbar" come posso fare? Vi ringrazio anticipatamente per le soluzioni che saprete sicuramente darmi


  • PROGRESSBAR
    di Marino (utente non iscritto) data: 13/07/2013 10:36:57

    Ciao a tutti, sono nuovo del Forum, e con l'occasione volevo chiedervi se potevate darmi qualche indicazione relativamente alla costruzione di una progressbar per il mio foglio di calcolo. Mi spiego. Ho una macro che esegue una operazione la quale richiede un po di tempo. Mi piacerebbe che durante l'esecuzione di questa macro comparisse una barra di avanzamento dell'esecuzione della macro in argomento. Ho cercato nella casella dei componenti aggiuntivi di excel ma non trovo l'oggetto "progressbar" come posso fare? Vi ringrazio anticipatamente per le soluzioni che saprete sicuramente darmi



  • di Paganiva (utente non iscritto) data: 14/07/2013 01:31:09

    Eccoti una sequenza di esempi, scegli te.
    Saluti



  • di nichicanta (utente non iscritto) data: 15/07/2013 17:07:05

    mi auguro di poter contribuire anch'io nel mettere a disposizione degli altri codice trovato in rete per mie precedenti ricerce ed esigenze.
    Allego un file con tanti esempi di progressbar.
    Saluti a tutti quanti, seguo con molto entusiasmo e piacere questo forum.



  • di Vecchio Frac data: 17/07/2013 16:33:52

    @nichi
    Ottimo contributo. Alcune soluzioni mi sembra di conoscerle ^_^





  • di Marino (utente non iscritto) data: 18/07/2013 11:03:26

    grazie a tutti ho risolto e adattato le informazioni al mio problema.