Valutazione 4.87/ 5 (100.00%) 5838 voti

Condividi:        

Generare una "barra di avanzamento".

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

Generare una "barra di avanzamento".

Postdi Charly_new » 05/07/11 14:07

Buon giorno a tutti.
E' possibile far apparire una segnalazione, tipo barra di avanzamento, dove si avvisa che le funzioni del pc sono momentaneamente bloccate in quanto è in corso un ciclo Do...Loop.
In questo foglio di lavoro accade spesso che si lanci la macro che contiene l'istruzione Do...Loop, e siccome il ciclo dura parecchi secondi, a volte all'operatore viene il dubbio che il pc sia come bloccato.
Grazie per eventuali aiuti.
Avatar utente
Charly_new
Utente Junior
 
Post: 59
Iscritto il: 08/03/10 15:57

Sponsor
 

Re: Generare una "barra di avanzamento".

Postdi Flash30005 » 05/07/11 16:11

All'inizio della macro inserisci questi codici
Codice: Seleziona tutto
Sub TuaMacro()
oldStatusBar = Application.DisplayStatusBar
Application.DisplayStatusBar = True
..
..

'all'interno del loop o for next che sia inserisci questo codice
Application.StatusBar = "Elaborazione... (scrivi ciò che vuoi) " & variabile_del_ciclo
...
...
..

'alla fine della macro scrivi questo codice
Application.StatusBar = ""
Application.DisplayStatusBar = False
Application.DisplayStatusBar = oldStatusBar


Apparirà la dicitura da te inserita nella barra di stato di excel (in basso a sinistra)

Ciao
Flash
Win7 + Office 2010 Ita
"Fotografica" al servizio dell'immagine

Ottime opportunità di lavoro (part-time o full-time) con guadagni immediati. Info in MP
Avatar utente
Flash30005
Moderatore
 
Post: 8460
Iscritto il: 27/09/07 11:44
Località: Roma +o-

Re: Generare una "barra di avanzamento".

Postdi Charly_new » 05/07/11 16:56

Innanzitutto grazie per l'aiuto e la celerità.
Allora: i tuoi codici funzionano correttamente quando elaboro la macro senza fare apparire la UserForm.(faccio la funzione del tasto pc F8 per intenderci)
In effetti ho omesso di dire che utilizzo una UserForm che mi copre tutto lo schermo, quindi mi servirebbe vedere l'effetto nella Form... se è possibile.
Grazie ancora.
Avatar utente
Charly_new
Utente Junior
 
Post: 59
Iscritto il: 08/03/10 15:57

Re: Generare una "barra di avanzamento".

Postdi miko » 05/07/11 18:27

ciao Charly,
ti invio una mia barra di avanzamento che realizzai molto tempo addietro con l'aiuto di flash;
http://myfreefilehosting.com/f/cfcbf58c18_0.1MB
il progetto, anche se perfettamente funzionante, fu poi abbandonato su consiglio di flash, per evitare inconvenienti con il resto del codice, ed adottare la barra di stato di excel cosi come ora ti ha proposto;
ti invio il file completo,sono 2 file zippati, in modo che non dovrai perdere tempo nella realizzazione;
all'interno del form troverai anche qualche mio commento al codice.
immagino sai come inserirlo nella tua cartella excel.
non conoscendo la tua macro non posso indicarti in quale punto del codice devi inserire il form, ma penso che non ti sarà difficile richiamarlo.
spero ti sia utile.
ciao alla prossima
windows xp-office 2003
miko
Utente Senior
 
Post: 422
Iscritto il: 29/12/09 10:44

Re: Generare una "barra di avanzamento".

Postdi Charly_new » 05/07/11 20:48

Mille grazie Mirko.
Ho scaricato il tuo contributo, però ti devo confessare che non riesco a capire la parte di codice che dovrei estrapolare per poi inserire nel mio VBA.

