simulare un'istruzione vba dentro un file power query L’argomento è risolto

Non è propriamente un programma di BI, ma nelle sue versioni più recenti anche Excel può fare grandi cose!

Moderatore: Utilizzo_prof_Excel

Avatar utente

Andrea90
Messaggi: 2240 | Topic creati
Iscritto il: dom 28 giu 2020, 19:41
Luogo: Bologna
Ringraziato: 672 volte
Contatta:

simulare un'istruzione vba dentro un file power query

Messaggio da Andrea90 »

Ciao mb63,

Le soluzioni che vengono date vanno poi però studiate ed adattate alla propria casistica e non semplicemente copiate ed incollate perché non possono essere soluzioni universali.

Ad esempio, tu hai scritto che se [CodiceTipo] = "Codice Art. fornitore" allora inserisci il valore che trovi per il campo [CodiceValore], nel tuo file è tutto "Codice Art. fornitore", quindi le condizioni che vengono scritte successivamente non vengono nemmeno prese in considerazione, ecco perché la colonna che crei è praticamente un duplicato del campo [CodiceValore].

Nel file che ho girato all'altro utente io non ho scritto [Indice] - 1 ma ho inserito una stringa simile a questa:

Codice: Seleziona tutto

List.Buffer(#"Rimosse colonne"[Venduto]){[Indice]-1}
Quindi se tu scrivi [Indice] - 1, quello che ottieni è semplicemente il valore del campo [Indice] per la riga corrente, meno 1.

Andrea


Se hai gradito l'aiuto che hai ricevuto considera di contribuire alle spese per il mantenimento del forum facendo una libera DONAZIONE --> Link

Ricordarsi di segnare come "RISOLTE" le discussioni per le quali si è ricevuto un feedback positivo. Per vedere come fare --> Link

Autore del topic
mb63
Messaggi: 123 | Topic creati
Iscritto il: gio 16 lug 2020, 15:09
Ringraziato: 5 volte

simulare un'istruzione vba dentro un file power query

Messaggio da mb63 »

Peccato cambiando anche la colonna di riferimento il risultato non è quello desiderato

200381
COU
IC


io dovrei ottenere come risultato finale
200381
200381
200381

perchè dovrei inserire se i dati sono :

COU copia il valore della cella precdente

IC copia il valore contenuto nelle due celle precedente

Codice: Seleziona tutto

let
    Origine = Excel.CurrentWorkbook(){[Name="Tabella1"]}[Content],
    #"Modificato tipo" = Table.TransformColumnTypes(Origine,{{"NumeroLinea", Int64.Type}, {"CodiceTipo", type text}, {"CodiceValore", type text}, {"Descrizione", type text}, {"Quantita", type number}, {"UnitaMisura", type text}, {"PrezzoUnitario", type number}, {"PrezzoTotale", type number}}),
    #"Colonna condizionale aggiunta" = Table.AddColumn(#"Modificato tipo", "Personalizzato", each if [CodiceValore] = "COU" then {[CodiceValore]-1} else if [CodiceValore] = "IC" then {[CodiceValore]-2} else null)
in
    #"Colonna condizionale aggiunta"
Allegati
adegua cou ic ib ecv3.xlsx
(28.07 KiB) Scaricato 11 volte
Avatar utente

Andrea90
Messaggi: 2240 | Topic creati
Iscritto il: dom 28 giu 2020, 19:41
Luogo: Bologna
Ringraziato: 672 volte
Contatta:

simulare un'istruzione vba dentro un file power query

Messaggio da Andrea90 »

Ciao mb63,

Quello che ti avevo indicato, come base per trovare la soluzione al tuo problema, era questa porzione di codice:

Codice: Seleziona tutto

List.Buffer(#"Rimosse colonne"[Venduto]){[Indice]-1}
Nel tuo file, invece, ho trovato questo:

Codice: Seleziona tutto

{[CodiceValore]-1}
Chiaramente non può portarti al risultato desiderato.

E per arrivare ad un primo risultato i passi che devi seguire/studiare sono diversi:

1) Nel file che avevo allegato in quella discussione puoi vedere la creazione di una colonna Indice che nel tuo file non ho trovato
2) Utilizzo List.Buffer, che come possiamo intuire dal nome sarà una funzione che agisce su delle liste. Ora per creare una lista si può agire nel seguente modo: nome_tabelle[nome_campo], e nel file che ho allegato il nome_tabella = #"Rimosse colonne" mentre il nome campo = [Venduto].
3) Le liste in linguaggio M sono 0-based, nel senso che il primo elemento della lista è valorizzato come il numero 0, pertanto non è un caso che l'Indice calcolato l'ho fatto partire proprio da 0 e non da 1.
4) Una volta che hai una lista, se vuoi richiamare un n-esimo valore da essa, devi far seguire la lista da questo codice {n} dove per esempio, se n fosse uguale a 2 in una lista contenente ["a", "b", "c", "d"] otterrei come valore la lettera "c".

