# Cómo convierto fechas a texto



## scano (Oct 29, 2002)

Deseo que al introducir una fecha en una celda, en otra aparezca su equivalente en texto. Ejemplo: 
Que al introducir en la celda A1 la fecha 18-06-1966, en la celda A2 aparezca DIECIOCHO DE JUNIO DE MIL NOVECIENTOS SESENTA Y SEIS
He buscado y buscado sin suerte.
Si lo que digo es una barbaridad, por favor también diganmelo. Por cierto, alguien sabe porque DATEIF() está disponible en la versión en ingles pero no en la version en español de excel?


----------



## Juan Pablo González (Oct 29, 2002)

Es una barbaridad !   No, mentiras, pero nunca había visto esa pregunta... depronto con la función que puso Roberto se puede hacer algo.

En cuanto a lo otro, la función sí existe en español, solo que con otro nombre, creo que es algo como SI.FECHA, voy a buscarla ahora.


----------



## scano (Oct 30, 2002)

Gracias por tu atención Juan Pablo,

Vi el código de roberto, y encontré elgo semejante en http://www.e-mision.net/crazyhouse/servicios/msgforo.asp?q=20020810060655&o=A , pero es para Visual Basic, dice:

´Copia todo esto en un modulo y te permitira
´un calculo exacto en años, meses y dias enviandole 
´dos fechas,
´ lo acabo de hacer, si tenes alguna duda preguntame via mail

Option Explicit
Dim X As Integer
Dim Años, Meses, Dias As Integer
Dim AMayor, AMenor As Date
Dim MMayor, MMenor As Date
Public Function Diferencia(Fecha1 As Date, Fecha2 As Date) As String

If Year(Fecha1) >= Year(Fecha2) Then
AMayor = Fecha1
AMenor = Fecha2
Else
AMayor = Fecha2
AMenor = Fecha1

End If

´ Diferencia de meses
Meses = 0
For X = 0 To 22
If Month(AMenor) + X < 12 Then
If Month(AMayor) = Month(AMenor) + X Then
Exit For
Else
Meses = Meses + 1
End If
Else
If Month(AMayor) = Month(AMenor) + X - 12 Then
Exit For
Else
Meses = Meses + 1
End If
End If
Next


´ Diferencia de años
Años = Year(AMayor) - Year(AMenor) - 1
If Años = -1 Then
Años = 0
End If
´ Diferencia de dias
If Day(AMayor) >= Day(AMenor) Then
Dias = Day(AMayor) - Day(AMenor)
Else
Dias = Day(AMenor) - Day(AMayor)
Meses = Meses - 1
End If
Diferencia = Años & " años " & Meses & " meses y " & Dias & " dias"
End Function
---

Repito: tengo excel en español y ni idea de cómo adaptar el código. Alguna sugerencia?
Gracias anticipadas.


----------



## Juan Pablo González (Oct 30, 2002)

Aparentemente, no hay necesidad de adaptar el código.  Simplemente copiarlo en un módulo (estándar, no de clase), y ya se puede usar la función directamente en Excel.


----------



## scano (Oct 31, 2002)

Mmmm, entiendo lo que dices Juan Pablo
respecto a los códigos,sin embargo, cuando digo "adaptarlo", me refiero a que el resultado que busco no es la diferencia entre dos fechas en años, meses y días (como resuelve el código); lo que busco es trasladar una fecha cualquiera en su equivalente texto.

Tengo una idea que voy a desarrollar a partir de los ejemplos ya vistos. 

Gracias de nuevo por tu atención y comentarios.


----------



## Juan Pablo González (Nov 1, 2002)

Bueno, esto parece funcionar, aunque hoy, aparece como

UNO DE NOVIEMBRE DE DOS MIL DOS

