Pagina 1 di 1

[Risolto] Nascondere/Mostrare colonne con condizione

MessaggioInviato: 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   Espandi visualeStringi visuale
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

MessaggioInviato: 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   Espandi visualeStringi visuale
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

MessaggioInviato: 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

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

Re: Nascondere/Mostrare colonne con condizione

MessaggioInviato: 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

MessaggioInviato: 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   Espandi visualeStringi visuale
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

MessaggioInviato: 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.