tuo codice:
Codice: Seleziona tutto
VERSION 5.00
Begin {C62A69F0-16DC-11CE-9E98-00AA00574A4F} Progress_Meter
   Caption         =   "Progress Meters"
   ClientHeight    =   2070
   ClientLeft      =   45
   ClientTop       =   330
   ClientWidth     =   8490
   OleObjectBlob   =   "Progress_Meter.frx":0000
   ShowModal       =   0   'False
   StartUpPosition =   1  'CenterOwner
End
Attribute VB_Name = "Progress_Meter"
Attribute VB_GlobalNameSpace = False
Attribute VB_Creatable = False
Attribute VB_PredeclaredId = True
Attribute VB_Exposed = False
Option Explicit

Private Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long)
Const PI = 3.14159265358979

' Region API functions

Private Declare Function CreateRoundRectRgn Lib "gdi32" (ByVal X1 As Long, ByVal Y1 As Long, ByVal X2 As Long, ByVal Y2 As Long, ByVal X3 As Long, ByVal Y3 As Long) As Long

Private Declare Function GetWindowRect Lib "user32" (ByVal hWnd As Long, lpRect As RECT) As Long

Private Declare Function SetWindowRgn Lib "user32" (ByVal hWnd As Long, ByVal hRgn As Long, ByVal bRedraw As Long) As Long

Private Declare Function DeleteObject Lib "gdi32" (ByVal hObject As Long) As Long

Private Declare Function FindWindow Lib "user32" Alias "FindWindowA" (ByVal lpClassName As String, ByVal lpWindowName As String) As Long

Private Type POINTAPI
    X As Long
    Y As Long
End Type

Private Type RECT
    Left As Long
    Top As Long
    Right As Long
    Bottom As Long
End Type
   
' modify the shape of a window
'
Dim FrmWndh  As Long
Dim Shp As Long

Sub SetWindowShape(ByVal hWnd As Long, ByVal Shape As Long)
Dim lpRect As RECT
Dim lFrmWidth As Long, lFrmHeight As Long
Dim hRgn As Long

' get the bounding rectangle's size
GetWindowRect hWnd, lpRect
lFrmWidth = lpRect.Right - lpRect.Left - 55 'ALLUNGA IL RETTANGOLO DA DESTRA
lFrmHeight = lpRect.Bottom - lpRect.Top - 5 'ALLUNGA IL RETTANGOLO DAL BASSO

' create a region rounded rectangle
        hRgn = CreateRoundRectRgn(118, 100, lFrmWidth, lFrmHeight, 0, 0) 'CAMBIARE I PRIMI 2 PARAMETRI PER MODIFICARE IL RETTANGOLO
        'IL PRIMO NUMERO ALLUNGA IL RETTANGOLO A SINISTRA, IL SECONDO FA VARIARE L'ALTEZZA DALL'ALTO
    'LE ULTIME DUE CIFRE ARROTONDANO GLI SPIGOLI DEL RETTANGOLO
   
    ' trim the window to the region
    SetWindowRgn hWnd, hRgn, True
    DeleteObject hRgn

End Sub

Private Sub UserForm_Initialize()
'Get Forms window handle set Variable NOW!
    FrmWndh = FindWindow("ThunderDFrame", Me.Caption)
' Leave Frm as STD
    SetWindowShape FrmWndh, 3

End Sub

Private Sub Progress_Meter_Initialize()
    labPg4.Tag = labPg4.Width
    labPg4.Width = 0
    labPg4v.Caption = ""
 
 End Sub
Mio codice:
Codice: Seleziona tutto
Sub cercanome()
Foglio9.Select
del_dataBase1
Foglio6.Select

oldStatusBar = Application.DisplayStatusBar
Application.DisplayStatusBar = True

With Foglio6.Range("H2:H60500")
Dim X, messaggio, titolo
titolo = "Cerca nome"
messaggio = "Inserisci il nome che vuoi ricercare.                   es: Charly"
X = InputBox(messaggio, titolo)
If X = "" Then Exit Sub
Set c = .Find(X, LookIn:=xlValues)
If Not c Is Nothing Then
firstAddress = c.Address
Do

