[Resuelto] Buscar la letra "p" y escribir la letra "x"

Desarrollo de Macros y programación en UNO, usar las API, llamar programas externos...

[Resuelto] Buscar la letra "p" y escribir la letra "x"

Notapor physic » Mié Nov 14, 2018 7:19 pm

Necesito una ayuda con la macro que funcionaba perfecto en Vba de Excel.

                    Necesito convertir esta macro al código BASIC de LibreOffice.

                    la macro vba en Excel hacía lo siguiente:

                    Buscar la letra "p" en la columna T de la hoja de cálculo ("2.2Ped Fat"), al encontrar la letra "p" en la columna T, desplazar el cursor 7 posiciones hacia la izquierda y escribir la letra "x".

                    es necesario hacer la búsqueda en la columna T (Loop), hasta que no encuentre ninguna letra "p".

                    En el caso de que no sea así,

=============================================================================================
Sub Buscar_x()
Dim localizador As Range
Worksheets("2.2Ped Fat").Activate
Range("M50:M20000").ClearContents
With Plan1.Range("T:T")
Set localizador = .Find("p", LookIn:=xlValues, LookAt:=xlWhole) 'procura exata
If localizador = 0 Then Exit Sub
If Not localizador Is Nothing Then
ENDERECO = localizador.Address
Do
Range(localizador.Address).Select
Range(localizador.Address).Offset(0, -7) = "x"
Set localizador = .FindNext(localizador)
Loop While Not localizador Is Nothing And localizador.Address <> ENDERECO
End If
End With
End Sub
=================================================================================================


abrazos.
Última edición por physic el Vie Nov 16, 2018 7:52 pm, editado 2 veces en total
LibreOffice 5.4.4.2 >>> Windows 7
physic
 
Mensajes: 85
Registrado: Lun Oct 29, 2018 12:55 am

Re: Buscar la letra "p" y escribir la letra "x"

Notapor fornelasa » Jue Nov 15, 2018 1:35 am

La consulta parece clara, aunque también parece que no es así en tu macro.
¿A que le haríamos caso, a esto:?
Buscar la letra "p" en la columna T de la hoja de cálculo ("2.2Ped Fat"), al encontrar la letra "p" en la columna T, desplazar el cursor 7 posiciones hacia la izquierda y escribir la letra "x".
¿o a esto:?
¿Que es en tu código Plan1? ¿Es otra hoja?, ¿si es otro hoja entonces los datos no están en 2.2Ped Fat o cómo?
lo 6.2.0 | aoo 4.1.6 | win 7/10
¡Un aplauso para todos los que luchan por proteger y promover la Web abierta!
Avatar de Usuario
fornelasa
 
Mensajes: 3216
Registrado: Jue Feb 17, 2011 8:30 pm
Ubicación: Estado de México, México.

Re: Buscar la letra "p" y escribir la letra "x"

Notapor physic » Jue Nov 15, 2018 2:09 am

sr. Federico ,

           los datos están en la hoja "2.2Ped Fat", es decir, la búsqueda de la letra "p" debe ser en la columna T de la hoja "2.2Ped Fat"

           al encontrar letra "p" debe mover 7 posición a la izquierda y escribir "x"

           todo ello en la columna T de la hoja "2.2Ped Fat"


           he utilizado LibreOffice para ejecutar la macro vba

           se produjo un error en la línea de comandos siguiente>

           Set de búsqueda = .Find ("p", LookIn: = xlValues, LookAt: = xlWhole)

           no puedo entender por qué ????



abrazos
LibreOffice 5.4.4.2 >>> Windows 7
physic
 
Mensajes: 85
Registrado: Lun Oct 29, 2018 12:55 am

Re: Buscar la letra "p" y escribir la letra "x"

Notapor mauricio » Jue Nov 15, 2018 2:51 am

physic escribió:he utilizado LibreOffice para ejecutar la macro vba, se produjo un error en la línea de comandos siguiente. no puedo entender por qué ????

Porqué LibreOffice tiene un soporte limitado para VBA, siempre es recomendable migrar el código VBA.
______________________________________________
"Todo cuanto no podemos dar nos posee". - André Gide
LibreOffice 6.2 | ArchLinux | Gnome3
No respondo preguntas privadas, por favor, usa el foro
Avatar de Usuario
mauricio
 
Mensajes: 5827
Registrado: Sab Nov 22, 2008 5:36 am
Ubicación: CDMX

Re: Buscar la letra "p" y escribir la letra "x"

Notapor fornelasa » Jue Nov 15, 2018 7:18 pm

Así es, VBA no está completamente soportado en Libre/Open Office. Concretamente parece que no soporta FindNext en está instrucción:

Código: Seleccionar todo   Expandir vistaContraer vista
Set localizador = .FindNext(localizador)

Aquí una posible traducción en base a:
Buscar la letra "p" en la columna T de la hoja de cálculo ("2.2Ped Fat"), al encontrar la letra "p" en la columna T, desplazar el cursor 7 posiciones hacia la izquierda y escribir la letra "x".

Código: Seleccionar todo   Expandir vistaContraer vista
Sub oSearchSheet
         actual = ThisComponent.getCurrentSelection().AbsoluteName
       oSheet = ThisComponent.Sheets.getByName("2.2Ped Fat")
            eMe = oSheet.getCellRangeByName("M50:M20000")
        rango = oSheet.getCellRangeByName("T1:T1048576")   
           eMe.clearContents(23)
      oSearch = rango.createReplaceDescriptor()
          With oSearch
             .SearchString = "p"   
             .SearchWords = true             
             .SearchCaseSensitive = false      
           End With
      oDisp = rango.findAll(oSearch)
       celdas = oDisp.createEnumeration()
     Do While celdas.hasMoreElements()
        oDoc = celdas.nextElement()            
      columna = Replace(oDoc.AbsoluteName, "$T$", "M")
       oSheet.getCellRangeByName(columna).ArrayFormula = """x"""
      loop
     
     ThisComponent.currentController.Select(eme)     
     document = ThisComponent.CurrentController.Frame
   dispatcher = createUnoService("com.sun.star.frame.DispatchHelper")
    dispatcher.executeDispatch(document, ".uno:Copy", "", 0, Array())
    dispatcher.executeDispatch(document, ".uno:PasteOnlyText", "", 0, Array())
    dim args3(0) as new com.sun.star.beans.PropertyValue
args3(0).Name = "ToPoint"
args3(0).Value = actual
dispatcher.executeDispatch(document, ".uno:GoToCell", "", 0, args3())
dispatcher.executeDispatch(document, ".uno:TerminateInplaceActivation", "", 0, Array())
dispatcher.executeDispatch(document, ".uno:Cancel", "", 0, Array())     
End Sub
lo 6.2.0 | aoo 4.1.6 | win 7/10
¡Un aplauso para todos los que luchan por proteger y promover la Web abierta!
Avatar de Usuario
fornelasa
 
Mensajes: 3216
Registrado: Jue Feb 17, 2011 8:30 pm
Ubicación: Estado de México, México.

Re: Buscar la letra "p" y escribir la letra "x"

Notapor physic » Jue Nov 15, 2018 7:38 pm

He encontrado dos modelos que usan el comando "Find"

quizá en el futuro puede ser útil :

https://opensourceforu.com/2009/05/auto ... rg-macros/

http://document-foundation-mail-archive ... 96513.html



abrazos.
LibreOffice 5.4.4.2 >>> Windows 7
physic
 
Mensajes: 85
Registrado: Lun Oct 29, 2018 12:55 am

Re: Buscar la letra "p" y escribir la letra "x"

Notapor physic » Jue Nov 15, 2018 7:41 pm

y yo voy a probar su código y daré noticias de los resultados.


abrazos.
LibreOffice 5.4.4.2 >>> Windows 7
physic
 
