Elenco Fogli

Creare una macro - Scrivere uno script - Usare le API
Rispondi
amax
Messaggi: 99
Iscritto il: mercoledì 7 novembre 2012, 10:59

Elenco Fogli

Messaggio da amax »

Buonasera, sto scrivendo una macro per poter selezionare facilmente un foglio presente nel file.
la macro funziona, mano n problema, non mi fa scegliere da un elenco a discesa, ma mette in fila tutti i fogli e per selezionare quello giusto, devo cancellare gli altri.

Codice: Seleziona tutto

Sub MostraFogli
    Dim fogli() As String
    Dim i As Integer
    Dim scelta As String
    
    ' Ottieni l'oggetto Document
    Dim document As Object
    document = ThisComponent
    
    ' Ottieni l'oggetto Sheets
    Dim sheets As Object
    sheets = document.Sheets
    
    ' Ottieni il numero totale di fogli nel documento
    Dim numeroFogli As Integer
    numeroFogli = sheets.getCount()
    
    ' Inizializza l'array di fogli
    ReDim fogli(numeroFogli - 1)
    
    ' Riempire l'array con i nomi dei fogli
    For i = 0 To numeroFogli - 1
        fogli(i) = sheets.getByIndex(i).getName()
    Next i
    
    ' Visualizza la finestra di dialogo
    scelta = InputBox("Seleziona il foglio desiderato:", "Elenco Fogli", Join(fogli, vbCrLf))
    
    ' Controlla se l'utente ha premuto Annulla o ha lasciato vuota la selezione
    If scelta <> "" Then
        ' Imposta il foglio selezionato come foglio attivo
        document.CurrentController.setActiveSheet(document.Sheets.getByName(scelta))
    End If
End Sub
Gazie
macOS 14 Sonoma: LibreOffice 24.2.1
geovign
Messaggi: 217
Iscritto il: domenica 13 gennaio 2019, 11:19
Località: Modena

Re: Elenco Fogli

Messaggio da geovign »

La funzione Inputbox accetta, nell'apposito campo, solamente stringhe semplici e non elenchi a discesa.
Pertanto, devi cambiare metodo; ad esempio puoi utilizzare una finestra di dialogo.
Geo
LibO 7 su LinuxMint 21
nickGiard
Messaggi: 65
Iscritto il: lunedì 14 maggio 2012, 22:04

Re: Elenco Fogli

Messaggio da nickGiard »

Ciao Amax
mi sembra che tu voglia una soluzione semplice e veloce per individuare un elemento in una lista, senza scomodare dialoghi od altro, si potrebbe sfruttare l'elemento indice.
Prova a scrivere all'interno del Loop
fogli(i) = Str(i) & " - " & sheets.getByIndex(i).getName()
Ogni Nome viene così preceduto dall'indice relativo, e potrai rispondere con il solo indice come scelta.
Il tuo foglio sarà :
Dim sShName$ : sShName = Split(fogli(CInt(scelta)), " - ")(1) ' Elimino quanto aggiunto
document.CurrentController.setActiveSheet(document.Sheets.getByName(sShName ))
Nicola
Nicola con LibreOffice 7.1 (x64) su Windows 11
patel
Volontario attivo
Volontario attivo
Messaggi: 4020
Iscritto il: venerdì 30 aprile 2010, 8:04
Località: Livorno

Re: Elenco Fogli

Messaggio da patel »

Soluzione non elegante, ma semplice e efficace. :bravo: :bravo: :bravo:
-------------------
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
geovign
Messaggi: 217
Iscritto il: domenica 13 gennaio 2019, 11:19
Località: Modena

Re: Elenco Fogli

Messaggio da geovign »

Oppure impostando un menù a tendina in una cella con l'elenco dei fogli ed un pulsante per spostarsi.
Vengono utilizzati due codici: una funzione per l'elenco dei fogli (validità dati) ed una sub per attivare il foglio desiderato.

Codice: Seleziona tutto

rem Funzione personalizzata per ottenere l'elenco dei nomi dei fogli nel documento
		'La funzione è richiamata nella scheda "Criteri/Intervallo di celle" nel menù Dati/Valitidà , associata alla cella dove
		'compare il menu a tendina (B2)
Function ElencoNomiFogli() As variant
	Dim NumeroFogli As Integer 
	Dim iFoglio As Integer 
	Dim NomeFoglio As String 
	Dim BozzaElenco() As variant 
	NumeroFogli = ThisComponent.getSheets.getCount()
	ReDim Preserve BozzaElenco()
	a = 0
	For iFoglio = 1 To NumeroFogli-1	'L'indice parte da 1 e non da 0 per escludere il foglio1
		NomeFoglio = ThisComponent.Sheets.getByIndex(iFoglio).getName()
		ReDim Preserve BozzaElenco(a)
		BozzaElenco(a) = NomeFoglio
		a = a +1
	Next iFoglio
	ElencoNomiFogli() = BozzaElenco()
