Pagina 1 di 1

Elenco Fogli

Inviato: sabato 17 febbraio 2024, 19:11
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

Re: Elenco Fogli

Inviato: venerdì 23 febbraio 2024, 19:07
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

Re: Elenco Fogli

Inviato: martedì 27 febbraio 2024, 23:35
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

Re: Elenco Fogli

Inviato: sabato 2 marzo 2024, 11:54
da patel
Soluzione non elegante, ma semplice e efficace. :bravo: :bravo: :bravo:

Re: Elenco Fogli

Inviato: domenica 3 marzo 2024, 8:58
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

Re: Elenco Fogli

Inviato: domenica 3 marzo 2024, 11:46
da patel
Complimenti Geo, non sapevo che fosse possibile inserire una function in validità. :bravo: :bravo: :bravo:

Re: Elenco Fogli

Inviato: domenica 3 marzo 2024, 12:57
da geovign
Una formula in validità l'avevo già vista, con una function ho provato e funziona.
Grazie @patel.
Saluti
Geo

Re: Elenco Fogli

Inviato: domenica 3 marzo 2024, 19:28
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

Re: Elenco Fogli

Inviato: lunedì 4 marzo 2024, 15:06
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

Re: Elenco Fogli

Inviato: lunedì 4 marzo 2024, 16:24
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

Re: Elenco Fogli

Inviato: lunedì 4 marzo 2024, 18:17
da geovign
Ottimo patel.
... Prima o poi imparerò/capirò le query.
Saluti
Geo

Re: Elenco Fogli

Inviato: mercoledì 13 marzo 2024, 18:51
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à

Re: Elenco Fogli

Inviato: mercoledì 13 marzo 2024, 19:11
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

Re: Elenco Fogli

Inviato: mercoledì 13 marzo 2024, 19:34
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

Re: Elenco Fogli

Inviato: giovedì 14 marzo 2024, 0:10
da geovign
Con una semplice finestra di dialogo.
Vedi allegato.
Geo

Re: Elenco Fogli

Inviato: sabato 16 marzo 2024, 10:19
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

Re: Elenco Fogli

Inviato: mercoledì 20 marzo 2024, 11:21
da amax
Cia sarebbe la possibilità di non visualizzare i fogli nascosti?

Grazie

Re: Elenco Fogli

Inviato: mercoledì 20 marzo 2024, 12:30
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

Re: Elenco Fogli

Inviato: mercoledì 20 marzo 2024, 16:03
da patel
A me non funziona con Libre e non ricordo più come si fa ad impostare l'avvio macro all'apertura del documento.

Re: Elenco Fogli

Inviato: mercoledì 20 marzo 2024, 17:15
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

Re: Elenco Fogli

Inviato: mercoledì 20 marzo 2024, 20:35
da patel
Grazie per il suggerimento, comunque non mi appare alcun menù in A1.

Re: Elenco Fogli

Inviato: mercoledì 20 marzo 2024, 20:40
da Gaetanopr
patel devi andare nella casella del nome in alto a sinistra

Re: Elenco Fogli

Inviato: mercoledì 20 marzo 2024, 20:48
da Gaetanopr
Gaetanopr ha scritto: mercoledì 20 marzo 2024, 12:30.............
Quindi la scelta avviene dal menù a tendina presente nella casella del nome ...........

Re: Elenco Fogli

Inviato: giovedì 21 marzo 2024, 20:15
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

Re: Elenco Fogli

Inviato: giovedì 21 marzo 2024, 20:34
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. :)

Re: Elenco Fogli

Inviato: venerdì 22 marzo 2024, 15:53
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: