› Sviluppare funzionalita su Microsoft Office con VBA › disporre fogli in ordine alfabetico
-
AutoreArticoli
-
Ciao a tutti,
ho una macro che mi crea fogli nuovi con relativa Inputbox per nominarli, e qui tutto ok !
Siccome però ne devo inserire tanti, dai nomi più disparati, avrei necessità di disporre in ordine alfabetico i nuovi fogli man mano che li creo.
Come fare ?
allego codice vba esistente
Option Explicit Sub inserisciFoglio() Dim wsNew As Worksheet, ws As Worksheet Dim nome As Variant Dim trovato As Boolean nome = Application.InputBox("Inserisci il nome del nuovo foglio", "Aggiungi Foglio", Type:=2) If nome <> False Then For Each ws In ThisWorkbook.Worksheets If ws.Name = nome Then trovato = True Exit For End If Next ws If Not trovato Then If nomeValido(nome) Then Set wsNew = ThisWorkbook.Worksheets.Add(After:=ThisWorkbook.Worksheets(ThisWorkbook.Worksheets.Count)) wsNew.Name = nome Else MsgBox "Il nome inserito non è valido!", vbExclamation, "Controllo nome foglio" Exit Sub End If Else MsgBox "Foglio già esistente!", vbCritical, "Controllo nome foglio" Exit Sub End If End If End Sub Function nomeValido(ByVal nomeFoglio As String) As Boolean Dim caratteri As Variant Dim i As Long If Len(nomeFoglio) = 0 Or Len(nomeFoglio) > 31 Then nomeValido = False Exit Function End If caratteri = Array(":", "\", "/", "?", "*", "[", "]") For i = LBound(caratteri) To UBound(caratteri) If InStr(nomeFoglio, caratteri(i)) > 0 Then nomeValido = False Exit Function End If Next i nomeValido = True End FunctionGrazie
Ciao, questo codice nel Modulo Standard (anche nello stesso di questa che hai pubblicato):
Sub ordinaFogli() Dim i As Integer, j As Integer Application.ScreenUpdating = False For i = 1 To ThisWorkbook.Worksheets.Count - 1 For j = i + 1 To ThisWorkbook.Worksheets.Count If ThisWorkbook.Worksheets(j).Name < ThisWorkbook.Worksheets(i).Name Then ThisWorkbook.Worksheets(j).Move Before:=ThisWorkbook.Worksheets(i) End If Next j Next i Application.ScreenUpdating = True End SubPoi nella
Sub inserisciFoglio()aggiungi ordinaFogli subito prima dell'ultimoEnd IfTutto perfettamente funzionante, Grazie !!
Solo che sarebbe ottimale che in ogni nuovo foglio creato, sia automaticamente presente il pulsante denominato "Ins" abbinato alla macro "AvviaUser".
A quel punto la user stessa, con i dati da inserirci, va a riportarli nel foglio in quel momento attivo
allego file esempio
GRAZIE
Allegati:
You must be logged in to view attached files.Prova a vedere se ho capito. sostituisci la Sub inserisicFoglio con questa:
Sub inserisciFoglio() Dim wsNew As Worksheet, ws As Worksheet Dim nome As Variant Dim trovato As Boolean Dim shp As Object nome = Application.InputBox("Inserisci il nome del nuovo foglio", "Aggiungi Foglio", Type:=2) If nome <> False Then For Each ws In ThisWorkbook.Worksheets If ws.Name = nome Then trovato = True Exit For End If Next ws If Not trovato Then If nomeValido(nome) Then Set wsNew = ThisWorkbook.Worksheets.Add(After:=ThisWorkbook.Worksheets(ThisWorkbook.Worksheets.Count)) wsNew.Name = nome Set shp = wsNew.Buttons.Add(730, 125, 70, 25) '<--per spostare il button agire sui primi 2 numeri (750 e 125). Gli altri determinano le dimensioni With shp .OnAction = "'" & ThisWorkbook.Name & "'!inserisciFoglio" .Text = "Aggiungi" End With Set shp = wsNew.Buttons.Add(730, 155, 70, 25) '<--per spostare il button agire sui primi 2 numeri (750 e 155). Gli altri determinano le dimensioni With shp .OnAction = "'" & ThisWorkbook.Name & "'!AvviaUser" .Text = "Ins" End With Else MsgBox "Il nome inserito non è valido!", vbExclamation, "Controllo nome foglio" Exit Sub End If Else MsgBox "Foglio già esistente!", vbCritical, "Controllo nome foglio" Exit Sub End If ordinaFogli End If End SubProva a vedere se ho capito. sostituisci la Sub inserisicFoglio con questa:
Un'idea, se percorribile, invece di creare un pulsante a runtime, potrebbe essere quella di creare un foglio base (anche nascosto) che contenga il suddetto pulsante associato alla sua brava sub o function pubblica, quindi fare una copia di tale foglio quando serve, rinominandolo nel modo desiderato. Poi non ho idea se devono essere mantenute formattazioni, tabelle o griglie (ma si potrebbero preimpostare nel suddetto foglio base).
fare una copia di tale foglio quando serve
Si anche, in realtà ho il sospetto che sono fogli tutti uguali, quindi anche una copia di quello già esistente forse andrebbe bene. No so...aspettiamo Frasubb cosa dice.
Grazie ragazzi per le risposte.
Onestamente non ho ben capito come suggerisce di fare Vecchio Frac, ma ovviamente per mia ignoranza in materia.
In pratica vorrei che tutti i nuovi fogli che vado a creare, siano della medesima formattazione che è possibile riscontrare nel file esempio che allego (foglio "prova")
Ok Alex per quanto riguarda i pulsanti che in base alla tua macro sono presenti in ogni nuovo foglio creato. GRAZIE
Allegati:
You must be logged in to view attached files.Ciao @frasubb
quello che vuole dire Vecchio Frac (e il tuo ultimo post e allegato confermano quanto presunto), se tu predisponi un foglio "base" con tutte le celle formattate, pulsanti con macro assegnate, ecc.. puoi benissimo nascondere questo foglio "Base" con dati assenti e ogni volta che devi replicarlo, ti basta copiarlo e rinominarlo con ciò che scrivi nella InputBox.
Ti mostro un esempio:
1) il foglio "prova" rinominalo in "FoglioBase" e nascondilo (tasto destro sul nome del Foglio --> Nascondi
2) Sostituisci la macro inserisciFoglio() con questa aggiornata
Sub inserisciFoglio() Dim wsBase As Worksheet, ws As Worksheet Dim nome As Variant Dim trovato As Boolean nome = Application.InputBox("Inserisci il nome del nuovo foglio", "Aggiungi Foglio", Type:=2) If nome <> False Then For Each ws In ThisWorkbook.Worksheets If ws.Name = nome Then trovato = True Exit For End If Next ws If Not trovato Then If nomeValido(nome) Then Set wsBase = ThisWorkbook.Worksheets("FoglioBase") wsBase.Visible = xlSheetVisible wsBase.Copy After:=ThisWorkbook.Worksheets(ThisWorkbook.Worksheets.Count) ActiveSheet.Name = nome wsBase.Visible = xlSheetVeryHidden Else MsgBox "Il nome inserito non è valido!", vbExclamation, "Controllo nome foglio" Exit Sub End If Else MsgBox "Foglio già esistente!", vbCritical, "Controllo nome foglio" Exit Sub End If ordinaFogli End If End SubAdesso ogni volta che crei un nuovo foglio, in realtà stai creando una copia di "FoglioBase".
Ciao @frasubb
Ciao Alex, ok grazie della spiegazione e della macro, ho fatto come dici tu ma mi restituisce questo errore di cui allego schermata ed inserisco codice vba "incriminato".
Approfitto per ringraziare Vecchio Frac per il suggerimento, che trovo utile.
Sub ordinaFogli() Dim i As Integer, j As Integer Application.ScreenUpdating = False For i = 1 To ThisWorkbook.Worksheets.Count - 1 For j = i + 1 To ThisWorkbook.Worksheets.Count If ThisWorkbook.Worksheets(j).Name < ThisWorkbook.Worksheets(i).Name Then ThisWorkbook.Worksheets(j).Move Before:=ThisWorkbook.Worksheets(i) End If Next j Next i Application.ScreenUpdating = True End SubFaccio presente che ho tentato di creare un foglio, rinominandolo
Allegati:
You must be logged in to view attached files.Ciao, io non riscontro alcun tipo di problema. Prova ad allegare di nuovo il file con le modifiche effettuate
Ciao, io non riscontro alcun tipo di problema. Prova ad allegare di nuovo il file con le modifiche effettuate
Allego file
Allegati:
You must be logged in to view attached files.Ok allora, non gli piace che il foglio sia nascosto. Dobbiamo prima renderlo visibile. Fai così:
1) nella Sub inserisciFoglio() cancella il rigo wsBase.Visible = xlSheetVeryHidden
2) nella Sub ordinaFogli(), prima di Application.ScreenUpdating = True aggiungi questa linea di codice ThisWorkbook.Worksheets("FoglioBase").Visible = xlSheetVeryHidden
Se avrai altri fogli nascosti però bisognerà rivedere il codice che li ordina
ciao,
codice con una variante, i nomi dei fogli vanno inseriti in "Foglio1" da A1 in giù.
Successivamente si possono inserire altri nomi sotto l'elenco esistente, oppure cancellare l'intervallo con i nomi dei fogli già inseriti e digitarne di nuovi
Sub InsertFogli() Dim i As Integer, c As Integer, r As Integer, x As String, rng As Range, sh As Worksheet r = Foglio1.Range("A" & Rows.count).End(xlUp).Row Set rng = Foglio1.Range("A1:A" & r) If Foglio1.Range("A1") = "" Then MsgBox "nessun foglio da aggiungere": Exit Sub End If For i = 1 To r On Error Resume Next Set sh = Sheets(Foglio1.Cells(i, "A").Value) On Error GoTo 0 If sh Is Nothing Then Sheets.Add ActiveSheet.Name = Sheets("Foglio1").Cells(i, "A").Value Else: Set sh = Nothing End If Next i Call OrdinaFogli Sheets("Foglio1").Move Before:=Worksheets(1) End Sub Sub OrdinaFogli() Dim i As Integer, j As Integer, c As Integer c = ThisWorkbook.Sheets.count For i = 1 To c - 1 For j = 1 To c - i If Sheets(j).Name > Sheets(j + 1).Name Then ThisWorkbook.Sheets(j).Move After:=ThisWorkbook.Sheets(j + 1) End If Next j Next i End Subaltra soluzione, sempre con i nomi dei fogli in "Foglio1" da A1 in giù
Sub InsertFogli() Dim i As Integer, f As Integer, r As Integer, c As Integer, rng As Range, sh As Worksheet Dim n1 As String, n2 As String r = Foglio1.Range("A" & Rows.count).End(xlUp).Row Set rng = Foglio1.Range("A1:A" & r) If Foglio1.Range("A1") = "" Then Exit Sub rng.Sort Key1:=rng.Cells(1, 1), Order1:=xlDescending, Header:=xlNo For i = 1 To r On Error Resume Next Set sh = Sheets(Foglio1.Cells(i, "A").Value) On Error GoTo 0 If sh Is Nothing Then Sheets.Add ActiveSheet.Name = Sheets("Foglio1").Cells(i, "A").Value c = ThisWorkbook.Sheets.count For f = 1 To c n1 = Sheets(f).Name n2 = Sheets("Foglio1").Cells(i, "A").Value If Sheets(f).Name < Sheets("Foglio1").Cells(i, "A").Value And Sheets(f).Name <> "Foglio1" Then Sheets(n2).Move after:=Sheets(n1) End If Next f Else: Set sh = Nothing End If Next i Set sh = Sheets("Foglio1"): sh.Move before:=Worksheets(1) End Subscusate, improvvisamente mi si è presentato il problema che quando vado ad aggiungere un nuovo foglio, una volta fatto non rimango in quello attivo ma in quello precedentemente creato.
La mia esigenza è quindi quella che ogni volta che creo un nuovo foglio col pulsante "Agg Cliente", rimanga nel medesimo foglio per poi inserirne i relativi dati (pulsante "Ins dati")
Visto che l'ho appena nominato, vorrei che ogni volta che avvio la user, il cursore sia direttamente presente nel box "contatore".
Grazie, come sempre, a chi vorrà aiutarmi !!
p.s. allego file esempio
Allegati:
You must be logged in to view attached files.Nella sub inserisciFoglio oltre alle variabili già dichiarate, aggiungi
Dim sh As Worksheetal rigo sotto If nome <> False Then ci scrivi:
Set sh = ActiveSheete verso la fine della macro, dopo ordinaFogli ci scrivi:
sh.ActivatePer quanto riguarda il Focus nella TxtContatore, nell'evento Initilize della UserForm1 prima di
End Subci scrivi:TxtContatore.SetFocusciao Alex,
ho fatto quello che tu mi suggerisci, e ovviamente ti ringrazio, ma aggiunge il foglio senza però selezionarlo.
Ti allego il codice che ho corretto come da tue indicazioni, avrò sbagliato qualcosa ?
Option Explicit Sub inserisciFoglio() Dim sh As Worksheet Dim wsBase As Worksheet, ws As Worksheet Dim nome As Variant Dim trovato As Boolean nome = Application.InputBox("Inserisci il nome del nuovo foglio", "Aggiungi Foglio", Type:=2) If nome <> False Then Set sh = ActiveSheet For Each ws In ThisWorkbook.Worksheets If ws.Name = nome Then trovato = True Exit For End If Next ws If Not trovato Then If nomeValido(nome) Then Set wsBase = ThisWorkbook.Worksheets("FoglioBase") wsBase.Visible = xlSheetVisible wsBase.Copy After:=ThisWorkbook.Worksheets(ThisWorkbook.Worksheets.Count) ActiveSheet.Name = nome Else MsgBox "Il nome inserito non è valido!", vbExclamation, "Controllo nome foglio" Exit Sub End If Else MsgBox "Foglio già esistente!", vbCritical, "Controllo nome foglio" Exit Sub End If ordinaFogli sh.Activate End If End SubE allora non ho capito io cosa vorresti. Tu hai scritto:
quando vado ad aggiungere un nuovo foglio, una volta fatto non rimango in quello attivo ma in quello precedentemente creato.
Cioè io ho inteso che tu, anche quando crei un nuovo foglio, vuoi comunque restare nel foglio dove hai premuto il pulsante che lancia la macro che crea il nuovo foglio.
A questo punto spiegati meglio.
esempio: come primo passaggio creo con il pulsante "Agg Cliente" il foglio denominato PLUTO, ci inserisco i dati che mi servono tramite user (pulsante "Ins Dati"), e salvo. Fin qui ... ok
Spingo nuovamente il pulsante "Agg Cliente" per creare il foglio PAPERINO, ma in questo caso, una volta creato quest'ultimo, rimango sempre nel foglio PLUTO e non vado in quello appena creato (PAPERINO) per poi lavorarci.
La mia esigenza è quella di andare a lavorare automaticamente nel nuovo foglio, senza selezionarlo manualmente nel modo classico.
Spero di essermi spiegato
Grazie
Be' in realtà, senza le modifiche che ti avevo suggerito, già fa quello che vorresti. Quando aggiungi un nuovo foglio, poi quest'ultimo diventa attivo.
Non capisco quale problema riscontri.
hai ragione e chiedo scusa, ma ieri usando il file che ho allegato (sempre ieri) non mi funzionava, ovvero non rendeva automaticamente attivo il nuovo.
Ora però ho scoperto quando fa il difetto. Se io creo nuovi fogli senza inserirvi nessun dato a ciascuno di loro, allora tutto ok, mentre se inserisco i dati sul foglio "xyz" col pulsante "Ins Dati", e poi ne vado a crearne uno nuovo, rimango sempre su quello iniziale.
Ecco dove sta il problema, nel senso che penso che risieda nelle istruzioni previste dal pulsante "Ins Dati" e non "Agg Cliente"
Nel pulsante "Ins Dati" c'è solo la macro che mostra la UserForm
Comunque ho simulato come hai specificato ma ribadisco che non riscontro problemi. Si crea il nuovo foglio e diventa attivo.
Mi permetto di chiederti una cortesia, ovvero simulare non solo creando fogli, perché come già detto, funziona anche a me.
La simulazione da fare è creare un foglio, riempirlo con tutti i dati tramite userform, e poi creare un altro foglio nuovo. Ti accorgerai che facendo quest'ultima cosa, non diventa attivo lui ma ci rimane il precedente
Buongiorno, ripensandoci .....
potrebbe mancare qualche istruzione, a risolvere il problema, nel tasto ok della user (cmdInvia) ?
La simulazione da fare è creare un foglio, riempirlo con tutti i dati tramite userform, e poi creare un altro foglio nuovo
Appena potrò gli ridarò uno sguardo, ma 2 giorni fa quando avevo provato mi ricordo di aver fatto la prova esattamente come hai descritto.
-
AutoreArticoli
