Filtro standard attraverso Macro

Discussioni sull'applicazione per i fogli di calcolo
Rispondi
gassosa
Messaggi: 19
Iscritto il: mercoledì 13 marzo 2013, 16:56

Filtro standard attraverso Macro

Messaggio da gassosa »

Un saluto a tutto il forum.

Qualcuno di voi saprebbe dirmi se esiste un modo di applicare i filtri standard automaticamente attraverso una macro?
Anche se sembra una richiesta strana, visto che attraverso "Dati" --> "Altri Filtri" --> "Filtro Standard", ci si arriva lo stesso.

Il problema è che lavoro con una miriade di tabelle che sono riuscito ad automatizzare con delle macro.
Però in mezzo a questi comandi macro devo fare una scrematura con questi filtri, e purtroppo devo farli manualmente, perdendo molto tempo.
Se ci fosse un modo per automatizzare anche queste con delle macro, a questo punto, il computer riuscirebbe a fare tutto.

Ho provato con "Registra macro", ma non funziona.

Vi prego di aiutarmi.

Vi ringrazio.
OpenOffice 3.1 su Ubuntu 12.04
patel
Volontario attivo
Volontario attivo
Messaggi: 4020
Iscritto il: venerdì 30 aprile 2010, 8:04
Località: Livorno

Re: Filtro standard attraverso Macro

Messaggio da patel »

Allega un file di esempio con dati e risultato desiderato
Tieni presente che è possibile filtrare nescondendo le righe oppure copiare i dati filtrati su un altro foglio
-------------------
Libre Office 7.5.3.2 su Windows 11
allega un file di esempio, guadagnerai tempo tu e lo farai risparmiare a chi ti aiuta
gassosa
Messaggi: 19
Iscritto il: mercoledì 13 marzo 2013, 16:56

Re: Filtro standard attraverso Macro

Messaggio da gassosa »

Le operazioni che facevo manualmente erano queste:
- Selezionavo tutta la tabella --> "Dati" --> "Altri filtri" --> "Filtro standard" -->" Nome campo": Codice articolo" --> "Valore": Non Vuoto -->"Opzioni": Nessun duplicato
In pratica le righe senza codice articolo devono essere eliminate. Poi devono essere eliminate le righe duplicate, lasciandone solo 1.

- Copiavo il risultato in un foglio nuovo, cancellando il vecchio.

- selezionavo SOLO la colonna codice articolo (e non tutta la tabella come in precedenza. Poi: "Dati" --> "Altri filtri" --> "Filtro standard" -->" Nome campo": Codice articolo" --> "Valore": Non Vuoto -->"Opzioni": Nessun duplicato
Questo mi toglieva le righe con codice duplicato, lasciando solamente 1 riga con quel codice.

- Copiavo il risultato in un foglio nuovo, cancellando il vecchio.

Dimmi che riesci a fare tutto questo con una macro e ti faccio un monumento... :)
Grazie mille
Allegati
Esempio.xls
Questo è un file di esempio, ma alcune colonne possono variare di volta in volta. Quello che non varia è la colonna codice articolo.
(15 KiB) Scaricato 138 volte
OpenOffice 3.1 su Ubuntu 12.04
Avatar utente
charlie
Site Admin
Site Admin
Messaggi: 8807
Iscritto il: mercoledì 19 dicembre 2012, 10:50
Contatta:

Re: Filtro standard attraverso Macro

Messaggio da charlie »

Ciao, mi sembra non ci sia un motivo plausibile (es. Importazione file) per usare un formato non nativo di Open Office. Sei pregato di postare un file di Calc in formato .ods e non un formato e Office Excel.
Grazie.
charlie
macOS 14.4.1 Sonoma: Open Office 4.1.15 - LibreOffice 7.5.7.2
http://www.charlieopenoffice.altervista.org
patel
Volontario attivo
Volontario attivo
Messaggi: 4020
Iscritto il: venerdì 30 aprile 2010, 8:04
Località: Livorno