Application.StatusBar = "Elaborazione... (scrivi ciò che vuoi) " & variabile_del_ciclo

c.Cells.Select
Selection.EntireRow.Copy
Sheets("dataBase1").Select
Range("B65536").End(xlUp).Offset(1, -1).Select
ActiveSheet.Paste
.Copy
Application.CutCopyMode = False
Sheets("rapp.settimanale").Select
Set c = .FindNext(c)
Loop While Not c Is Nothing And c.Address <> firstAddress
Sheets("dataBase1").Select
Range("B3").Select
ActiveCell.Offset(1, 0).Select
dati.TextBox1 = ActiveCell.Offset(0, 0).Value
dati.TextBox2 = ActiveCell.Offset(0, 1).Value
dati.TextBox3 = ActiveCell.Offset(0, 2).Value
dati.TextBox4 = ActiveCell.Offset(0, 3).Value
dati.TextBox5 = ActiveCell.Offset(0, 4).Value
dati.TextBox6 = ActiveCell.Offset(0, 5).Value
dati.TextBox7 = ActiveCell.Offset(0, 6).Value
dati.TextBox8 = ActiveCell.Offset(0, 7).Value
dati.TextBox9 = Range("K3")

Application.StatusBar = ""
Application.DisplayStatusBar = False
Application.DisplayStatusBar = oldStatusBar

Else
MsgBox "Nome inesistente"
End If
End With
End Sub
Non so se potrai ancora aiutarmi, in ogni caso un sincero ringraziamento per la disponibilità.
Avatar utente
Charly_new
Utente Junior
 
Post: 59
Iscritto il: 08/03/10 15:57

Re: Generare una "barra di avanzamento".

Postdi Anthony47 » 06/07/11 00:27

Io in genere faccio cosi':
-nella Form inserisco un frame; chiamiamolo FRAMEPB
-all' interno del frame inserisco una label; chiamiamola PBAR, sara' la progress bar.
-con Proprieta' assegno alla label un colore a piacimento

Poi nel vba mi calcolo il "progress" e faccio interventi su PBAR; ad esempio:
Codice: Seleziona tutto
PBar.Width = (FRAMEPB.Width + 10) * progress   'progress va da 0 a 1=100%
FRAMEPB.Caption = Format(progress, "0%")
If progress > 0.99 And progress < 1.01 Then PBar.BackColor = RGB(0, 255, 0)
If progress > 1.01 Then PBar.BackColor = RGB(255, 0, 111)
If progress < 0.99 Then PBar.BackColor = RGB(0, 0, 200)

La prima assegna alla PBAR una larghezza proporzionale al "progress" attuale
La seconda scrive in chiaro quel valore
Le ultime tre sono esempi di ome si puo' usare il colore di PBAR per indicare degli stati di progresso. Nell' applicazione da cui ho estratto l' esempio si trattava di una pianificazione di pagamenti ed era possibile che si verificasse un progress >1.01: questa situazione di errore portava la barra al colore RGB(255, 0, 111), circa Magenta.

Ciao a tutti.
Anthony
Win7 + Office 2010 Ita; Win 7 + Office 2013 Ita
Xp + Office 2003 Ita
E voi cosa usate? (per istruzioni vedere viewtopic.php?f=26&t=97449)
Avatar utente
Anthony47
Moderatore
 
Post: 13904
Iscritto il: 21/03/06 16:03
Località: Ivrea

Re: Generare una "barra di avanzamento".

Postdi Charly_new » 06/07/11 10:35

Grazie Anthony.
Ho provato a seguire il tuo suggerimento ma purtroppo mi sfugge qualcosa, nel senso che non riesco a riprodurre l'effetto.
Queste istruzioni:
Codice: Seleziona tutto
PBar.Width = (FRAMEPB.Width + 10) * progress   'progress va da 0 a 1=100%
FRAMEPB.Caption = Format(progress, "0%")
le ho scritte, a tentativi dato che non ho buona conoscenza, nei punti più impensati della macro ma nella Label non vedo nessun risultato.
Potresti aiutarmi a capire dove dovrei inserire il codice :roll:
Grazie ancora per il suggerimento.
Avatar utente
Charly_new
Utente Junior
 
