Domanda Excel: estrarre dati da 2 file e riportare

SmoonStyle

Utente Platinum
11 Maggio 2014
3,850
61
1,199
1,020
In sostanza avrei bisogno di un file excel in cui all'interno, leggendo e confrontando la data di oggi mi va a sommare due valori inserite in due celle di due file separati e che, al cambiamento della data, mi salva quello che il giorno prima è riuscito a calcolare.
Ad esempio

Cella O7=8 (file 1.xlsx) e Cella O7=10 (file 2.xlsx) | data 21/03/2025
Cella O7=6 (file 1.xlsx) e Cella O7=19 (file 2.xlsx) | data 22/03/2025

Risultato nel file 3.xlsx:
21/03/2025 Cella O7=18
22/03/2025 Cella O7=25

Leggendo e provando con chatgpt, questo mi diceva che non era fattibile salvare il valore calcolato nella giornata passata con una formula (in quanto al cambiamento della data, excel ricalcola) e usare una macro VBA. Solo che nei codici che ha generato nessuno di quelli andava bene. Può sembrare di una facilità assurda a ragionarci su, ma all'atto pratico dà un bel filo da torcere.
 
Ciao! Mi piace molto Excel! Lo uso parecchio e anche se non sono un esperto mi capitano sfide come queste eheh.
Allora tramite formule io fare così:

Possiamo ottenere un valore da un altro file scrivendo questa formula in una cella del file1: =[file2.xlsx]foglio1!$A$1
Quindi fare quello che vuoi utilizzando le formule risulta molto facile utilizzando:
  • Per la colonna A inserisco le date copiando il valore di uno dei due file nella prima cella A1: =[file1.xlsx]Foglio1!$A1
  • Per la colonna B la somma dei valori che metto nella cella B1: =[file1.xlsx]Foglio1!$B1+[file2.xlsx]Foglio1!$B1
