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