Mensajes: 85
Registrado: Lun Oct 29, 2018 12:55 am

Re: Buscar la letra "p" y escribir la letra "x"

Notapor fornelasa » Jue Nov 15, 2018 9:23 pm

Ok gracias por el link, la verdad esta interesante.
Reitero, si queremos usar VBA en LibreOffice el objeto "origen" de tu código no soporta la instrucción FindNext cómo ya lo habia dicho lineas arriba.
Código: Seleccionar todo   Expandir vistaContraer vista
Set localizador = .FindNext(localizador)

FindNext esta perfectamente soportado si usamos código propio de LibreOffice (como claramente lo dice el vinculo enviado)
lo 6.2.0 | aoo 4.1.6 | win 7/10
¡Un aplauso para todos los que luchan por proteger y promover la Web abierta!
Avatar de Usuario
fornelasa
 
Mensajes: 3216
Registrado: Jue Feb 17, 2011 8:30 pm
Ubicación: Estado de México, México.

Re: Buscar la letra "p" y escribir la letra "x"

Notapor physic » Vie Nov 16, 2018 12:08 am

sr. Federico ,

        yo haré pruebas con el código corregido. cuando tenga los resultados de la prueba voy a informar a usted.


gracias por la ayuda
LibreOffice 5.4.4.2 >>> Windows 7
physic
 
Mensajes: 85
Registrado: Lun Oct 29, 2018 12:55 am

Re: Buscar la letra "p" y escribir la letra "x"

Notapor physic » Vie Nov 16, 2018 5:18 pm

sr. Federico

                 se produce un Error en la definición de variable

                 probablemente no estoy declarando correctamente las variables (celdas, ....) ....

Dim celdas As Object
Dim ....
Dim ....
Dim ....

* ver la imagen adjunta


abrazos
Adjuntos
colocar  X.jpg
LibreOffice 5.4.4.2 >>> Windows 7
physic
 
Mensajes: 85
Registrado: Lun Oct 29, 2018 12:55 am

Re: Buscar la letra "p" y escribir la letra "x"

Notapor fornelasa » Vie Nov 16, 2018 5:39 pm

A mi no me marca error, verifica si no en otra parte a nivel módulos hayas ya definido previamente dicha variable.
El error es claro:
Variable de objeto no definida
:roll:
Es correcto definirla cómo
Dim celdas As Object
lo 6.2.0 | aoo 4.1.6 | win 7/10
¡Un aplauso para todos los que luchan por proteger y promover la Web abierta!
Avatar de Usuario
fornelasa
 
Mensajes: 3216
Registrado: Jue Feb 17, 2011 8:30 pm
Ubicación: Estado de México, México.

Re: Buscar la letra "p" y escribir la letra "x"

Notapor Longi » Vie Nov 16, 2018 5:58 pm

Buenas!
Siento meterme en medio de la 'pelea', y además sin controlar nada de nada (yo solo intento hacer algo en base, pero calc siempre fue algo más lejano para mi).
Por otra parte, entiendo que hay que escribir una "X" en una columna 7 puestos a la izquierda de la de trabajo (Columna T), así que he montado una macro, que entiendo es muy rudimentaria, pero aparentemente, y según entendí parece que funciona:
Hacemos un ciclo que recorra las columnas de trabajo (en este caso solo la situada en posición 19). Dentro, hacemos otro ciclo que recorra cada fila (por lo que estamos yendo celda por celda). Dentro, a su vez, hacemos un ciclo que recorra cada letra del texto que tiene en su interior, y en cuanto detecta una "p", la cambiamos por "", es decir, por nada, y va a otra columna 7 puestos antes y ponemos una "X", salimos del ciclo y vamos a la siguiente celda.
Es decir, detecta la primera "p" del texto y ya no se lo piensa más.
No sé si es exactamente lo planteado, pero si es así, parece que funciona.
Solamente le puse hasta la celda 300, seguro que si las celdas son muchas se enlentecerá todo un montón, pero lo siento!, no doy para más.

