È soltanto un Pokémon con le armi o è un qualcosa di più? Vieni a parlarne su Award & Oscar!
 
Pagina precedente | 1 | Pagina successiva
Vota | Stampa | Notifica email    
Autore

macro che riordina fogli con i nomi dei mesi

Ultimo Aggiornamento: 21/04/2015 15:55
Post: 92
Registrato il: 02/08/2014
Città: MILANO
Età: 49
Utente Junior
excel 2010
OFFLINE
20/04/2015 23:16

Ancora una volta bloccato su una cosa per me nuova... ho bisogno di fare una macro che mi riordini alcuni fogli a seconda dei mesi in essi contenuti; faccio un esempio:

in un file excel ho in questa sequenza dei fogli con i nomi dei mesi:
marzo 2015 - giugno 2015 - gennaio 2015 - maggio 2015

la macro mi dovrebbe riordinare i fogli nel modo seguente:
gennaio 2015 - marzo 2015 - maggio 2015 - giugno 2015

Tenete presente che nell'esempio compaiono 4 mesi su 12, ma il numero di mesi può variare.

Ho provato con la seguente macro ma se lavoro con meno di 10 mesi mi da errore:

Sub ordina_mesi()
    Dim J As Integer
    Dim K As Integer
    Dim sMo(12) As String

    sMo(1) = "gennaio 2015"
    sMo(2) = "febbraio 2015"
    sMo(3) = "marzo 2015"
    sMo(4) = "aprile 2015"
    sMo(5) = "maggio 2015"
    sMo(6) = "giugno 2015"
    sMo(7) = "luglio 2015"
    sMo(8) = "agosto 2015"
    sMo(9) = "settembre 2015"
    sMo(10) = "ottobre 2015"
    sMo(11) = "novembre 2015"
    sMo(12) = "dicembre 2015"

    

    For J = 1 To 12
        If Sheets(J).Name <> sMo(J) Then
            For K = J + 1 To Sheets.Count
                If Sheets(K).Name = sMo(J) Then
                    Sheets(K).Move Before:=Sheets(J)
                    
                End If
                
            Next K
        End If
    Next J

    Sheets(1).Activate
End Sub


Allego anche il file di prova, dove oltre ai mesi compaiono altri due fogli "foglio13" e "foglio3" che devono rimanere in quella posizione. Di volta in volta cambieranno solo i fogli con i mesi che verranno importati da altri file(per importarli la macro già c'è ed è funzionante, anche se non è presente in questo file esempio)

Grazie.
[Modificato da rossi1975 20/04/2015 23:18]
Post: 2.957
Registrato il: 13/03/2012
Città: LIVORNO
Età: 78
Utente Veteran
2010
OFFLINE
21/04/2015 08:27

prova questa
Sub ordina_mesi()
    Dim J As Integer
    Dim K As Integer
    Dim sMo(12) As String

    sMo(1) = "gennaio 2015"
    sMo(2) = "febbraio 2015"
    sMo(3) = "marzo 2015"
    sMo(4) = "aprile 2015"
    sMo(5) = "maggio 2015"
    sMo(6) = "giugno 2015"
    sMo(7) = "luglio 2015"
    sMo(8) = "agosto 2015"
    sMo(9) = "settembre 2015"
    sMo(10) = "ottobre 2015"
    sMo(11) = "novembre 2015"
    sMo(12) = "dicembre 2015"
    p = 2
    For J = 1 To 12
      For sh = 3 To Sheets.Count
        If Sheets(sh).Name = sMo(J) Then
           Sheets(sh).Move after:=Sheets(p)
           p = p + 1
        End If
      Next
    Next
End Sub

----------
Win 10 - Excel 2010
allega un file di esempio, guadagnerai tempo tu e lo farai risparmiare a chi ti aiuta
Post: 1.394
Registrato il: 27/10/2003
Città: SESTO SAN GIOVANNI
Età: 43
Utente Veteran
2010
OFFLINE
21/04/2015 08:57

Proposta alternativa con utilizzo dele funzioni "Ubound" e "lbound" giusto per didattica :)

