Aggiornamento Date



  • Aggiornamento Date
    di Alberto (utente non iscritto) data: 05/06/2014 13:15:49

    Buongiorno!
    Ho un file che contiene in ogni riga un codice e una data.
    In un altro file chiamato storico sono presenti in modo non univoco tutti i codici che si possono utilizzare e tutte le date associate (3 date distinte per ogni occorrenza di un codice).
    Poiché il numero di righe dello storico è >4000 devo creare un codice molto leggero quindi la logica usata è divide et impera.
    Per ogni codice sono possibili 4 casi:
    Caso 1 la data è già aggiornata
    Caso 2 la data è presente in un foglio di appoggio
    Caso 3 la data è presente solo nello storico
    Caso 4 il codice non è presente o non sono disponibili date
    La data che mi serve deve essere superiore ad oggi, il foglio di appoggio viene compilato con le date accettabili prese dallo storico.
    Ho pensato di suddividere tuta la funzione in 3 sottoparti, in funzione del foglio in uso.
    In allegato il codice finora fatto.
    La logica è la seguente:
    Scansiono il foglio con i codici, se la data associata è ok vado avanti altrimenti la cerco nel foglio di appoggio, poichè non so se c'è il codice o comunque non sò dove si trova impongo Dcol=0( se fosse nella colonna B avrei messo 2).
    Se dunque DCol =0 cerco nella prima riga se trovo il codice, se lo trovo verifico che ci sia una data.
    se la data è presente la scrivo nel foglio dunque posso cercare la data per il successivo codice.
    Se la data non è presente o il codice non è presente devo cercare nello storico.
    La ricerca nello storico può sembrare ciclica, in realtà lo è solo una volta cioè quando la data non è aggiorna
    ta e non so dove trovare il codice, appena la ricerca dello storico da esito positivo e va a scrivere nel foglio di appoggio non faccio più ricerche nello storico per quel codice (a questo punto o c'è o non c'è).
    Ora però arriva la mia domanda.
    se guardate nella funzione there notate che l'ordinamento non avviene in quanto non ho fornito il range da ordinare; questo range deve essere una colonna ma non riesco a scriverlo in quanto non posso sapere quale sia la colonna da ordinare.
    Mi spiego meglio:l'ordinamento della colonna avviene solo se esiste una colonna , avente nella prima riga il codice ricercato; questa colonna però non ha un nome es :C (altrimenti Range C1:C&lRow) ma viene identificata dal numero WCol
    DOMANDA: come faccio a dire quale colonna ordinare se conosco solo il numero della colonna? es wCol=5 ==> E
    quindi Rng= colonna E
     
    Sub Here()
        Dim TWb As Workbook
        Dim WWSh As Worksheet
        Dim TDay As Date
        Dim TRow As Long
        Set TWb = ThisWorkbook
        Set WWSh = TWb.Worksheets("Foglio1")
        WWSh.Range("Z1").Formula = "=TODAY()"
        WWSh.Range("Z1").NumberFormat = "yyyy-mm-dd"
        TDay = WWSh.Range("Z1").Value
        TRow = 3
        Do
            If Not (WWSh.Cells(TRow, 12).Value >= TDay) Then 'se la data non va bene
                WWSh.Cells(TRow, 12).Clear
                Call There(TRow, TDay, 0)
            End If
            TRow = TRow + 1
        Loop While WWSh.Cells(TRow, 2) <> ""
    End Sub
    
    Sub There(TRow As Long, TDay As Date, DCol As Long)
        Dim TWb As Workbook
        Dim WWSh As Worksheet
        Dim RWSh As Worksheet
        Set TWb = ThisWorkbook
        Set WWSh = TWb.Worksheets("Foglio1")
        Set RWSh = TWb.Worksheets("Foglio2")
        Dim Value As Variant
        Dim lRow As Long
        Dim WCol As Long
        Dim Rng As Range
        Value = WWSh.Cells(TRow, 2).Value
        WCol = DCol
        If DCol = 0 Then
            Dim ACol As Long
            ACol = RWSh.UsedRange.Columns.Count
            For i = 1 To ACol
                If (RWSh.Cells(1, i).Value = Value) Then
                    WCol = i
                    Exit For
                End If
            Next
            If WCol = 0 Then
                GoTo Nav
            End If
        End If
        With RWSh
            lRow = .Cells(.Rows.Count, Col_Letter(WCol)).End(xlUp).Row
        End With
        
        RWSh.Sort.SortFields.Clear
        RWSh.Sort.SortFields.Add Key:=r, SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:=xlSortNormal 'ordina le date del codice
        With RWSh.Sort
            .SetRange RWSh.UsedRange
            .Header = xlNo
            .MatchCase = False
            .Orientation = xlTopToBottom
            .SortMethod = xlPinYin
            .Apply
        End With
        Dim ARow As Long
        ARow = Rng.Count
        If ARow = 1 Then
            MsgBox ("Data non disponibile")
            Exit Sub
        End If
        For i = 2 To ARow
            If (RWSh.Cells(i, DCol).Value >= TDay) Then
                WWSh.Cells(TRow, 12).Value = RWSh.Cells(i, DCol).Value
                Exit For
            End If
        Next
        If DCol = 0 Then
            If Not (WWSh.Cells(TRow, 12).Value >= TDay) Then
                 Call Nav(Value, TDay, WCol, TRow)
            End If
        End If
    Exit Sub
    
    Nav:
        Call Nav(Value, TDay, WCol + 1, TRow)
    End Sub
    
    Sub Nav(Value As Variant, TDay As Date, Col As Long, TRow As Long)
        Dim NWb As Workbook
        Dim TWb As Workbook
        Dim NWs As Worksheet
        Dim RWSh As Worksheet
        Dim NRng As Range
        Dim NRow As Long
        Dim DDay As Collection
        EndF = "storico.xlsx"
        Set NWb = Workbooks.Open(EndF)
        Set NWs = NWb.Worksheets("ODL")
        Set TWb = ThisWorkbook
        Set RWSh = TWb.Worksheets("Foglio2")
        With NWs
            NRow = .Cells(.Rows.Count, "O").End(xlUp).Row
        End With
        'NRng = NWs.Range("O1:O" & NRow)
        NWs.Sort.SortFields.Clear
        NWs.Sort.SortFields.Add Key:=NWs.Range("O1:O" & NRow), SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:=xlSortNormal
        With NWs.Sort
            .SetRange NWs.UsedRange
            .Header = xlNo
            .MatchCase = False
            .Orientation = xlTopToBottom
            .SortMethod = xlPinYin
            .Apply
        End With
        NWs.UsedRange.AutoFilter
        NWs.UsedRange.AutoFilter Field:=15, Criteria1:=Value
        Set DDay = New Collection
        For i = 2 To NRow 'sta prendendo tutte le date!!!!
            If (NWs.Range("T" & i).Value >= TDay) Then
                DDay.Add NWs.Range("T" & i).Value
            End If
            If (NWs.Range("U" & i).Value >= TDay) Then
                DDay.Add NWs.Range("U" & i).Value
            End If
            If (NWs.Range("V" & i).Value >= TDay) Then
                DDay.Add NWs.Range("V" & i).Value
            End If
        Next
        If Not DDay.Count > 1 Then
            If MsgBox(Value, vbOKOnly, "il codice non fornisce date attive") = vbOK Then
                Exit Sub
            End If
        End If
        For i = 1 To DDay.Count
            RWSh.Cells(i + 1, Col).Value = DDay.Item(i)
        Next
        Set DDay = Nothing
        NWs.UsedRange.AutoFilter
        NWs.Sort.SortFields.Clear
        Set NWs = Nothing
        NWb.Close False
        Set NWb = Nothing
        Call There(TRow, TDay, Col)
    End Sub