Pagina 1 di 1

[Risolto] Nascondere/Mostrare colonne con condizione

Inviato: mercoledì 8 novembre 2017, 21:22
da MrMoret
Ciao ragazzi, mi sono appena iscritto.
Vi seguo da un po', mi avete risolto qualche dubbio "base" su open office e le macro ma sto sbattendo la testa sulla creazione di una funzione in vba...
In pratica ho bisogno che alla verifica di una condizione (un determinato valore in E43) venga nascosta la colonna B e mostrata la colonna C, e viceversa.

Esempio:
Se in E43 ho il valore "MANUAL" allora avrò la colonna B nascosta e la colonna C visibile.
Viceversa, se in E43 ho qualsiasi altro valore diverso da "MANUAL" avrò la colonna C nascosta e la colonna B visibile.
Questo è quello che sono riuscito a scopiazzare qua e là:

Codice: Seleziona tutto

REM  *****  BASIC  *****
Option VBASupport 1

Public Function HIDECOLUMN(MM as String)
REM---- VARIABILI
	dim col1(0) as new com.sun.star.beans.PropertyValue
	col1(0).Name = "ToPoint"
	col1(0).Value = "$B$5"
	dim col2(0) as new com.sun.star.beans.PropertyValue
	col2(0).Name = "ToPoint"
	col2(0).Value = "$C$5"
	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 ---- CONDIZIONE
	If MM="MANUAL" then
		REM --- Seleziono e nascondo COL1
		dispatcher.executeDispatch(document, ".uno:GoToCell", "", 0, col1())
		dispatcher.executeDispatch(document, ".uno:HideColumn", "", 0, col1())
		REM --- Seleziono e mostro COL2
		dispatcher.executeDispatch(document, ".uno:GoToCell", "", 0, col2())
		dispatcher.executeDispatch(document, ".uno:ShowColumn", "", 0, col2())
	else
	REM --- Seleziono e nascondo COL2
		dispatcher.executeDispatch(document, ".uno:GoToCell", "", 0, col2())
		dispatcher.executeDispatch(document, ".uno:HideColumn", "", 0, col2())
	REM --- Seleziono e mostro COL1
		dispatcher.executeDispatch(document, ".uno:GoToCell", "", 0, col1())
		dispatcher.executeDispatch(document, ".uno:ShowColumn", "", 0, col1())
	end if
End Function
Il problema è che, nonostante le celle siano tutte senza protezione, quando cambio valore a E43 mi dà questo errore: "Impossibile modificare le celle protette".

Avete soluzioni/consigli? Purtroppo il mio bagaglio limitato di VB non mi consente di arrivare alla soluzione! :crazy:
Grazie! :D

Re: Nascondere/Mostrare colonne con condizione

Inviato: giovedì 9 novembre 2017, 8:07
da patel
Il linguaggio macro per OO non è il VBA, un buon testo per studiare è qui http://www.pitonyak.org/oo.php, lascia perdere il registratore di macro.

Codice: Seleziona tutto

sub nascondi_colonnaSe
Doc = ThisComponent
Sheet = Doc.Sheets(0)
if Sheet.getcellrangebyname("E43").string = "MANUAL" then 
  sheet.Columns(1).IsVisible = False
  sheet.Columns(2).IsVisible = True
else
  sheet.Columns(1).IsVisible = True
  sheet.Columns(2).IsVisible = Valse
end if  

End Sub

Re: Nascondere/Mostrare colonne con condizione

Inviato: giovedì 9 novembre 2017, 16:01
da MrMoret
Grande! Grazie mille! :D
Ti ringrazio, avevo visto la possibilità di usare il VB e quindi mi ero buttato su quello.
Comunque funziona tutto ma avrei una domanda: è possibile fare in modo che sia automatico il processo? Cioè, messa così funziona solo se richiamo la macro, invece il top sarebbe renderlo automatico al cambio valore di E43. È possibile?

Re: Nascondere/Mostrare colonne con condizione

Inviato: giovedì 9 novembre 2017, 16:16
da charlie
Ciao @MrMoret e benvenuto sul forum.
Se intanto ti vuoi presentare puoi farlo qui: viewforum.php?f=16
Per una panoramica delle regole consulta il Manuale di sopravvivenza.
Buon proseguimento.

Re: Nascondere/Mostrare colonne con condizione

Inviato: giovedì 9 novembre 2017, 17:40
da patel
MrMoret ha scritto:Ti ringrazio, avevo visto la possibilità di usare il VB e quindi mi ero buttato su quello.
ti sbagli, quello che hai usato tu non è il VB e nemmeno il VBA, è il linguaggio incomprensibile del registratore.
Si può fare quello che chiedi, si tratta di gestire l'evento Contenuto modificato del foglio, lascio a te il compito di studiartelo e fare una proposta

Re: Nascondere/Mostrare colonne con condizione

Inviato: venerdì 10 novembre 2017, 13:21
da MrMoret
Ce l'ho fatta! :super:
Grazie delle dritte patel, sono state utilissime.
Scrivo come ho risolto che magari può essere utile a qualcuno:
ho inserito la macro in Contenuto Modificato nella sezione Eventi Foglio (tasto DX sulla linguetta del foglio in questione).
Ho anche fatto una modifica al codice per selezionare il foglio in base al nome e non al numero di riferimento, così nel caso debba spostarlo di posizione non devo andare a modificare la macro:

Codice: Seleziona tutto

sub nascondi_colonnaSe

Doc = ThisComponent
Sheet = Doc.Sheets.getByName("Foglio1")
if Sheet.getcellrangebyname("E43").string = "MANUAL" then 
  sheet.Columns(1).IsVisible = False
  sheet.Columns(2).IsVisible = True
else
  sheet.Columns(1).IsVisible = True
  sheet.Columns(2).IsVisible = Valse
end if  

End Sub

Re: [RISOLTO] Nascondere/Mostrare colonne con condizione

Inviato: venerdì 10 novembre 2017, 13:54
da patel
E' un piacere aiutare utenti svegli e volonterosi come te, non sono molti quelli che hanno voglia di imparare, la maggioranza vuole la soluzione e basta.