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

Modifica numero foglio di lavoro quando supero 100

Ultimo Aggiornamento: 26/04/2021 10:12
Post: 343
Registrato il: 13/12/2015
Città: MILANO
Età: 58
Utente Senior
2010
OFFLINE
23/04/2021 15:38

Ciao a tutti.
Premetto che è solo una curiosità accademica.
In pratica in questo script:
 Sub numera() 
Dim prev() 
Dim sh As Worksheet 
ReDim Preserve prev(Worksheets.Count) 
Max = 0 
For i = 1 To Worksheets.Count     
           prev(i) = Split(Worksheets(i).Name, "21-10") 'fino a 100 usare ->21-0 dopo 21-10     
           On Error Resume Next     
           If prev(i)(1) > Max Then Max = prev(i)(1)     
           On Error GoTo 0 
Next i 
Max = Max + 1 Worksheets("master (2)").Name = "21-10" & Max 'fino a 100 usare ->21-0 dopo 21-10 
Call EstraiNomeFoglio 
End Sub


Da 21-001 a 21-099 -> uso:
 ...............   
           prev(i) = Split(Worksheets(i).Name, "21-0")     
           ............
           Max = Max + 1 Worksheets("master (2)").Name = "21-0" & Max 
           .............


Successivamente per avere il foglio numerato da 21-100 fino a 21-999 effettuo una correzione manuale dello script:
 ...............   
           prev(i) = Split(Worksheets(i).Name, "21-10")     
           ............
           Max = Max + 1 Worksheets("master (2)").Name = "21-10" & Max 
           .............


Ma se volessi evitarla?
PS i primi due numeri indicano l'anno in corso.

Grazie per l'aiuto.
[Modificato da BG66 23/04/2021 15:41]
BG66
Excel 2010
Post: 3.149
Registrato il: 06/04/2013
Utente Master
2010
OFFLINE
23/04/2021 16:27

ciao

magari una spiegazione per vecchietti???

saluti



Domenico
Win 10 - Excel 2016
Post: 343
Registrato il: 13/12/2015
Città: MILANO
Età: 58
Utente Senior
2010
OFFLINE
23/04/2021 16:42

Ciao Domenico,
lo sai che la mia fiducia nelle capacità divinatorie di chi frequenta questo forum è altissima!! 😀

In pratica, ho un file che dopo una serie di elaborazioni arriva a creare un foglio master (2) partendo da uno schema iniziale.
Successivamente con lo script sopracitato vado a rinominare il foglio in maniera progressiva.
Il tutto funziona alla perfezione. Ma siccome non riesco a "stare fermo" ho provato a ragionare su come evitare l'operazione amanuense di correggere lo script quando i fogli di lavoro arrivano a 100.

Non ho allegato il file perchè cancellando tutti i dati sensibili mi sono ritrovato con un foglio bianco che creava un foglio bianco... ma se pensi sia d'aiuto posso allegarlo comunque.

Gene
[Modificato da BG66 23/04/2021 16:44]
BG66
Excel 2010
Post: 906
Registrato il: 24/06/2015
Città: CATANIA
Età: 80
Utente Senior
Excel2019
OFFLINE
23/04/2021 17:55

Salve a tutti

Non dici come sono denominati i fogli ma credo che facendo lo split non con "21-00" ma con "-" avrai prev(i)(0) che sarà uguale da "21", quindi aggiungi la lineetta e continui col max fini a quando vuoi. Cioè
...............
prev(i) = Split(Worksheets(i).Name, "-")
............
Max = Max + 1 Worksheets("master (2)").Name = prev(0) & "-" & Max
.............


Ciao,
Mario

PS - Ovviamente questa è l'idea. Se poi vuoi 3 cifre dopo la lineetta occorre costruire il dato, ma è facile.
[Modificato da Marius44 23/04/2021 21:10]
23/04/2021 22:34

Solo se ho capito. Ex...
Sub numera2()
Dim N As Long, A As String
A = "21-" ' Anno ed -
N = Worksheets.Count + 1
    Sheets("master").Copy After:=Sheets(Sheets.Count)
    If N < 10 Then
        ActiveSheet.Name = A & Format(N, "0")
    ElseIf N < 100 Then
        ActiveSheet.Name = A & Format(N, "00")
    ElseIf N < 1000 Then
        ActiveSheet.Name = A & Format(N, "000")
    End If
End Sub

Forse desideri solo ...00 & 000
    If N < 100 Then
        ActiveSheet.Name = A & Format(N, "00")
    ElseIf N < 1000 Then
        ActiveSheet.Name = A & Format(N, "000")
    End If
[Modificato da ABCDEF@Excel 24/04/2021 11:13]
Post: 344
Registrato il: 13/12/2015
Città: MILANO
Età: 58
Utente Senior
2010
OFFLINE
24/04/2021 21:57