Re: Filtro standard attraverso Macro

Messaggio da patel »

Anche perché la macro non funzionerà col formato xls
-------------------
Libre Office 7.5.3.2 su Windows 11
allega un file di esempio, guadagnerai tempo tu e lo farai risparmiare a chi ti aiuta
gassosa
Messaggi: 19
Iscritto il: mercoledì 13 marzo 2013, 16:56

Re: Filtro standard attraverso Macro

Messaggio da gassosa »

Vi chiedo scusa... non avevo pensato all'estensione del file. Il fatto è che mi mandano i file con estensione xls.
io ci lavoro con openoffice, ma mi sono dimenticato di salvare come file openoffice.
Ora è in ods.
Vi chiedo ancora scusa
Allegati
Esempio.ods
(22.69 KiB) Scaricato 157 volte
OpenOffice 3.1 su Ubuntu 12.04
patel
Volontario attivo
Volontario attivo
Messaggi: 4020
Iscritto il: venerdì 30 aprile 2010, 8:04
Località: Livorno

Re: Filtro standard attraverso Macro

Messaggio da patel »

Prova questa che copia nel foglio2 il risultato del filtro

Codice: Seleziona tutto

sub filtracolonna
rem parametri
	NomeFoglio="Foglio1"
	numColonna=1 'riferimento relativo rispetto all'area scelta.la prima col è 0
rem fine parametri
	oDoc = ThisComponent
	sheet= oDoc.sheets.getbyname(nomefoglio)
	sheet1= thiscomponent.sheets(1)
    oCursor = Sheet.createcursor
    oCursor.gotoendofusedarea(false)
    nEndColumn = oCursor.rangeaddress.EndColumn
    nEndrow = oCursor.rangeaddress.Endrow
    oCursor.gotoendofusedarea(false)
    nEndColumn = oCursor.rangeaddress.EndColumn
    nEndrow = oCursor.rangeaddress.Endrow		
	rng=sheet.getcellrangebyPosition(0,0,nEndColumn,nEndrow)
	orange=sheet.getcellrangebyPosition(numColonna,3,numColonna,nEndrow)
rem prepara filtro	
	Dim oFields(0) As New com.sun.star.sheet.TableFilterField
  	REM If argument is True, creates an empty filter descriptor.
  	oFilterDesc = oRange.createFilterDescriptor(false)
  	With oFields(0)   
    	.Connection = com.sun.star.sheet.FilterConnection.AND
    	.Field = numColonna  
    	.IsNumeric = False 
  		.Operator = com.sun.star.sheet.FilterOperator.NOT_EMPTY
  	End With

  oFilterDesc.setFilterFields(oFields())
  oFilterDesc.ContainsHeader = False
  oFilterDesc.UseRegularExpressions = True
  oFilterDesc.SkipDuplicates = True
  oFilterDesc.CopyOutputData = FALSE
  oRange.filter(oFilterDesc)
  
  oEmptyRanges = oRange.queryEmptyCells()
  For Each oEmptyRange in oEmptyRanges
     oEmptyRange.Rows.IsVisible = False
  Next

  oRanges = rng.queryVisibleCells()
  oCell = Sheet1.getcellrangebyName("A1") ' destinazione
  oTargetRange = copyTiledRanges(oDoc, oRanges, oCell, bValues)
  sheet1.Columns.OptimalWidth  = True
'---------- ripristina il foglio1	
  oFilterDesc = Sheet.createFilterDescriptor(True)
  Sheet.filter(oFilterDesc)

end sub

