Pannello di Controllo Moderatore ]

[Risolto]macro filtro intervallo tra due date + cliente

Creare una macro - Scrivere uno script - Usare le API

[Risolto]macro filtro intervallo tra due date + cliente

Messaggioda nikolas1194 » mercoledì 24 luglio 2019, 12:08

Buongiorno a tutti,
prima di aprire il nuovo argomento ho cercato nel forum delle soluzioni (sia nella sezione "Calc" che in questa), ma senza trovare qualcosa che mi aiutasse. Ho cominciato da pochissimo a lavorare con OpenOffice e sto creando un file Calc per la gestione delle scadenze dei prodotti ordinati su commessa. Volevo un aiuto per costruire una macro nella prima cartella ("CERCA") che copi in quest'ultima tutte le voci degli ordini dalla seconda cartella ("SCAD"), che corrispondono ad un cliente e che abbiano come consegna una data compresa tra due inserite dall'utente e calcoli il totale nella cella sotto "TOT.MESE".
Per rendere la cosa ancora più utile vorrei non mettere come obbligatorio l'inserimento del cliente per la ricerca (magari inserendo nell'elenco TUTTI) è possibile?
Allego file con dati di prova e prima cartella che mostra il risultato che vorrei ottenere.

Ringrazio in anticipo per l'aiuto e mi scuso nel caso in cui ci siano argomenti aperti analoghi a questo.
Nikolas
Allegati
Prova scadenziario.ods
(19.31 KiB) Scaricato 16 volte
Ultima modifica di nikolas1194 il martedì 30 luglio 2019, 10:15, modificato 1 volta in totale.
OpenOffice 4.1.6
Windows 7 e Windows10
nikolas1194
 
Messaggi: 21
Iscritto il: mercoledì 24 luglio 2019, 10:19

Re: Copia in nuova cartella file con scadenza fra due date

Messaggioda Gaetanopr » giovedì 25 luglio 2019, 9:48

Il tutto funziona tramite il filtro speciale da macro che viene azionata al variare della cella CLIENTE, quindi è indispensabile variare prima le date e alla fine il Cliente.
Se si vogliono riportare tutti i clienti ti basta lasciare la cella vuota, il range A1:C2 del foglio Cerca và lasciato vuoto in quanto serve come area dei criteri per il filtro.

Saluti
Allegati
Prova scadenziario.ods
(21.68 KiB) Scaricato 16 volte
Openoffice 4.1 su windows xp
Gaetanopr
Volontario
Volontario
 
Messaggi: 2774
Iscritto il: mercoledì 21 novembre 2012, 20:07

Re: Copia in nuova cartella file con scadenza fra due date

Messaggioda nikolas1194 » venerdì 26 luglio 2019, 9:23

Gaetanopr ha scritto:Il tutto funziona tramite il filtro speciale da macro che viene azionata al variare della cella CLIENTE, quindi è indispensabile variare prima le date e alla fine il Cliente.
Se si vogliono riportare tutti i clienti ti basta lasciare la cella vuota, il range A1:C2 del foglio Cerca và lasciato vuoto in quanto serve come area dei criteri per il filtro.

Saluti


Nel file che mi hai allegato non risulta nessuna macro. Itanto ti chiedo una delucidazione: visto che la macro si dovrebbe attivare appena vado a riempire il campo cliente, conviene quindi invertire celle mettendo in E2-F2 Data inizio, E3-F3 data fine e in E4-F5 il Cliente per evitare che venga messo per primo? E funziona anche se il cliente viene inserito con selezione da menù a tendina? E per togliere il filtro come dovrei fare?

grazie per i chiarimenti
OpenOffice 4.1.6
Windows 7 e Windows10
nikolas1194
 
Messaggi: 21
Iscritto il: mercoledì 24 luglio 2019, 10:19

Re: Copia in nuova cartella file con scadenza fra due date

Messaggioda Gaetanopr » venerdì 26 luglio 2019, 9:39

nikolas1194 ha scritto:Nel file che mi hai allegato non risulta nessuna macro

Ne sei sicuro ? ho appena scaricato il file e tutto funziona bene, questa è la macro presente nel modulo Foglio1
Codice: Seleziona tutto   Espandi visualeStringi visuale
Sub Scadenziario(Target)

If NOT Target.supportsService("com.sun.star.sheet.SheetCell") then exit sub
If Target.AbsoluteName <> "$CERCA.$F$2" then exit sub

Dim ShSCAD As Object, ShCerca As Object
Dim LastCol As Long, LastRow As Long
Dim Args(3) as New com.sun.star.beans.PropertyValue
Dim i As Long     'A sheet from the Calc document.
Dim oRanges As Object   'The NamedRanges property.
Dim oCritRange As Object'Range that contains the filter criteria.
Dim oDataRange As Object'Range that contains the data to filter.
Dim oFiltDesc  As Object'Filter descriptor.
Dim x As New com.sun.star.table.CellAddress
Dim oCursor As Object

Doc = ThisComponent
ShCerca = Doc.sheets.getbyname("CERCA")
ShSCAD = Doc.sheets.getbyname("SCAD")
DataIn = ShCerca.GetCellRangeByname("F3").Value
DataFin = ShCerca.GetCellRangeByname("F4").Value
CDataIn = DateSerial( Year(DataIn), Month(DataIn), Day(DataIn))
CDataFin = DateSerial( Year(DataFin), Month(DataFin), Day(DataFin))
Cliente = ShCerca.getCellRangeByName("F2").string

If DataFin = 0 Or DataIn = 0 Then MsgBox "Date non valorizzate" : Exit Sub
If DataFin < DataIn Then MsgBox "Hai indicato una data finale inferiore a quella iniziale" : Exit Sub

    oCursor = ShSCAD.createcursor
    oCursor.gotoendofusedarea(false)
    LastRow = oCursor.rangeaddress.Endrow
    LastCol = oCursor.rangeaddress.Endcolumn
    oDataRange = ShSCAD.getCellRangeByPosition(1, 1, LastCol, LastRow)
 
     
       Dim Curs As Object, LR As Long, LC As Long
       Curs = ShCerca.createcursor
       Curs.gotoendofusedarea(false)
       LR = oCursor.rangeaddress.Endrow
       LC = oCursor.rangeaddress.Endcolumn
       ShCerca.GetCellRangeByPosition(1, 5, LC, LR).ClearContents(1023)
       ShCerca.getCellRangeByName("A1").String = "CLIENTE"
       ShCerca.getCellRangeByName("B1").String = "CONS"
       ShCerca.getCellRangeByName("C1").String = "CONS"
       ShCerca.getCellRangeByName("A2").string = Cliente
       ShCerca.getCellRangeByName("B2").string =  ">="& CDataIn & ""
       ShCerca.getCellRangeByName("C2").string = "<="& CDataFin & ""
             
       oCritRange = ShCerca.getCellRangeByName("A1:C2")

       oFiltDesc = oCritRange.createFilterDescriptorByObject(oDataRange)
       oFiltDesc.ContainsHeader = True
       oFiltDesc.SkipDuplicates = False 'True
       oFiltDesc.CopyOutputData = True
       For i = 0 To Doc.Sheets.Count - 1
         If Doc.Sheets(i).Name = "CERCA" Then
           x.sheet = i
           exit for
         End if
       Next i
       x.column = 1
       x.row = 6
 
       oFiltDesc.OutputPosition = x
       oDataRange.filter(oFiltDesc)
       oCritRange.ClearContents(1+2+4)
  End Sub     

La convenienza la decide chi compila il modulo, per quanto mi riguarda io non avrei problemi anche con l'attuale impostazione, per eliminare il filtro basta non indicare il cliente e mettere la data iniziale e finale minima e massima, puoi usare il menù a tendina.

PS: Se ti viene meglio puoi azionare la macro con un pulsante dopo aver compilato i vari campi.
Openoffice 4.1 su windows xp
Gaetanopr
Volontario
Volontario
 
Messaggi: 2774
Iscritto il: mercoledì 21 novembre 2012, 20:07

Re: Copia in nuova cartella file con scadenza fra due date

Messaggioda patel » venerdì 26 luglio 2019, 11:28

Il file originale deriva da un xlsm e stranamente con Libre la macro non si vede, con Openoffice nessun problema
-------------------
OpenOffice 4.1 e Libre Office 6.o.7.3 su Windows 10
allega un file di esempio, guadagnerai tempo tu e lo farai risparmiare a chi ti aiuta
patel
Volontario attivo
Volontario attivo
 
Messaggi: 3346
Iscritto il: venerdì 30 aprile 2010, 7:04
Località: Livorno

Re: Copia in nuova cartella file con scadenza fra due date

Messaggioda nikolas1194 » venerdì 26 luglio 2019, 14:02

Gaetanopr ha scritto:
nikolas1194 ha scritto:Nel file che mi hai allegato non risulta nessuna macro

Ne sei sicuro ? ho appena scaricato il file e tutto funziona bene, questa è la macro presente nel modulo Foglio1
Codice: Seleziona tutto   Espandi visualeStringi visuale
Sub Scadenziario(Target)

If NOT Target.supportsService("com.sun.star.sheet.SheetCell") then exit sub
If Target.AbsoluteName <> "$CERCA.$F$2" then exit sub

Dim ShSCAD As Object, ShCerca As Object
Dim LastCol As Long, LastRow As Long
Dim Args(3) as New com.sun.star.beans.PropertyValue
Dim i As Long     'A sheet from the Calc document.
Dim oRanges As Object   'The NamedRanges property.
Dim oCritRange As Object'Range that contains the filter criteria.
Dim oDataRange As Object'Range that contains the data to filter.
Dim oFiltDesc  As Object'Filter descriptor.
Dim x As New com.sun.star.table.CellAddress
Dim oCursor As Object

Doc = ThisComponent
ShCerca = Doc.sheets.getbyname("CERCA")
ShSCAD = Doc.sheets.getbyname("SCAD")
DataIn = ShCerca.GetCellRangeByname("F3").Value
DataFin = ShCerca.GetCellRangeByname("F4").Value
CDataIn = DateSerial( Year(DataIn), Month(DataIn), Day(DataIn))
CDataFin = DateSerial( Year(DataFin), Month(DataFin), Day(DataFin))
Cliente = ShCerca.getCellRangeByName("F2").string

If DataFin = 0 Or DataIn = 0 Then MsgBox "Date non valorizzate" : Exit Sub
If DataFin < DataIn Then MsgBox "Hai indicato una data finale inferiore a quella iniziale" : Exit Sub

    oCursor = ShSCAD.createcursor
    oCursor.gotoendofusedarea(false)
    LastRow = oCursor.rangeaddress.Endrow
    LastCol = oCursor.rangeaddress.Endcolumn
    oDataRange = ShSCAD.getCellRangeByPosition(1, 1, LastCol, LastRow)
 
     
       Dim Curs As Object, LR As Long, LC As Long
       Curs = ShCerca.createcursor
       Curs.gotoendofusedarea(false)
       LR = oCursor.rangeaddress.Endrow
       LC = oCursor.rangeaddress.Endcolumn
       ShCerca.GetCellRangeByPosition(1, 5, LC, LR).ClearContents(1023)
       ShCerca.getCellRangeByName("A1").String = "CLIENTE"
       ShCerca.getCellRangeByName("B1").String = "CONS"
       ShCerca.getCellRangeByName("C1").String = "CONS"
       ShCerca.getCellRangeByName("A2").string = Cliente
       ShCerca.getCellRangeByName("B2").string =  ">="& CDataIn & ""
       ShCerca.getCellRangeByName("C2").string = "<="& CDataFin & ""
             
       oCritRange = ShCerca.getCellRangeByName("A1:C2")

       oFiltDesc = oCritRange.createFilterDescriptorByObject(oDataRange)
       oFiltDesc.ContainsHeader = True
       oFiltDesc.SkipDuplicates = False 'True
       oFiltDesc.CopyOutputData = True
       For i = 0 To Doc.Sheets.Count - 1
         If Doc.Sheets(i).Name = "CERCA" Then
           x.sheet = i
           exit for
         End if
       Next i
       x.column = 1
       x.row = 6
 
       oFiltDesc.OutputPosition = x
       oDataRange.filter(oFiltDesc)
       oCritRange.ClearContents(1+2+4)
  End Sub     

La convenienza la decide chi compila il modulo, per quanto mi riguarda io non avrei problemi anche con l'attuale impostazione, per eliminare il filtro basta non indicare il cliente e mettere la data iniziale e finale minima e massima, puoi usare il menù a tendina.

PS: Se ti viene meglio puoi azionare la macro con un pulsante dopo aver compilato i vari campi.





La macro alla fine l'ho trovata (avevo guardato per sbaglio nel modulo di un altro file di openoffice che avevo aperto il quel momento :knock: ). Però non parte. Ho provato anche ad aggiungere un pulsante a cui ho assegnato la macro, ma non succedere nulla.

Ps.alla fine ho invertito l'ordine di inserimento mettendo: data inizio, data fine e cliente modificando anche la macro nel dodice in cui va a prenere i valori dalle celle.

Non capisco dove sto sbagliando...

Riallego file con modifiche
Allegati
Prova scadenziario.ods
(21.34 KiB) Scaricato 12 volte
OpenOffice 4.1.6
Windows 7 e Windows10
nikolas1194
 
Messaggi: 21
Iscritto il: mercoledì 24 luglio 2019, 10:19

Re: Copia in nuova cartella file con scadenza fra due date

Messaggioda Gaetanopr » venerdì 26 luglio 2019, 14:31

Se usi il pulsante alcune righe non servono, il parametro target serve ad intercettare la cella che scatena l'evento "contenuto modificato" del foglio, quindi le prime 3 righe sono superflue ma soprattutto causano un errore, devi pure eliminare l'associazione della macro all'evento "contenuto modificato"
Hai provato il file che ho allegato io? o copiato la macro su altro file, perchè funziona tutto bene anche patel conferma.
Allegati
Prova scadenziario.ods
(21.86 KiB) Scaricato 15 volte
Openoffice 4.1 su windows xp
Gaetanopr
Volontario
Volontario
 
Messaggi: 2774
Iscritto il: mercoledì 21 novembre 2012, 20:07

Re: Copia in nuova cartella file con scadenza fra due date

Messaggioda nikolas1194 » venerdì 26 luglio 2019, 16:18

Gaetanopr ha scritto:Se usi il pulsante alcune righe non servono, il parametro target serve ad intercettare la cella che scatena l'evento "contenuto modificato" del foglio, quindi le prime 3 righe sono superflue ma soprattutto causano un errore, devi pure eliminare l'associazione della macro all'evento "contenuto modificato"
Hai provato il file che ho allegato io? o copiato la macro su altro file, perchè funziona tutto bene anche patel conferma.



EURECA!!! Ho abbassato il livello di sicurezza delle macro a medio ed ora funziona premendo il pulsante :D

Però ho una piccola richiesta sempre legata a questa macro: è possibile fare in modo che copi anche i commenti di? tipo quelli legati alle due voci nelle righe 6 e 7?

Riallego il file con la macro che si attiva premendo il pulsante

grazie per l'aiuto
Allegati
Prova scadenziario.ods
(21.86 KiB) Scaricato 14 volte
OpenOffice 4.1.6
Windows 7 e Windows10
nikolas1194
 
Messaggi: 21
Iscritto il: mercoledì 24 luglio 2019, 10:19

Re: Copia in nuova cartella file con scadenza fra due date

Messaggioda Gaetanopr » lunedì 29 luglio 2019, 9:29

nikolas1194 ha scritto:Però ho una piccola richiesta sempre legata a questa macro: è possibile fare in modo che copi anche i commenti di? tipo quelli legati alle due voci nelle righe 6 e 7?
Non è piccola come richiesta, ad accorgersene prima(sarà una dimenticanza degli sviluppatori) si poteva procedere diversamente anche se credo che l'uso del filtro sia il sistema più veloce per questo tipo di richieste, quindi ho preferito modificare la macro.
Allegati
Prova scadenziario.ods
(21.4 KiB) Scaricato 18 volte
Openoffice 4.1 su windows xp
Gaetanopr
Volontario
Volontario
 
Messaggi: 2774
Iscritto il: mercoledì 21 novembre 2012, 20:07

Re: Copia in nuova cartella file con scadenza fra due date

Messaggioda nikolas1194 » martedì 30 luglio 2019, 10:14

Gaetanopr ha scritto:
nikolas1194 ha scritto:Però ho una piccola richiesta sempre legata a questa macro: è possibile fare in modo che copi anche i commenti di? tipo quelli legati alle due voci nelle righe 6 e 7?
Non è piccola come richiesta, ad accorgersene prima(sarà una dimenticanza degli sviluppatori) si poteva procedere diversamente anche se credo che l'uso del filtro sia il sistema più veloce per questo tipo di richieste, quindi ho preferito modificare la macro.



Funziona perfettamente.

Grazie mille per l'aiuto
OpenOffice 4.1.6
Windows 7 e Windows10
nikolas1194
 
Messaggi: 21
Iscritto il: mercoledì 24 luglio 2019, 10:19


Torna a Macro e UNO API

Chi c’è in linea

Visitano il forum: paolokap e 1 ospite