Formati per differenza date



  • Formati per differenza date
    di Mangusta (utente non iscritto) data: 24/01/2013 07:22:25

    Sto usando datediff e funziona bene. ma se il formato data è 20130124 (data oggi) da errore.
    devo x forza cambiare il formato x avere la differenza giorni tra due date?


  • DATA
    di canapone (utente non iscritto) data: 24/01/2013 08:00:13


    Ciao,

    dovresti convertire le due stringhe in date. Un sistema potrebbe essere:

    =DATE(LEFT(A1;4);MID(A1;5;2);RIGHT(A1;2))

    Non so se usi i ";" o le "," come separatore degli argomenti.

    Spero sia d'aiuto




  • di Vecchio Frac data: 24/01/2013 18:00:36

    cit. " se il formato data è 20130124 (data oggi) da errore "
    ---> Certamente: hai creato un formato con Format e questo trasforma il risultato in un tipo Stringa (non è più una data).
    Devi seguire il consiglio di canapone, in VBA nel tuo caso, e ricostruirti la data:
    data_estesa = cdate(right(stringa, 2) & "/" & mid(stringa, 5, 2) & "/" & left(stringa, 4))







  • di Mangusta (utente non iscritto) data: 26/01/2013 22:39:17

    Grazie dei consigli!!!



  • di Mangusta (utente non iscritto) data: 27/01/2013 17:52:38

    Ho fatto questo codice per convertire
    convertire nel giusto formato
    eseguire la differenza
    calcolare la media
    riprestinare il formato iniziale

    il risultato però non è attendibile in quanto al primo passaggio calcola giusto al secondo sbaglia
    al terzo ancora giusto al quarto sbaglia e cosi via ripetendo sempre 2 valori 1 giusto e altro sbagliato

    devo aver sbagliato qualcosa ma non capisco dove
     
    Sub prova()
        Dim ur As Integer, rng As Range, rng3 As Range, rng4 As Range, rng5 As Range, rng19 As Range, cella As Range, data As String
    
        With Sheets("foglio1")
    
            ur = .Cells(Rows.Count, 1).End(xlUp).Row
            Set rng = Range(.Cells(2, 1), .Cells(ur, 1))
            Set rng3 = Range(.Cells(2, 3), .Cells(ur, 3))
            Set rng4 = Range(.Cells(2, 4), .Cells(ur, 4))
            Set rng5 = Range(.Cells(2, 5), .Cells(ur, 5))
            Set rng19 = Range(.Cells(2, 19), .Cells(ur, 19))
        End With
    
        For Each cella In rng3
            If cella <> 0 Then
                cella = (Right(cella, 2) & "/" & Mid(cella, 5, 2) & "/" & Left(cella, 4))
            End If
        Next
    
        For Each cella In rng4
            If cella <> 0 Then
                cella = (Right(cella, 2) & "/" & Mid(cella, 5, 2) & "/" & Left(cella, 4))
            End If
        Next
    
        For Each cella In rng5
            If cella <> 0 Then
                cella = (Right(cella, 2) & "/" & Mid(cella, 5, 2) & "/" & Left(cella, 4))
            End If
             If cella = 0 Then
                cella = Date
            End If
        Next
    
        For Each cella In rng19
            If cella <> 0 Then
                cella = (Right(cella, 2) & "/" & Mid(cella, 5, 2) & "/" & Left(cella, 4))
            End If
        Next
        
        
    
        For Each cella In rng
    
            cella.Offset(0, 5) = DateDiff("d", cella.Offset(0, 3), cella.Offset(0, 4))
        Next
    
        Cells(2, 1) = Application.WorksheetFunction.Average(Range("f:f"))
    
    
    
    
    'RIPRISTIONO FORMATO INIZIALE
        For Each cella In rng3
            cella = (Right(cella(1, 1), 4) & Mid(cella(1, 1), 4, 2) & Left(cella(1, 1), 2))
            cella.NumberFormat = "General"
        Next
    
        For Each cella In rng4
            cella = (Right(cella(1, 1), 4) & Mid(cella(1, 1), 4, 2) & Left(cella(1, 1), 2))
            cella.NumberFormat = "General"
        Next
    
        For Each cella In rng5
            If cella = Date Then
                cella = "0"
                cella.NumberFormat = "General"
                End If
            If cella <> 0 Then
                cella = (Right(cella(1, 1), 4) & Mid(cella(1, 1), 4, 2) & Left(cella(1, 1), 2))
                cella.NumberFormat = "General"
            End If
        Next
    
        For Each cella In rng19
            cella = (Right(cella(1, 1), 4) & Mid(cella(1, 1), 4, 2) & Left(cella(1, 1), 2))
            cella.NumberFormat = "General"
        Next
      
    End Sub



  • di Vecchio Frac data: 27/01/2013 18:53:48

    Un filettino con dati di esempio? :)
    Penso che si potrebbe fare a meno di tutti quei rng*
    cosa intendi per primo passaggio, secondo, terzo ecc.? un'esecuzione completa della macro prova o per passaggio intendi l'esecuzione del primo for, del secondo for, ecc?





  • di Mangusta (utente non iscritto) data: 27/01/2013 19:23:46

    Fatto (lo stavo preparando)

    la cella gialla ho momentaneamente inserito il risultato (lancia più volte macro e vedrai comparire sempre 2 risultati diversi)

    (ogni miglioramento del codice è ben accetto)



  • di Vecchio Frac data: 27/01/2013 20:56:42

    Ti scoccerebbe confermare se ho capito? :)
    In pratica il codice prende una data in un formato "aaaammdd", la ritrasforma in formato data quindi calcola la differenza in giorni tra le colonne D e E, ponendo il risultato in colonna F... Se in E c'è 0 vi pone la data odierna quindi calcola la differenza.









  • di Vecchio Frac data: 27/01/2013 21:18:15

    Nel frattempo ti posto la mia revisione (visto che hai chiesto un miglioramento, mi permetto ^_^).
    Però nella revisione non viene considerata la colonna S che viene lasciata inalterata (era una colonna di appoggio?).

    Inoltre c'è un problemino in cella D1302 ed E1302, dove entrambe le date sono a zero e la mia macro le imposta entrambe a data odierna ottenendo una differenza in giorni pari a zero (ovviamente), mentre nel tuo originale c'è come differenza 41301: la conseguenza è che la media (cella A2) cambia, da 138 nel tuo originale a 107 nella mia versione.

     
    Option Explicit
    
    Sub prova_2()
    Dim ur As Integer, rng As Range, cella As Range
    Dim date_from As Date, date_to As Date
    
        ur = Sheets("foglio1").Cells(Rows.Count, 1).End(xlUp).Row
        Set rng = Range("D2:D" & ur)
    
        'scandisce colonna D
        For Each cella In rng
            'se in colonna D c'è zero, imposta la data odierna
            If cella = 0 Then
                date_from = Date
            Else
                date_from = CDate(Right(cella, 2) & "/" & Mid(cella, 5, 2) & "/" & Left(cella, 4))
            End If
            
            'se in colonna E c'è zero, imposta la data odierna
            If cella.Offset(, 1) = 0 Then
                date_to = Date
            Else
                date_to = CDate(Right(cella.Offset(, 1), 2) & "/" & Mid(cella.Offset(, 1), 5, 2) & "/" & Left(cella.Offset(, 1), 4))
            End If
            
            'calcola la difefrenza in giorni tra le due date
            cella.Offset(, 2) = DateDiff("d", date_from, date_to)
        Next
    
       [A2] = [AVERAGE(F:F)]
       
       MsgBox "Fatto."
     
    End Sub






  • di Mangusta (utente non iscritto) data: 27/01/2013 21:23:36

    non mi scoccia!!! si capito benissimo! capito cosa non va nel mio codice?



  • di Mangusta (utente non iscritto) data: 27/01/2013 21:26:44

    il mio codice da 2 risultati 138 e 107 (arrotondati)

    il tuo 76

    scusa ma alla fine della fiera quale è quello giusto?



  • di Vecchio Frac data: 27/01/2013 22:03:08

    76? il mio codice dà 107, ed è quello giusto, con i dati che hai fornito ^_^
    e no, non ho capito cosa non va nel tuo codice a parte la ridondanza che ho eliminato con la mia versione, riducendo i for a un ciclo solo, quello davvero necessario, ed elaborando le date in memoria.





  • di Mangusta (utente non iscritto) data: 27/01/2013 22:21:11

    Sto per dire qualcosa di nuovo: HAI RAGIONE !!!



  • di Vecchio Frac data: 27/01/2013 22:36:32

    LOL ^_^
    Se hai tempo, e voglia, guarda quale è stato il mio ragionamento, la sua traduzione in codice, e dimmi se lo condividi.





  • di Mangusta (utente non iscritto) data: 28/01/2013 10:01:02

    Bhe certo che la condivido!
    affronti subito la colonna D e fai le conversioni poi nello stesso ciclo fai la stessa cosa per E.
    e per finire stessa differenza.
    Mi spiego meglio : per ogni valore di cella D nello stesso passaggio converti D poi E e fai differenza poi passa al NEXT

    In effetti è la cosa più logica da fare!
    (per la colonna S posso aggiungere un altro cella.offset)



  • di mister-x (utente non iscritto) data: 28/01/2013 16:07:39

    ciao mangusta

    ho provato a scaricare il file dove ho visto che in colonna C:C e D:D tu hai delle date, giusto da come ho capito

    tu vorresti che in colonna e ti vengono calcolati i giorni tra una data in C - E ma dato che queste sono scritte cole valore in farmato anno-mese-giorno con l'andicap che ci puo' essere una data maggiore in C e minore in D , al secondo step al contrariodandoti degli errori
    se e' cosi basta che tu in colonna E2 metti la seguente funzione etrascini

    =SE(C2<=D2;DATA(SINISTRA(D2;4);STRINGA.ESTRAI(D2;5;2);DESTRA(D2;2))-DATA(SINISTRA(C2;4);STRINGA.ESTRAI(C2;5;2);DESTRA(C2;2))+1;DATA(SINISTRA(C2;4);STRINGA.ESTRAI(C2;5;2);DESTRA(C2;2))-DATA(SINISTRA(D2;4);STRINGA.ESTRAI(D2;5;2);DESTRA(D2;2))+1)

    tuoi dati io ho messo la formula in F per comodita' sul tuo file
    DATA INIZIO DATA FINE GIORNI TRASCORSI
    138,4534624 20121023 20121023 20121024 1
    201208792 20120511 20120911 0 124
    201208793 20120211 20120211 0 1
    201208794 20120711 20120711 20120711 1
    201208795 20121016 20121019 0 4
    201208796 20121031 20120611 0 143
    201208797 20121114 20121116 0 3
    201208798 20121123 20121123 0 1
    201208799 20121019 20121019 0 1
    201208800 20121211 20121211 0 1
    201208801 20121019 20121019 20121019 1
    201208802 20121019 20121019 20121022 1
    201208803 20121211 20121119 0 23

    ciao

     
    =SE(C2<=D2;DATA(SINISTRA(D2;4);STRINGA.ESTRAI(D2;5;2);DESTRA(D2;2))-DATA(SINISTRA(C2;4);STRINGA.ESTRAI(C2;5;2);DESTRA(C2;2))+1;DATA(SINISTRA(C2;4);STRINGA.ESTRAI(C2;5;2);DESTRA(C2;2))-DATA(SINISTRA(D2;4);STRINGA.ESTRAI(D2;5;2);DESTRA(D2;2))+1)



  • di Mangusta (utente non iscritto) data: 28/01/2013 16:55:04

    Sto cercando modificare tuo codice e mi sto perdendo:
    ho aggiunto una condizione And cella.Offset(, 5) = x Then
    dove x valore di una cella e mi da errore:

    tipo non corrispondente in:
    date_to = CDate(Right(cella.Offset(, 1), 2) & "/" & Mid(cella.Offset(, 1), 5, 2) & "/" & Left(cella.Offset(, 1), 4))

    volevo che effettuasse il calcolo solo su alcuni date a seconda del valore in celle adiacenti
     
    For Each cella In rng
            'se in colonna D c'è zero, imposta la data odierna
            If cella = 0 And cella.Offset(, 5) = x Then
                date_from = Date
            Else



  • di Vecchio Frac data: 28/01/2013 17:24:45

    @mister-x
    Ma Mangusta non vuole una formula in colonna E: lì ci mette un dato a mano (è la data-fine), gli serve un pezzo di codice che traduca gli zeri in data odierna e poi calcoli la differenza in giorni tra colonna E e colonna D.

    @Mangusta
    dipende cosa c'è in "x" ^_^
    chiaramente, se non valorizzi "date_from" in qualche modo, il codice fallisce.
    Fai quindi così:
    date_from = Date
    If cella = 0 And cella.Offset(, 5) = x Then
    date_from = Date
    Else
    ...

    e in questo modo date_from sarà comunque valorizzato a oggi, non andando in errore.





  • di Mangusta (utente non iscritto) data: 28/01/2013 17:39:58

    Ho capito quello che intendi ma mi sfugge il motivo per cui debba essere valorizzato visto che aggiungo solo una condizione a quella che dice cella = 0
    non avrebbe dovuto dare errore anche prima?



  • di Mister_x (utente non iscritto) data: 28/01/2013 19:32:35

    ciao
    a questo punto mi sempbra di capire che se mangusta trova uno 0 in colonna E questi deve essere calcolato come se fosse tata odiena riportando il calcolo in F
    la mia domanda e' la seguente quando io ho riportato il dato in F se faccio ripartire la macro domani questo viene di nuovo conteggiato con l'aggiunta ti un giorno, quindi per non far si che questo succeda nell sub() che posto il calcolo avviene solamente se trova la cella F adiacente libera o nulla altrimenti salta

    spero di aver capito fino a questo punto

    ciao
     
    Sub prova2()
    Dim i
    Dim Data_I As Date, Data_F As Date
    On Error Resume Next
    Application.EnableEvents = False
    For i = 2 To Cells(Rows.Count, "D").End(xlUp).Row
      If Cells(i, "F") = "" Then
      Data_I = CDate(Left(Cells(i, "D"), 4) & "/" & Mid(Cells(i, "D"), 5, 2) & "/" & Right(Cells(i, "D"), 2))
        If Cells(i, "E") = 0 Then
         Data_F = Date
        Else
         Data_F = CDate(Left(Cells(i, "E"), 4) & "/" & Mid(Cells(i, "E"), 5, 2) & "/" & Right(Cells(i, "E"), 2))
        End If
      End If
      Cells(i, "F") = Data_F - Data_I ''+ 1 normalmente si usa 
      Next i
    Application.EnableEvents = True
    End Sub






  • di Mangusta (utente non iscritto) data: 28/01/2013 21:07:25

    grazie Mister_x


    Vechhio Frac iho provato ma non funziona!
    mi ci metto vediamo se ho riesco a sistemare



  • di Vecchio Frac data: 28/01/2013 21:28:23

    E' giusta l'osservazione che hai fatto: l'Else dovrebbe sopperire alla situazione.
    Avrebbe dovuto dare errore anche prima.

    Ma qual è il valore di "x" in
    If cella = 0 And cella.Offset(, 5) = x Then
    ?





  • di Mangusta (utente non iscritto) data: 28/01/2013 22:13:04

    è una stringa di lettere: dei nomi



  • di Vecchio Frac data: 28/01/2013 22:28:37

    Sono convinto che c'è qualcosa che non mi dici :D
    Fai una cortesia, allega un filetto di esempio con le modifiche da apportate, così verifichiamo sul campo.
    Se magari stasera non rispondo oltre, è perchè sto per chiudere, è stata una bella giornatina oggi ;)





  • di mister_x (utente non iscritto) data: 28/01/2013 22:57:24

    ciao vecchio frac

    sono anch'io dell'idea che forse mangusta sta risolvendo un rebus, visto il suo dire sulla cella
    If cella = 0 And cella.Offset(, 5) = x Then
    avendo aperto il file in questione e valutando la cosa iniziando dalla cella=0 e facendo un offset di 5 in quella colonna non ci sono dati di nessun genere (BIANCA) quindi cosa deve fare mangusta MA?????

    perche' se deve mettere un controllo anche alla cella X basta che metta alla sub()

    da cosi If Cells(i, "E") = 0 Then
    a cosi If Cells(i, "E") = 0 and cell(i,"J") = X Then

    controllero' gli sviluppi del mistero in questione

    ciao





  • di Mangusta (utente non iscritto) data: 29/01/2013 10:10:26

    Se dicessi la verità..... dovrei uccidervi!!!! lol

    ecco il file in G altri parametri. (cosi è più semplice)

    calcola la differenza data solo per "MARIO" ^_^



  • di Vecchio Frac data: 29/01/2013 11:24:12

    Ho capito.
    L'errore si verifica alla cella D1302, dove c'è zero anche come data iniziale.
    Avendo impostato la condizione aggiuntiva, poichè non si verifica prchè nelle celle in G non c'è nulla da confrontare, assume un valore inconsistente da parsare con Left, Mid e Right.
    O elimini le date iniziali pari a zero, oppure gestisci questa situazione (miglior cosa).
    All'atto pratico non fa differenza, sempre la data odierna viene inserita.

    Tieni conto che nel codice devi considerare lo scarto di tre celle e non cinque in cella.Offset(, 3) = "MARIO" perchè la colonna G è solo 3 posizioni a destra di "cella".
    Inoltre vedo che nell'esempio postato sei ritornato al tuo vecchio codice :P
     
        For Each cella In rng
            'se in colonna D c'è zero e si riferisce a Mario, imposta la data odierna
            If cella = 0 And cella.Offset(, 3) = "MARIO" Then
                date_from = Date
            ElseIf cella = 0 Then     'se in colonna D c'è zero imposta comunque la data odierna
                date_from = Date
            Else
                date_from = CDate(Right(cella, 2) & "/" & Mid(cella, 5, 2) & "/" & Left(cella, 4))
            End If
    ....
    ...






  • di Mangusta (utente non iscritto) data: 29/01/2013 13:44:53

    ho solo ripostato lo stesse file di prima aggiungendo i nomi niente di più!!!
    il tuo è certamente meglio!!




  • di Vecchio Frac data: 29/01/2013 13:56:49

    No, non è "meglio"... è solo un approccio diverso!
    "Meglio" è ciò che si risolve in un'utilità, che sia maggior comprensione, eleganza, sinteticità, economia di codice, di spazio su disco ecc... tutto è soggettivo!
    Apriamo una sezione del forum in Metafisica? ^_^





  • di Mangusta (utente non iscritto) data: 29/01/2013 16:00:01

    Non sarebbe male almeno li potrei usare i miei ricordi di liceo!!! ahhah ahhah ahahhah ahah



  • di Mangusta (utente non iscritto) data: 29/01/2013 21:27:26

    La data = zero in D era un errore ! probabilmente a forza di lavorare sui dati qualcosa è stato sovrascritto! l'ho tolta ma l'errore persiste!!!



  • di Vecchio Frac data: 29/01/2013 21:54:51

    Non ti credo :)
    Fai uno screenshot dell'errore e allegalo!!
    A me funziona tutto senza problemi.
    Su quale riga si ferma? qual è il dato che non viene digerito stavolta? L'errore è lo stesso di prima?
    uhm :/





  • di Mangusta (utente non iscritto) data: 02/02/2013 21:13:23

    Errore 13 tipo non corrispondente ---- errore e nome file allegato



  • di Mangusta (utente non iscritto) data: 03/02/2013 10:23:13

    Ho provato a inserire la condizione "and cella.offset()="mario" anche nel mio codice e ho lo stesso errore
    Errore 13 tipo non corrispondente



  • di Mangusta (utente non iscritto) data: 03/02/2013 10:47:35

    Allora visto che sono 2 giorni che ci litigo dietro vediamo di essere più chiari
    sotto codice originale nel quale commetto un grave errore di valutazione: considero la data in formato yyyymmdd come un numero e faccio la sottrazione calcolando poi il minimo ed il massimo.
    poi ripristino le date che da zero sono diventate "data oggi" a zero per poter fare calcoli ripetuti in giorni diversi.
    x è valore scelto di una lista
    quindi sui fanno i calcoli si alcuni valori specifici!

    cosi cerco modificare questa parte di codice per usare datediff



     
         If Trim(x) = Trim(cella) And Trim(cella.Offset(0, -4).Value) = "0" And Trim(cella.Offset(0, -2).Value) = "vecchio frac" Then
                APERTE = APERTE + 1
                cella.Offset(0, -4).Value = Format(Date, "yyyymmdd")
    
            End If
    
            If Trim(x) = Trim(cella) And Trim(cella.Offset(0, -4).Value) <> "0" And Trim(cella.Offset(0, -2).Value) = "vecchio frac" Then
                cella.Offset(0, 17) = Trim(cella.Offset(0, -4).Value) - Trim(cella.Offset(0, -5).Value)
                max = Application.WorksheetFunction.max(T)
                min = Application.WorksheetFunction.min(T)
            End If
    
    
            If Trim(x) = Trim(cella) And Trim(cella.Offset(0, -4).Value) = Format(Date, "yyyymmdd") And Trim(cella.Offset(0, -2).Value) = "D9" Then
                cella.Offset(0, -4).Value = "0"
            End If
    



  • di Vecchio Frac data: 03/02/2013 14:08:03

    Dunque: l'errore 13 che hai riscontrato deriva dall'errata definizione del range nel file che hai allegato.
    Infatti rng era impostato su D1:D2, perchè ur era impostato all'ultima riga compilata di colonna A (sbagliando perchè le doveva cercare almeno in colonna C).

    Correggi questa riga iniziale:
    ur = Sheets("foglio1").Cells(Rows.Count, "C").End(xlUp).Row

    Però non capisco quei valori negativi in colonna Y da cui si devono ricavare i valori di media, min e max.
     
    Option Explicit
    
    Sub minmaxmedia()
    Dim ur As Integer, rng As Range, cella As Range
    Dim date_from As Date, date_to As Date
    
        ur = Sheets("foglio1").Cells(Rows.Count, "C").End(xlUp).Row
        Set rng = Range("D2:D" & ur)
    
        'scandisce colonna D
        For Each cella In rng
            'se in colonna D c'è zero, imposta la data odierna
            If cella = 0 And LCase(cella.Offset(, 3)) = "mario" Then
                date_from = Date
            ElseIf cella = 0 Then     'se in colonna D c'è zero imposta comunque la data odierna
                date_from = Date
            Else
                date_from = CDate(Right(cella, 2) & "/" & Mid(cella, 5, 2) & "/" & Left(cella, 4))
            End If
            
            'se in colonna E c'è zero, imposta la data odierna
            If cella.Offset(, 1) = 0 And LCase(cella.Offset(, 3)) = "mario" Then
                date_from = Date
            ElseIf cella.Offset(, 1) = 0 Then    'se in colonna E c'è zero imposta comunque la data odierna
                date_from = Date
            Else
                date_from = CDate(Right(cella.Offset(, 1), 2) & "/" & Mid(cella.Offset(, 1), 5, 2) & "/" & Left(cella.Offset(, 1), 4))
            End If
            
            'calcola la differenza in giorni tra le due date
            cella.Offset(, 21) = DateDiff("d", date_from, date_to)
        Next
    
       [A2] = [AVERAGE(y:y)]
       [A3] = [MAX(y:y)]
       [A4] = [MIN(y:y)]
       
       MsgBox "Fatto."
     
    End Sub
    






  • di Mangusta (utente non iscritto) data: 03/02/2013 14:47:49

    A parte i valori negativi mi pare che il risultato sia sbagliato anche se fosse positivo



  • di Vecchio Frac data: 03/02/2013 14:59:54

    Però non credo di aver capito il tuo intervento precedente, sorry.
    Se consideri la data in formato yyyymmdd come un numero e fai la sottrazione ottieni in linea di massima un risultato corretto in giorni, ma approssimativo (c'è differenza tra mesi 30 e mesi di 31 giorni, senza considerare febbraio e gli anni bisestili, e l'accumulo può essere critico, da quattordici a sedici giorni).
    Il ragionamento con la conversione delle date è più corretto.
    Non so come inserire nel contesto il codice che hai postato.
    Abbi pazienza :)





  • di Mangusta (utente non iscritto) data: 03/02/2013 16:04:37

    Infatti con data diff è più corretto.

    il frammento di codice che ho postato è l'orginale inserito in un contesto più ampio
    nella porzione si fa la differenza numerica e non sulla data poi si fa max e min.
    quindi volevo adattare le nostre considerazioni a quel frammento.
    ESEMPIO
    cella.Offset(0, -4).Value = Format(Date, "yyyymmdd") diventa
    cella.Offset(0, -4).Value = date (visto che non teniamo piu il formato yyyymmdd)








  • di Mangusta (utente non iscritto) data: 10/02/2013 10:45:59

    Ragazzi veramente non capisco non riesco ad uscirne! ho allegato un file molto più completo.
    nelle note a metà codice indico dove facevo fare la differenza errata non considerandola cioè come data.

    Help meee!!!!!

    (tempo fa ho fatto una piccola donazione anche io!! quanto vi occorre per una icone che sbatte la testa ???lol)



  • di Vecchio Frac data: 10/02/2013 20:32:42

    La richiesta non cadrà nel vuoto :)
    Ma devo riorganizzarmi perchè oggi ho la testa che mi fuma per via di una stampante capricciosa...

    Non trovo le "note a metà codice" di cui parli.
    Ripetimi per favore su cosa ti sei bloccato e che risultato stavamo perseguendo.

    (grazie infinite per la donazione... per l'icona che sbatte la testa perorerò la causa al patron )





  • di Mangusta (utente non iscritto) data: 10/02/2013 21:06:32

    Riga 195 -214!! vorrei impostare la differenza data non differenza numero (ho preso data oggi 20130210 come numero per vedere numeri passati ma è errato)
    Ma non ringraziarmi per quanto mi avete aiutato meritate molto di più!!

    Per icona mi offro volontario per filmarmi mentre sbatto testa sul tavolo lol



  • di Vecchio Frac data: 11/02/2013 09:45:23

    Sto guardando il codice. Bel lavoro, complesso :)
    Un'osservazione al volo: invece di quella sfilza di Trim(x) etc, potresti fin da subito toglierti il pensiero
    x = Trim(Cells(1, 1).Value)
    o anche più semplicemente
    x = Trim([A1])

    e nel ciclo For una variabile di appoggio tmp:
    tmp = Trim(cella)

    In questo modo ti risparmi di scrivere n-mila volta
    If Trim(x) = Trim(cella)
    e puoi semplificare con:
    if x = s

    e successivamente puoi compattare quella sfilza di If...Then con un più snello e compatto Select Case.
    Comunque adesso mi concentro sul problema, a eventuali suggerimenti pensiamo poi.
    Sempre se li accetti ;)





  • di Vecchio Frac data: 11/02/2013 11:08:45

    Allego la mia revisione 1 che secondo me funziona, almeno per max2 e min2, ma attendo tue indicazioni.





  • di Vecchio Frac data: 11/02/2013 11:16:39

    Spulciano il codice ho notato un grave problema nell'inputbox della colonna i cui far risiedere i dati all'elaborazione; se premi Annulla non viene gestito, ritorna "Falso" che poi andrebbe a costruire il range di destinazione. Ho fixato il problema.
    Guardando meglio, vedo una sfilza di "GoTo fine" che sono da evitare... il GoTo è fonte di problemi perchè fa sfuggire il controllo del flusso.





  • di Mangusta (utente non iscritto) data: 11/02/2013 19:36:30

    Ogni tuo consiglio è oro colato!! soprattutto con un codice che è molto più lungo.

    cavolo ho sbagliato il mio ostacolo era sul codice riga 84-103.

    Scusa sono proprio cotto.. troppe testate contro il muro!!! (la scrivania, la porta .....)



  • di Mangusta (utente non iscritto) data: 11/02/2013 20:51:26

    Come elimineresti goto?



  • di Vecchio Frac data: 11/02/2013 22:23:11

    Devi scusarmi, ma non ho potuto resistere, è più forte di me.
    Oggi ho messo mano al codice e l'ho adattato al mio stile.
    Essendo il "mio" stile, quindi non è il "tuo", sei libero di:
    -accettarlo
    -rifiutarlo
    -esaminarlo per vedere le differenze concettuali tra i codici
    Mi sono permesso di aggiungere un pulsante all'userform (per chiuderlo): non è bello che l'utente cerchi e azzecchi la X della finestrella soprattutto se è "cecato" come me :)
    Allego il file (marcato vfrac 2).
    Chiedevi del Goto... ti lascio il piacere di scoprire da solo come sono spariti tutti quegli spaghettamenti, ne resterai sorpreso ^_^

    (verifica il corretto funzionamento del file, cioè che dia i risultati corretti)





  • di Mangusta (utente non iscritto) data: 12/02/2013 20:46:55

    Accetto accetto e studio!! domande!

    1) come vengono riportati i valori?
    da riga 3 a 37 sono riportati gli altri no? non vedo differenze nel codice però!

    2) 'CONTROLLO CORRETTO INSERIMENTO DELLE COLONNE con array? bello
    If Trim(Sheets("Foglio1").Cells(1, header(0))) <> header(1) Then
    MsgBox "Inserisci " & header(1) & " in colonna " & header(0), vbInformation, "Attenzione!"
    Exit Sub
    non capisco la logica di questo porzione di codice :header(0)?? header(1)???

    3) bello!!! :'RIGA 38 LINEE - ragionamento alla base?
    For i = 28 To 68
    Cells(i + 10, y) = q(i)
    Next



  • di Vecchio Frac data: 13/02/2013 15:06:01

    Il modellino targato "vfrac 2" è da testare a fondo prima di dire "ok va bene".
    In particolare bisogna verificare con attenzione che vengano riportati correttamente tutti i dati.
    Comunque, in premessa ti dico che ho sostituito tutte le variabili As Double che hai creato espressamente per i tuoi dati con un solo vettore q() che contiene (quasi) tutti i dati significativi. E che vengono infilzati nelle celle da riga 7 a riga 78 del foglio nella porzione del codice che segue "T.ClearContents" e "T2.ClearContents".

    1) Appunto qui bisogna porre attenzione: non essendoci più variabili esplicite, ma essendo tutto indicizzato in q(), si rischia di perdere il filo e non capire quale dato va a finire in quale cella.

    2) Riportiamo il For per esteso altrimenti non si capisce:

    For Each hdr In Array("I:Mittente", "G:Motivo", "E:Data Chiusura", "D:Data Apertura", "P:Linea", "S:Data Rif.")
    header = Split(hdr, ":")
    If Trim(Sheets("Foglio1").Cells(1, header(0))) <> header(1) Then
    MsgBox "Inserisci " & header(1) & " in colonna " & header(0), vbInformation, "Attenzione!"
    Exit Sub
    End If
    Next

    Qui la variabile header contiene lo splittaggio del contatore hdr che è composto da due parti separate da duepunti: "I:Mittente"; in header(0) hai la parte "I", in header(1) hai la parte "Mittente" (ti ricordo che Split genera un vettore che ha il cui primo indice è zero).
    Pertanto poi è facile controllare che se il contenuto della cella "1, header(0)" (ossia 1, "I" --> I1) è diversa header(1) (ossia "Mittente") allora scatena il MsgBox. Il ciclo continua a splittsre hdr fino ad esaurire l'Array specificato. Se vuoi la puoi vedere come un'implementazione di una Collection o di un Dictionary con le coppie chiave-valore in una stringa, che devono essere esplose singolarmente.

    3) vedi premessa :) e resto del codice, in cui ho associato ai diversi elementi di q() i tuoi elementi originari (CAL, CAM, TAA, ecc.); il commento era un tuo commento originale e ho dimenticato di toglierlo.

    Però se fai girare il programma credo che sia qualche problema, perchè i dati non sono coerenti con l'originale; verifica e fammi sapere.