Occhio che in assenza di "Option Base 1" l'arrai "sMo" è composto da 13 elementi, ecco perchè io l'ho dichiarato con indice masismo 11 (0-11 sono 12 elementi)

Poi ho aggiunto una variabile "lY" per indicare l'anno per il quale si vuole alimentare un array, poi ciclandolo si sfrutta la funzioen "Format" per trovare il nome dei mesi.

Infine lo ripercorri al contrario e sposti dopo il primo foglio (che ho capito essere fisso) ogni elemento dell'array, in questo modo li avrai ordinati progressivamente!

Ovvio che in questo caso i cicli potrebbero essere semplicemente "For 1 = 0 to 11" e "For i = 11 to 0 step -1":

Option Explicit
Sub ordina_mesi()
  Dim i As Long, lY As Long
  Dim sMo(11) As String
  
  lY = 2015 'qui per l'anno
  For i = LBound(sMo()) To UBound(sMo())
    sMo(i) = Format("01/" & i + 1 & "/" & lY, "mmmm yyyy") 'alimento un array con elementi da 0 a 11 con "i+1"
  Next i
  
  For i = UBound(sMo()) To LBound(sMo()) Step -1
    On Error Resume Next
    ThisWorkbook.Worksheets(sMo(i)).Move after:=ThisWorkbook.Worksheets(1)
  Next i
  
End Sub
________________________________
Excel 2010 - Win 7 Ufficio
Excel 2013 - Win 8 Casa

A poche informazioni corrispondono poche spiegazioni.
Post: 2.958
Registrato il: 13/03/2012
Città: LIVORNO
Età: 78
Utente Veteran
2010
OFFLINE
21/04/2015 12:38

Molto meglio, ma perché hai messo On Error Resume Next all'interno del loop ?

----------
Win 10 - Excel 2010
allega un file di esempio, guadagnerai tempo tu e lo farai risparmiare a chi ti aiuta
Post: 1.400
Registrato il: 27/10/2003
Città: SESTO SAN GIOVANNI
Età: 43
Utente Veteran
2010
OFFLINE
21/04/2015 13:23

Perchè in caso di assenza del foglio "iesimo" si inchioderebbe il codice [SM=g27811]
________________________________
Excel 2010 - Win 7 Ufficio
Excel 2013 - Win 8 Casa

A poche informazioni corrispondono poche spiegazioni.
Post: 93
Registrato il: 02/08/2014
Città: MILANO
Età: 49
Utente Junior
excel 2010
OFFLINE
21/04/2015 13:43

Grazie mille... 2 soluzioni entrambe funzionanti... grandi!!! [SM=x423028]
Post: 2.959
Registrato il: 13/03/2012
Città: LIVORNO
Età: 78
Utente Veteran
2010
OFFLINE
21/04/2015 15:55

Re:
Davide Turbo Neofita, 21/04/2015 13:23:

Perchè in caso di assenza del foglio "iesimo" si inchioderebbe il codice [SM=g27811]


non ne basta uno prima del for ?


----------
Win 10 - Excel 2010
allega un file di esempio, guadagnerai tempo tu e lo farai risparmiare a chi ti aiuta
Vota:
Amministra Discussione: | Chiudi | Sposta | Cancella | Modifica | Notifica email Pagina precedente | 1 | Pagina successiva
Nuova Discussione
 | 
Rispondi
Feed | Forum | Bacheca | Album | Utenti | Cerca | Login | Registrati | Amministra
Tutti gli orari sono GMT+01:00. Adesso sono le 04:49. Versione: Stampabile | Mobile | Regolamento | Privacy
FreeForumZone [v.6.1] - Copyright © 2000-2024 FFZ srl - www.freeforumzone.com