[Risolto] Formattare intere righe da valori duplicati in una colonna

Discussioni sull'applicazione per i fogli di calcolo
Rispondi
Arbellini
Messaggi: 79
Iscritto il: mercoledì 29 giugno 2022, 5:44

[Risolto] Formattare intere righe da valori duplicati in una colonna

Messaggio da Arbellini »

Salve a tutti
Come nuovo iscritto sto cercando di esplorare tutti i post possibili per comprendere il meccanismo delle macro, in particolare modo mi ha incuriosito una soluzione che riguarda la Formattazione condizionata con diversi stili, sulla base di più condizioni.
Il post in questione è il seguente: viewtopic.php?f=9&t=7325
Purtroppo, almeno con il mio PC, la macro risulta lentissima, per visualizzare il risultato bisognerebbe chiudere il file e riaprirlo.
A differenza della richiesta nel post, la mia esigenza sarebbe quella di rilevare i duplicati presenti in UNA sola colonna, senza alcun confronto con altre e allo stesso tempo formattare l'intera riga corrispondente (vedi allegato "foglio2"), sperando che in questo modo sia più veloce nell'esecuzione.
Ho provato a fare delle prove, ma alla cieca, in quanto non riesco / non conosco la modalità per eseguire il debug della macro.

Macro:

Codice: Seleziona tutto

'Option Explicit
Sub Formattazione()
Dim Doc As Object, c As Long, Sh As Object, Arr As New Collection, svc As Object
Dim ri As Long, rf As Long, ci As Long, cf As Long, Color As Long, Art As String
Dim InRange As Object, item As String

Doc = ThisComponent
Sh= Doc.Sheets.getbyName("Foglio1")

svc = createUnoService("com.sun.star.sheet.FunctionAccess")
InRange = Sh.getcellRangeByName("C4:D18")
InRange.CellBackColor = - 1
Addr = InRange.RangeAddress


ci = Addr.StartColumn
cf = Addr.EndColumn
ri = Addr.StartRow
rf = Addr.EndRow


On Error Resume Next
  For c = ci To cf
   For r = ri To rf
    Art = Sh.getCellByPosition(c, r).String
    Arr.Add Art, CStr(Art)
   Next r
  Next c 
On Error Goto 0

Color = 16252663
For i = 1 To Arr.Count
 For c = ci To cf
   For r = ri To rf
     item = Sh.getCellByPosition(c, r).String 
     If item = Arr(i) And svc.callFunction("COUNTIF", Array(InRange, item)) > 1 Then
        if c = cf And Sh.getCellByPosition(c-1, r).CellBackColor <> -1 Then 
           Sh.getCellByPosition(c, r).CellBackColor = Sh.getCellByPosition(c-1, r).CellBackColor
        else   
           Sh.getCellByPosition(c, r).CellBackColor = Color
        End if   
     End if   
   Next r
 Next c  
 Color = Color + 16252650
Next
Set Arr = Nothing

End Sub

Allego il file del post che vi parlavo dove è presente, nel "foglio2" la mia esigenza.
Allegati
Macro Ricerca DUPLICATIcon formattazione 2.ods
(20.47 KiB) Scaricato 49 volte
Ultima modifica di Arbellini il giovedì 7 luglio 2022, 11:10, modificato 3 volte in totale.
LibreOffice 7.3.4.2 su MacOS 10.12.6 Sierra
patel
Volontario attivo
Volontario attivo
Messaggi: 4020
Iscritto il: venerdì 30 aprile 2010, 8:04
Località: Livorno

Re: Formattare intere righe da valori duplicati in una colonna

Messaggio da patel »

Perché l'intera riga e non solo la cella ?
-------------------
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
Arbellini
Messaggi: 79
Iscritto il: mercoledì 29 giugno 2022, 5:44

Re: Formattare intere righe da valori duplicati in una colonna

Messaggio da Arbellini »

Pensavo alla creazione di una tabella contenente nominativi appartenenti ad una certa categoria
es: nominativo - categoria
Mario - A (Colore 1)
Luigi - B (Colore 2)
Mario - B (Colore 2)
LibreOffice 7.3.4.2 su MacOS 10.12.6 Sierra
patel
Volontario attivo
Volontario attivo
Messaggi: 4020
Iscritto il: venerdì 30 aprile 2010, 8:04
Località: Livorno

Re: Formattare intere righe da valori duplicati in una colonna

Messaggio da patel »

Una riga intera contiene moltissime celle, formttarla tutta richiede tempo e quindi la macro è lenta.
-------------------
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
Arbellini
Messaggi: 79
Iscritto il: mercoledì 29 giugno 2022, 5:44

Re: Formattare intere righe da valori duplicati in una colonna

Messaggio da Arbellini »

