Página 1 de 1
[Resuelto] Buscar la letra "p" y escribir la letra "x"
Publicado: Mié Nov 14, 2018 7:19 pm
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.
Re: Buscar la letra "p" y escribir la letra "x"
Publicado: Jue Nov 15, 2018 1:35 am
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?
Re: Buscar la letra "p" y escribir la letra "x"
Publicado: Jue Nov 15, 2018 2:09 am
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
Re: Buscar la letra "p" y escribir la letra "x"
Publicado: Jue Nov 15, 2018 2:51 am
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.
Re: Buscar la letra "p" y escribir la letra "x"
Publicado: Jue Nov 15, 2018 7:18 pm
por fornelasa
Así es, VBA no está completamente soportado en Libre/Open Office. Concretamente parece que no soporta FindNext en está instrucción:
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
Re: Buscar la letra "p" y escribir la letra "x"
Publicado: Jue Nov 15, 2018 7:38 pm
por physic
Re: Buscar la letra "p" y escribir la letra "x"
Publicado: Jue Nov 15, 2018 7:41 pm
por physic
y yo voy a probar su código y daré noticias de los resultados.
abrazos.
Re: Buscar la letra "p" y escribir la letra "x"
Publicado: Jue Nov 15, 2018 9:23 pm
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.
FindNext esta perfectamente soportado si usamos código propio de LibreOffice (como claramente lo dice el vinculo enviado)
Re: Buscar la letra "p" y escribir la letra "x"
Publicado: Vie Nov 16, 2018 12:08 am
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
Re: Buscar la letra "p" y escribir la letra "x"
Publicado: Vie Nov 16, 2018 5:18 pm
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
Re: Buscar la letra "p" y escribir la letra "x"
Publicado: Vie Nov 16, 2018 5:39 pm
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
Es correcto definirla cómo
Dim celdas As Object
Re: Buscar la letra "p" y escribir la letra "x"
Publicado: Vie Nov 16, 2018 5:58 pm
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!
Re: Buscar la letra "p" y escribir la letra "x"
Publicado: Vie Nov 16, 2018 6:14 pm
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.
Re: Buscar la letra "p" y escribir la letra "x"
Publicado: Vie Nov 16, 2018 7:50 pm
por physic
sr. Federico y sr. Longi ,
Muchas gracias por la ayuda, saludos para ustedes
las macros ya están funcionando muy bien
abrazos