El código de Numero_A_Letras lo encontré AQUI<pre>'Convierte 0< Numero< 1.000.000.000
Private Function Numeros_A_Letras(Numero As Double) As String
Dim Letras As String
Dim HuboCentavos As Boolean
Dim Decimales As Double
Decimales = Numero - Int(Numero)
Numero = Int(Numero)
Dim Numeros(90) As String
Numeros(0) = "cero"
Numeros(1) = "uno"
Numeros(2) = "dos"
Numeros(3) = "tres"
Numeros(4) = "cuatro"
Numeros(5) = "cinco"
Numeros(6) = "seis"
Numeros(7) = "siete"
Numeros(8) = "ocho"
Numeros(9) = "nueve"
Numeros(10) = "diez"
Numeros(11) = "once"
Numeros(12) = "doce"
Numeros(13) = "trece"
Numeros(14) = "catorce"
Numeros(15) = "quince"
Numeros(20) = "veinte"
Numeros(30) = "treinta"
Numeros(40) = "cuarenta"
Numeros(50) = "cincuenta"
Numeros(60) = "sesenta"
Numeros(70) = "setenta"
Numeros(80) = "ochenta"
Numeros(90) = "noventa"
Do
    '*---> Centenas de Millón
    If (Numero< 1000000000) And (Numero >= 100000000) Then
        If (Int(Numero / 100000000) = 1) And ((Numero - (Int(Numero / 100000000) * 100000000))< 1000000) Then
            Letras = Letras & "cien millones "
        Else
            Select Case Int(Numero / 100000000)
            Case 1
                Letras = Letras & "ciento"
            Case 5
                Letras = Letras & "quinientos"
            Case 7
                Letras = Letras & "setecientos"
            Case 9
                Letras = Letras & "novecientos"
            Case Else
                Letras = Letras & Numeros(Int(Numero / 100000000))
            End Select
            If (Int(Numero / 100000000)<> 1) And (Int(Numero / 100000000)<> 5) And (Int(Numero / 100000000)<> 7) _
                And (Int(Numero / 100000000)<> 9) Then
                Letras = Letras & "cientos "
            Else
                Letras = Letras & " "
            End If
        End If
        Numero = Numero - (Int(Numero / 100000000) * 100000000)
    End If
    '*---> Decenas de Millón
    If (Numero< 100000000) And (Numero >= 10000000) Then
        If Int(Numero / 1000000)< 16 Then
            Letras = Letras & Numeros(Int(Numero / 1000000))
            Letras = Letras & " millones "
            Numero = Numero - (Int(Numero / 1000000) * 1000000)
        Else
            Letras = Letras & Numeros(Int(Numero / 10000000) * 10)
            Numero = Numero - (Int(Numero / 10000000) * 10000000)
            If Numero > 1000000 Then
                Letras = Letras & " y "
            End If
        End If
    End If
    '*---> Unidades de Millón
    If (Numero< 10000000) And (Numero >= 1000000) Then
        If Int(Numero / 1000000) = 1 Then
            Letras = Letras & " un millón "
        Else
            Letras = Letras & Numeros(Int(Numero / 1000000))
            Letras = Letras & " millones "
        End If
        Numero = Numero - (Int(Numero / 1000000) * 1000000)
    End If
    '*---> Centenas de Millar
    If (Numero< 1000000) And (Numero >= 100000) Then
        If (Int(Numero / 100000) = 1) And ((Numero - (Int(Numero / 100000) * 100000))< 1000) Then
            Letras = Letras & "cien mil "
        Else
            Select Case Int(Numero / 100000)
            Case 1
                Letras = Letras & "ciento"
            Case 5
                Letras = Letras & "quinientos"
            Case 7
                Letras = Letras & "setecientos"
            Case 9
                Letras = Letras & "novecientos"
            Case Else
                Letras = Letras & Numeros(Int(Numero / 100000))
            End Select
            If (Int(Numero / 100000)<> 1) And (Int(Numero / 100000)<> 5) And (Int(Numero / 100000)<> 7) _
                And (Int(Numero / 100000)<> 9) Then
                Letras = Letras & "cientos "
            Else
                Letras = Letras & " "
            End If
        End If
        Numero = Numero - (Int(Numero / 100000) * 100000)
    End If
    '*---> Decenas de Millar
    If (Numero< 100000) And (Numero >= 10000) Then
        If Int(Numero / 1000)< 16 Then
            Letras = Letras & Numeros(Int(Numero / 1000))
            Letras = Letras & " mil "
            Numero = Numero - (Int(Numero / 1000) * 1000)
        Else
            Letras = Letras & Numeros(Int(Numero / 10000) * 10)
            Numero = Numero - (Int((Numero / 10000)) * 10000)
            If Numero > 1000 Then
                Letras = Letras & " y "
            Else
                Letras = Letras & " mil "
            End If
        End If
    End If
    '*---> Unidades de Millar
    If (Numero< 10000) And (Numero >= 1000) Then
        If Int(Numero / 1000) = 1 Then
            Letras = Letras 'Letras & "un"
        Else
            Letras = Letras & Numeros(Int(Numero / 1000))
        End If
        Letras = Trim(Letras & " mil") & " "
        Numero = Numero - (Int(Numero / 1000) * 1000)
    End If
    '*---> Centenas
    If (Numero< 1000) And (Numero > 99) Then
        If (Int(Numero / 100) = 1) And ((Numero - (Int(Numero / 100) * 100))< 1) Then
            Letras = Letras & "cien "
        Else
            Select Case Int(Numero / 100)
            Case 1
                Letras = Letras & "ciento"
            Case 5
                Letras = Letras & "quinientos"
            Case 7
                Letras = Letras & "setecientos"
            Case 9
                Letras = Letras & "novecientos"
            Case Else
                Letras = Letras & Numeros(Int(Numero / 100))
            End Select
            If (Int(Numero / 100)<> 1) And (Int(Numero / 100)<> 5) And (Int(Numero / 100)<> 7) _
                And (Int(Numero / 100)<> 9) Then
                Letras = Letras & "cientos "
            Else
                Letras = Letras & " "
            End If
        End If
        Numero = Numero - (Int(Numero / 100) * 100)
    End If
    '*---> Decenas
    If (Numero< 100) And (Numero > 9) Then
        If Numero< 16 Then
            Letras = Letras & Numeros(Int(Numero))
            Numero = Numero - Int(Numero)
        Else
            Letras = Letras & Numeros(Int((Numero / 10)) * 10)
            Numero = Numero - (Int((Numero / 10)) * 10)
            If Numero > 0.99 Then
                Letras = Letras & " y "
            End If
        End If
    End If
    '*---> Unidades
    If (Numero< 10) And (Numero > 0.99) Then
       Letras = Letras & Numeros(Int(Numero))
       Numero = Numero - Int(Numero)
    End If
