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

Desarrollo de Macros y programación en UNO, usar las API, llamar programas externos...
Responder
physic
Mensajes: 85
Registrado: Lun Oct 29, 2018 12:55 am

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

Mensaje por physic »

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
Avatar de Usuario
fornelasa
Mensajes: 3268
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"

Mensaje por fornelasa »

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!
physic
Mensajes: 85
Registrado: Lun Oct 29, 2018 12:55 am

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

Mensaje por physic »

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
Avatar de Usuario
mauricio
Mensajes: 6092
Registrado: Sab Nov 22, 2008 5:36 am
Ubicación: CDMX
Contactar:

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

Mensaje por mauricio »

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
fornelasa
Mensajes: 3268
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"

Mensaje por fornelasa »

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

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

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!
physic
Mensajes: 85
Registrado: Lun Oct 29, 2018 12:55 am

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

Mensaje por physic »

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"

Mensaje por physic »

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


abrazos.
LibreOffice 5.4.4.2 >>> Windows 7
Avatar de Usuario
fornelasa
Mensajes: 3268
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"

Mensaje por fornelasa »

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

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!
physic
Mensajes: 85
Registrado: Lun Oct 29, 2018 12:55 am

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

Mensaje por physic »

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"

Mensaje por physic »

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
Avatar de Usuario
fornelasa
Mensajes: 3268
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"

Mensaje por fornelasa »

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!
Longi
Mensajes: 804
Registrado: Dom Ene 20, 2013 9:05 pm
Ubicación: Ourense, Galicia, España

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

Mensaje por Longi »

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

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) Descargado 233 veces
Openoffice 4.1.7, en Windows 10
Libreoffice 6.4.2, en Windows 10
Avatar de Usuario
fornelasa
Mensajes: 3268
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"

Mensaje por fornelasa »

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!
physic
Mensajes: 85
Registrado: Lun Oct 29, 2018 12:55 am

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

Mensaje por physic »

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
Responder