Koen ha una cartella di lavoro contenente 150 fogli di lavoro, uno per ogni ramo aziendale. Deve ordinare quei fogli in base alla regione a cui appartiene ogni ramo. (Ci sono cinque regioni nella sua azienda.) Nota inoltre che sarebbe fantastico se il colore della scheda per ogni foglio di lavoro potesse riflettere la regione e si chiede se tale ordinamento sia possibile in Excel.

Sì, tale ordinamento è possibile, ma richiede l’uso di una macro.

La parte più difficile della creazione della macro è definire come determinare quali rami si trovano in quale regione. Forse il modo più semplice per farlo è assicurarsi che i fogli di lavoro utilizzino uno schema di denominazione che includa sia le informazioni sulla regione che sul ramo. Ad esempio, potresti denominare i fogli di lavoro qualcosa come “Reg01-Branch123”. La tua macro potrebbe quindi passare attraverso ogni foglio di lavoro e fare sia la colorazione che l’ordinamento.

Sub SortWorksheets()

Dim iReg As Integer     Dim I As Integer     Dim J As Integer     Dim K As Integer     Dim ws As Worksheet

Application.ScreenUpdating = False

' Set tab colors     For Each ws in Worksheets         iReg = Val(Mid(ws.Name,4,2))

Select Case iReg             Case 1                 ws.Tab.Color = vbRed             Case 2                 ws.Tab.Color = vbYellow             Case 3                 ws.Tab.Color = vbBlue             Case 4                 ws.Tab.Color = vbGreen             Case 5                 ws.Tab.Color = vbCyan             Case Else                 ws.Tab.ColorIndex = xlColorIndexNone         End Select     Next ws

' Sort the worksheets     For I = 1 To Sheets.Count - 1         K = I         For J = I + 1 To Sheets.Count             If UCase(Sheets(K).Name) > UCase(Sheets(J).Name) Then K = J         Next J         If K <> I Then Sheets(K).Move Before:=Sheets(I)

Next I

Application.ScreenUpdating = True End Sub

La macro funziona due volte attraverso la raccolta dei fogli di lavoro. Al primo passaggio, il numero della regione viene estratto dal nome del foglio di lavoro.

Questo viene quindi utilizzato (nella struttura Seleziona caso) per impostare il colore della scheda.

Se il numero di regione non è compreso nell’intervallo 1-5, non viene apportata alcuna modifica al colore della scheda.

Se la tua determinazione di quale ramo si trova in quale regione è più complessa, dovrai regolare la macro di conseguenza. Ad esempio, potresti avere un foglio di lavoro denominato “Chiave regione” che contiene, nella colonna A, i nomi di ciascuno dei tuoi rami e, nella colonna B, il numero di regione corrispondente per ciascuno di questi rami. Supponendo che i dati effettivi inizino nella riga 2, è possibile modificare la macro nel modo seguente:

Sub SortWorksheets2()

Dim sTemp As String     Dim iReg As Integer     Dim I As Integer     Dim J As Integer     Dim K As Integer     Dim ws As Worksheet     Dim key As Worksheet

Application.ScreenUpdating = False

Set key = Worksheets("Region Key")



' Set tab colors     For Each ws in Worksheets         sTemp = UCase(ws.Name)

I = 2    ' Beginning row number         iReg = 0         While key.Cells(I, 1) > ""

If UCase(key.Cells(I, 1)) = sTemp Then iReg = key.Cells(I, 2)

I = I + 1         Wend         Select Case iReg             Case 1                 ws.Tab.Color = vbRed             Case 2                 ws.Tab.Color = vbYellow             Case 3                 ws.Tab.Color = vbBlue             Case 4                 ws.Tab.Color = vbGreen             Case 5                 ws.Tab.Color = vbCyan             Case Else                 ws.Tab.ColorIndex = xlColorIndexNone         End Select     Next ws

' Sort the worksheets     For I = 1 To Sheets.Count - 1         K = I         For J = I + 1 To Sheets.Count             If UCase(Sheets(K).Name) > UCase(Sheets(J).Name) Then K = J         Next J         If K <> I Then Sheets(K).Move Before:=Sheets(I)

Next I     Sheets("Region Key").Move Before:=Sheets(1)



Application.ScreenUpdating = True End Sub

La più grande differenza tra questa macro e la precedente è che questa prende il numero di regione da un foglio di lavoro. Come ultima azione nella macro, il foglio di lavoro “Chiave regione” viene spostato all’inizio della raccolta Fogli di lavoro.

Nota che questa seconda macro può anche far apparire le schede del tuo foglio di lavoro, nella parte inferiore della finestra del programma, come un caleidoscopio di colori.

Il motivo è che le schede sono ordinate in base ai loro nomi, non ai loro colori. Questo differisce dalla prima macro, che effettivamente ordinava per regione e poi per ramo perché i fogli di lavoro erano denominati utilizzando quel modello. Se vuoi usare ancora la “Region Key”

avvicinati e ordina per regione e poi ramifica, puoi farlo aggiustando un po ‘di più la macro:

Sub SortWorksheets3()

Dim sTemp As String     Dim sSortArray(499) As String     Dim iReg As Integer     Dim I As Integer     Dim J As Integer     Dim K As Integer     Dim ws As Worksheet     Dim key As Worksheet

Application.ScreenUpdating = False

Set key = Worksheets("Region Key")



' Set tab colors and build sort array     J = 0     For Each ws in Worksheets         sTemp = UCase(ws.Name)

I = 2    ' Beginning row number         iReg = 0         While key.Cells(I, 1) > ""

If UCase(key.Cells(I, 1)) = sTemp Then iReg = key.Cells(I, 2)

I = I + 1         Wend

J = J + 1         sSortArray(J) = Right("00" & iReg, 2) & " " & ws.Name

Select Case iReg             Case 1                 ws.Tab.Color = vbRed             Case 2                 ws.Tab.Color = vbYellow             Case 3                 ws.Tab.Color = vbBlue             Case 4                 ws.Tab.Color = vbGreen             Case 5                 ws.Tab.Color = vbCyan             Case Else                 ws.Tab.ColorIndex = xlColorIndexNone                 ' Force into incorrect region area for sort                 sSortArray(J) = "00 " & ws.Name         End Select     Next ws

' Sort the worksheets     For I = 1 To Sheets.Count - 1         K = I         For J = I + 1 To Sheets.Count             If UCase(sSortArray(K)) > UCase(sSortArray(J)) Then K = J         Next J         If K <> I Then             Sheets(K).Move Before:=Sheets(I)

sTemp = sSortArray(K)

For J = K To I Step -1                 sSortArray(J) = sSortArray(J-1)

Next J             sSortArray(I) = sTemp         End If     Next I     Sheets("Region Key").Move Before:=Sheets(1)



Application.ScreenUpdating = True End Sub

Si noti che questa iterazione della macro si basa su un array di supporto (sSortArray) per tenere traccia di come devono essere ordinati i nomi nei fogli di lavoro.

_Nota: _

Se desideri sapere come utilizzare le macro descritte in questa pagina (o in qualsiasi altra pagina dei siti ExcelTips), ho preparato una pagina speciale che include informazioni utili.

ExcelTips è la tua fonte di formazione economica su Microsoft Excel.

Questo suggerimento (13710) si applica a Microsoft Excel 2007, 2010, 2013, 2016, 2019 e Excel in Office 365.