Grazie patel,
speravo il contrario, ma lo avevo intuito.
Buona giornata
LibreOffice 7.3.4.2 su MacOS 10.12.6 Sierra
Avatar utente
lucky63
Volontario assiduo
Volontario assiduo
Messaggi: 2995
Iscritto il: martedì 18 maggio 2010, 17:01

Re: [Risolto] Formattare intere righe da valori duplicati in una colonna

Messaggio da lucky63 »

Arbellini ha scritto: mercoledì 6 luglio 2022, 7:53 Pensavo alla creazione di una tabella ...
Devi fare solo per A e B o anche altri ?
Devi evidenziare tutte righe A e B ... o solo i loro doppioni (quindi escluso il primo riscontro)?
Quante righe di dati dovrai gestire ?
Allega un esempio con dati fittizzi e relative formattazioni che rispecchi esattamente le tue esigenze.
...
Provo a farlo senza macro ...
.
Arbellini
Messaggi: 79
Iscritto il: mercoledì 29 giugno 2022, 5:44

Re: [Risolto] Formattare intere righe da valori duplicati in una colonna

Messaggio da Arbellini »

Volevo solo capire se era possibile velocizzare la macro,
non voglio farvi perdere del tempo inutilmente. quindi
Grazie anche a te lucky63.
[Risolto]
LibreOffice 7.3.4.2 su MacOS 10.12.6 Sierra
Arbellini
Messaggi: 79
Iscritto il: mercoledì 29 giugno 2022, 5:44

Re: [Risolto] Formattare intere righe da valori duplicati in una colonna

Messaggio da Arbellini »

Arbellini ha scritto: mercoledì 6 luglio 2022, 11:14 Volevo solo capire se era possibile velocizzare la macro,
non voglio farvi perdere del tempo inutilmente. quindi
Grazie anche a te lucky63.
[Risolto]
Per essere chiaro
Ho una Tabella
range (A1:E1000)
SE cella colonna "C1:C1000" = a "x" range (A:E) = colore 1
Il valore "x" potrebbe assumere valori fino 1000 e conseguentemente anche i colori

A me piaceva l'idea
LibreOffice 7.3.4.2 su MacOS 10.12.6 Sierra
patel
Volontario attivo
Volontario attivo
Messaggi: 4020
Iscritto il: venerdì 30 aprile 2010, 8:04
Località: Livorno

Re: [Risolto] Formattare intere righe da valori duplicati in una colonna

Messaggio da patel »

Quindi inutile parlare di intera riga visto che le colonne sono soltanto 5
Il risolto non serve per chiudere la discussione ma indica che è stata trovata la soluzione al problema, cosa attualmente non vera.
-------------------
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
Arbellini
Messaggi: 79
Iscritto il: mercoledì 29 giugno 2022, 5:44

Re: Formattare intere righe da valori duplicati in una colonna

Messaggio da Arbellini »

Infatti hai ragione,
Ho provveduto a modificare il titolo.
LibreOffice 7.3.4.2 su MacOS 10.12.6 Sierra
Avatar utente
lucky63
Volontario assiduo
Volontario assiduo
Messaggi: 2995
Iscritto il: martedì 18 maggio 2010, 17:01

Re: Formattare intere righe da valori duplicati in una colonna

Messaggio da lucky63 »

Arbellini ha scritto: mercoledì 6 luglio 2022, 12:21 SE cella colonna "C1:C1000" = a "x" range (A:E) = colore 1
Il valore "x" potrebbe assumere valori fino 1000 e conseguentemente anche i colori
01.png
01.png (19.22 KiB) Visto 1218 volte
Con codice macro:

Codice: Seleziona tutto

Sub EvidenziaSfondoRangeAxExInModoDiversoAPariRIscontroDiValoriDa1A1000InCOlonnaC
Rem Link del quesito:https://forum.openoffice.org/it/forum/viewtopic.php?t=11766
Doc = ThisComponent
AvvioMacro = Now
Foglio= Doc.Sheets.getbyName("Foglio1")
'Ricordare che Cella A1 corrisponde a coordinate Colonna 0 Riga 0
UltimaRiga = 1000
For riga = 1 to UltimaRiga
Foglio.GetCellRangeByPosition(0,Riga,4,Riga).CellBackColor = Foglio.GetCellByPosition(2,Riga).Value * 1000
Next Riga

REM Visualizza messaggio FINALE 
MsgBox("START: " & AvvioMacro & Chr$(10) & _
	   "END:    " & Now , 0 , " AVVISO DI FINE LAVORO:")
End sub
02.png
02.png (37.25 KiB) Visto 1218 volte
Allegati
Test - Macro - EvidenzaRangeAxExConColoreUgualePerStessoValoreDa1A1000InColonnaC.ods
(24.65 KiB) Scaricato 47 volte
Arbellini
Messaggi: 79
Iscritto il: mercoledì 29 giugno 2022, 5:44