Ciao a tutti.
Scusate il ritardo nella risposta ma ho provato ad integrare il suggerimento di Mario con lo script di ABCDEF@Excel con l'obiettivo (non raggiunto 😡) di avere le tre cifre dopo il trattino.
Infatti lo script di @ABCDEF@Excel numera il foglio nuovo contando quelli esistenti e inserendolo in coda mentre la modifica di Mario "tocca" solo il nome del foglio lasciando immutate le altre peculiarità (numerazione escludendo alcuni fogli, posizionamento foglio e eliminazione del foglio master (2).
Al momento l'unica mia integrazione è stata questa:
-----------
prev(i) = Split(Worksheets(i).Name, "21-") 'by Marius     
--------
Worksheets("master (2)").Name = prev(0) & "21-" & Max 'by Marius


Allego file depurato. Principio di funzionamento:
Premo IMPORTA nel foglio "master" creo master (2) e in questo foglio uso Numera per rinominarlo (21-001, etc, 21-100, etc, etc)

PS L'errore 91 non si presenta nel file originale ma credo che sia frutto della "pulizia" dei dati sensibili quindi ho scelto di ignorarne la causa!!

Grazie per l'aiuto
BG66
Excel 2010
Post: 907
Registrato il: 24/06/2015
Città: CATANIA
Età: 80
Utente Senior
Excel2019
OFFLINE
24/04/2021 23:12

Ciao Gene

1°) evita di usare per le variabili definizioni riservate (di Excel o VBA), per esempio Max. Io ho messo mx
2°) questa la macro dove, alla fine troverai uno Stop per farti notare che la variabile nomefoglio riporta il numero successivo
Sub numera()
Dim i As Long
Dim mx As Integer
Dim nomefoglio As String
Dim prev
Dim sh As Worksheet
mx = 0
For i = 1 To Worksheets.Count
    On Error Resume Next
    If Left(Worksheets(i).Name, 3) = "21-" Then
      prev = Split(Worksheets(i).Name, "-") 'by Marius
    End If
    On Error GoTo 0
Next i
mx = Val(prev(1)) + 1
'QUI ASSEGNI IL NOME DEL NUOVO FOGLIO DOPO AVER CREATO LE TRE CIFRE
nomefoglio = prev(0) & "-" & Right("000" & mx, 3)
Stop
Call EstraiNomeFoglio
End Sub

Quando si ferma la macro se ti posizioni "sopra" la variabile nomefoglio vedrai il nome da assegnare.
Non vedo, però, come crei il nuovo foglio.
Buona Domenica,
Mario
Post: 908
Registrato il: 24/06/2015
Città: CATANIA
Età: 80
Utente Senior
Excel2019
OFFLINE
25/04/2021 07:10

Buongiorno

@BG66
Gene attento che la macro di cui sopra funziona se i Fogli sono in sequenza e, quindi, l'ultimo foglio porta il numero maggiore. Se i Fogli fossero disposti diversamente occorre una piccola modifica che, sono certo, sei in grado di applicare.

Ciao,
Mario
Post: 345
Registrato il: 13/12/2015
Città: MILANO
Età: 58
Utente Senior
2010
OFFLINE
25/04/2021 07:52

Ciao Mario,
non riesco a capire..
In pratica allo stop mi visualizza correttamente il dato atteso ma quando riprende non lo esegue (??!!)
Ho anche avuto il dubbio letta la tua nota sull'ultimo foglio che dovessi forzargli la mano creando ex-novo il preventivo 21-001 e poi lanciando lo script ma non ha funzionato comunque. In pratica nessun avviso/errore ma il foglio non viene rinominato.
Ho escluso invece la possibilità che il foglio sia posizionato nella seguenza sbagliata proprio perchè il numero indicato allo STOP è corretto!!


Grazie per l'aiuto
Gene

[Modificato da BG66 25/04/2021 07:57]
BG66
Excel 2010
Post: 3.151
Registrato il: 06/04/2013
Utente Master
2010
OFFLINE
25/04/2021 10:18

@BG
Se ho capito devi duplicare il foglio "master" assegnandogli come nome anno-progressivo a tre cifre, qualora un foglio non esistesse già il nome sarà 21-001, altrimenti 21-002 , 3 , etc etc

1) suggerisco di spostare tutti i fogli aggiunti alla fine, quindi dopo storico 2020, in modo da averli in progressione

2) NB: se hai per esempio i fogli 21-001 e 21-003 (perchè 21-002 lo hai eliminato), il foglio creato sarà 21-004

3) infine suggerisco di lasciare il pulsante che genera il nuovo foglio SOLO sul foglio master (almeno io la penso così)

4) ho lasciato solo il pulsante legato alla mia routine che trovi nel modulo Domenico

5) a tale pulsante ho assegnato nome "NewS" per poterlo eliminare dal foglio creato

saluti

