Condividi tramite

Confronto Codici

Anonimo
2024-10-09T13:53:44+00:00

Ciao, ho un file con una serie di codici che devo analizzare ogni giorno.
Sarebbe molto utile per me creare un confronto con il file del giorno prima dove mi evidenzia i codici nuovi appunto rispetto al gg prima e quelli che non ci sono più sempre rispetto al gg prima.
Mi potete aiutare per favore? E' possibile tramite una macro?

Secondo voi è utile che l'eventuale macro mi estrae in un foglio separato i codici nuovi e quelli non più esistenti? di seguito il link del file: File date.xlsx
Grazie mille

Microsoft 365 e Office | Excel | Per il lavoro | 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

Risposta accettata dall'autore della domanda

Anonimo
2024-11-19T17:14:55+00:00

Ciao,

Vedi il file modificato: File modificato

In particolare per le due query nominate Tabella1 e Tabella2 dopo il passaggio "Navigazione" ho modificato il passaggio "FiltrateRighe" aggiungendo la condizione che filtra non solo i valori nulle e "" della colonna "Cod." ma anche i valori "SI" della colonna "prodotti in vendita".

Ti consiglio, a questo punto, di studiare e comprendere quanto è stato fatto per poter agire in futuro con un minimo di autonomia.

ciao

La risposta è stata utile?

1 persona ha trovato utile questa risposta.
0 commenti Nessun commento

Risposta accettata dall'autore della domanda

Anonimo
2024-11-18T13:33:07+00:00

Hai ragione scusami, il dato esce solo e sempre in questa forma: SI

Credi sia possibile fare una correzione in corsa al file?

Non hai specificato come è esattamente intestata la colonna.

Power Query è "case sensitive" e fa differenza se l'intestazione della colonna è tutto in minuscolo, tutto in maiuscolo, o alcuni caratteri sono in maiuscolo o minuscolo.

La risposta è stata utile?

1 persona ha trovato utile questa risposta.
0 commenti Nessun commento

Risposta accettata dall'autore della domanda

Anonimo
2024-11-15T15:04:08+00:00

Nei file di esempio che mi hai mandato non è presente alcuna colonna "prodotti in vendita".

Sarebbe stato molto opportuno, anzi direi necessario, specificare questa cosa fin dall'inizio della discussione.

In teoria dovresti, partendo dagli esempi che ti ho fornito, e studiando quanto fatto, riuscire ad estrarre, applicando, anche nel passaggio prima di quello di eliminazione delle colonne non utili ai successivi riepiloghi, un filtro alla colonna "prodotti in vendita" mantenendo le sole righe dove è presente il "si".

Detto questo sarebbe fondamentale sapere, per chi non ha sotto mano i dati completi, indicare esattamente come è l'intestazione della colonna (tutto maiuscolo, tutto minuscolo, iniziali maiuscole) e come è scritto il "si" (SÌ, Sì, sì, SI, Si, si), per poter replicare fedelmente la tua situazione.

La risposta è stata utile?

1 persona ha trovato utile questa risposta.
0 commenti Nessun commento

Risposta accettata dall'autore della domanda

Anonimo
2024-11-13T09:55:12+00:00

Ciao,

riguardando il "progetto" la soluzione più pratica e meno invasiva è quella di caricare, invece che mantenerla in sola memoria, la query "Tabella2" in una tabella, magari in un foglio da nascondere.

Successivamente impostare una formattazione condizionale alla tabella "NEW" che faccia un confronto con la Tabella2 presente nel foglio.

Vedi il solito file di esempio dove in Foglio2 trovi la Tabella2 caricata.

Nel Foglio1 vedrai che ho applicato una formattazione condizionale con la seguente formula:

=SE.ERRORE(CONFRONTA($C7;INDIRETTO("Tabella2[Cod.]");0);0)=0

in questo modo ottengo una rappresentazione "grafica" di questo tipo:

In questo modo quando farai "Aggiorna tutto" verranno aggiornate tutte le tabelle nei fogli, anche Tabella2, e la formattazione condizionale evidenzierà le righe dei codici non presenti nella Tabella2.

Qui il file di esempio: File esempio

ciao

La risposta è stata utile?

1 persona ha trovato utile questa risposta.
0 commenti Nessun commento

Risposta accettata dall'autore della domanda

Anonimo
2024-10-31T14:39:58+00:00

Direi di sì.

ciao

La risposta è stata utile?

1 persona ha trovato utile questa risposta.
0 commenti Nessun commento

Risposta accettata dall'autore della domanda

Anonimo
2024-10-30T15:54:40+00:00

Comunque forse rispetto alla tabella New che ha questi dati?