Post: 59
Iscritto il: 08/03/10 15:57

Re: Generare una "barra di avanzamento".

Postdi miko » 06/07/11 10:58

salve,
certo che sono disponibile ad aiutare, se le mie poche capacità mi permettono di farlo;
non sono geloso dei miei progetti.
non devi prelevare alcuna riga dal codice che ti ho inviato;
tutto quel listato serve solo per creare, dimensionare e far apparire la barra.
devi importare il solo file Progress_Meter.frm nella tua cartella excel;
vai nel vba, nella finestra che elenca i progetti seleziona la cartella;
clicca sul nome con tasto destro, apparirà un menu popup, seleziona importa file;
ricerca il file che ti ho indicato sul tuo pc, e clicca importa;
troverai una nuova cartella form con dentro la barra;
aprila clicca 2 volte sul nome Progress_Meter apparirà nel vba, poi clicca sul triangolino in alto per avviare vba e ti sarà mostrata la barra;
clicca sul quadratino per farla scomparire.
ti ho preparato un piccolo file excel con la barra così potrai verificare il funzionamento.
https://rapidshare.com/files/1126121658/Progress_Meter.xls
nella cella A1 inserisci il valore 1 per mostrare la barra;
nella stessa cella inserisci il valore 2 per nascondere la barra.
come vedrai è statica, non si vede avanzamento, perchè come scrivevo quel codice serve solo per creare la barra.
se vuoi puoi modificare,nel precedente codice, le linee commentate ma solo per dare una diversa foma alla barra e non per produrre uno scorrimento della barra.
nel tuo codice inserisci questa call:
Codice: Seleziona tutto
....
Application.StatusBar = "Elaborazione... (scrivi ciò che vuoi) " & variabile_del_ciclo
  '<<<esistente
Call Barra   '<<<aggiungere
....

con la Call viene chiamata la routine che mostra la barra nel tuo foglio, come avviene nel file excel che ti sto inviando, ma è ancora statica;
per renderla dinamica devi usare questo codice, che perdonami ho dimenticato di inserirlo nel precedente post solo per distrazione, e devi inserirlo in un modulo:
Codice: Seleziona tutto
Sub Barra()
Dim Percent As Single
   Percent = NRow * NCol  '<<<< A modificare in base al tuo calcolo
  Progress_Meter.Show
  With Progress_Meter
  .labPg4v.Caption = Format(Percent, "0%")
  .labPg4.Width = Percent * (.labPg4v.Width + 2)  '<<<< B modificare  eventualment in base al tuo calcolo

End With
  DoEvents
End Sub

come vedi è simile a quello suggerito da Anthony.
è questo il codice su cui agire per ottenere l'avanzamento della barra;
ma devi modificare la riga A, valida per il mio caso, in base alle tue esigenze;
per la tua situazione devi modificare il valore di NRow * NCol e questo dipende dal tuo calcolo;
e purtroppo qui non posso esserti di grande aiuto poichè non ho capito ancora come si stabilisce il valore da attribuire a Percent e non ho la tua cartella con i tuoi dati per tentare dei test;
necessitiamo dell'intervento dei professori.
se eventualmente vuoi che la barra scompaia alla fine del calcolo aggiungi alla fine del tuo codice questa riga:
Codice: Seleziona tutto
Application.StatusBar = ""  '<<<esistente
Application.DisplayStatusBar = False  '<<<esistente
Application.DisplayStatusBar = oldStatusBar  '<<<esistente
Progress_Meter.Hide

spero che questo "trattato" ti sia di aiuto e che i moderatori non mi mettano al bando per aver occupato tanto spazio.
ciao
windows xp-office 2003
miko
Utente Senior
 
Post: 422
Iscritto il: 29/12/09 10:44

Re: Generare una "barra di avanzamento".

Postdi Charly_new » 06/07/11 16:43

