# Macro para convertir número a texto fecha



## Aretradeser (Oct 2, 2013)

Necesito una macro para que cuando introduzaca un numero en la celdas A1 y A2, me devuelva el mes, en texto, correspondiente a ese número.
Ejemplo: 1 devuelva Enero; 2 devuelva Febrero; 3 devuelva Marzo...12 devuelva Diciembre.
Gracias,
Saludos


----------



## Héctor Miguel (Oct 2, 2013)

tu consulta parece confusa (?)

quieres que al introducir (p.e.) 1 en [A1] aparezca "enero" en la misma [A1] ?
y si introduces (p.e.) 5 en [A2] aparezca "mayo" en la misma [A2] ?

o quieres que el numero que introduzcas en [A1] aparezca el mes en letra en [A2] ?

saludos,
hector.


----------



## Aretradeser (Oct 2, 2013)

Héctor Miguel said:


> tu consulta parece confusa (?)
> 
> quieres que al introducir (p.e.) 1 en [A1] aparezca "enero" en la misma [A1] ?
> y si introduces (p.e.) 5 en [A2] aparezca "mayo" en la misma [A2] ?
> ...


Que al introducir (p.e.) 1 en [A1] aparezca "enero" en la misma [A1].
y si introduzco (p.e.) 5 en [A2] aparezca "mayo" en la misma [A2] ?


----------



## Héctor Miguel (Oct 2, 2013)

haz un clic-secundario sobre el nombre en la etiqueta de "esa" hoja y selecciona: "ver código" (se abrirá el editor de VBA)
copia/pega (o escribe) lo siguiente:

Private Sub Worksheet_Change(ByVal Target As Range)
  Select Case Target.Address
    Case "$A$1", "$A$2"
      If Target < 1 Or Target > 12 Or Not IsNumeric(Target) Then Exit Sub
      Application.EnableEvents = False
      Target = Format(DateSerial(2000, Target, 1), "mmmm")
      Application.EnableEvents = True
  End Select
End Sub

regresa a la interfaz de Excel (atajo: Alt + Q)
introduce valores entre 1 y 12 en esas celdas [A1] y [A2]

saludos,
hector.


----------



## Aretradeser (Oct 3, 2013)

Gracias Héctor Miguel, funciona perfectamente; pero con lo único que no había contado es que ahora, al devolverme el valor como texto, no puedo utilizar estas celdas en los cáculos. Antes, al poner números, que se correspondían con los meses, podía utilizarlos, ahora no. Quizás la solución pase con crear un formato personalizado de celda, pero las docenas de pruebas que he realizado no me han dado resultado alguno. Si se te ocurre algo, te agradeceré tus comentarios.
Saludos.


----------



## Héctor Miguel (Oct 3, 2013)

1) cambia la instrucción entre los dos "Application.EnableEvents" (true y false) a lo siguiente:
Target = DateSerial(Year(Date), Target, 1)

2) aplica un formato personalizado a esas celdas de: "mmmm"

el código deposita como fecha el día 1 del mes (1 a 12) entrado en esas celdas (del año en curso)

saludos,
hector.


----------



## Aretradeser (Oct 3, 2013)

Héctor Miguel said:


> 1) cambia la instrucción entre los dos "Application.EnableEvents" (true y false) a lo siguiente:
> Target = DateSerial(Year(Date), Target, 1)
> 
> 2) aplica un formato personalizado a esas celdas de: "mmmm"
> ...



Me da error, siquieres te envio el archivlo de ejemplo


----------



## Héctor Miguel (Oct 3, 2013)

el tema deja de ser sencillo después de que las celdas contienen datos de fecha-real
(ya no son valores entre 1 y 12, sino números seriales mas grandes)

con las siguientes modificaciones la macro funciona con un "pero"...
no consigo (aun) obtener el mes 1 (enero), lo voy a seguir investigando (???)

Private Sub Worksheet_Change(ByVal Target As Range)
  Select Case Target.Address
    Case "$A$1", "$A$2"
      Application.EnableEvents = False
      Target = DateSerial(Year(Date), Day(Target) + 1, 1)
      Application.EnableEvents = True
  End Select
 End Sub

saludos,
hector.


----------



## Héctor Miguel (Oct 3, 2013)

ok, después de un poco de I+D (R&D) prueba con el siguiente código:

Private Sub Worksheet_Change(ByVal Target As Range)
  Select Case Target.Address
    Case "$A$1", "$A$2"
      Application.EnableEvents = False
      Target = DateSerial(Year(Date), Day(CDate(Target) + 1), 1)
      Application.EnableEvents = True
  End Select
End Sub

saludos,
hector.


----------



## Aretradeser (Oct 4, 2013)

Hector, funciona perfectamente. Te lo has trabajado a conciencia. En esa  misma hoja, para realizar los cálculos, ya existía la siguiente macro  de la que desconozco su autor, puesto que este libro excel ya existia en  mi oficina. mi perguanta es, se pueden unir ambas en una sola?
Macro
Private Sub Worksheet_Change(ByVal Target As Range)
If Not Intersect(Target, Range("A1:A2")) Is Nothing Then
    For I = 3 To Range("A" & Rows.Count).End(xlUp).Row
        If Range("A2") = "" Or Range("A2") = 0 Then
            ki = 2
            kf = Range("A1")
        Else
            If Range("A2") < Range("A1") Then Exit Sub

            ki = (Range("A1") * 3) - 1
            kf = Range("A2") - Range("A1") + 1
        End If
        z1 = 0: z2 = 0: z3 = 0
        co = 0
        For j = 1 To kf
            z1 = z1 + Cells(I, ki)
            z2 = z2 + Cells(I, ki + 1)
            z3 = z3 + Cells(I, ki + 2)
            ki = ki + 3
            co = co + 1
        Next
        Cells(I, "AL") = z1 / co
        Cells(I, "AM") = z2 / co
        Cells(I, "AN") = z3 / co
    Next