Operatore Cod. Cod. fornitore Prodotti Data WMS di arrivo Fornitore
ACQ4 77777 77777AA PRODOTTO NUOVO GIORNO CORRENTE 20/10/2024 ZZZZZ SRL
BBB BBBBB BBBBB BBBBB 31/10/2024 BBBBBB
CCC CCCCC CCCCC CCCCC 01/11/2024 CCCCCCC
ABCDE ABCDEFG ABCDEFG ABCDEFG 03/11/2024 ABCDEFGH

Vorresti ottenere una tabella che contenga anche quelle righe che sono presenti nel giorno corrente ma erano presenti nel giorno precedente?

Operatore Cod. Cod. fornitore Prodotti Data WMS di arrivo Fornitore
ACQ3 123456 678ABC PIPPO 10/10/2024 MILANO SPA
ACQ4 77777 77777AA PRODOTTO NUOVO GIORNO CORRENTE 20/10/2024 ZZZZZ SRL
BBB BBBBB BBBBB BBBBB 31/10/2024 BBBBBB
CCC CCCCC CCCCC CCCCC 01/11/2024 CCCCCCC
ABCDE ABCDEFG ABCDEFG ABCDEFG 03/11/2024 ABCDEFGH
000 0000000 0000000 0000000 07/10/2024 000000

Se fosse così ti basterebbe modificare nella query New il tipo di unione, inserita nel passaggio Origine, indicando JoinKind.LeftOuter al posto di JoinKind.LeftAnti

ciao

La risposta è stata utile?

1 persona ha trovato utile questa risposta.
0 commenti Nessun commento

Risposta accettata dall'autore della domanda

Anonimo
2024-10-24T09:53:07+00:00

Evidentemente le tabelle risultano con meno righe.

E quindi tra una tabella e l'altra si creano delle righe vuote.

È un problema differente che penso andrebbe affrontato in altra sede rispetto a questo post.

Di certo occorrerebbe affidarsi al VBA a meno di non eliminare le righe vuote manualmente.

La risposta è stata utile?

1 persona ha trovato utile questa risposta.
0 commenti Nessun commento

Risposta accettata dall'autore della domanda

Anonimo
2024-10-11T10:32:04+00:00

Certo rispondi no.

Ma, in realtà, non c'è bisogno di cancellare.

Quel dato si aggiorna quando aggiungi un nuovo file con data successiva nel nome dello stesso.

Idem per i dati delle altre tabelle.

Quando aggiorni tutto si aggiornano in automatico.

Io avevo cancellato solo per mostrarti il "prima" e il "dopo".

Prima di inserire i file date in un'apposita cartella era in un percorso dove erano presenti vari file (excel, pdf, altre cartelle) e non ho problemi.

L'importante che se ci sono file che iniziano con "File date " poi questi nomi siano completi con la data in formato "gg.mm.aa".

Altrimenti si deve pensare altre forme di filtro per selezionare i file specifici.

Certo che per una questione di "ordine" ed efficienza sarebbe sempre meglio utilizzare percorsi dedicati per i vari file che fanno da "data base" per i recap.

Si hanno sicuramente meno problemi e meno difficoltà nel creare query a cui applicare magari svariati filtri per selezionare solo i file necessari.

Insomma, un po' di metodo non guasta :-)

La risposta è stata utile?

1 persona ha trovato utile questa risposta.
0 commenti Nessun commento

Risposta accettata dall'autore della domanda

Anonimo
2024-10-11T09:42:08+00:00

Per caso hai anche altri file che iniziano con "File date "?

Ho provato ad inserire i file in un percorso "dedicato":

Immagine

Come vedi ho inserito più file con date che vanno dal 08.10 al 11.10