Sub InsFoglio()
Dim CurYear As String, mMaster As Worksheet, j As Integer, arrNumb(), mSheet As String
Set mMaster = Worksheets("master")
CurYear = "21" ' <<< eventualmente prendi valore da cella di Master (?)
k = 0
' cerco eventuale ultimo foglio
For j = 1 To Sheets.Count
    If Left(Sheets(j).Name, 2) = CurYear Then
        ReDim Preserve arrNumb(k)
        mpos = 4
        arrNumb(k) = Mid(Sheets(j).Name, mpos, Len(Sheets(j).Name)) * 1
        k = k + 1
    End If
Next j
' se già non esiste creo 001, altrimenti incremento
If k > 0 Then
    mMax = WorksheetFunction.Max(arrNumb) + 1
Else
    mMax = 1
End If
mSheet = CurYear & "-" & Format(mMax, "000")
mMaster.Copy after:=Sheets(Sheets.Count)
ActiveSheet.Name = mSheet
'cancello pulsante comando nel foglio creato
ActiveSheet.Shapes("NewS").Delete
End Sub




[Modificato da dodo47 25/04/2021 10:22]
Domenico
Win 10 - Excel 2016
Post: 346
Registrato il: 13/12/2015
Città: MILANO
Età: 58
Utente Senior
2010
OFFLINE
25/04/2021 14:18

Ciao Domenico,
è quasi perfetto.
Ho apprezzato il tuo suggerimento e ho creato il collegamento alla data in corso in questo modo:
 CurYear = Format(mMaster.Range("AC35"), "yy") 


Mentre vorrei poter modificare la progressione in modo da avere l'ultimo preventivo dopo il foglio sommario e dal più grande a decrescere.

Grazie se puoi.
Gene
[Modificato da BG66 25/04/2021 14:19]
BG66
Excel 2010
Post: 3.152
Registrato il: 06/04/2013
Utente Master
2010
OFFLINE
25/04/2021 16:48

ciao
quindi tra sommario e config.....
te lo preciso perchè "config" serve per riferimento quando non c'è nessun foglio aggiunto.
Se non è così dovremo fare un doppio copy uno before e uno after, fai sapere

Option Explicit

Sub InsFoglio()
Dim CurYear As String, mMaster As Worksheet, j As Integer, arrNumb(), mSheet As String
Dim mBefore As String, k As Integer, mPos As Byte, mMax As Integer
On Error GoTo errori
Application.Calculation = xlCalculationManual
Set mMaster = Worksheets("master")
CurYear = Format(mMaster.Range("AC35"), "yy")
k = 0
' cerco eventuale ultimo foglio
For j = 1 To Sheets.Count
    If Left(Sheets(j).Name, 2) = CurYear Then
        ReDim Preserve arrNumb(k)
        mPos = 4
        arrNumb(k) = Mid(Sheets(j).Name, mPos, Len(Sheets(j).Name)) * 1
        k = k + 1
    End If
Next j
' creo nome progressivo destinazione e variabile foglio prima del quale va inserito
If k > 0 Then
    mMax = WorksheetFunction.Max(arrNumb) + 1
    mBefore = CurYear & "-" & Format(mMax - 1, "000")
Else
    mMax = 1
    mBefore = "Config"
End If
mSheet = CurYear & "-" & Format(mMax, "000")
mMaster.Copy before:=Sheets(mBefore)
ActiveSheet.Name = mSheet
'cancello pulsante comando nel foglio creato
ActiveSheet.Shapes("NewS").Delete
Application.Calculation = xlCalculationAutomatic
esci:
Exit Sub

errori:
MsgBox Err.Number & " - " & Err.Description
Resume esci
End Sub


saluti


EDIT: qualora vi fossero eventi ti suggerisco di disattivarli ad inizio e riattivarli alla fine
[Modificato da dodo47 25/04/2021 17:04]
Domenico
Win 10 - Excel 2016
Post: 347
Registrato il: 13/12/2015
Città: MILANO
Età: 58
Utente Senior
2010
OFFLINE
25/04/2021 17:56

[RISOLTO]
Ciao Domenico,
tutto perfetto.

Grazie e buona domenica.
Gene
STAY SAFE
BG66
Excel 2010
Post: 3.153
Registrato il: 06/04/2013
Utente Master
2010
OFFLINE
26/04/2021 10:12

Gene
la label di rimando

esci:

deve essere posta prima di:
Application.Calculation = xlCalculationAutomatic

quindi:
......
.....
ActiveSheet.Shapes("NewS").Delete

esci:
Application.Calculation = xlCalculationAutomatic
Exit Sub
errori:
MsgBox Err.Number & " - " & Err.Description
Resume esci
End Sub


Altrimenti in caso di errore ti resta il calcolo manuale

sorry.....
saluti





Domenico
Win 10 - Excel 2016
Vota: 15MediaObject5,00314 3
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 07:07. Versione: Stampabile | Mobile | Regolamento | Privacy
FreeForumZone [v.6.1] - Copyright © 2000-2024 FFZ srl - www.freeforumzone.com