Ayuda por favor:
Estoy trabajando con los meses del año Ene13, Feb13, Mar13 , etc y tengo tres hojas con los nombres de - Cliente , Txt y Mes, las cuales son mi base para hacer mis informes mensuales, cada que comienza un nuevo mes tengo que crear un nuevo mes, mi consulta es como ordenar por mes mis hojas de calculo execptuando mis tres hojas bases ?? desde ya muchas gracias por su tiempo
Saludos
Jesús
Todo sería más sencillo si los nombres de los meses ordenados alfabéticamente se correspondiesen con el orden cronológico, pero no es así
por supuesto, esto habrá que hacerlo mediante una macro.
En tu caso, que tienes Ene13, Feb13, Mar13 (hasta aquí vamos bien), Abr13 (ya lo estropeamos...)
Tendrías que obtener el mes a partir de las tres primeras letras del nombre de la hoja. Bueno, con la función Left de VBA lo tenemos hecho.
pero necesitamos convertir esas tres letras en algo que podamos ordenar
Imagina una función como esta:
Function numero_de_mes(iniciales_del_mes As String) As Integer
Select Case iniciales_del_mes
Case "Ene"
numero_de_mes = 1
Case "Feb"
numero_de_mes = 2
Case "Mar"
numero_de_mes = 3
Case "Abr"
numero_de_mes = 4
Case "May"
numero_de_mes = 5
Case "Jun"
numero_de_mes = 6
Case "Jul"
numero_de_mes = 7
Case "Ago"
numero_de_mes = 8
Case "Sep"
numero_de_mes = 9
Case "Oct"
numero_de_mes = 10
Case "Nov"
numero_de_mes = 11
Case "Dic"
numero_de_mes = 12
Case Else
'si no sabemos, lo ponemos al final
numero_de_mes = 13
End Select
End Function
Esta función devuelve el número de mes.
Ahora podríamos adaptar la función de este otr tema del foro: http://www.necesitomas.com/ordenar-hojas-libro-excepto-menu#comment-8159
para que ordene las hojas, comprobando que su nombre no sea ni cliente, ni Txt ni Mes, y empleando esta función numero_de_mes que hemos definido antes, para obtener el número que corresponde al mes indicado por las tres primeras letras del nombre.
Sub OrdenarHojasPorMes()
Dim i As Integer, j As Integer, x As Integer
x = Sheets.Count
On Error GoTo ErrorTrap:
For i = 1 To x - 1
For j = i + 1 To x
If Sheets(j).Name <> "Cliente" _
And Sheets(j).Name <> "Txt" _
And Sheets(j).Name <> "Mes" Then
If numero_de_mes(Left(Sheets(j).Name, 3)) < numero_de_mes(Left(Sheets(i).Name, 3)) Then
Sheets(j).Move before:=Sheets(i)
End If
End If
Next
Next
Sheets(1).Select
ErrorTrap:
End Sub
------
Ya sé Excel, pero necesito más.
Estimado PacoMegia , buena idea, solo que , todo tengo que poner un un solo modulo?
Gracias
Jesús
Jesus Martinez Plantarosa
Sí, ponlo todo en un mismo módulo
en realidad no es obligatorio que esté en el mismo módulo, pero así será más sencillo de mantener en el futuro.
------
Ya sé Excel, pero necesito más.
Gracias milll
saludos
Jesús
Jesus Martinez Plantarosa
Buen día.
Primero que todo mil gracias por los aportes.
Soy nuevo en esto de macros, quiero hacer un pequeño aporte con respecto al código asignado, solo son un par de detalles.
Copio el codigo dado con los ajustes personales.
Function NUM_MES(INI_MES As String) As Integer
Select Case INI_MES
Case "ENE"
NUM_MES = 1
Case "FEB"
NUM_MES = 2
Case "MAR"
NUM_MES = 3
Case "ABR"
NUM_MES = 4
Case "MaAY"
NUM_MES = 5
Case "JUN"
NUM_MES = 6
Case "JUL"
NUM_MES = 7
Case "AGO"
NUM_MES = 8
Case "SEP"
NUM_MES = 9
Case "OCT"
NUM_MES = 10
Case "NOV"
NUM_MES = 11
Case "DIC"
NUM_MES = 12
Case Else
'Sí no sabemos, lo ponemos al final
NUM_MES = 13
End Select
End Function
Sub HOJAS_ENE_DIC()
Dim A As Integer, B As Integer, X As Integer
X = Sheets.Count
On Error GoTo ERROR_CONTEO:
For A = 1 To X
Sheets(A).Visible = True
For B = A + 1 To X
Sheets(B).Visible = True
If NUM_MES(Left(UCase(Sheets(A).Name), 3)) > NUM_MES(Left(UCase(Sheets(B).Name), 3)) Then
Sheets(B).Move before:=Sheets(A)
End If
Next B
Next A
Sheets(1).Select
ERROR_CONTEO:
End Sub
Feliz día.