Aggiornamento automatico serie di valori

Anonimo
2021-09-10T05:55:23+00:00

Buongiorno, ho una piccola necessità, concettualmente facile, ma non trovo soluzione.

Quotidianamente ricevo un report vendite di un centinaio di prodotti, un file Excel che ha sempre lo stesso nome, stesso layout delle celle, ma cambiano ovviamente i valori.

È possibile creare un secondo file con lo storico di ogni giorno, separato per ogni prodotto, prendendo ogni giorno il valore della stessa cella dal primo file, e creando quindi una serie di dati nel secondo file, in modo da poter poi elaborare un grafico?

Evitando di doverlo fare a mano, si intende..

in pratica è un vettore di dati in cui ogni dato è preso sempre dalla stessa cella del file di provenienza, e crea così una serie, giorno dopo giorno

Microsoft 365 e Office | Excel | Per la casa | Windows

Domanda bloccata. Questa domanda è stata eseguita dalla community del supporto tecnico Microsoft. È possibile votare se è utile, ma non è possibile aggiungere commenti o risposte o seguire la domanda.

0 commenti Nessun commento

11 risposte

Ordina per: Più utili
  1. Anonimo
    2021-11-16T18:27:00+00:00

    Ciao Marco,

    nessuno riesce a darmi una mano?

    speravo fosse una questione meno complicata :(

    Non ho risposto prima perché, sfortunatamente, mi ero sfuggito la tua ultima risposta (:-

    Ora ho scaricato i tuoi file e ti suggerirei di sostituire il mio codice precedente con la seguente versione:

    '========>>

    Option Explicit

    '-------->>

    Public Sub Tester()

    Dim srcWB As Workbook, destWB As Workbook 
    
    Dim srcSH As Worksheet, destSH As Worksheet 
    
    Dim srcRng As Range, destRng As Range 
    
    Dim arrDati() As Variant, arrIn As Variant, arrNuoviProdotti() As Variant, arrTemp As Variant 
    
    Dim Res As Variant 
    
    Dim oTable As ListObject 
    
    Dim sStr As String, sPath As String, sDate As String 
    
    Dim sFilename As String, sProdotto As String 
    
    Dim iFileDate 'As Long 
    
    Dim i As Long, j As Long, iCtr As Long 
    
    Dim iCol As Long, jCol As Long 
    
    Dim iRow As Long, jRow As Long 
    
    Const sFile\_Vendite\_Giornaliere As String = **"AB Seller - ERRANI MARCO\_D0194.xlsx"       '<<=== Modifica** 
    
    Const sFoglio\_Sorgente As String = **"FT\_DIVISIONE"                                                              '<<=== Modifica** 
    
    Const sPercorso As String = **"C:\dati\"                                                                                     '<<=== Modifica** 
    
    Const iPrimaRiga\_Prodotti As Long = **9** 
    
    Const sPrefisso\_Data As String = **"Fatturato progressivo al "** 
    
    Const sCella\_Data As String = **"C7"** 
    
    sStr = Application.PathSeparator 
    
    If Right(sPercorso, 1) <> sStr Then 
    
        sPath = sPercorso & sStr 
    
    Else 
    
        sPath = sPercorso 
    
    End If 
    
    On Error GoTo XIT 
    
    Application.ScreenUpdating = False 
    
    sFilename = sPath & sFile\_Vendite\_Giornaliere 
    
    Set srcWB = Workbooks.Open(sFilename) 
    
    Set srcSH = srcWB.Sheets(sFoglio\_Sorgente) 
    
    With srcSH 
    
        iRow = LastRow(srcSH, .Columns("A:C")) 
    
        Set srcRng = .Range("A:C").Resize(iRow - iPrimaRiga\_Prodotti + 1).Offset(iPrimaRiga\_Prodotti - 1) 
    
        arrIn = srcRng.Value 
    
        sDate = Mid(.Range(sCella\_Data).Value, Len(sPrefisso\_Data) + 1) 
    
        iFileDate = CLng(DateSerial(Right(sDate, 4), Left(sDate, 2), Mid(sDate, 4, 2))) 
    
        .Parent.Close SaveChanges:=False 
    
    End With 
    
    Set destWB = ThisWorkbook 
    
    Set destSH = destWB.Sheets(1) 
    
    With destSH 
    
        jRow = LastRow(srcSH, .Columns("A")) 
    
        jCol = LastCol(destSH) 
    
        Set destRng = .Range("A2").Resize(jRow - 1, jCol) 
    
        arrDati = destRng.Value2 
    
    End With 
    
    ReDim Preserve arrDati(1 To UBound(arrDati), 1 To UBound(arrDati, 2) + 1) 
    
    iCol = UBound(arrDati, 2) 
    
    arrDati(1, iCol) = iFileDate 
    
    For i = 1 To UBound(arrIn) 
    
        sProdotto = arrIn(i, 1) 
    
        arrTemp = Application.Index(arrDati, 0, 1) 
    
        Res = Application.Match(sProdotto, arrTemp, 0) 
    
        If Not IsError(Res) Then 
    
            arrDati(Res, iCol) = arrIn(i, 3) 
    
        Else 
    
            '\\ Nuovo prodotto! 
    
            iCtr = iCtr + 1 
    
            ReDim Preserve arrNuoviProdotti(1 To iCol, 1 To iCtr) 
    
            arrNuoviProdotti(1, iCtr) = arrIn(i, 1) 
    
            arrNuoviProdotti(iCol, iCtr) = arrIn(i, 3) 
    
        End If 
    
    Next i 
    
    With destRng 
    
        With .Cells(1).Resize(UBound(arrDati), iCol) 
    
            .Value = arrDati 
    
            .Rows(1).NumberFormat = "dd/mm/yy" 
    
        End With 
    
        If CBool(iCtr) Then 
    
            '\\ Nuovi prodotti trovati 
    
            .Cells(jRow, 1).Resize(iCtr, iCol).Value = Application.Transpose(arrNuoviProdotti) 
    
        End If  
    
    End With 
    
    Call MsgBox(Prompt:="Fatto", \_ 
    
        Buttons:=vbInformation, \_ 
    
        Title:="REPORT") 
    

    XIT:

    Application.ScreenUpdating = True 
    

    End Sub

    '--------->>

    Public Function LastRow(SH As Worksheet, _

    Optional Rng As Range, \_ 
    
    Optional minRow As Long = 1) 
    
    If Rng Is Nothing Then 
    
        Set Rng = SH.Cells 
    
    End If 
    
    On Error Resume Next 
    
    LastRow = Rng.Find(What:="\*", \_ 
    
        after:=Rng.Cells(1), \_ 
    
        Lookat:=xlPart, \_ 
    
        LookIn:=xlFormulas, \_ 
    
        SearchOrder:=xlByRows, \_ 
    
        SearchDirection:=xlPrevious, \_ 
    
        MatchCase:=False).Row 
    
    On Error GoTo 0 
    
    If LastRow < minRow Then 
    
        LastRow = minRow 
    
    End If 
    

    End Function

    '--------->>

    Public Function LastCol(SH As Worksheet, _

    Optional Rng As Range) 
    
    If Rng Is Nothing Then 
    
        Set Rng = SH.Cells 
    
    End If 
    
    On Error Resume Next 
    
    LastCol = Rng.Find(What:="\*", \_ 
    
        after:=Rng.Cells(1), \_ 
    
        Lookat:=xlPart, \_ 
    
        LookIn:=xlFormulas, \_ 
    
        SearchOrder:=xlByColumns, \_ 
    
        SearchDirection:=xlPrevious, \_ 
    
        MatchCase:=False).Column 
    
    On Error GoTo 0 
    

    End Function

    '<<========

    Potresti scaricare il mio file di prova Marco20211116.xlsm

    Per evitare problemi con l'attuale editor del forum, che inserisce righe vuote indesiderate quando il codice pubblicato viene ricopiato, copia il codice direttamente dal mio file di prova nel tuo file.

    ===

    Regards,

    Norman

    Immagine

    La risposta è stata utile?

    0 commenti Nessun commento
  2. Anonimo
    2021-11-16T14:20:52+00:00

    nessuno riesce a darmi una mano?

    speravo fosse una questione meno complicata :(

    La risposta è stata utile?

    0 commenti Nessun commento
  3. Anonimo
    2021-09-24T16:47:20+00:00

    ...da lunedì di questa settimana hanno cambiato il layout del file che ci mandano :-D

    dunque:

    ho messo in cartella:

    -3 files, tutti con la stessa struttura, che rappresentano un esempio di quello che ricevo (mi arriva un file di 6mb con 15 fogli di lavoro, ma se poi è possibile modificare lo script e selezionare foglio di lavoro e celle di interesse, il problema non sussiste);

    • il file esempio di risultato, ovvero la copia dei valori di ogni prodotto dei 3 files, in modo da tenerne traccia storica giorno dopo giorno (o settimana dopo settimana) e poter elaborarne un grafico.

    ho solo anteposto ai 3 files la data, in realtà mi arrivano ovviamente con lo stesso nome, senza data.

    scusa ma avevo problemi con la cache di ffx e non riuscivo a collegarmi da martedì, quando ho visto la tua risposta...

    La risposta è stata utile?

    0 commenti Nessun commento
  4. Anonimo
    2021-09-21T14:42:26+00:00

    Caio Marco,

    Ciao, e scusa la latitanza, ma gli impegni extralavorativi sono stati più impegnativi di quelli lavorativi!

    Ho ricontrollato meglio e, al netto del fatto che avevo fatto un errore di scrittura per il nome del tab, anche correggendo questa cosa, l'errore rimane.

    ho messo su onedrive:

    1. file origine ( Ab seller dati - ENVAS_D0194.xlsx ): ho tolto i dati sensibili, lasciando bene o male la gerarchia..le celle di mio interesse sono B5 e B6.
    2. file con macro (prova.xlsm)..quello che contiene il tuo script..

    ecco il link

    Ho scaricato i tuoi due file ma i dati e la struttura dei dati non sono quelli che mi aspettavo.

    In ogni caso, inizialmente indichi che il file quotidiano comprende un centinaio di prodotti, ma il file che hai caricato sembra includerne solo uno.

    Ti chiederei, quindi, di caricare tre file:

    1. Il file storico con alcuni dati iniziali
    2. Un file quotidiano con più prodotti (almeno tre)
    3. Il file storico come tu vuole che appaia dopo che è stato aggiornato con i dati del file quotidiano del punto 2.

    ===

    Regards,

    Norman

    Immagine

    La risposta è stata utile?

    0 commenti Nessun commento
  5. Anonimo
    2021-09-21T13:07:43+00:00

    Ciao, e scusa la latitanza, ma gli impegni extralavorativi sono stati più impegnativi di quelli lavorativi!

    Ho ricontrollato meglio e, al netto del fatto che avevo fatto un errore di scrittura per il nome del tab, anche correggendo questa cosa, l'errore rimane.

    ho messo su onedrive:

    1. file origine ( Ab seller dati - ENVAS_D0194.xlsx ): ho tolto i dati sensibili, lasciando bene o male la gerarchia..le celle di mio interesse sono B5 e B6.
    2. file con macro (prova.xlsm)..quello che contiene il tuo script..

    ecco il link

    grazie in ogni modo per l'aiuto!

    La risposta è stata utile?

    0 commenti Nessun commento