Pertanto se vuoi trovare una soluzione al tuo problema è necessario studiare a partire da qui per riuscire a padroneggiare la soluzione.

A presto,

Andrea
Se hai gradito l'aiuto che hai ricevuto considera di contribuire alle spese per il mantenimento del forum facendo una libera DONAZIONE --> Link

Ricordarsi di segnare come "RISOLTE" le discussioni per le quali si è ricevuto un feedback positivo. Per vedere come fare --> Link

Autore del topic
mb63
Messaggi: 123 | Topic creati
Iscritto il: gio 16 lug 2020, 15:09
Ringraziato: 5 volte

simulare un'istruzione vba dentro un file power query

Messaggio da mb63 »

Non avendo le conoscenze di power query forse mi sto perdendo, ho visto anche un video di emmanuele relativo a list. Buffer, ma io non devo fare somme devo sostituire delle lettere con dei numeri.
Domani mattina provo a fare delle prove sul file per vedere cosa succede
Grazie per avermi risposto, visto l ora
Avatar utente

Andrea90
Messaggi: 2240 | Topic creati
Iscritto il: dom 28 giu 2020, 19:41
Luogo: Bologna
Ringraziato: 672 volte
Contatta:

simulare un'istruzione vba dentro un file power query

Messaggio da Andrea90 »

List.Buffer è una formula che viene utilizzata per riuscire ad ottimizzare il calcolo, nulla di più. Discorso complicato da inserire in una risposta ad un utente, ma per dare l'idea è simile, come logica, a Table.Buffer. Ma potresti benissimo rimuoverlo che non cambierebbe il risultato finale.

Purtroppo, o per fortuna, dipende uno come la vede, un forum come questo è pensato per dare spunti agli utenti al fine di trovare la soluzione che meglio si adatta alle proprie esigenze. Pertanto c'è comunque da studiare.

Fai tutte le prove che ti servono con calma, soprattutto studiando l'esempio che ho indicato questa mattina all'altro utente. Una volta capito come ottenere un dato elemento da una lista utilizzando una colonna Indice, allora non penso avrai problemi ad impostare una clausola if then con PQ.

A presto,

Andrea
Se hai gradito l'aiuto che hai ricevuto considera di contribuire alle spese per il mantenimento del forum facendo una libera DONAZIONE --> Link

Ricordarsi di segnare come "RISOLTE" le discussioni per le quali si è ricevuto un feedback positivo. Per vedere come fare --> Link

Autore del topic
mb63
Messaggi: 123 | Topic creati
Iscritto il: gio 16 lug 2020, 15:09
Ringraziato: 5 volte

simulare un'istruzione vba dentro un file power query

Messaggio da mb63 »

Ciao Andrea
partiamo da zero..
ho inserito la colonna indicizzata come da te suggerito ok

nell'esempio che mi facevi dell'altro post

Codice: Seleziona tutto