Function copyTiledRanges(oDoc,oRanges,oTopLeft, bVal As Boolean)
Dim oTargetSheet, oEnum, aTgt, oTgtRg, oNext, aNext, aPrev, iRow&, bCalc As Boolean
Dim oResult as New com.sun.star.table.CellRangeAddress
	bCalc = oDoc.isAutomaticCalculationEnabled()
	oDoc.enableAutomaticCalculation(False)
	aTgt = oTopLeft.getCellAddress()
	iRow = aTgt.Row
	oTargetSheet = oDoc.getSheets.getByIndex(aTgt.Sheet)
	oResult.Sheet = aTgt.Sheet
	oResult.StartColumn = aTgt.Column
	oResult.StartRow = aTgt.Row
	oEnum = oRanges.createEnumeration()
	while oEnum.hasMoreElements()
		oNext = oEnum.nextElement()
		aNext = oNext.getRangeAddress()
		if not isUnoStruct(aPrev) then aPrev = aNext
		REM SheetCellRanges-collections are sorted ascending by StartColumn and StartRow
		REM therefore we go down column by column
		If aNext.StartColumn > aPrev.StartColumn then
			'start new column at top row, right of previous range
			aTgt.Column = aTgt.Column + aPrev.EndColumn - aPrev.StartColumn +1
			aTgt.Row = iRow
		elseIf aNext.StartRow > aPrev.StartRow then
			'target cell below the previous range in same column
			aTgt.Row = aTgt.Row + aPrev.EndRow - aPrev.StartRow +1
		endif
		oTargetSheet.copyRange(aTgt, aNext)
		if bVal Then 
			oTgtRg = oTargetSheet.getCellRangeByPosition( _
				aTgt.Column, aTgt.Row, _
				aTgt.Column + aNext.EndColumn - aNext.StartColumn, _
				aTgt.Row + aNext.EndRow - aNext.StartRow _
			)
			oTgtRg.setDataArray(oNext.getDataArray())
		endif
		aPrev = aNext
	wend
	oResult.EndColumn = aTgt.Column + aNext.EndColumn - aNext.StartColumn
	oResult.EndRow = aTgt.Row + aNext.EndRow - aNext.StartRow
	oDoc.enableAutomaticCalculation(bCalc)
	copyTiledRanges = oTargetSheet.getCellRangeByPosition( _
	oResult.StartColumn, oResult.StartRow, oResult.EndColumn, oResult.EndRow )
End Function
-------------------
Libre Office 7.5.3.2 su Windows 11
allega un file di esempio, guadagnerai tempo tu e lo farai risparmiare a chi ti aiuta
gassosa
Messaggi: 19
Iscritto il: mercoledì 13 marzo 2013, 16:56

Re: Filtro standard attraverso Macro

Messaggio da gassosa »

Patel, innanzitutto ti ringrazio per la risposta. Sei molto gentile.
Purtroppo, quando eseguo la macro, mi si blocca e mi indica:

Valore o tipo di dati non ammesso.
Indice al di fuori dell'area definita

Poi mi sottolinea questa riga di codice:

sheet1 = thiscomponent.sheets(1)
OpenOffice 3.1 su Ubuntu 12.04
patel
Volontario attivo
Volontario attivo
Messaggi: 4020
Iscritto il: venerdì 30 aprile 2010, 8:04
Località: Livorno

Re: Filtro standard attraverso Macro

Messaggio da patel »

Devi aggiungere tu un foglio sul quale verrà copiata la tabella filtrata
patel ha scritto:Prova questa che copia nel foglio2 il risultato del filtro
-------------------
Libre Office 7.5.3.2 su Windows 11
allega un file di esempio, guadagnerai tempo tu e lo farai risparmiare a chi ti aiuta
gassosa
Messaggi: 19
Iscritto il: mercoledì 13 marzo 2013, 16:56

Re: Filtro standard attraverso Macro

Messaggio da gassosa »

GRANDE..... Patel !!! funziona!!!

Ti chiedo 1 ultimo favore... scusa non mandarmi a quel paese...

ho provato il tuo script e va bene, ma anzichè avere un unico script, dovrei avere 1 script per:
- Selezionare tutta la tabella --> "Dati" --> "Altri filtri" --> "Filtro standard" -->" Nome campo": Codice articolo" --> "Valore": Non Vuoto -->"Opzioni": Nessun duplicato

e un altro script per:

