Pagina precedente | 1 | Pagina successiva
Vota | Stampa | Notifica email    
Autore

rinomina fogli automatico con condizioni

Ultimo Aggiornamento: 12/03/2018 16:22
Post: 13
Registrato il: 09/02/2012
Età: 53
Utente Junior
2013
OFFLINE
09/03/2018 13:45

Buonasera, ho la necessità di nominare tutti i fogli di un file con il testo contenuto nella cella "B6"
Scopiazzando qua e là sul forum, ho usato la macro

Sub rinominafogli()
ActiveSheet.Name = ActiveSheet.Range("B6")
End Sub

che funziona con i seguenti problemi:
1. rinomina solo il foglio attivo, mentre a me occorre che nomini tutti i fogli
2. non funziona se la cella B6 contiene caratteri particolari (quelli non consentiti nel nome del foglio) che purtroppo sono presenti, poiché il file proviene dall'export di un database con informazioni contenenti anche caratteri particolari ("/", "*", etc.)
3. non funziona se la cella B6 contiene più di 31 caratteri

A me servirebbe una macro che superi queste difficoltà in modo che rinomini tutti i fogli con i primi 31 caratteri del testo in B6 e che se trova caratteri "proibiti" li sostituisca con "-"
Si può fare?
grazie in anticipo

Excel 2007
Post: 3.662
Registrato il: 21/06/2013
Città: NAPOLI
Età: 70
Utente Master
Excel 365
OFFLINE
09/03/2018 14:03

Ciao Alessia

Per il punto 1 basta che imposti un ciclo For che vada a rinominare tutti i fogli della cartella di lavoro.

Per i punti 2 e 3 credo ci sia poco o nulla da fare perché sono limiti imposti da Excel stesso.

Per i caratteri non accettati nei nomi dei fogli potresti sostituirli con altri tramite un Replace.

Il limite dei 31 caratteri credo, invece, sia invalicabile e dovresti quindi usare un

vb
Left(stringa, 31)

Se alleghi un file di esempio e dici come devono essere rinominati i fogli potrò essere più preciso.
[Modificato da alfrimpa 09/03/2018 14:04]

Alfredo
Post: 13
Registrato il: 09/02/2012
Età: 53
Utente Junior
2013
OFFLINE
09/03/2018 14:53

Ciao Alfredo
grazie per l'aiuto
allego file come esce dal db
purtroppo non sono "addetta ai lavori" e non so cosa sia un "ciclo For" o un "Replace"
riguardo a "Left(stringa, 31)" a che punto della macro devo inserirla?
mi spiace essere così inetta [SM=x423027]
Excel 2007
Post: 3.663
Registrato il: 21/06/2013
Città: NAPOLI
Età: 70
Utente Master
Excel 365
OFFLINE
09/03/2018 15:36

Ciao Alessia

Onestamente dal tuo file non ho capito gran che.

Comunque supponendo che tu abbia una cartella con un numero indefinito di fogli e con l'ultimo denominato "Totali" con la macro che vedi sotto ogni foglio (tranne l'ultimo) verrà ridenominato con la stringa ""CDA FONDAZIONE POLICLINICO G-" seguita da un numero progressivo che va da 1 al numero del penultimo foglio.

vb
Sub RinominaFogli()
Dim i As Integer
For i = 1 To Sheets.Count - 1
    Sheets(i).Name = "CDA FONDAZIONE POLICLINICO G-" & i
Next i
End Sub


Non ho capito dove c'entra la cella B6 di cui parlavi prima.

Alfredo
Post: 14
Registrato il: 09/02/2012
Età: 53
Utente Junior
2013
OFFLINE
09/03/2018 15:39

per ora ho applicato i suggerimenti di Alfredo in questo modo:
1. ho selezionato tutti i fogli; nella cella C6 ho inserito la formula =SOSTITUISCI(B6;"/";"-")
2. nella cella D6 ho inserito la formula
=SINISTRA(C6;31)

Ora il testo della cella D6 è quello che deve essere inserito come nome del foglio e non ha più le criticità di superare i 31 caratteri o di contenere caratteri non consentiti
Permane il problema della macro che funziona solo per un foglio, quello in cui la lancio
ho provato ad inserire il ciclo for ma continua a nominare solo il foglio attivo.
riporto sotto la macro

Sub a()
For Each Sh In Sheets
ActiveSheet.Name = ActiveSheet.Range("D6")
Next
End Sub

potete aiutarmi col ciclio for?
grazie
Alessia
Excel 2007
Post: 3.664
Registrato il: 21/06/2013
Città: NAPOLI
Età: 70
Utente Master
Excel 365
OFFLINE
09/03/2018 15:55

Alessia con riferimento al file che hai allegato spiega bene quello che vuoi fare punto per punto.

I fogli sono già denominati.

Non riesco a capire.

Non c'è bisogno di fare tutto quello che hai fatto.

Fa tutto la macro ma bisogna capire bene cosa deve fare.
[Modificato da alfrimpa 09/03/2018 15:56]

Alfredo
Post: 15
Registrato il: 09/02/2012
Età: 53
Utente Junior
2013
OFFLINE
09/03/2018 16:44

Caro Alfredo,
provo a spiegarmi meglio
quando scarico il file dal database, mi ritrovo i fogli con dei nomi che non sono utili, per questo mi occorre rinominarli.
Considerando il file in allegato, vorrei una macro che rinomina ogni foglio del file con il testo in D6
al momento ho usato questa macro:

Sub a()
For Each Sh In Sheets
ActiveSheet.Name = ActiveSheet.Range("D6")
Next
End Sub