End Function

rem Codice associato al pulsante "Visualizza foglio scelto"
Sub VisualizzaFoglio
	rem definizione della cella contenente il nome del foglio da visualizzare
	Dim CellaSelezionata As Object 	
	CellaSelezionata = ThisComponent.getCurrentController().getActiveSheet().getCellRangeByName("B2")
	rem definizione nome del foglio da esportare
	Dim NomeFoglio As String 
	NomeFoglio = CellaSelezionata.String
	rem attivazione del foglio scelto
	ThisComponent.CurrentController.setActiveSheet(ThisComponent.Sheets.getByName(NomeFoglio))
End Sub
Spero che anche questa possa interessare.
Saluti
Geo
Allegati
ProvaElencoFogli.ods
(12.85 KiB) Scaricato 17 volte
LibO 7 su LinuxMint 21
patel
Volontario attivo
Volontario attivo
Messaggi: 4020
Iscritto il: venerdì 30 aprile 2010, 8:04
Località: Livorno

Re: Elenco Fogli

Messaggio da patel »

Complimenti Geo, non sapevo che fosse possibile inserire una function in validità. :bravo: :bravo: :bravo:
-------------------
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
geovign
Messaggi: 217
Iscritto il: domenica 13 gennaio 2019, 11:19
Località: Modena

Re: Elenco Fogli

Messaggio da geovign »

Una formula in validità l'avevo già vista, con una function ho provato e funziona.
Grazie @patel.
Saluti
Geo
LibO 7 su LinuxMint 21
nickGiard
Messaggi: 65
Iscritto il: lunedì 14 maggio 2012, 22:04

Re: Elenco Fogli

Messaggio da nickGiard »

geovign ottima soluzione.
Scusa la mia maniacale ricerca dell'ottimizzazione del codice, e pensando che questo Forum possa anche essere didattico, mi permetto di fare alcune considerazioni sull'uso degli Array, secondo le mie conoscenze che possono essere anche erronee:
- l'uso in un ciclo di ReDim Preserve BozzaElenco(a) porta a riscrivere i dati in ogni ciclo nel nuovo array, con rallentamento prestazioni
- Poichè la dimensione massima si conosce a priori, ed anche i tipo, scriverei :
Dim BozzaElenco() As String
ReDim BozzaElenco(NumeroFogli-2) As String
ed usare BozzaElenco(a) = NomeFoglio
E' ovvio che nel caso in questione la variazione è ininfluente, ma non si sa mai ...
Saluti Nicola
Nicola con LibreOffice 7.1 (x64) su Windows 11
geovign
Messaggi: 217
Iscritto il: domenica 13 gennaio 2019, 11:19
Località: Modena

Re: Elenco Fogli

Messaggio da geovign »

Ciao @nickGiard,
inizialmente ero partito da una funzione semplicissima

Codice: Seleziona tutto

Function ElencoNomiFogli() As variant
ElencoNomiFogli() = ThisComponent.Sheets.getElementNames()
End Function
che riportava in elenco tutti i nomi dei fogli del documento.
Mi sono poi fatto una domanda: e se in futuro voglio escludere uno o più fogli in qualsivoglia posizione, come faccio?
Con le mie conoscenze limitate del Basic, l'unica soluzione a cui sono approdato è quella proposta: ridimensionare di volta in volta la matrice (nel caso specifico escludo il primo foglio) .
Ora, leggendo il tuo post, e sperando di averlo capito correttamente, tu proponi di dimensionare subito l'array e poi inserire i dati.
Propongo quindi questa modifica alla Funzione ElencoNomiFogli()

Codice: Seleziona tutto

Function ElencoNomiFogli() As variant
	Dim NumeroFogli As Integer 
	Dim iFoglio As Integer 
	Dim NomeFoglio As String 
	Dim BozzaElenco() As String
	Dim arrFogli() As Integer 
	Dim a As Integer 
	NumeroFogli = ThisComponent.getSheets.getCount()
	ReDim BozzaElenco(NumeroFogli -1)		'ridimensionamento di una matrice senza dati (vuota)
	arrFogli = array(1,2,3,4,5,6,7,8,9)	'array contenente gli indici dei fogli che mi interessano visualizzare
	a = 0
	For Each iFoglio In arrFogli()
		NomeFoglio = ThisComponent.Sheets.getByIndex(iFoglio).getName()
		BozzaElenco(a) = NomeFoglio
		a = a +1
	Next iFoglio
	ElencoNomiFogli() = BozzaElenco()	
