Evidenziando ogni altra riga in LibreOffice (o OpenOffice) senza formattazione condizionale?


3

Oltre ad usare la formattazione condizionale, c'è qualche modo in LibreOffice Calc (o OpenOffice Calc) di evidenziare ogni altra riga per rendere più facile la lettura del foglio di calcolo?

LibreOffice presenta un grave bug che causa più errori quando si utilizza la tipica tecnica di formattazione condizionale ISEVEN(ROW())per tentare questa attività e quindi le righe vengono copiate o spostate. Ho trovato un rapporto sui bug di LibreOffice su questo problema, ma i bug sono ancora presenti.

Risposte:


2

Ho scritto una macro in StarBasic nel 2004, che applica colori alternati alle celle usate (sto ancora lavorando con LO 5.2.2.2 che uso da oggi). Spero che la fonte sia ben documentata per farti trovare le definizioni dei colori, se ti piace cambiarle ;-)

Copia il codice in un modulo nella libreria STANDARD del codice di base, per renderlo disponibile a tutti i documenti CALC. HTH

'Copyright (c) 2004, 2016 Winfried Rohr, re-Solutions Software Test Engineering

'This program is free software; you can redistribute it and/or modify it under 
'the terms of the GNU General Public License as published by the Free Software
'Foundation; either version 2 of the License, or (at your option) any later 
'version.

'This program is distributed in the hope that it will be useful, but WITHOUT ANY 
'WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR 
'A PARTICULAR PURPOSE. See the GNU General Public License for more details.

'You should have received a copy of the GNU General Public License along with 
'this program; if not, write to the Free Software Foundation, Inc., 59 Temple 
'Place, Suite 330, Boston, MA 02111-1307 USA
' ========================================================================
Dim oDoc
Dim lRows as Long
Dim lCols as Long
Dim lStartRow as Long
Dim i as Long
Dim lEvenColor, lOddColor as Long
Dim sModulName, sModulSubName, sModulVersion

' -------------------------------------------------------------------
Sub colorCalcTableRowsEnglish ' manual extension 2006-03-24
sModulName = "wr CALC Modul"
sModulSubName = "colorCalcTableRows"
sModulVersion = "20040810"

oDoc = ThisComponent

If Not oDoc.supportsService(_
    "com.sun.star.sheet.SpreadsheetDocument" ) Then
        MsgBox _
        "Macro not called from CALC Document." & CHR(10) _
        & CHR(10) & "Explanation:" _
        & CHR(10) & "This Macro applies alternating, pre-definied" _
& CHR(10) & "background colors to the rows of the used cell"_
& CHR(10) & "range in CALC Documents and will only work there."_
& CHR(10) & CHR(10) _
& "Macro " & sModulSubName & " will terminate now." _
, 48 , sModulName & " " & sModulVersion
Exit Sub
End If

' RGB: Red/Green/Blue portion of color
' values could range from 0 to 255
' see Tools > OpenOffice.org > Colors for values
' 0,0,0: Black
' 255,255,255: White
' 
' Even/Odd correspond to ROW number
lEvenColor = RGB(255,200,200) ' kinda red
lOddColor =RGB(188,188,188) ' grey


if oDoc.Sheets.Count > 1 then
    ' more than 1 sheet, ask if macro should work on all sheets
    sQuestion = _
        "Applying alternating background colors to used cell range."_
        & CHR(10) _
        & CHR(10) & "Should all sheets be affected?" _
        & CHR(10) & "YES: apply on all sheets" _
        & CHR(10) & "No: apply to actual sheet only"

    iButton = _
        MsgBox(sQuestion ,35, sModulSubName & " - " & sModulVersion)

    Select Case iButton
        Case 2 ' cancel
            exit sub
        Case 6 ' yes = all sheets
            PROC_AllSheets
        Case 7 ' no = actual sheet only
            actSheet = oDoc.currentController.ActiveSheet
            PROC_colorSheetRow(actSheet)
    End Select
else
    ' only one sheet present
    actSheet = oDoc.currentController.ActiveSheet
    PROC_colorSheetRow(actSheet)
end if

End Sub

' -------------------------------------------------------------------
Sub PROC_allSheets

enumS = oDoc.getSheets.createEnumeration

While enumS.hasMoreElements
    actSheet = enumS.nextElement()
    PROC_colorSheetRow(actSheet)
Wend

End Sub

' -------------------------------------------------------------------
Sub PROC_colorSheetRow(actSheet)

lStartRow = 0
' watch out on first 4 rows if they might be formatted as heading
for i = 0 to 3
    ' don't touch rows with heading style
    oCell = actSheet.getCellByPosition(0,i)
    if INSTR(oCell.CellStyle , "Heading") > 0 then
        ' style heading found: increase start row
        lStartRow = i + 1
    end if