che funziona rinominando però solo il foglio attivo in quel momento. Così, per rinominare tutti i fogli devo andare su ogni singolo foglio e eseguire la macro daccapo!!!!
Puoi aggiustare la macro in modo che quando la eseguo rinomini tutti i fogli del file?
grazie
Alessia

Excel 2007
Post: 3.665
Registrato il: 21/06/2013
Città: NAPOLI
Età: 70
Utente Master
Excel 365
OFFLINE
09/03/2018 19:23

Alessia eccoti la macro

vb
Sub RinominaFogli()
Dim i As Integer
For i = 1 To Sheets.Count
    Sheets(i).Name = Sheets(i).Range("D6").Value
Next i
End Sub


Però guarda che in D6 dei fogli 1, 2 e 31 c'è la stessa stringa "N-A" e questo non può essere.

In D6 ci devono essere tutte stringhe diverse oppure devi dirmi come gestire questa situazione.

Alfredo
Post: 667
Registrato il: 16/08/2015
Città: CORDENONS
Età: 67
Utente Senior
Excel 2016-32bit Win11
OFFLINE
09/03/2018 22:45

Un saluto a tutti.

Analizzati i dati presenti nella colonna B dei vari fogli, valutate le perplessità di alfrimpa sull'unicità dei dati presenti in colonna B propongo questa mia macro.
In pratica cerco il primo nome valido in colonna B partendo da B7 a salire in quanto N/A secondo il db corrisponde a Non Disponibile.
La macro, così come l'ho pensata, ti evita anche di dover gestire le due celle che utilizzi per eliminare caratteri strani (probabilmente non più necessario) e per mantenere i nomi nel limite dei 31 caratteri; formula che poteva essere unificata in un'unica cella con:
=SINISTRA(SOSTITUISCI(B6;"/";"-");31)
Non ho previsto un controllo ON ERROR dato che presumo che la struttura dei nomi sarà sempre la stessa; sarebbero solo due-tre righe di codice in più.

Option Explicit

Sub RinominaFogli()

    Dim i As Integer
    Dim x As Integer
    
    For i = 1 To Sheets.Count                                   'ciclo tutti i fogli
        With Sheets(i)                                          'individuo il foglio da rinominare
            For x = 7 To 5 Step -1                              'ciclo almeno 3 righe a partire dall'ultima
                If .Range("B" & x) <> "N/A" Then                'verifico se non c'è N/A in colonna B
                    .Name = Left(.Range("B" & x).Value, 31)     'imposto il nome trovato in colonna B
                    Exit For                                    'passo al prossimo foglio
                End If
            Next x
        End With
    Next i

End Sub
[Modificato da rollis13 10/03/2018 08:41]

______________________________________________________________
C'è chi fa le COSE a CASO e chi fa CASO alle COSE (Ignoto)
Post: 16
Registrato il: 09/02/2012
Età: 53
Utente Junior
2013
OFFLINE
12/03/2018 15:29

Grazie!
ho provato le due soluzioni
1. soluzione di rollis13 mi da il seguente errore:
Errore di run-time 'error 1004':
"errore definito dall'applicazione o dall'oggetto"
2. soluzione di Alfredo funziona ma si blocca perché in D6 ricorre in più di un foglio il testo N-A e quindi genera l'errore "impossibile nominare un foglio con lo stesso nome di un altro foglio"

Sarebbe utile se nella macro di Alfredo si potesse aggiungere l'istruzione di rinominare il foglio con il testo in D5 se D6="N-A"
il massimo sarebbe poi se nella macro di Alfredo ci si potesse aggiungere la stringa di rollis13 che gestisce i 31 caratteri di lunghezza ed i caratteri speciali!!!!!!!!!! [SM=x423017]
Grazie in anticipo
Alessia
Excel 2007
Post: 3.672
Registrato il: 21/06/2013
Città: NAPOLI
Età: 70
Utente Master
Excel 365
OFFLINE
12/03/2018 16:07

Ciao Alessia

Prova con questa macro

vb
Sub RinominaFogli()
Dim i As Integer
For i = 1 To Sheets.Count
    If Sheets(i).Range("D6") <> "N-A" Then
        Sheets(i).Name = Sheets(i).Range("D6").Value
        Else
        Sheets(i).Name = Sheets(i).Range("D5").Value
    End If
Next i
End Sub


Verifica un po' e poi vedremo la faccenda dei caratteri speciali.

Alfredo
Post: 669
Registrato il: 16/08/2015
Città: CORDENONS
Età: 67
Utente Senior
Excel 2016-32bit Win11
OFFLINE
12/03/2018 16:22

Ma la mia macro, mettendola in un modulo, l'hai applicata al file che hai allegato al post #3 o #7 [SM=g27833]
[Modificato da rollis13 12/03/2018 16:24]

______________________________________________________________
C'è chi fa le COSE a CASO e chi fa CASO alle COSE (Ignoto)
Vota:
Amministra Discussione: | Chiudi | Sposta | Cancella | Modifica | Notifica email Pagina precedente | 1 | Pagina successiva
Nuova Discussione
 | 
Rispondi
Cerca nel forum
Tag discussione
Discussioni Simili   [vedi tutte]
Feed | Forum | Bacheca | Album | Utenti | Cerca | Login | Registrati | Amministra
Tutti gli orari sono GMT+01:00. Adesso sono le 12:47. Versione: Stampabile | Mobile | Regolamento | Privacy
FreeForumZone [v.6.1] - Copyright © 2000-2024 FFZ srl - www.freeforumzone.com