A questo punto posso copiare le due celle con le formule (trascinando le celle dall'angolo in basso a destra) per il numero di giorni che ho con i valori.
Qui posso poi potenziare le formule mettendo dei controlli (ad esempio verificando che le date dei due file corrispondano e non ci siano errori).

Contro: siccome si sta richiamando i due file, il terzo file è dipendente dai due. Se li elimini o li modifichi il terzo file subirà le modifiche. Quindi potresti perdere i valori. Per ovviare questo:
  • copia il risultato (le due colonne nel file3) e li incolli solo come valori;
  • fai una macro in VBA
Copilot mi ha fornito questo codice e con qualche modifica adesso fa quello che avevo in mente.

foglio1​
foglio2​
foglio3​
1742726224601.png
1742726242265.png
1742726284529.png

I file1, file2 e file3 vanno nella stessa cartella. Il file1 e file2 hanno nella colonna A le date partendo dalla prima cella A1 e nella colonna B i valori partendo dalla cella B1. il file3 è salvato in formato .xlsm (Foglio di lavoro con attivazione macro di Microsoft Excel) e ci ho messo dentro un'icona di un gatto che utilizzo per attivare la macro. Qui sotto la macro:

Codice:
Sub update_data()
    Dim wb1 As Workbook
    Dim wb2 As Workbook
    Dim ws1 As Worksheet
    Dim ws2 As Worksheet
    Dim ws3 As Worksheet
    Dim ultimaRiga As Long
    Dim i As Long

    percorso = ThisWorkbook.Path & "\"
    Set wb1 = Workbooks.Open(percorso & "file1.xlsx")
    Set wb2 = Workbooks.Open(percorso & "file2.xlsx")
    Set ws1 = wb1.Sheets("Foglio1")
    Set ws2 = wb2.Sheets("Foglio1")
    Set ws3 = ThisWorkbook.Sheets("Foglio1")

    ultimaRiga = ws1.Cells(ws1.Rows.Count, "A").End(xlUp).Row
    ws1.Range("A1:A" & ultimaRiga).Copy Destination:=ws3.Range("A1")

    For i = 1 To ultimaRiga
        ws3.Cells(i, 2).Value = ws1.Cells(i, 2).Value + ws2.Cells(i, 2).Value
    Next i

    wb1.Close SaveChanges:=False
    wb2.Close SaveChanges:=False
End Sub

Con questa macro il risultato non sarà più un collegamento con i due file quindi indipendente da essi. Anche qui la macro si può ottimizzare.
Ecco il risultato:

Registrazione2025-03-23105649-ezgif.com-video-to-gif-converter.gif


È quello che volevi ottenere?
 
@Valley allora, perdonami se ti rispondo solo adesso e che non ho avuto modo di controllare le risposte. Comunque ad occhio dovrebbe essere quello, ma devo verificare con un PC.
 
@Valley premesso che ho dei problemi con la macro, il punto era leggermente diverso (anche se in fin dei conti è quello il risultato).
I due file cui dove sommare e copiare il valore vengono aggiornati giornalmente con la funzione =oggi() e quindi il 3 file excel deve aggiornare e sommare i due valori al cambiamento della data e "tenere in memoria" (non deve sovrascrivere) i valori precedentemente calcolati..
 
@Valley premesso che ho dei problemi con la macro, il punto era leggermente diverso (anche se in fin dei conti è quello il risultato).
I due file cui dove sommare e copiare il valore vengono aggiornati giornalmente con la funzione =oggi() e quindi il 3 file excel deve aggiornare e sommare i due valori al cambiamento della data e "tenere in memoria" (non deve sovrascrivere) i valori precedentemente calcolati..

Quindi i due file excel hanno un valore ciascuno che si aggiorna e la data sarà la formula =oggi()?
Nel terzo file i valori presi vengono sommati tra di loro e aggiunti a quelli già salvati(?)

Quindi tutti i giorni devi eseguire la macro o ti perdi dei giorni giusto?
Che problemi ti da la macro?
 
Quindi i due file excel hanno un valore ciascuno che si aggiorna e la data sarà la formula =oggi()? Allora, i 2 file excel sono come delle schede che devono essere aggiornate quotidianamente e banalmente per cambiare la data è stata impostata la funzione =oggi(). Quindi in un certo senso pensavo che nel file3, la macro da dover impostare deve verificare la data e se corrisponde alla data odierna deve sommare 2 valori nei 2 file excel e registrarli automaticamente nel file3.

Nel terzo file i valori presi vengono sommati tra di loro e aggiunti a quelli già salvati(?) Esatto, i due valori che si trovano ad esempio nella cella O5 file1 e O5 nel file2 devono essere sommati tra loro (utilizzando i percorsi dei file) e scritti in un file3 in una qualsiasi cella, oltre anche ad una data di riferimento (ad esempio in data 31/03/2025 ha sommato i valori e restituisce la data in una cella e nella cella accanto la somma dei suddetti valori). Chiaramente la somma calcolata in una data deve essere sempre presente e non sovrascritta.

Quindi tutti i giorni devi eseguire la macro o ti perdi dei giorni giusto? Si, dato che il valore nei 2 file può essere aggiornato giornalmente, la macro deve registrarmi e aggiornarmi la data e la somma ogni 24 ore (ogni giorno)

Che problemi ti da la macro? Non me la fà eseguire

Sembra molto più difficile a scrivere quello che la macro deve fare anziché la banalità dei calcoli.
 
file1 e file2 sono così:
1744142481341.png


Io ho scritto manualmente la data ma immagina ci sia la formula =oggi().
file3 l'ho fatto così:
1744142675504.png


Considera che file3 deve essere salvato come "foglio di lavoro con attivazione macro di Excel" altrimenti le macro non funzionano.
All'icona ho assegnato la macro.
Cliccando sull'icona esegue la macro che:
- verifica le date presenti nel file1 e file2 nelle celle A1.
- se sono diverse mostra un avviso di errore​
- se sono uguali procede​
- prende i valori presenti nel file1 e file2 nelle celle B1 e li somma
- scrive il valore nel file3 nella prima riga libera che trova (non sovrascrive tutto)
1744143256502.png
cdn-1744143304169-png.80134



Codice:
Sub update_data()
    Dim wb1 As Workbook
    Dim wb2 As Workbook
    Dim ws1 As Worksheet
    Dim ws2 As Worksheet
    Dim ws3 As Worksheet
    Dim data1 As Date
    Dim data2 As Date
    Dim ultimaRiga As Long

    percorso = ThisWorkbook.Path & "\"
    Set wb1 = Workbooks.Open(percorso & "file1.xlsx")
    Set wb2 = Workbooks.Open(percorso & "file2.xlsx")
    Set ws1 = wb1.Sheets("Foglio1")
    Set ws2 = wb2.Sheets("Foglio1")
    Set ws3 = ThisWorkbook.Sheets("Foglio1")

    ' Prendi le date dalle celle A1
    data1 = ws1.Range("A1").Value
    data2 = ws2.Range("A1").Value

    ' Confronta le date
    If data1 <> data2 Then
        wb1.Close SaveChanges:=False
        wb2.Close SaveChanges:=False
        MsgBox "Le date sono diverse. Operazione interrotta.", vbCritical
        Exit Sub
    End If

    ' Prendi i valori dalle celle B1
    valore1 = ws1.Range("B1").Value
    valore2 = ws2.Range("B1").Value

    ' Somma i valori
    somma = valore1 + valore2

    ' Trova la prima riga vuota nella colonna A di file3
    ultimaRiga = ws3.Cells(ws3.Rows.Count, "A").End(xlUp).Row + 1

    ' Copia la data e la somma nelle celle di file3
    ws3.Cells(ultimaRiga, 1).Value = data1
    ws3.Cells(ultimaRiga, 2).Value = somma

    ' Chiudi i file senza salvare le modifiche
    wb1.Close SaveChanges:=False
    wb2.Close SaveChanges:=False


End Sub


Utile sarebbe verificare il giorno che sta per inserire nel file3, se già presente verifica se il valore è lo stesso:
- se è lo stesso mostra un avviso in cui dice che il valore è già stato registrato​
- se è diverso mostra un avviso di errore in quando la data è la stessa ma il valore è cambiato.​
 
Allora, stavo riflettendo un pò su quel codice e a livello concettuale ci siamo solo che, oltre a dover inserire i percorsi dei file cui andare a pescare i dati, in quanto 1 due file sono presenti su percorsi che non si trovano sul desktop (tanto per chiarirci), ci sarebbe la questione legata al fatto che il codice leggendo le date da 1 o da tutte e due i file excel aggiorni in automatico data e valore nel 3 file. Aggiungendo anche quello che hai scritto cioé che
"se è lo stesso mostra un avviso in cui dice che il valore è già stato registrato"