Re: Formattare intere righe da valori duplicati in una colonna

Messaggio da Arbellini »

Si,
intendevo proprio questo, ma non ho ancora risolto :mrgreen:
sarebbe possibile anche con valori di testo o alfanumerici?
Inoltre mi piacerebbe usare colori pastello che ho visto partire da Color = 12000000
ad esempio Color =16121850
Quindi considerare un range di colori da 12000000 a 18000000
LibreOffice 7.3.4.2 su MacOS 10.12.6 Sierra
Avatar utente
lucky63
Volontario assiduo
Volontario assiduo
Messaggi: 2995
Iscritto il: martedì 18 maggio 2010, 17:01

Re: Formattare intere righe da valori duplicati in una colonna

Messaggio da lucky63 »

.
Colorazione gestita nell'ambito di 1.000.000 di diverse possibilità.
1.000.000 / 255 (Possibili codici ascii) = 3921,568627451 (Fattore di moltiplicazione)
Codice ascii del carattere rilevato verrà moltiplicato x 3921 .... a seconda della posizione occupata così da poter distanziare il più possibile tra loro i riscontri colore carattere e renderli meno simili per due caratteri aventi codice ascii consecutivi o troppo vicini l'uno all'altro.
Paletta colori inizierà da 12.000.000 ( .. .. come da richiesta utente .. .. )
Quindi .... colorazione compresa tra valori 12.000.000 e 13.000.000.
.
Schermata.png
Schermata.png (42.62 KiB) Visto 1192 volte
.

Codice: Seleziona tutto

Sub EvidenziaSfondoRangeAxExInModoDiversoAPariRiscontroInColonnaC
Rem Link quesito:https://forum.openoffice.org/it/forum/viewtopic.php?t=11766
Doc = ThisComponent
OrarioAvvioMacro = Now
Foglio= Doc.Sheets.getbyName("Foglio1")
Rem Ricordare che Cella A1 corrisponde a coordinate Colonna 0 Riga 0
PrimaRiga  = 1
UltimaRiga = 1002
For Riga = PrimaRiga to UltimaRiga
	ValoreCellaCx  = 0
	StringaCx = Foglio.GetCellByPosition(2,Riga).String
	LunghezzaCx = Len(StringaCx)
	For Lunghezza = 1 to LunghezzaCx
		Carattere = Mid(StringaCx , Lunghezza , 1)
		ValoreCarattere = Asc(Carattere)	' ... Ascii Da 1 a 255
		
		Rem Colorazione da gestire nell'ambito di 1.000.000 di colori
		Rem 1000000 / 255 = 3921,568627451
		Rem Codice ascii del carattere verrà moltiplicato x 3921 .... a seconda della posizione occupata
		Rem Paletta colori inizierà da 12.000.000 ( .. .. come da richiesta utente .. .. )
		If Lunghezza = 1 Then
			ValoreCellaCx = ValoreCellaCx + ValoreCarattere * 3921 + 12000000 
		Else If Lunghezza = 2 Then
			ValoreCellaCx = ValoreCellaCx + ValoreCarattere * 392.1
		Else If Lunghezza = 3 Then
			ValoreCellaCx = ValoreCellaCx + ValoreCarattere * 39.21
		Else If Lunghezza = 4 Then
			ValoreCellaCx = ValoreCellaCx + ValoreCarattere * 3.921
		Else If Lunghezza > 4 Then
			ValoreCellaCx = ValoreCellaCx + ValoreCarattere
		End If
		End If
		End If
		End If
		End If
	Next

	Rem Colorazione sfondo range AxCx
	If ValoreCellaCx > 0 Then
	Foglio.GetCellRangeByPosition(0,Riga,4,Riga).CellBackColor = ValoreCellaCx
	ValoreCellaCx = 0 
	End If
		
Next Riga

REM Visualizza messaggio FINALE 
MsgBox("START: " & OrarioAvvioMacro & Chr$(10) & _
	   "END:    " & Now , 0 , " AVVISO DI FINE LAVORO:")
End sub
.
Allegati
Test - Macro - EvidenziareSfondoRangeAxExInBaseAgliStessiRiscontriDiColonnaC.ods
(24.25 KiB) Scaricato 40 volte
Arbellini
Messaggi: 79
Iscritto il: mercoledì 29 giugno 2022, 5:44

Re: Formattare intere righe da valori duplicati in una colonna

Messaggio da Arbellini »

Grazie lucky63

SODDISFATTO

:super:
LibreOffice 7.3.4.2 su MacOS 10.12.6 Sierra
Rispondi