Progress bar calcolo



  • Progress bar + calcolo %
    di Nicola (utente non iscritto) data: 11/11/2014 16:23:38

    Ciao a tutti ...eccomi nuovamente nel forum....

    Ho un problema che da un paio di giorni mi fa venire il male alla testa

    All'interno di un file chiamato pulizia db_prova ho inserito un codice che attraverso il metodo Find apre un altro file chiamato dbnew2 e se trova gli stessi codice riempie la cella corrispondente...

    Fino a qui funziona bene...

    Ho provato ad integrare a questo codice il progress bar e cercare di calcolare visibilmente attraverso la
    userfom la % di aggiornamento in modo che gli utenti capiscano cosa sta accadendo....

    Un disastro....mi sono impattanato alla grande...

    Spero che come al solito mi possiate aiutare a capire i miei sbagli .....e migliorare sempre di più la mia conoscenza....

    Grazie in anticipo come sempre

     
    Option Explicit
    
    Sub Aggiorna_assortimento()
    
    Dim Ws1 As Workbook: Set Ws1 = Workbooks("pulizia db_Prova.xlsm")
    Dim Sh1 As Worksheet: Set Sh1 = Ws1.Worksheets("db1")
    Dim Ws As Worksheet, Area As Range, RR As Object
    Dim Uriga1 As Long, Uriga2 As Long, r As Long, X As Long
    Dim ID As String, Percorso As String, nomeFile As String
    
    Dim Conta As Integer
    Dim RigaMax As Integer, ColMax As Integer
    Dim A As Integer, B As Integer
    Dim Tempo As Single
    
    
    Application.ScreenUpdating = False
    Application.EnableEvents = False
    
    
    Conta = 0
    RigaMax = Uriga2
    ColMax = 9
    
    
    For A = 1 To RigaMax
    For B = 1 To ColMax
    
    On Error Resume Next
    
    Uriga1 = Sh1.Range("A" & Rows.Count).End(xlUp).Row
    Set Area = Sh1.Range("A3:A" & Uriga1)
    Percorso = "C:Users
    icola.spanuDesktopdbnew2.Xlsx"
    Workbooks.Open (Percorso)
    For Each Ws In ActiveWorkbook.Worksheets
    
    Ws.Activate
    
    Uriga2 = Ws.Range("A" & Rows.Count).End(xlUp).Row
    
    For X = 2 To Uriga2
    
    ID = Cells(X, 1).Value
    
    Set RR = Area.Find(ID, LookIn:=xlValues, Lookat:=xlWhole)
    
    If r <> ID Then
    
    r = 0
    
    r = RR.Row
    
    Ws.Cells(X, 28) = Sh1.Cells(r, 9)
    
    
    End If
    
    Next X
    
    
    Tempo = Conta / (RigaMax * ColMax)
    
    UpdateProgressBar Tempo
    
    Next Ws
      
    Unload UserForm1
    
    Application.ScreenUpdating = True
    Application.EnableEvents = True
    Application.DisplayAlerts = False
    ActiveWorkbook.Close SaveChanges:=True
    Application.DisplayAlerts = True
    
    MsgBox "Aggiornamento eseguito con successo"
    
    Set Sh1 = Nothing
    
    Set Ws1 = Nothing
    Set Area = Nothing
    End Sub
    
    Sub ShowUserForm()
    UserForm1.Show
    End Sub
    
    
    Sub UpdateProgressBar(Tempo As Single)
     
     With UserForm1
    
                .FrameProgress.Caption = Format(Tempo, "0%")
    
           
             .LabelProgress.Width = Tempo * _
                 (.FrameProgress.Width - 10)
         End With
    
        
         DoEvents
     End Sub
    
    Private Sub UserForm_Activate()
    UserForm1.LabelProgress.Width = 0
    Call Aggiorna_assortimento
    End Sub
    
    
    



  • di lepat (utente non iscritto) data: 11/11/2014 17:00:56

    impara a indentare i cicli for, gli IF ecc.. serve per non dimenticare le chiusure, ti mancano 2 next.
    Inoltre hai un call Main che non esiste, magari sarà call Aggiorna_assortimento.
    Inoltre l'aggiornamento è talmente rapido che non fai a tempo a vedere la barra.



  • di Nicola (utente non iscritto) data: 11/11/2014 17:09:29

    Ciao lepat

    il file lo dovuto ridimensionare ....in pratica ci impiega circa mezzora a concludere l'aggiornamento...

    Il tuo consiglio lo sto gia applicando ....sono nel forum da tanto è grazie a voi ho imparato tante cose...

    La sub si chiama Aggiorna_assortimento...




  • di lepat (utente non iscritto) data: 11/11/2014 17:54:47

    quando alleghi un file allegalo aggiornato



  • di Nicola (utente non iscritto) data: 11/11/2014 23:36:54

    Domani rimando i file aggiornati..scusami

    Spero che possiate darmi una mano


  • Progress bar + calcolo %
    di Nicola (utente non iscritto) data: 12/11/2014 08:33:17

    Ciao a tutti ...

    in allegato ho inserito il file della sub Aggiorna_assortimento...in più il codice senza il progress bar...che funziona...

    Questa macro impiega circa 30 minuti per aggiornare i dati in un altro file chiamato dbnew2...Per questioni di spazio o ridotto le righe per poter inviare l'allegato ...in quanto sono circa 30000...

    Spero che qualcuno di voi possa darmi una mano ad adattare un progress bar ....per far capire a chi usa questo codice ....che la macro sta aggiornando i dati e la % di aggiornamento...

    Vi prego aiutatemi....
     
    Option Explicit
    
    Sub Aggiorna_assortimento()
    
    
    Dim Ws1 As Workbook: Set Ws1 = Workbooks("pulizia db.xlsm")
    Dim Sh1 As Worksheet: Set Sh1 = Ws1.Worksheets("db1")
    Dim Ws As Worksheet, Area As Range, RR As Object
    Dim Uriga1 As Long, Uriga2 As Long, R As Long, X As Long
    Dim ID As String, Percorso As String, nomeFile As String
    
    Application.ScreenUpdating = False
    Application.EnableEvents = False
    
    On Error Resume Next
    
    Uriga1 = Sh1.Range("A" & Rows.Count).End(xlUp).Row
    Set Area = Sh1.Range("A3:A" & Uriga1)
    Percorso = "C:Users
    icola.spanuDesktopdbnew2.Xlsx"
    Workbooks.Open (Percorso)
    For Each Ws In ActiveWorkbook.Worksheets
    
    Ws.Activate
    
    Uriga2 = Ws.Range("A" & Rows.Count).End(xlUp).Row
    
    For X = 2 To Uriga2
    
    ID = Cells(X, 1).Value
    
    Set RR = Area.Find(ID, LookIn:=xlValues, Lookat:=xlWhole)
    
    If R <> ID Then
    
    R = 0
    
    R = RR.Row
    
    Ws.Cells(X, 28) = Sh1.Cells(R, 9)
    
    
    
    End If
    
    Next X
    
    Next Ws
    Application.ScreenUpdating = True
    Application.EnableEvents = True
    Application.DisplayAlerts = False
    ActiveWorkbook.Close SaveChanges:=True
    Application.DisplayAlerts = True
    
    MsgBox "Aggiornamento eseguito con successo"
    
    Set Sh1 = Nothing
    
    Set Ws1 = Nothing
    Set Area = Nothing
    End Sub
    
    



  • di lepat (utente non iscritto) data: 12/11/2014 09:03:32

    tu avevi detto:
    "All'interno di un file chiamato pulizia db_prova ho inserito un codice che attraverso il metodo Find apre un altro file chiamato dbnew2 e se trova gli stessi codice riempie la cella corrispondente...
    Fino a qui funziona bene... "

    questo non è vero, allega un file con codice funzionante senza userform e poi te la integro io


  • Progress bar + calcolo %
    di Nicola (utente non iscritto) data: 12/11/2014 09:25:22

    ciao lepat ho inserito il file senza userform...spero tanto potrai farmi capire come devo fare

    graziee




  • di lepat (utente non iscritto) data: 12/11/2014 10:08:11

    mi spieghi perché l'ultimo codice è diverso da quello con userform ? perché hai aggiunto queste righe ?
    For A = 1 To RigaMax
    For B = 1 To ColMax


  • Progress bar + calcolo %
    di Nicola (utente non iscritto) data: 12/11/2014 10:20:58

    Nel primo codice dove vedi "For A = 1 To RigaMax
    For B = 1 To ColMax" stavo provando a creare un ciclo for ...per contare righe e colonne ...ma ovviamente non ci sono riuscito...

    L'ultimo codice è pulito dal casino che ho fatto nel primo....

    Spero di essere stato chiaro ....



  • di lepat (utente non iscritto) data: 12/11/2014 11:29:27

    Un'altra domanda, il file da aprire ha soltanto un foglio, perché hai messo il ciclo
    For Each Ws In ActiveWorkbook.Worksheets
    ?


  • Progress bar + calcolo %
    di Nicola (utente non iscritto) data: 12/11/2014 11:38:06

    Si ...perfettamente ragione ...agli inizi avevo più fogli ....e quindi avevo costruito il codice con il ciclo for each...poi in seguito ho cambiato il sistema ....lasciando il ciclo for each ......capisco che è un codice bruttissimo ....seguendo il forum .....infatti sto sempre li a seguirvi per migliorarmi perché siete bravissimi....veramente



  • di lepat (utente non iscritto) data: 12/11/2014 11:49:55

    prova il file allegato (lepat)


  • Progress bar + calcolo %
    di Nicola (utente non iscritto) data: 12/11/2014 11:54:19

    Provo subittissimi


  • Progress bar + calcolo %
    di Nicola (utente non iscritto) data: 12/11/2014 12:16:40

    MI da questo errore che vedi in allegato------ il debug si ferma in "R = RR.Row"

    Forse il problema sta in R = 0 ...ossia se id non viene trovato r = 0



  • di lepat (utente non iscritto) data: 12/11/2014 12:41:58

    te lo dà con lo stesso file dbnew2.Xlsx che hai allegato o con quello originale ?



  • di lepat (utente non iscritto) data: 12/11/2014 12:44:49

    prova ad inserire nuovamente la riga
    On Error Resume Next
    io l'avevo tolta per evidenziare eventuali errori



  • di Nicola (utente non iscritto) data: 12/11/2014 12:55:02

    Grande lepat ora sta andando e visualizza la userform con la barra è la %...

    Secondo te ...perche da errore senza "on error resume next" .....e inoltre è normale che ci impieghi circa 30 minuti a finire l'aggiornamento???? dipenderà dal ciclo for each????....

    Comunque come al solito sei grande....



  • di lepat (utente non iscritto) data: 12/11/2014 13:02:06

    perché dà errore me l'hai detto tu, se non trova l'ID R=0 e non può esistere una riga con numero 0, si potrebbe ovviare con un controllo sul Find, ma non so se ne vale la pena



  • di lepat (utente non iscritto) data: 12/11/2014 13:07:22

    per eliminare on error prova questa modifica
     
        For X = 2 To Uriga2
            ID = Cells(X, 1).Value
            Set RR = Area.Find(ID, LookIn:=xlValues, Lookat:=xlWhole)
            If Not RR Is Nothing Then
                If R <> ID Then
                    R = 0
                    R = RR.Row
                    Ws.Cells(X, 28) = Sh1.Cells(R, 9)
                End If
                TEMPO = (X) / Uriga2
                UpdateProgressBar TEMPO
            End If
        Next X
    



  • di Nicola (utente non iscritto) data: 12/11/2014 14:31:12

    Eccomi lepat....provo subito....



  • di Nicola (utente non iscritto) data: 12/11/2014 14:45:05

    Cavolo con l'ultima modifica sembrava che partisse e poi mi da errore nella riga "If R <> ID Then" run time 13 tipo non corrispondente ....



  • di nicola (utente non iscritto) data: 12/11/2014 15:49:10

    lepat le ho provate tutte è non riesco a liberarmi di questo errore...volendo potrei lasciare "on error resume next" è il codice funziona....ma per mia curiosità e voglia di capire....lo vorrei evitare........cosa dici?????



  • di lepat (utente non iscritto) data: 12/11/2014 16:37:45

    che devi allegare un file dati i cui cui nasca l'errore, altrimenti non posso fare le prove



  • di Nicola (utente non iscritto) data: 12/11/2014 17:03:09

    ti ho girato i 2 file che utilizzo ....dbnew2 e pulizia db....ora hai quasi un mega di dati per fare il test ....

    dovresti per cortesia disabilitare la riga on error resume next...scusami mi sono dimenticato...

    grazie per il tuo aiuto



  • di lepat (utente non iscritto) data: 12/11/2014 17:16:05

    tu non hai inserito l'ultima modifica che ti ho suggerito, con quella non riscontro alcun errore



  • di Nicola (utente non iscritto) data: 12/11/2014 17:26:43

    Scusa lepat...sono io che avevo sbagliato inserendo la modifica è funziona alla grande.....

    Finalmente grazie a te ho appreso una cosa nuova....

    Sei bravissimo....magari se vorrai ci sentiremo nella mio prossimo problema