Código: Seleccionar todo   Expandir vistaContraer vista
Sub quitar_p

    dim c as integer, r as integer
    oSheet = ThisComponent.getSheets().getByIndex(0)
    for c=19 to 19                                                                                    ' Columna T
     for r= 0 to 300                                                                                  ' Ciclo para los 300 primeros registros
      oCell = oSheet.getCellByPosition(c,r)                                                           ' Celda de cada momento
      oText = oCell.getText                                                                           ' Texto en la celda
      oCursor = oText.createTextCursorByRange(oText.getStart)                                         ' Cursor de rango
      oCursor.gotoEnd(True)                                                                           ' Va hasta el final del texto
      L=len(oCursor.String)                                                                           ' Longitud del texto
      oCursor.gotoStart(False)                                                                        ' Cursor al principio del texto sin fijarse en cual es el texto
    '-------------------------------------------
    ' Buscamos la primera "p" en el texto de la celda, la anulamos y ponemos la "X" en una columna 7 puestos anteriores
   
        for i=0 to L-1                                                                                ' Ciclo que recorre todas las letras del texto de cada celda
         oCursor.goRight(1,False)                                                                     ' Vamos un hueco o letra a la derecha, pero no fijamos de qué letra se trata
         oCursor.goLeft(1,True)                                                                       ' Vamos un hueco a la izquierda, fijando la letra en la que estamos
         if oCursor.String="p" Then                                                                   ' si la letra es una p (en este caso minúscula)
          oCursor.String=""                                                                           ' La substituimos por nada, es decir, la borramos
          oCell = oSheet.getCellByPosition(c-7,r)                                                     ' Nos situamos en una celda 7 columnas antes     
          oText = oCell.Text                                                                          ' Texto en el interior de la celda
          oCurs = oText.createTextCursor()                                                            ' Generamos un cursor de texto
          oCurs.gotoEND(True)                                                                         ' Vamos hasta el final del texto, indicando que las acciones se aplican a todo el texto de la celda
          oCurs.String="X"                                                                            ' Ponemos una X     
         Exit for                                                                                     ' Salimos del ciclo de letras
         End if                                                                                       ' Acabamos la condición de que sea una p
        Next                                                                                          ' Vamos a la siguiente letra
     next                                                                                             ' Vamos a la siguiente fila
    next                                                                                              ' Vamos a la siguiente columna

End Sub


Ya diréis.

Un saludo! ;)
Adjuntos
Macro.7z
(10.51 KiB) 86 veces
Openoffice 4.1.5, en Windows 10
Openoffice 4.1.3, en Windows 7
Libreoffice 6.0, en Windows 10
Longi
 
Mensajes: 546
Registrado: Dom Ene 20, 2013 9:05 pm
Ubicación: Ourense, Galicia, España

Re: Buscar la letra "p" y escribir la letra "x"

Notapor fornelasa » Vie Nov 16, 2018 6:14 pm

Hola Longi, para mi tu macro cumple correctamente con una batería de datos suficiente, me parece buena opción a lo ya previamente planteado.
lo 6.2.0 | aoo 4.1.6 | win 7/10
¡Un aplauso para todos los que luchan por proteger y promover la Web abierta!
Avatar de Usuario
fornelasa
 
Mensajes: 3216
Registrado: Jue Feb 17, 2011 8:30 pm
Ubicación: Estado de México, México.

Re: Buscar la letra "p" y escribir la letra "x"

Notapor physic » Vie Nov 16, 2018 7:50 pm

sr. Federico y sr. Longi ,

Muchas gracias por la ayuda, saludos para ustedes

las macros ya están funcionando muy bien


abrazos
LibreOffice 5.4.4.2 >>> Windows 7
physic
 
Mensajes: 85
Registrado: Lun Oct 29, 2018 12:55 am


Volver a Macros y API UNO

¿Quién está conectado?

Usuarios navegando por este Foro: No hay usuarios registrados visitando el Foro y 1 invitado