Ciao miko.
Sto incontrando difficoltà nell'importare il file: ti allego qualche sequenza fotografica cosi da rendere meglio l'idea.
Prima fase, apertura della finestra per selezionare il file da importare... e va bene.
Immagine
Fase successiva, mi appare il messaggio dove dice "Errore durante il caricamento"
Immagine
La guida in linea di Microsoft visual basic dice:
    Errore durante il caricamento. Per informazioni fare riferimento a 'elemento'
    informazioni aggiuntive
    Il file ASCII contiene qualcosa di non previsto. In Visual Basic è stato creato un file di registro degli errori in cui vengono fornite informazioni dettagliate sugli errori generati. È consigliabile consultare tale file per determinare la gravità del problema. A volte è possibile ignorare gli errori (ad esempio errori quali Numero di versione mancante o non valido...). In altri casi, tuttavia, un errore può far sì che un form non venga eseguito nel modo previsto (ad esempio, l'errore La classe MyClass del controllo MyControl non era una classe di controllo caricata).
Cosa mi suggerisci di fare?
Ancora tante grazie per la disponibilità e la pazienza.
Avatar utente
Charly_new
Utente Junior
 
Post: 59
Iscritto il: 08/03/10 15:57

Re: Generare una "barra di avanzamento".

Postdi miko » 06/07/11 18:54

ciao,
non so dirti con precisione perchè hai questo problema, forse dipende dalla versione di excel; la mia è la 2003 sp3;
io ho introdotto il file in una cartella vuota, quella che ti ho inviato, e tutto funziona perfettamente.
tu hai aperto il file ? cosa avviene?
se continui ad avere problemi fai questa prova:
crea una nuova form, inserisci sul form un controllo immagine e 2 label, sovrapponi gli oggetti cercando di rispettare, per quanto è possibile, le dimensioni del mio esempio così non hai altri problemi;
dai agli elementi, gli stessi nomi che trovi nel codice che ti ho inviato, quello del .frm;
lascia stare l'altro file .frx, che è un file interno del vb che lui crea in automatico e che a noi utenti non serve;
cerca anche di attribuire agli elementi che hai creato le stesse proprietà del mio file;
copia l'intero codice che trovi nel file, il mio oppure quello del Progress_Meter.frm, all'interno del modulo-codice della form;
in pratica devi creare una nuova form con tutti gli altri elementi rispettando le proprietà e nomi di quelli miei.
avvia la form dentro il vba e vedi cosa succede;
se tutto va bene dovrebbe apparire la barra altrimenti potrebbe dipendere da una diversa versione del vb e quindi bisognerà modificare qualche linea di codice.
altrimenti se vuoi, invia una copia del tuo file, interessa solo una cartella vuota priva dei dati che hai nel foglio, ma identica a quella che usi e faccio io una prova ad inserire il file.
speriamo che tutto vada bene.
altrimenti fai sapere e troviamo una soluzione diversa.
ciao
windows xp-office 2003
miko
Utente Senior
 
Post: 422
Iscritto il: 29/12/09 10:44

Re: Generare una "barra di avanzamento".

Postdi Anthony47 » 06/07/11 20:59

Se puoi usa la proposta di miko, che e' meglio strutturata; quello che ti ho proposto e' "fatto in casa" (vedi sopra messaggio di miko).
Per quanto riguarda la situazione in cui ti trovi con la cosa fatta in casa:
-la scritta su framepb che cosa ti dice? (cioe' quale "progresso" devi rappresentare)
-alla label PBar hai assegnato un colore?

Ciao
Anthony
Win7 + Office 2010 Ita; Win 7 + Office 2013 Ita
Xp + Office 2003 Ita
E voi cosa usate? (per istruzioni vedere viewtopic.php?f=26&t=97449)
Avatar utente
Anthony47
Moderatore
 
Post: 13904
Iscritto il: 21/03/06 16:03
Località: Ivrea


Torna a Applicazioni Office Windows


Topic correlati a "Generare una "barra di avanzamento".":


Chi c’è in linea

Visitano il forum: Nessuno e 6 ospiti