End Function
Mi scuso per la lunghezza del post.
Saluti
Geo
Allegati
Prova2ElencoFogli.ods
(13.01 KiB) Scaricato 18 volte
LibO 7 su LinuxMint 21
patel
Volontario attivo
Volontario attivo
Messaggi: 4020
Iscritto il: venerdì 30 aprile 2010, 8:04
Località: Livorno

Re: Elenco Fogli

Messaggio da patel »

A questo punto semplificherei ancora di più sfruttando gli eventi

Codice: Seleziona tutto

Function ElencoNomiFogli()
  ElencoNomiFogli() = ThisComponent.Sheets.getElementNames()
End Function		
Sub evento(Target) 
    If NOT Target.supportsService("com.sun.star.sheet.SheetCell") then exit sub
    Sh = Target.getSpreadsheet()
    rng = sh.getCellRangeByName("B2")
    range2 = rng.queryintersection(Target.rangeaddress()) 
    If range2.RangeAddressesAsString = "" Then   Exit Sub
	ThisComponent.CurrentController.setActiveSheet(ThisComponent.Sheets.getByName(target.string))
 End Sub
Allegati
FOGLI_ElencoTendina.ods
(10.73 KiB) Scaricato 18 volte
-------------------
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
geovign
Messaggi: 217
Iscritto il: domenica 13 gennaio 2019, 11:19
Località: Modena

Re: Elenco Fogli

Messaggio da geovign »

Ottimo patel.
... Prima o poi imparerò/capirò le query.
Saluti
Geo
LibO 7 su LinuxMint 21
amax
Messaggi: 99
Iscritto il: mercoledì 7 novembre 2012, 10:59

Re: Elenco Fogli

Messaggio da amax »

Prima cosa devo scusarmi per aver lanciato il messaggio d'aiuto ed essere sparito, non è mia abitudine.
Devo ringraziarvi per le soluzioni, imparo sempre qualcosa.
La soluzione "semplificata" di Patel è fantastica.
La mia richiesta si spingeva un po' più in la, avendo tanti fogli, mi faceva piacere avere un "pulsante" su tutti i fogli che mi richiama la finestra a tendina che mi permette di scegliere il foglio dove andare. Indubbiamente posso farlo anche così.

Grazie a tutti

PS attendo anchìora un po prima di segnalarlo come risolto, magari vi ho stuzzicato e qualcuno riesce a colmare la mia curiosità
macOS 14 Sonoma: LibreOffice 24.2.1
amax
Messaggi: 99
Iscritto il: mercoledì 7 novembre 2012, 10:59

Re: Elenco Fogli

Messaggio da amax »

Ho provato a copiare la cella su tutti i fogli, ma purtroppo funziona solo sul foglio1. Naturalmente la cella è stata copiata sempre nella sua posizione B2.

Grazie
macOS 14 Sonoma: LibreOffice 24.2.1
geovign
Messaggi: 217
Iscritto il: domenica 13 gennaio 2019, 11:19
Località: Modena

Re: Elenco Fogli

Messaggio da geovign »

La soluzione di @patel sfrutta gli eventi ... del foglio (come da lui specificato).
All'evento del foglio denominato "Contenuto modificato" è associata la macro che visualizza il foglio. L'elenco degli eventi lo trovi in "Foglio-> Eventi del foglio" .
Quindi, oltre a copiare la cella nella stessa posizione, devi associare, per ogni foglio, la macro "Sub evento (Target) all'evento "Contenuto modificato".
Poi fai diverse prove.
Se non funziona, credo che si debba passare alle finestre di dialogo oppure alla soluzione di @nickGiard
Saluti
Ciao
LibO 7 su LinuxMint 21
geovign
Messaggi: 217
Iscritto il: domenica 13 gennaio 2019, 11:19
Località: Modena

Re: Elenco Fogli

Messaggio da geovign »

Con una semplice finestra di dialogo.
Vedi allegato.
Geo
Allegati
Prova3ElencoFogli.ods
(12.79 KiB) Scaricato 21 volte
LibO 7 su LinuxMint 21
amax
Messaggi: 99
Iscritto il: mercoledì 7 novembre 2012, 10:59

Re: Elenco Fogli

Messaggio da amax »

Perfetto, questo è proprio quello che stavo cercando e funziona bene. Ma la finestra di dialogo non si può personalizzare (parlo di design) ?

Grazie a tutti
macOS 14 Sonoma: LibreOffice 24.2.1
amax
Messaggi: 99
Iscritto il: mercoledì 7 novembre 2012, 10:59

Re: Elenco Fogli

Messaggio da amax »

Cia sarebbe la possibilità di non visualizzare i fogli nascosti?

Grazie
macOS 14 Sonoma: LibreOffice 24.2.1
Gaetanopr
Volontario
Volontario
Messaggi: 3300
Iscritto il: mercoledì 21 novembre 2012, 20:07

Re: Elenco Fogli

Messaggio da Gaetanopr »