End If
End Sub

Muchas gracias.


----------



## Aretradeser (Oct 2, 2013)

Necesito una macro para que cuando introduzaca un numero en la celdas A1 y A2, me devuelva el mes, en texto, correspondiente a ese número.
Ejemplo: 1 devuelva Enero; 2 devuelva Febrero; 3 devuelva Marzo...12 devuelva Diciembre.
Gracias,
Saludos


----------



## Héctor Miguel (Oct 5, 2013)

el código anterior (entre el "Private..." y el "End Sub") puedes agregarlo al final del código propuesto (entre el "End Select" y el "End Sub")

solo considera los siguientes cambios:

1) tu línea de: => If Range("A2") = "" Or Range("A2") = 0 Then
la cambias a: => If Range("A2") = "" Then

2) todas las referencias a los rangos "A1" y "A2" (del tipo: Range("A1")
las cambias por referencias al mes de esas celdas: p.e.
Month(Range("A1"))

por lo demás, si tienes alguna duda (o información adicional)... comentas ?
saludos,
hector.


----------



## Aretradeser (Oct 6, 2013)

Uniendo el código, según tus indicaciones, me da el siguiente error en la línea que te marco:
CÓDIGO
Private Sub Worksheet_Change(ByVal Target As Range)
Select Case Target.Address
Case "$A$1", "$A$2"
Application.EnableEvents = False
Target = DateSerial(Year(Date), Day(CDate(Target) + 1), 1)
Application.EnableEvents = True
End Select
Select Case Target.Address
Case "$A$1", "$A$2"
Application.EnableEvents = False
Target = DateSerial(Year(Date), Day(CDate(Target) + 1), 1)
Application.EnableEvents = True
End Select
If Not Intersect(Target, Range("A1:A2")) Is Nothing Then
    For I = 3 To Range("A" & Rows.Count).End(xlUp).Row
        If Range("A2") = "" Then
            ki = 2
            kf = Month(Range("A1"))
        Else
            If Range("A2") < Month(Range("A1")) Then Exit Sub


            ki = (Month(Range("A1")) * 3) - 1
            kf = Range("A2") - Month(Range("A1")) + 1
        End If
        z1 = 0: z2 = 0: z3 = 0
        co = 0
        For j = 1 To kf
*            z1 = z1 + Cells(I, ki) >>>error*
            z2 = z2 + Cells(I, ki + 1)
            z3 = z3 + Cells(I, ki + 2)
            ki = ki + 3
            co = co + 1
        Next
        Cells(I, "AL") = z1 / co
        Cells(I, "AM") = z2 / co
        Cells(I, "AN") = z3 / co
    Next
End If
End Sub
Saludos.


----------



## Héctor Miguel (Oct 8, 2013)

antes de continuar...

1) ya notaste que has duplicado las instrucciones del "Select Case Target.Address" (???)

2) al parecer, no leíste (o entendiste) completamente este punto de la sugerencia en el mensaje anterior...


Héctor Miguel said:


> 2) todas las referencias a los rangos "A1" y "A2" (del tipo: Range("A1")
> las cambias por referencias al mes de esas celdas: p.e.
> Month(Range("A1"))



en tu nueva exposición, SOLO a las referencias al rango [A1] les has agregado la función Month(...) pero NO a las referencias al rango [A2] ???

podrías analizar (de nuevo) las sugerencias ofrecidas ?
si no te son claras, te ofrezco postear el código arreglado (con base a estas mismas sugerencias) para tus pruebas

saludos,
hector.

p.d. no lo tomes a mal, pero siempre he considerado (preferentemente) "enseñar a pescar"... que "dar un pescado" :D


----------



## Aretradeser (Oct 8, 2013)

Efectivamente, no me di cuenta, Ya he realizado las modificaciones que me habías indicado y funciona perfectamente.
Muchas gracias, Héctor Miguel, podemos dar por cerrada esta consulta, resuelta a plena satisfacción.


----------



## rodrigosantannalima (Nov 6, 2013)

Bom dia Aretradeser

Infelizmente, apenas agora vi seu tópico(sou novo membro no forum)

Pois bem, penso que poderia fazer da seguinte maneira:

Você tem a coluna A e utiliza A1 e A2.
Em A1, o título é "MES(NUMERO)"
Em A2, o título é "MES(TEXTO)

Inserir a formula em A2
=IFERROR(CHOOSE($A$2;"January";"February";"March";"Abril";"May";"June";"July";"August";"September";"October";"November";"December");"NOT FOUND")
Ao inserir valores entre 1 e 12, ele busca na formula o mês correspondente.
Caso esteja fora da faixa, retorna "NOT FOUND"

Para tal, esconda a formula em A2 para que não possa ser vista.Com isso, você evitar problemas e utiliza macro(VBA) somente onde for necessário.



Espero ter ajudado.


----------