Loop Until (Numero = 0)
'*---> Decimales
If (Decimales > 0) Then
    Letras = Letras & " con "
    Letras = Letras & Format(Decimales * 100, "00") & "/100 centavos"
End If
Numeros_A_Letras = Letras '"pesos " & Letras
End Function

Function FechaALetras(Fecha As Double) As String
    Dim tmp As String
    'Dia
    tmp = Numeros_A_Letras(Day(Fecha)) & " de "
    'Mes
    tmp = tmp & Format(Fecha, "mmmm") & " de "
    'Año
    tmp = tmp & Numeros_A_Letras(Year(Fecha))
    FechaALetras = UCase(tmp)
End Function</pre>Espero que sirva.

_________________
Regards,

Juan Pablo G.
MrExcel.com Consulting
This message was edited by  Juan Pablo G. on 2002-11-01 17:53


----------



## Juan Pablo González (Nov 1, 2002)

Leyendo un poco más esa página, ví que aparentemente hay unos errores con la función de Numero_A_Letras, pero también ponen un vínculo a http://guille.costasol.net/indice.asp que tiene muchas cosas interesantes, y en Español.


----------



## scano (Nov 4, 2002)

Juan Pablo,

Nuevamente agradezco el tiempo que haz dedicado a mi problema.

Como te mencioné en mi anterior mensaje, a estas alturas estoy concluyendo una posible solución a mi problema, la estoy limpiando de errores para presentartela, no es elegante, pero me funciona como necesito. Seguramente alguien con conocimiento más avanzado la podrá implementar desde un modulo de VBA. Intentaré convertirla a código como el que has proporcionado para ver cual funciona mejor.

Por otra parte, déjame te cuento que encontré documentada en la ayuda de Excel el equivalente en español de la función    DATEIF(), es SIFECHA() sin embargo no la encuentro en el listado de fechas, de modo que no la puedo usar.

Activé en Herramientas|Complementos la opción Herramientas para análisis y pude acceder a funciones de fecha adicionales, luego active también la opción Herramientas para análisis - VBA y ahora tengo una mezcla de funciones en ingles y español bajo el menu de funciones. Qué desorden!.

Juan Pablo, si con las funciones ahora disponibles desarrollo la hoja como la necesito y la distribuyo, quienes la reciban deberán activar las opciones que yo para que funcione, o no es necesario hacer eso?

Gracias.
scano.


----------



## Juan Pablo González (Nov 4, 2002)

La función SIFECHA funciona sin necesidad del complemento "Herramientas de Analisis".  Lo que pasa es que, por alguna razón, la gente de Excel no le gusta "mostrar" la función, pero si se puede utilizar:Libro1ABCD104/11/2002230/09/2002335Hoja1

Ahora, cuando uno utiliza funciones de complementos, y le envía a otra persona el libro, pasan dos cosas:

1) La otra persona tiene el complemento y lo tiene instalado, lo que hace que el libro funcione bien.

2) La otra persona no tiene el complemento y/o no lo tiene instalado, Excel funciona más o menos, porque como no encuentra las funciones, saca el error #¿NOMBRE?, por lo que sí es necesario que la otra persona tenga el complemento instalado si se quiere usar esas funciones.


----------



## scano (Nov 5, 2002)

Caramba Juan Pablo, sí que eres bueno en lo que haces!.

Gracias, ya pude usar el (al menos para mi) problemático SIFECHA().

Estoy retrasado en mostrarte mi propuesta de solución que ya te habia mencionado, porque he tenido mucho trabajo y en casa mi hija de 8 meses enfermó. Espero que mi post dure lo suficiente para mostrar mi hoja de cálculo.

scano.


----------



## scano (Oct 29, 2002)

Deseo que al introducir una fecha en una celda, en otra aparezca su equivalente en texto. Ejemplo: 
Que al introducir en la celda A1 la fecha 18-06-1966, en la celda A2 aparezca DIECIOCHO DE JUNIO DE MIL NOVECIENTOS SESENTA Y SEIS
He buscado y buscado sin suerte.
Si lo que digo es una barbaridad, por favor también diganmelo. Por cierto, alguien sabe porque DATEIF() está disponible en la versión en ingles pero no en la version en español de excel?


----------



## tomcatplus (Jul 19, 2006)

*Propuesta...*

No se si te sirva pero yo quise realizar esa misma formula pero sin usar Visual Basic y lo logre usando la siguiente formula:

Suponiendo que tengas la fecha que quieras convertir en la celda A1: =CONCATENAR(TEXTO(DIA(A1);"dd");" de ";MINUSC(TEXTO(A1;"mmmm"));" de ";AÑO(A1)). Eso te da como resultado 19 de julio de 2006. Espero que te sea de utilidad.


----------

