Buon pomeriggio,
vorrei usare calc al posto di base per ottenere pochi ma semplici risultati (da ottenere i risultati in foglio "riepilogo). Con movimenti di carico univoci ho “n” movimenti di scarico così che ho il rapporto di “uno a molti”. Come posso “aggregare” i risultati per prodotto come da file allegato ?
Grazie in anticipo
Prova.ods (11.6 KB)
Ciao prova così. Nel foglio “riepilogo”, in B6 metti
=SE.ERRORE(INDICE(Carico.$D$2:$D$40;AGGREGA(15;6;(RIF.RIGA(Carico.$D$2:$D$40)-1)/(Carico.$A$2:$A$40=$A$5);RIF.RIGA(A1)));"")
in C6
=SE.ERRORE(INDICE(Carico.$C$2:$C$40;CONFRONTA(G6;Carico.$D$2:$D$40;0));"")
in D6
=SE.ERRORE(INDICE(Scarico.$C$4:$C$42;CONFRONTA(G6;Scarico.$A$4:$A$42;0));"")
e tiri in basso per quanto ti può servire
In E6 c’è la tua formula. Il totale per praticità l’ho spostato in alto.
Allego esempio.
Database con calc.ods (14.3 KB)
magari ho tratto in errore e chiedo scusa: pur tuttavia
- i movimenti di scarico non vengono “aggregati”
- occorrerebbe la somma di valori “non contigui”
- il report dovrebbe essere “dinamico” e contenere solo righe <> 0
riallego file prova
Prova.ods (12.1 KB)
Forse non avevo capito anch’io bene la richiesta.
Comunque per fare ciò che vuoi con le formule ti ripropongo una mia soluzione, dove ho affiancato gli articoli e sostituito le formule di C6 e D6 con
=SOMMA.SE(Carico.$D$2:$D$38;B6;Carico.$C$2:$C$38)
e
=SOMMA.SE(Carico.$D$2:$D$38;B6;Carico.$C$2:$C$38)
e da tirare in basso.
Analogamente ho fatto per gli altri articoli.
Se poi vuoi una cosa come nel tuo esempio, con tutto incolonnato, forse si può fare con le macro, ma in questo caso non saprei aiutarti.
Database con calc(bis).ods (17.7 KB)
Grazie mille e di nuovo scusa per non aver posto correttamente la domanda. Sì, sono arrivato anche io ad una soluzione similare ma più semplice.
Avrei bisogno, però, di avere un report in “portrait” come da allegato (gli articoli sono tanti) e, se potessi spiegarmi, come aggiungere (senza copia-incolla) eventuali articoli e/o carichi e scarichi.
Ti lascio il mio indirizzo e-mail (gianvi60@hotmail.it) se puoi chiarirmi ovvero lasciare qua la spiegazione di cui sopra.
In ogni caso grazie tante ancora.
Prova.ods (14.2 KB)
Ciao ho visto che possono esserci stessi prodotti con lotti diversi, può capitare di esserci lo stesso prodotto con lo stesso lotto? quindi ad esempio due volte aaa
e due volte #001
Comunque se ti va bene possiamo usare una macro per riprodurre il foglio riepilogo come da tuo esempio, con formule sarebbe molto macchinoso.
Se dovessi optare per la soluzione con macro, il file di esempio deve essere uguale “all’originale”, altrimenti si rischia di perdere solo tempo.
Saluti
aspetta:
gli articoli sono UNICI mentre i lotti sono tanti (usando il linguaggio MySql dovrei dire uno-a-molti) Per intenderci:
art.aaa lotto #001, #005, #010;
art.bbb lotto #00x, #00y, #00z;
art.ccc lotto #00a, #00b, #00c e così via.
…
…
…
fino alla fine degli articoli presenti nella prima tabella
Per cui avrei bisogno di un report che sia così strutturato: raggruppamento per articolo con sotto-raggruppamento per lotto (carico e scarico).
Spero di essere stato chiaro questa volta.
Grazie e saluti
Si sei stato abbastanza chiaro, più tardi ti scrivo una piccola macro.
Ultima domanda, il sistema operativo ??
Ecco il perché della mia domanda sul sistema operativo
Aggiungi questa riga prima
GlobalScope.BasicLibraries.loadLibrary("ScriptForge")
Se non funziona cambia con questa
Sub Database
Dim Lista()
Dim t As Long
Dim Doc As Object, ShCarico As Object, ShScarico As Object, ShRiep As Object
Doc = ThisComponent
ShCarico = Doc.Sheets.getByName("Carico")
ShScarico = Doc.Sheets.getByName("Scarico")
ShRiep = Doc.Sheets.getByName("riepilogo")
c = ShCarico.createCursor
c.gotoEndOfUsedArea(false)
LastRow = c.RangeAddress.EndRow
InRange = ShCarico.getCellRangeByName("A2:A" & LastRow+1)
Lista() = InRange.GetDataArray
Dim collezione As New Collection
On Error Resume Next
For t = 0 To Ubound(Lista)
prod = Lista(t)(0)
collezione.Add(prod, CStr(prod))
Next t
On Error Goto 0
c.gotoEndOfUsedArea(false)
LastRow = c.RangeAddress.EndRow
If LastRow < 4 Then LastRow = 4
ShRiep.getCellRangeByName("A5:E" & LastRow+1).ClearContents(1+4+16+32)
RigaInizio = 2
For t = 1 To collezione.Count
oDescriptor = InRange.createSearchDescriptor()
With oDescriptor
.SearchString = collezione(t)
.SearchWords = True
.SearchType = 1 ' cerca nei valori
.SearchCaseSensitive = False
End With
oFound = InRange.findFirst(oDescriptor)
iF Not IsNull(oFound) Then
RigaInizio = RigaInizio + 3
ShRiep.GetCellRangeByName("A" & RigaInizio).String = collezione(t)
Formatta(ShRiep.GetCellRangeByPosition(0, RigaInizio-1, 4, RigaInizio-1).AbsoluteName)
End If
Do While Not IsNull(oFound)
r=oFound.getCellAddress.Row
Col = oFound.getCellAddress.Column
oFound = InRange.findNext( oFound, oDescriptor)
Lotto = ShCarico.getCellbyposition(3, r).String
Q = ShCarico.getCellbyposition(2, r).Value
RigaInizio = RigaInizio + 1
ShRiep.GetCellRangeByName("B" & RigaInizio).String = Lotto
ShRiep.GetCellRangeByName("C" & RigaInizio).Value = Q
ShRiep.GetCellRangeByName("D" & RigaInizio).FormulaLocal = "=SOMMA.SE($Scarico.$A:$Scarico.$C;$B" & RigaInizio & ";$Scarico.$C:$Scarico.$C)"
ShRiep.GetCellRangeByName("E" & RigaInizio).FormulaLocal = "=C"&RigaInizio & "-D"& RigaInizio
Loop
Next t
End Sub
sub Formatta(rng)
rem ----------------------------------------------------------------------
rem define variables
dim document as object
dim dispatcher as object
rem ----------------------------------------------------------------------
rem get access to the document
document = ThisComponent.CurrentController.Frame
dispatcher = createUnoService("com.sun.star.frame.DispatchHelper")
rem ----------------------------------------------------------------------
dim args1(0) as new com.sun.star.beans.PropertyValue
args1(0).Name = "ToPoint"
args1(0).Value = rng
dispatcher.executeDispatch(document, ".uno:GoToCell", "", 0, args1())
rem ----------------------------------------------------------------------
dispatcher.executeDispatch(document, ".uno:BorderTLBR", "", 0, Array())
rem ----------------------------------------------------------------------
dispatcher.executeDispatch(document, ".uno:BorderBLTR", "", 0, Array())
rem ----------------------------------------------------------------------
dim args4(7) as new com.sun.star.beans.PropertyValue
args4(0).Name = "BorderOuter.LeftBorder"
args4(0).Value = Array(0,0,0,0,0,0)
args4(1).Name = "BorderOuter.LeftDistance"
args4(1).Value = 0
args4(2).Name = "BorderOuter.RightBorder"
args4(2).Value = Array(0,0,0,0,0,0)
args4(3).Name = "BorderOuter.RightDistance"
args4(3).Value = 0
args4(4).Name = "BorderOuter.TopBorder"
args4(4).Value = Array(0,0,0,0,0,0)
args4(5).Name = "BorderOuter.TopDistance"
args4(5).Value = 0
args4(6).Name = "BorderOuter.BottomBorder"
args4(6).Value = Array(0,0,26,0,0,26)
args4(7).Name = "BorderOuter.BottomDistance"
args4(7).Value = 0
dispatcher.executeDispatch(document, ".uno:BorderOuter", "", 0, args4())
end sub
Come la giro… errore di sintassi BASIC; atteso sub
provato sia con win 10 che con mac OS - L.O. 7.4.5.1
A me funzionano entrambe, fai uno screen dell’errore, figura intera.
Riallego file con entrambe le macro.
Prova (1).ods (14.6 KB)
grazie ! funziona solo la seconda macro, però
potresti darmi qualche indicazione per, come e dove studiare la composizione macro
?
Ci sono diverse guide soprattutto in inglese, ad esempio quello di pitonyak e in italiano invece la guida a star office 8.