Sviluppare funzionalita su Microsoft Office con VBA disporre fogli in ordine alfabetico

Login Registrati
Stai vedendo 25 articoli - dal 1 a 25 (di 28 totali)
  • Autore
    Articoli
  • #52148 Score: 0 | Risposta

    Frasubb
    Partecipante
      1 pt

      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 Function

      Grazie

      #52149 Score: 0 | Risposta

      alexps81
      Moderatore
        58 pts

        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 Sub

        Poi nella Sub inserisciFoglio() aggiungi ordinaFogli subito prima dell'ultimo End If

        #52183 Score: 0 | Risposta

        Frasubb
        Partecipante
          1 pt

          Tutto 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.
          #52188 Score: 0 | Risposta

          alexps81
          Moderatore
            58 pts

            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 Sub
            #52198 Score: 0 | Risposta

            vecchio frac
            Senior Moderator
              272 pts

              alexps81 ha scritto:

              Prova 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).

              #52199 Score: 0 | Risposta

              alexps81
              Moderatore
                58 pts

                vecchio frac ha scritto:

                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.

                #52203 Score: 0 | Risposta

                Frasubb
                Partecipante
                  1 pt

                  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.
                  #52208 Score: 0 | Risposta

                  alexps81
                  Moderatore
                    58 pts

                    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 Sub

                    Adesso ogni volta che crei un nuovo foglio, in realtà stai creando una copia di "FoglioBase".

                     

                    #52210 Score: 0 | Risposta

                    Frasubb
                    Partecipante
                      1 pt

                      alexps81 ha scritto:

                      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 Sub
                      

                      Faccio presente che ho tentato di creare un foglio, rinominandolo

                      Allegati:
                      You must be logged in to view attached files.
                      #52220 Score: 0 | Risposta

                      alexps81
                      Moderatore
                        58 pts

                        Ciao, io non riscontro alcun tipo di problema. Prova ad allegare di nuovo il file con le modifiche effettuate

                        #52233 Score: 0 | Risposta

                        Frasubb
                        Partecipante
                          1 pt

                          alexps81 ha scritto:

                          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.
                          #52239 Score: 0 | Risposta

                          alexps81
                          Moderatore
                            58 pts

                            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

                            #52521 Score: 0 | Risposta

                            LukeReds
                            Partecipante
                              19 pts

                              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 Sub
                              

                               

                              #52526 Score: 0 | Risposta

                              LukeReds
                              Partecipante
                                19 pts

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

                                 

                                #52557 Score: 0 | Risposta

                                Frasubb
                                Partecipante
                                  1 pt

                                  scusate, 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.
                                  #52559 Score: 0 | Risposta

                                  alexps81
                                  Moderatore
                                    58 pts

                                    Nella sub inserisciFoglio oltre alle variabili già dichiarate, aggiungi Dim sh As Worksheet

                                    al rigo sotto  If nome <> False Then ci scrivi:

                                    Set sh = ActiveSheet

                                    e verso la fine della macro, dopo ordinaFogli ci scrivi:

                                    sh.Activate

                                    Per quanto riguarda il Focus nella TxtContatore, nell'evento Initilize della UserForm1 prima di End Sub ci scrivi:

                                    TxtContatore.SetFocus
                                    #52565 Score: 0 | Risposta

                                    Frasubb
                                    Partecipante
                                      1 pt

                                      ciao 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 Sub
                                      #52566 Score: 0 | Risposta

                                      alexps81
                                      Moderatore
                                        58 pts

                                        E allora non ho capito io cosa vorresti. Tu hai scritto:

                                        Frasubb ha 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.

                                         

                                        #52567 Score: 0 | Risposta

                                        Frasubb
                                        Partecipante
                                          1 pt

                                          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

                                          #52570 Score: 0 | Risposta

                                          alexps81
                                          Moderatore
                                            58 pts

                                            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. 

                                            #52571 Score: 0 | Risposta

                                            Frasubb
                                            Partecipante
                                              1 pt

                                              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"

                                              #52572 Score: 0 | Risposta

                                              alexps81
                                              Moderatore
                                                58 pts

                                                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.

                                                #52692 Score: 0 | Risposta

                                                Frasubb
                                                Partecipante
                                                  1 pt

                                                  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

                                                  #52697 Score: 0 | Risposta

                                                  Frasubb
                                                  Partecipante
                                                    1 pt

                                                    Buongiorno, ripensandoci .....

                                                    potrebbe mancare qualche istruzione, a risolvere il problema, nel tasto ok della user (cmdInvia) ?

                                                    #52698 Score: 0 | Risposta

                                                    alexps81
                                                    Moderatore
                                                      58 pts

                                                      Frasubb ha scritto:

                                                      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.

                                                    Login Registrati
                                                    Stai vedendo 25 articoli - dal 1 a 25 (di 28 totali)
                                                    Rispondi a: disporre fogli in ordine alfabetico
                                                    Gli allegati sono permessi solo ad utenti REGISTRATI
                                                    Le tue informazioni: