Eduardo:

Aquí te doy una solución alternativa. Que si bien es más compleja y sólo
convierte a fechas los valores de la columna actual, la pongo a modo de
ejemplo de las capacidades de los servicios e interfaces de la API UNO.

Coincido contigo en que el paradigma y la estructura e interrelación de
los servicios e interfaces es dantesco, y a primera vista causa rechazo
y algo de frustración, ya que no hay muchos ejemplos disponibles. Pero a
medida que programas y comprendes el porqué se estructura de esa manera,
ya no parece tan antinatural, y vas más rápido.

Estúdialo y modifícalo a voluntad, si de algo te sirve.

Saludos,

Santiago




REM  *****  Inicio del código  *****

Sub modificarFechas ()

Dim oDoc As Object
Dim oHoja As Object
Dim nCol As Long
Dim i As Long
Dim oCelda As Object
Dim sReemplazo As String
Dim nReemplazos As Long
Dim oTextSearch As Object
Dim oSearchOptions As New com.sun.star.util.SearchOptions
Dim oSearchResult As Object
Dim nIdFormato As Long
Dim oNumberFormatter As Object

oDoc = ThisComponent

If Not oDoc.supportsService("com.sun.star.sheet.SpreadsheetDocument") Then
        MsgBox ("Este documento no es una hoja de cálculo.")
        Exit Sub
End If

' Creamos el objeto para poder realizar búsquedas dentro del contenido de las 
celdas
oTextSearch = createUnoService("com.sun.star.util.TextSearch")
oSearchOptions.algorithmType = com.sun.star.util.SearchAlgorithms.REGEXP
oSearchOptions.searchFlag = com.sun.star.util.SearchFlags.REG_EXTENDED + 
com.sun.star.util.SearchFlags.REG_NOSUB
oSearchOptions.searchString = "^[:digit:]{2}/[:alpha:]{3}/[:digit:]{4}$"
oTextSearch.setOptions(oSearchOptions)

' Creamos el objeto para poder cambiar el formato numérico de las celdas
nIdFormato = 
oDoc.NumberFormats.getStandardFormat(com.sun.star.util.NumberFormat.DATE, 
oDoc.CharLocale)
oNumberFormatter = createUnoService("com.sun.star.util.NumberFormatter")
oNumberFormatter.attachNumberFormatsSupplier(oDoc)

' Accedemos a la posición de la celda actual para obtener el número de columna
oHoja = oDoc.CurrentController.getActiveSheet
oCelda = oDoc.getCurrentSelection
nCol = oCelda.getCellAddress.Column
oCelda = oHoja.getCellByPosition(nCol, 0)

' Revisar todas las celdas de la columna hasta encontrar una celda vacía
While i <= 65535 And oCelda.Type <> com.sun.star.table.CellContentType.EMPTY
        If oCelda.Type = com.sun.star.table.CellContentType.TEXT Then
                ' La celda contiene texto
                oSearchResult = oTextSearch.searchForward(oCelda.String, 0, 
Len(oCelda.String) - 1)
                If oSearchResult.subRegExpressions > 0 Then
                        ' Se encontró la expresión, hay que construir la cadena 
de reemplazo
                        sReemplazo = Left(oCelda.String, 3)
                        Select Case Mid(oCelda.String, 4, 3)
                                Case "Ene"
                                        sReemplazo = sReemplazo + "01"
                                Case "Feb"
                                        sReemplazo = sReemplazo + "02"
                                Case "Mar"
                                        sReemplazo = sReemplazo + "03"
                                Case "Abr"
                                        sReemplazo = sReemplazo + "04"
                                Case "May"
                                        sReemplazo = sReemplazo + "05"
                                Case "Jun"
                                        sReemplazo = sReemplazo + "06"
                                Case "Jul"
                                        sReemplazo = sReemplazo + "07"
                                Case "Ago"
                                        sReemplazo = sReemplazo + "08"
                                Case "Set"
                                        sReemplazo = sReemplazo + "09"
                                Case "Oct"
                                        sReemplazo = sReemplazo + "10"
                                Case "Nov"
                                        sReemplazo = sReemplazo + "11"
                                Case "Dic"
                                        sReemplazo = sReemplazo + "12"
                        End Select
                        sReemplazo = sReemplazo + Right(oCelda.String, 5)

                        ' Cambiar el contenido de la celda
            oCelda.Value = oNumberFormatter.convertStringToNumber(nIdFormato, 
sReemplazo)
                        oCelda.NumberFormat= nIdFormato
                        nReemplazos = nReemplazos + 1
                End If
        End If

        ' Próxima celda
        i = i + 1
        oCelda = oHoja.getCellByPosition(nCol, i)