Nel file excel "Confronto Codici #2.xlsx" nella cella del Percorso ho inserito appunto il percorso (naturalmente comprensivo del riferimento all'unità principale C:):

Immagine

ho cancellato i valori presenti nelle varie tabelle (anche nell'unica cella della tabella del nome File Dati) giusto per partire da una situazione senza dati (anche se non è necessario).

Eseguo aggiorna tutto e ottengo questo:

Immagine

senza particolari segnalazioni.

Nella cella "File Dati" è stato automaticamente inserito il nome del file più recente e le altre tabelle si sono aggiornate.

Nel frattempo avevo anche provato ad impostare la query che inserisce i codici presenti in entrambi i giorni (quello corrente e quello precedente) e ne estrae solo quelli per cui vi sia una differenza tra date.

La query aggiunta, nominata "DATE", è la seguente:

let 

    Origine = Table.NestedJoin(Tabella1, {"Cod."}, Tabella2, {"Cod."}, "Tabella2", JoinKind.Inner), 

    EspansaDataWMS = Table.ExpandTableColumn(Origine, "Tabella2", {"Data WMS di arrivo"}, {"Data WMS di arrivo giorno precedente"}), 

    FiltraDateDifferenti = Table.SelectRows(EspansaDataWMS, each ([Data WMS di arrivo] <> [Data WMS di arrivo giorno precedente])), 

    RimosseColonne = Table.RemoveColumns(FiltraDateDifferenti,{"Data WMS di arrivo giorno precedente"}), 

    RiordinateColonne = Table.ReorderColumns(RimosseColonne,{"Operatore", "Cod.", "Cod. fornitore", "Prodotti", "Data WMS di arrivo", "Fornitore"}) 

in 

    RiordinateColonne

Il file è sempre al medesimo link.

La risposta è stata utile?

1 persona ha trovato utile questa risposta.
0 commenti Nessun commento

Risposta accettata dall'autore della domanda

Anonimo
2024-10-10T14:34:20+00:00

Allora prova questa seconda versione: Confronto Codici #2.xlsx

In questa versione devi indicare, nella relativa cella, il solo percorso dove vengono salvati i file.

Oltre alle precedenti query ora è presente una query, presente solo in memoria, nominata "FileDatiRecente" che leggendo tutti i file presenti nel percorso filtra i file con estensione ".xlsx" e il cui nome inizia per "File date " (compreso lo spazio prima della stringa che fa da dasta).

In una colonna personalizzata viene estratta, dal nome dei file, la data, viene effettuato un ordinamento decrescente, per avere come primo file quello che riporta la data più recente, mantenuta la sola prima riga della tabella, estratto il contenuto della cartella di lavoro mantenute le sole tabelle.

Questo il codice M della suddetta query:

let 

    Origine = Folder.Files(GetNamedRange("PercorsoFile")), 

    FiltrateRighe = Table.SelectRows(Origine, each (Text.Upper([Extension])=".XLSX") and (Text.Start(Text.Upper([Name]),10)="FILE DATE ")), 

    RimosseAltreColonne = Table.SelectColumns(FiltrateRighe,{"Name","Content"}), 

    ColonnaData = Table.AddColumn(RimosseAltreColonne, "Data", each Text.Replace( Text.Replace(Text.Upper([Name]),"FILE DATE ",""),".XLSX","")), 

    FormatoData = Table.TransformColumnTypes(ColonnaData,{{"Data", type date}}), 

    OrdinaDataRecente = Table.Sort(FormatoData,{{"Data", Order.Descending}}), 

    MantieniRiga1 = Table.FirstN(OrdinaDataRecente,1), 

    Content = MantieniRiga1{0}[Content], 

    ContenutoWorkbook = Excel.Workbook(Content), 

    FiltraTabelle = Table.SelectRows(ContenutoWorkbook, each ([Kind] = "Table")), 

    OrdinaNomeTabelle = Table.Sort(FiltraTabelle,{{"Name", Order.Ascending}}) 

in 

    OrdinaNomeTabelle

Ora le due query in memoria "Tabella1" e "Tabella2", a differenza di prima, hanno come origine la suddetta query e da lì estraggono i dati delle relative tabelle.

In pratica il codice M delle query Tabella1 e Tabella2 si modifica solo in questa parte:

let 

    Origine = FileDatiRecente

Per avere anche il nome del file, ma questa volta a solo titolo di informazione per capire a che file facciano riferimento i dati, ho creato una ulteriore query, duplicando la query "FileDatiRecente", per avere i primi passaggi comuni ma con la differenza che arrivato al passaggio in cui si mantiene la prima riga "estraggo", in formato testuale, il nome del file.

Questa query è stata caricata nel foglio di lavoro nella tabella di fianco a "Nome file" e la tabella è senza intestazione in modo che sia presente la sola riga del corpo con il nome del file.

Il tutto per funzionare correttamente ha la necessità che il nome dei file di interesse sia sempre del tipo "File date gg.mm.aa.xlsx" (dove gg.mm.aa rappresenta la data assegnata al file periodicamente).

La risposta è stata utile?

1 persona ha trovato utile questa risposta.
0 commenti Nessun commento

Risposta accettata dall'autore della domanda

Anonimo
2024-10-10T11:30:28+00:00

Comunque intanto prova a vedere questo file di esempio: Confronto Codici.xlsx

Nel Foglio1 vedrai due celle dove inserire, nella prima, il percorso di salvataggio dei file (nota che il percorso deve concludersi con "") e nella seconda il nome del file (Es. File date 21.10.24.xlsx).

Ho poi inserito due tabelle che sono frutto di query per avere i codici nuovi, presenti nel giorno corrente e assenti nel giorno precedente) e per avere i codici vecchi (presenti nel giorno precedente ma assenti nel giorno corrente).

Per aggiornare le tabelle basta fare "Aggiorna Tutto".

Per arrivare a quel risultato ho quattro query, di cui due in memoria per prendere i dati di origine (Tabella1 e Tabella2), e due query per avere le due tabelle di "recap" (NEW e OLD).

Inoltre è presente una query, sempre in memoria, per ottenere le stringhe di testo del percorso e nome e utilizzata nellle query Tabella1 e Tabella2

Metto il codice M delle varie query:

Tabella1

let 

    Origine = Excel.Workbook(File.Contents(GetNamedRange("PercorsoFile") & GetNamedRange("NomeFile")), null, true), 

    Tabella1_Table = Origine{[Item="Tabella1",Kind="Table"]}[Data], 

    FiltrateRighe = Table.SelectRows(Tabella1_Table, each [#"Cod."] <> null and [#"Cod."] <> ""), 

    RimosseAltreColonne = Table.SelectColumns(FiltrateRighe,{"Cod.", "Cod. fornitore", "Prodotti", "Data WMS di arrivo", "Operatore", "Fornitore"}), 

    Formati = Table.TransformColumnTypes(RimosseAltreColonne,{{"Cod.", type text}, {"Cod. fornitore", type text}, {"Prodotti", type text}, {"Operatore", type text}, {"Fornitore", type text}, {"Data WMS di arrivo", type date}}) 

in 

    Formati

Tabella2

let 

    Origine = Excel.Workbook(File.Contents(GetNamedRange("PercorsoFile") & GetNamedRange("NomeFile")), null, true), 

    Tabella1_Table = Origine{[Item="Tabella2",Kind="Table"]}[Data], 

    FiltrateRighe = Table.SelectRows(Tabella1_Table, each [#"Cod."] <> null and [#"Cod."] <> ""), 

    RimosseAltreColonne = Table.SelectColumns(FiltrateRighe,{"Cod.", "Cod. fornitore", "Prodotti", "Data WMS di arrivo", "Operatore", "Fornitore"}), 

    Formati = Table.TransformColumnTypes(RimosseAltreColonne,{{"Cod.", type text}, {"Cod. fornitore", type text}, {"Prodotti", type text}, {"Operatore", type text}, {"Fornitore", type text}, {"Data WMS di arrivo", type date}}) 

in 

    Formati

Si differenza da Tabella1 per il fatto di andare a prendere i dati di Tabella1 del file origine dati.

NEW

let 

    Origine = Table.NestedJoin(Tabella1, {"Cod."}, Tabella2, {"Cod."}, "Tabella2", JoinKind.LeftAnti), 

    RimossaTabella2 = Table.RemoveColumns(Origine,{"Tabella2"}), 

    RiordinateColonne = Table.ReorderColumns(RimossaTabella2,{"Operatore", "Cod.", "Cod. fornitore", "Prodotti", "Data WMS di arrivo", "Fornitore"}) 

in 

    RiordinateColonne

OLD

let 

    Origine = Table.NestedJoin(Tabella1, {"Cod."}, Tabella2, {"Cod."}, "Tabella2", JoinKind.RightAnti), 

    RimosseAltreColonne = Table.SelectColumns(Origine,{"Tabella2"}), 

    EspansaTabella2 = Table.ExpandTableColumn(RimosseAltreColonne, "Tabella2", {"Cod.", "Cod. fornitore", "Prodotti", "Data WMS di arrivo", "Operatore", "Fornitore"}, {"Cod.", "Cod. fornitore", "Prodotti", "Data WMS di arrivo", "Operatore", "Fornitore"}), 

    RiordinateColonne = Table.ReorderColumns(EspansaTabella2,{"Operatore", "Cod.", "Cod. fornitore", "Prodotti", "Data WMS di arrivo", "Fornitore"}) 

in 

    RiordinateColonne

Infine la query di "appoggio" (una funzione query a cui passare come argomento il nome delle celle) per ottenere il testo contenuto nelle celle nominate relative al percorso e nome del file:

let GetNamedRange=(NamedRange) => 

  let 

	name = Excel.CurrentWorkbook(){[Name=NamedRange]}[Content], 

	value = name{0}[Column1] 

in 

	value 

 in GetNamedRange

Prova ad utilizzarlo indicando il percorso e il nome di un file realmente da te utilizzato (dopo aver nominato in modo opportuno le tabelle contenenti i dati).

ciao

La risposta è stata utile?

1 persona ha trovato utile questa risposta.
0 commenti Nessun commento

Risposta accettata dall'autore della domanda

Anonimo
2024-10-10T11:08:45+00:00

Dipende anche da quali siano le tue esigenze.

Avere comunque dei riepiloghi giornalieri che tengano in memoria i dati giorno per giorno o meno.

Per intenderci ti serve un "Recap File Date 10.10.24" che contenga le sole differenze del 10.10.24 (e via dicendo giorno per giorno un file Recap differente in base alla data) o un "Recap File Date" che contenga sempre e solo le variazioni rispetto all'ultimo file presente nel percorso?

La risposta è stata utile?

1 persona ha trovato utile questa risposta.
0 commenti Nessun commento

Risposta accettata dall'autore della domanda

Eleuterio Tedeschi 18,590 Punti di reputazione Moderatore volontario
2024-10-10T10:16:42+00:00

Onestamente mi sembrava di aver rispostai tempi comunicando di aver risolto grazie al vostro supporto, ho contrassegnato come utili le risposte come mi hanno risolto la questione.
Se esiste una modalità specifica per chiudere la discussione onestamente non la conosco, non ci ho fatto apposta a lasciare eventualmente qualcosa in appeso.

Esiste e come nelle precedenti, va contrassegnata la risposta che ora ho fatto io, visto che continuavo a vederla non chiusa, ora puoi vedere che compare la spunta in verde ed aprendola visualizza la risposta contrassegnata:

gentilmente tienine conto per il futuro,

grazie.

La risposta è stata utile?

1 persona ha trovato utile questa risposta.
0 commenti Nessun commento

Risposta accettata dall'autore della domanda

Anonimo
2024-10-10T09:54:09+00:00

Ah, ok. Ora ho capito. Intendevi l'ordinamento delle colonne.

Quindi le tabelle saranno sempre nominate "Tabella1" (per il giorno corrente) e "Tabella2" (per il giorno precedente).

Il file sarà sempre salvato nello stesso percorso e nominato sempre allo stesso modo (si tratterà, nel caso, di impostare l'origine anche manualmente nel caso venga salvato in altro percorso o nominato in altro modo).

La risposta è stata utile?

1 persona ha trovato utile questa risposta.
0 commenti Nessun commento

Risposta accettata dall'autore della domanda

Anonimo
2024-10-09T15:24:58+00:00

Si potrebbe pensare ad un file che contenga la o le query, che prenda, da un determinato percorso, i dati dei file degli ultimi due giorni.

Crei un elenco dei dati del giorno più recente.

Faccia un confronto con i dati del file del giorno precedente rispetto al file del giorno più recente e crei due elenchi, uno con i nuovi codici e uno con i codici assenti.

Ad occhio e croce si tratterebbe di effettuare delle "merge" di tabelle in base a parametri differenti (codici presenti solo nella tabella del giorno "corrente" e codici presenti solo nella tabella del giorno precedente).

In questo modo andando a salvare il file di dati nello stesso percorso aggiornando le query della cartella di lavoro di riepilogo dei dati si avrebbe ogni giorno l'aggiornamento rispetto a quello che risulta il giorno precedente.

Ma senza conoscere qual è la situazione reale diventa impossibile fare qualcosa se non teorizzare soluzioni.

Per poter "automatizzare", anche con Power Query, occorrerebbe avere più informazioni del tipo:

I file giornalieri vengono salvati sempre nello stesso percorso e che formato hanno?

I file vengono nominati in modo che sia possibile ricavare la data a cui si riferiscono i dati?

O la data a cui fanno riferimento i dati può essere in qualche modo ricavata dal contenuto dei file?

I dati sono inseriti sempre allo stesso modo nei file giornalieri?

Insomma se non si conosce lo scenario non si riesce nemmeno a dare qualche indicazione per impostare la query.

La risposta è stata utile?

1 persona ha trovato utile questa risposta.
0 commenti Nessun commento

34 risposte aggiuntive

Ordina per: Più utili
  1. Anonimo
    2024-10-11T08:37:19+00:00

    Probabilmente chiede i controlli di privacy perché vede che si tratta di un pc diverso.

    Imposta la check dove è scritto di ignorare i controlli di privacy per questo file.

    Se stai utilizzando la seconda versione il nome del file non va iserito.

    Sarà la procedura che selezionerà il file con data più recente.

    Ma i file devono avere il nome "File date gg.mm.aa.xlsx"

    La risposta è stata utile?

    1 persona ha trovato utile questa risposta.
    0 commenti Nessun commento