next i

' obtain last cell in sheet
vLastPos = FUNC_LastUsedCell(actSheet)
lRows = vLastPos(0)
lCols = vLastPos(1)

' if no more cell used - then nothing
if lRows = 0 AND lCols = 0 then
    exit sub
end if

' not more than headings
if lStartRow > lRows then
    exit sub
end if

' set range to one color (performance issue)
actRange = actSheet.getCellRangeByPosition(0,lStartRow,lCols,lRows)
actRange.setPropertyValue("CellBackColor", lEvenColor)

' now set color to Odd (number) rows (are even indexes)
for i = lStartRow to lRows
    ' determine range
    actRange = actSheet.getCellRangeByPosition(0,i,lCols,i)
    ' only every second row
    if((i MOD 2) = 0) then
        ' even index is odd row number
        actRange.setPropertyValue("CellBackColor", lOddColor)
    end if
next i
End Sub

' -------------------------------------------------------------------
' function uses variant array to return more than one value
Function FUNC_LastUsedCell(oSheet as Object) as Variant

oCursor = oSheet.createCursor()

oCursor.gotoEndOfUsedArea(TRUE) 
oEndAdr = oCursor.getRangeAddress

Dim vLastUsedCell(1) as Variant
vLastUsedCell(0) = oEndAdr.EndRow
vLastUsedCell(1) = oEndAdr.EndColumn 
FUNC_LastUsedCell = vLastUsedCell()

End Function

Da quello che posso dire, questo richiederà l'installazione di Java (JRE). È corretto?
RockPaperLizard,

Non è necessario Java - questo è solo codice StarBasic. Per i test ho disabilitato usando un JRE ( Tools>Options...>Advanced) e la macro è ancora in esecuzione.
ngulam,

Wow! L'ho fatto funzionare! LibreOffice fa questa cosa fastidiosa in cui insiste su JRE anche per le macro BASIC. Ma puoi semplicemente ignorare gli avvisi e funziona meravigliosamente. Grazie!
RockPaperLizard,

1
Grande! Se desideri cambiare i colori utilizzati, osserva Tools>Options...>LibreOffice>Colors, scegline uno dalla tabella dei colori e leggi i valori R / G / B dal lato destro. Quindi modificare i valori per lEvenColoro di lOddColorconseguenza. Divertiti!
ngulam,

Stai avendo successo con questo ancora funzionante sotto LO 6.0.2.1? La macro sembra essere completamente scomparsa per me quando ho "aggiornato".
RockPaperLizard,

3

1
Grazie. Questo è quello che sto facendo ora, secondo il tuo consiglio. L'unico aspetto negativo è dover riapplicare lo stile ogni volta che una riga viene aggiunta o eliminata. Qualche modo per aggirare questo?
RockPaperLizard,

@RockPaperLizard, ho aggiornato la mia risposta, potrebbe essere l'unico è andare con soluzioni macro come la risposta di ngulam.
user.dz

Grazie per le informazioni aggiunte. Cercherò e sperimenterò!
RockPaperLizard,

Stai avendo successo con la soluzione macro che funziona con LO 6.0.2.1? La macro sembra essere completamente scomparsa per me quando ho "aggiornato".
RockPaperLizard,

0

Il modo più semplice potrebbe essere semplicemente quello di copiare e incollare la formattazione diretta. È un po 'noioso ma non richiede troppo tempo. Ho provato diverse altre soluzioni automatiche che non hanno funzionato altrettanto bene.

Ecco le istruzioni per un modello a tre file; due file sarebbero simili. Innanzitutto, selezionare manualmente ed evidenziare le prime tre righe.

Quindi, seleziona le prime tre righe e copia. Fare clic con il tasto destro sulla quarta riga e selezionare Paste Special. Specifica di incollare solo Formats.

file colorate inserisci qui la descrizione dell'immagine

Ora sono formattate 6 righe. Copia le 6 righe e incollane altre 6 in modo che vengano evidenziate 12 righe. Quindi raddoppia di nuovo per 24 righe, 48 righe, 96 righe e così via in modo esponenziale, fino a quando tutte le righe sono evidenziate.


Grazie Jim. Prima di scoprire la formattazione condizionale, ecco come ho raggiunto questo obiettivo. Ma poi quando aggiungi / elimini / sposti / copi le righe, non ti ritrovi con un pasticcio e devi farlo di nuovo?
RockPaperLizard

Sì, questo è uno svantaggio di questo metodo. Ma evita i problemi che possono verificarsi con la formattazione condizionale. Per semplificare la ripetizione della formattazione, è possibile conservare una copia della formattazione su un foglio o documento separato, quindi copiarlo nuovamente quando necessario.
Jim K,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.