Tengo varias hojas en un libro de excel, quiero ordenarlas pero solo las que cumplan la característica que es que su nombre es numérico de 7 caracteres. Como lo puedo hacer con una macros.
1 Respuesta
Respuesta de José Saúl Méndez Alonso
1
1
José Saúl Méndez Alonso, Programación Avanzada en Visual Basic, VBA, Modelo de Objetos de...
Necesitas mediante una MACRO recorrer la colección de HOJAS y sí cumplen con tu condición entonces guardas el nombre de la hoja en un arreglo, cuando termines el recorrido ordenas el arreglo y luego comienzas a mover las hojas según el orden que obtuviste del arreglo. Dim sHojas() As Variant Dim nNumHoja As Integer Sub OrdenaHojas() Application.ScreenUpdating = False 'Congela la pantalla para que no se vea lo que la MACRO esta haciendo esto es opcional ReDim sHojas(Sheets.Count) nNumHoja = 0 Dim nPos As Integer For Each shoja In Sheets If IsNumeric(shoja.Name) Then nNumHoja = nNumHoja + 1 sHojas(nNumHoja) = shoja.Name End If Next Call OrdenaArreglo(sHojas, LBound(sHojas), UBound(sHojas)) 'Reacomoda las hojas ordenadas nPos = 0 For nNumHoja = LBound(sHojas) To UBound(sHojas) If Trim(sHojas(nNumHoja)) <> "" Then nPos = nPos + 1 Sheets(sHojas(nNumHoja)).Select Sheets(sHojas(nNumHoja)).Move Before:=Sheets(nPos) End If Next Application.ScreenUpdating = True 'Refresca la pantalla End Sub Sub OrdenaArreglo(MiArreglo() As Variant, _ Limite_Inferior As Long, _ Limite_Superior As Long) Dim i As Long, j As Long, x As Variant, y As Variant i = Limite_Inferior j = Limite_Superior x = MiArreglo((Limite_Inferior + Limite_Superior) / 2) While i <= j While (MiArreglo(i) < x) And (i < Limite_Superior) i = i + 1 Wend While (x < MiArreglo(j)) And (j > Limite_Inferior) j = j - 1 Wend If i <= j Then y = MiArreglo(i) MiArreglo(i) = MiArreglo(j) MiArreglo(j) = y i = i + 1 j = j - 1 End If Wend If Limite_Inferior < j Then OrdenaArreglo MiArreglo(), Limite_Inferior, j If i < Limite_Superior Then OrdenaArreglo MiArreglo(), i, Limite_Superior End Sub