Propongo un'altra soluzione, una macro che si aziona all'apertura del documento e va a creare dei nomi definiti dei fogli presenti e visibili.
Il nome definito prende il nome del foglio e il trattino basso finale, la cella selezionata è A1(si può cambiare).
Quindi la scelta avviene dal menù a tendina presente nella casella del nome azionabile da qualsiasi foglio e senza bisogno di finestre di dialogo o menù a tendina su celle
Allegati
ListaFogli.ods
(9.9 KiB) Scaricato 20 volte
LibreOffice 7.2.2.2 windows 10
Openoffice 4.1.13 su windows 10
patel
Volontario attivo
Volontario attivo
Messaggi: 4020
Iscritto il: venerdì 30 aprile 2010, 8:04
Località: Livorno

Re: Elenco Fogli

Messaggio da patel »

A me non funziona con Libre e non ricordo più come si fa ad impostare l'avvio macro all'apertura del documento.
-------------------
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
Gaetanopr
Volontario
Volontario
Messaggi: 3300
Iscritto il: mercoledì 21 novembre 2012, 20:07

Re: Elenco Fogli

Messaggio da Gaetanopr »

patel ha scritto: mercoledì 20 marzo 2024, 16:03 A me non funziona con Libre e non ricordo più come si fa ad impostare l'avvio macro all'apertura del documento.
Strano perchè ho aperto il file con Libre e mi funziona.
Comunque per l'avvio all'apertura bisogna andare su Strumenti - Personalizza..... come da immagine
Allegati
Cattura.JPG
Cattura.JPG (55.92 KiB) Visto 436 volte
LibreOffice 7.2.2.2 windows 10
Openoffice 4.1.13 su windows 10
patel
Volontario attivo
Volontario attivo
Messaggi: 4020
Iscritto il: venerdì 30 aprile 2010, 8:04
Località: Livorno

Re: Elenco Fogli

Messaggio da patel »

Grazie per il suggerimento, comunque non mi appare alcun menù in A1.
-------------------
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
Gaetanopr
Volontario
Volontario
Messaggi: 3300
Iscritto il: mercoledì 21 novembre 2012, 20:07

Re: Elenco Fogli

Messaggio da Gaetanopr »

patel devi andare nella casella del nome in alto a sinistra
LibreOffice 7.2.2.2 windows 10
Openoffice 4.1.13 su windows 10
Gaetanopr
Volontario
Volontario
Messaggi: 3300
Iscritto il: mercoledì 21 novembre 2012, 20:07

Re: Elenco Fogli

Messaggio da Gaetanopr »

Gaetanopr ha scritto: mercoledì 20 marzo 2024, 12:30.............
Quindi la scelta avviene dal menù a tendina presente nella casella del nome ...........
Allegati
Casella_del_nome.png
Casella_del_nome.png (12.27 KiB) Visto 400 volte
LibreOffice 7.2.2.2 windows 10
Openoffice 4.1.13 su windows 10
geovign
Messaggi: 217
Iscritto il: domenica 13 gennaio 2019, 11:19
Località: Modena

Re: Elenco Fogli

Messaggio da geovign »

@Gaetanopr
Scorrendo il tuo codice, ho visto che come prima cosa cancelli tutte le aree con nome eventualmente definite. Nel caso invece ne avessi bisogno, esiste la possibilità di mostrare nell'elenco solo i fogli?
Geo
LibO 7 su LinuxMint 21
Gaetanopr
Volontario
Volontario
Messaggi: 3300
Iscritto il: mercoledì 21 novembre 2012, 20:07

Re: Elenco Fogli

Messaggio da Gaetanopr »

Non credo sia possibile, riguardo alla cancellazione delle aree la macro andrebbe "sistemata" in modo da cancellare eventualmente solo i nomi definiti che fanno riferimento all'elenco fogli, attualmente cancella tutto.
Diciamo che si possono attuare varie soluzioni, ad esempio quella di patel si può ampliare creando i menù a tendina su ogni foglio tramite codice.
Si potrebbe pure creare un menù personalizzato sulla barra dei menù con elenco a discesa dei fogli.
Ma per me la soluzione migliore rimane l'uso della linguetta del foglio, credo sia più veloce selezionare un foglio in questo modo che andare ad aprire un menù a discesa e cercare il foglio da attivare. :)
LibreOffice 7.2.2.2 windows 10
Openoffice 4.1.13 su windows 10
patel
Volontario attivo
Volontario attivo
Messaggi: 4020
Iscritto il: venerdì 30 aprile 2010, 8:04
Località: Livorno

Re: Elenco Fogli

Messaggio da patel »

Gaetanopr ha scritto: mercoledì 20 marzo 2024, 20:40 patel devi andare nella casella del nome in alto a sinistra
Sono davvero invecchiato... funziona perfettamente :super: :super:
-------------------
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
Rispondi