Wend

MsgBox("Se realizaron " + nReemplazos + " reemplazos en la columna actual")

End Sub

REM *** Fin del código ***





El vie, 24-02-2006 a las 20:25, Eduardo Moreno escribió:
> En un correo anterior comentaba que en Mxico existe una empresa de
> software llamada Aspel que desarrolla programas de administracin y
> contabilidad muy famosos por estas tierras.
> 
> Dichos programas producen listados en modo de texto, los cuales pueden ser
> abiertos por OpenOffice.org cuando se les cambia la extensin de .txt a
> csv
> 
> El problema que resuelve este macro es que en el listado que generan los
> programas las fechas son del tipo 24/Feb/2006 y OpenOffice.org los
> interpreta como texto, por lo que no se pueden ordenar por fecha las
> tablas generadas, o aplciar la funcin sumar.si().
> 
> El macro transforma los textos correspondientes a los meses de letras a
> nmeros y se solucionan los problemas.
>  
> SUB Hacerfechas
> ' Este programa esta diseado para cambiar los meses en las fechas que se
> exportan
> ' como texto de algunos programas. En Mxico es comn este efecto en los
> archivos de
> ' texto generados por los programas de la empresa Aspel(MR).
> '
> ' Autor: J. Eduardo Moreno
> ' Patrocinador: TGC Ingenieria, S.A. de C.V.
> 
> ' Declaracin de variables
>     Dim I As Long                             'Contador que revisa los 
> arreglos de equivalencias
>     Dim Doc As Object                 'Objeto donde se almacena el documento 
> de Calc
>     DIM Hoja As Object                        'Objeto donde se almacena la 
> hoja de calculo
> generada por el archivo de texto
>     Dim Remplazar As Object           'Objeto donde se almacenan los datos a
> cambiar y remplazar
>     Dim Conletra(11) As String        'Arreglo donde se almacenan los meses 
> con
> letra
>     Dim Connumero(11) As String       'Arreglo donde se almacenan los meses 
> con
> nmero
>     
>     ' Generamos el arreglo con los meses en letra
>     Conletra() = Array("/Ene/", "/Feb/", "/Mar/", "/Abr/", "/May/",
> "/Jun/", "/Jul/", "/Ago/",_
>      "/Sep/", "/Oct/", "/Nov/", "/Dic/")
>     
>     'Generamos el arreglo donde se almacenan los meses con nmero
>     Connumero() = Array("/01/", "/02/", "/03/", "/04/", "/05/", "/06/",
> "/07/", "/08/", "/09/", "/10/", "/11/", "/12/")
> 
>       'Guardamos el documento, la hoja y el objeto de bsqueda en sus
> respectivas variables
>     Doc = StarDesktop.CurrentComponent
>     Hoja = Doc. Sheets (0) 
>     Remplazar = Hoja.createReplaceDescriptor
> 
>       'Recorremos el arreglo para buscar en todo el documento cualquier
> coincidencia.
>     For I = 0 To 11
>         Remplazar.SearchString = Conletra(I)
>         Remplazar.ReplaceString = Connumero(I)
>         Hoja.replaceAll(Remplazar)
>     Next I
> end sub
> 
> E insisto, es ms complicado encontrar informacin para OOo que para MS,
> pero de que se puede, se puede.


---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]

Responder a