selezionare SOLO la colonna "codice articolo" (e non tutta la tabella come in precedenza.
Poi: "Dati" --> "Altri filtri" --> "Filtro standard" -->" Nome campo": Codice articolo" --> "Valore": Non Vuoto -->"Opzioni": Nessun duplicato

Cioè dividere le 2 azioni che sono comprese nel tuo unico script.
Mi sono accorto che devo correggere manualmente alcune cose tra uno script e l'altro.

Grazie mille per quello che hai fatto.
Allegati
Esempio.ods
(22.69 KiB) Scaricato 132 volte
OpenOffice 3.1 su Ubuntu 12.04
patel
Volontario attivo
Volontario attivo
Messaggi: 4020
Iscritto il: venerdì 30 aprile 2010, 8:04
Località: Livorno

Re: Filtro standard attraverso Macro

Messaggio da patel »

il mio codice lavora soltanto sulla colonna codice articolo per togliere i duplicati, quindi non capisco cosa vuoi dividere
-------------------
Libre Office 7.5.3.2 su Windows 11
allega un file di esempio, guadagnerai tempo tu e lo farai risparmiare a chi ti aiuta
gassosa
Messaggi: 19
Iscritto il: mercoledì 13 marzo 2013, 16:56

Re: Filtro standard attraverso Macro

Messaggio da gassosa »

la prima azione dovrebbe togliermi tutte le righe identiche. in pratica sono doppioni.(hanno quindi lo stesso "codice articolo", ma hanno anche gli altri campi uguali)
Dovrebbe avere la stessa azione manuale:
Selezione di TUTTA la tabella --> "Dati" --> "Altri filtri" --> "Filtro standard" -->" Nome campo": Codice articolo" --> "Valore": NON VUOTO -->"Opzioni": Nessun duplicato - (Il campo codice articolo non deve essere vuoto).

Dopo, la seconda, serve per togliermi anche le righe che hanno lo stesso "codice articolo", che non sono identiche in tutti gli altri campi.... sono duplicati solo per quello che riguarda il campo "Codice articolo" (e per questo non sono stati eliminati precedentemente dal primo script.

Dovrebbe avere la stessa azione manuale:
Selezione SOLO della colonna "codice articolo" (e non tutta la tabella come in precedenza. Poi: "Dati" --> "Altri filtri" --> "Filtro standard" -->" Nome campo": Codice articolo" --> "Valore": Non Vuoto -->"Opzioni": Nessun duplicato

Questo perchè devo fare gli aggiornamenti di prezzo. Ho doppioni che devo togliere per non creare confusione... (qui deve agire il primo script) . Faccio l'aggiornamento prezzi ... Poi devo togliere articoli nel database che hanno lo stesso codice, quindi in pratica è lo stesso articolo, ma ha una descrizione diversa, perchè obsoleta, e quindi deve essere eliminata. (secondo script)
Fra la prima e seconda azione devo fare gli aggiornamenti..

Da quello che mi hai scritto, lo script che hai messo servirebbe come seconda azione, cioè mi toglie tutte le righe che hanno lo stesso codice, a prescindere se gli altri campi sono uguali o meno?
OpenOffice 3.1 su Ubuntu 12.04
patel
Volontario attivo
Volontario attivo
Messaggi: 4020
Iscritto il: venerdì 30 aprile 2010, 8:04
Località: Livorno

Re: Filtro standard attraverso Macro

Messaggio da patel »

Toglie tutte le righe che hanno lo stesso codice, a prescindere se gli altri campi sono uguali o meno e toglie anche quelle col codice vuoto.
Non so fare di meglio
-------------------
Libre Office 7.5.3.2 su Windows 11
allega un file di esempio, guadagnerai tempo tu e lo farai risparmiare a chi ti aiuta
gassosa
Messaggi: 19
Iscritto il: mercoledì 13 marzo 2013, 16:56

Re: Filtro standard attraverso Macro

Messaggio da gassosa »

Grazie lo stesso Patel. Sei stato molto gentile.
OpenOffice 3.1 su Ubuntu 12.04
Rispondi