try List.Buffer(#"Rimosse colonne"[Venduto]){[Indice]-1} otherwise ""
c'era una logica che generava una colonna in cui l'importo era esattamente il valore della cella precedente e il cui importo era preso dalla colonna Venduto (OK)


--------------------------------------------------
nel mio caso non riesco a capire qual'è il legame tra la colonna indice e la colonna [CodiceValore] dove, se trova la parola COU (cella C3) deve sostituire la parola con il numero 200381 come nel caso dell'articolo in cella C2, oppure (cella C14 COU) sostituito da 220079 valore di cella (C13)

--------------------------------------------------

grazie
Allegati
adegua cou ic ib ec con indice.xlsx
(24.08 KiB) Scaricato 13 volte
Avatar utente

Andrea90
Messaggi: 2240 | Topic creati
Iscritto il: dom 28 giu 2020, 19:41
Luogo: Bologna
Ringraziato: 672 volte
Contatta:

simulare un'istruzione vba dentro un file power query

Messaggio da Andrea90 »

Ciao mb63,

Quello che vuoi fare tu è sostituire le varie sigle che trovi in colonna C (es° COU, IC, EC) con i numeri che compaiono nelle righe precedenti ?

Giusto per intenderci prova a sostituire tutto il codice da te scritto nella query "crea codice valore", con questo qui (comparirà una nuova colonna chiamata test):

Codice: Seleziona tutto

let
    Origine = Excel.CurrentWorkbook(){[Name="Tabella1"]}[Content],
    #"Modificato tipo" = Table.TransformColumnTypes(Origine,{{"NumeroLinea", Int64.Type}, {"CodiceTipo", type text}, {"CodiceValore", type text}, {"Descrizione", type text}, {"Quantita", type number}, {"UnitaMisura", type text}, {"PrezzoUnitario", type number}, {"PrezzoTotale", type number}}),
    #"Aggiunta colonna personalizzata" = Table.AddColumn(#"Modificato tipo", "Test", each Text.Combine(List.RemoveItems(Text.ToList([CodiceValore]),{"A".."Z"}))),
    #"Sostituito valore" = Table.ReplaceValue(#"Aggiunta colonna personalizzata","",null,Replacer.ReplaceValue,{"Test"}),
    #"Ricopiato in basso" = Table.FillDown(#"Sostituito valore",{"Test"})
in
    #"Ricopiato in basso"
Andrea
Se hai gradito l'aiuto che hai ricevuto considera di contribuire alle spese per il mantenimento del forum facendo una libera DONAZIONE --> Link

Ricordarsi di segnare come "RISOLTE" le discussioni per le quali si è ricevuto un feedback positivo. Per vedere come fare --> Link

Autore del topic
mb63
Messaggi: 123 | Topic creati
Iscritto il: gio 16 lug 2020, 15:09
Ringraziato: 5 volte

simulare un'istruzione vba dentro un file power query

Messaggio da mb63 »

Andrea90 ha scritto: mar 29 dic 2020, 0:58 Ciao mb63,

Quello che vuoi fare tu è sostituire le varie sigle che trovi in colonna C (es° COU, IC, EC) con i numeri che compaiono nelle righe precedenti ?

Giusto per intenderci prova a sostituire tutto il codice da te scritto nella query "crea codice valore", con questo qui (comparirà una nuova colonna chiamata test):

Codice: Seleziona tutto

let
    Origine = Excel.CurrentWorkbook(){[Name="Tabella1"]}[Content],
    #"Modificato tipo" = Table.TransformColumnTypes(Origine,{{"NumeroLinea", Int64.Type}, {"CodiceTipo", type text}, {"CodiceValore", type text}, {"Descrizione", type text}, {"Quantita", type number}, {"UnitaMisura", type text}, {"PrezzoUnitario", type number}, {"PrezzoTotale", type number}}),
    #"Aggiunta colonna personalizzata" = Table.AddColumn(#"Modificato tipo", "Test", each Text.Combine(List.RemoveItems(Text.ToList([CodiceValore]),{"A".."Z"}))),
    #"Sostituito valore" = Table.ReplaceValue(#"Aggiunta colonna personalizzata","",null,Replacer.ReplaceValue,{"Test"}),
    #"Ricopiato in basso" = Table.FillDown(#"Sostituito valore",{"Test"})
in
    #"Ricopiato in basso"
Andrea
Grazie Andrea

ho verificato va bene adesso vado a studiare i vari passaggi che hai utilizzato nella query

Alla prossima
Rispondi