[RESUELTO] Hacer búsquedas que ignoren las tildes en Calc

Discute sobre la aplicación de hojas de cálculo
Responder
RARG
Mensajes: 6
Registrado: Jue Abr 06, 2017 12:31 pm

[RESUELTO] Hacer búsquedas que ignoren las tildes en Calc

Mensaje por RARG »

Un saludo a todo el mundo.

Llevaba tiempo intentando encontrar la forma de que al realizar una búsqueda en Calc, está ignorara los signos de acentuación, y me encontré el siguiente tema:
https://forum.openoffice.org/es/forum/v ... =17&t=9821

que nos lleva a la siguiente página:
https://blog.open-office.es/basic/cuestion-de-acentos

Increible el trabajazo que hicieron, así que me puse a intentar adaptar el código para que funcionara en LibreOffice Calc, pero no he sido capaz...

¿Me podéis echar una mano para conseguir una macro similar que funcione en Calc?

La macro funciona a la perfección en Writer, abriendo un textbox para insertar la palabra que queremos buscar, y como resultado nos señala todas las palabras, con o sin acentos en el texto. La idea sería que o bien nos señale todo, o bien nos lleve a la siguiente palabra que cumpla con esos requisitos, sin tener en cuenta las tildes.

El código original de la macro creada en las páginas citadas para Writer es el siguiente:

Código: Seleccionar todo

REM  *****  BASIC  *****

Sub BuscaConSinTildesWriter()
' Busca la primera o todas las palabras que contiene cualquier tipo de coincidencia con las mismas vocales y cualquier tilde o sin ella
' Tilde == Acento

	Dim LoQueBusco As String, BuscarC As String
	Dim n As Long, c As String
	Dim Primero_o_Todos As Integer

	LoQueBusco=InputBox( "Teclea la palabra a BuscarC", "BuscarC con o sin tildes")
	If LoQueBusco="" Then Exit Sub

	Primero_o_Todos = 1 ' BuscarC todos = 1, BuscarC el primero = 0

	For n=1 To Len(LoQueBusco)
		c = Mid(LCase(LoQueBusco),n,1)
		Select Case c
		Case "a","á","à","â","ä","ã", "å", "ă","ā","ą","ǎ" ' 
			BuscarC = BuscarC & "[aáàâäãåăāąǎAÁÀÂÄÃÅĂĀĄ]"
		Case "e","é","è","ê","ë","ē","ę","ě"
			BuscarC = BuscarC & "[eéèêëēęěEÉÈÊËĒĘ]"
		Case "i","í","ì","î","ï","ī","ǐ"
			BuscarC = BuscarC & "[iíìîïīǐIÍÌÎÏĪ]"
		Case "o","ó","ò","ô","ö", "õ", "ő","ō","ǒ"
			BuscarC = BuscarC & "[oóòôöõőōǒOÓÒÔÖÕŐŌ]"
		Case "u","ú","ù","û","ü","ŭ","ű","ū","ǔ","ǖ","ǘ","ǚ","ǜ"
			BuscarC = BuscarC & "[uúùûüŭűūǔǖǘǚǜUÚÙÛÜŬŰŪ]"
		Case "y","ý","ÿ"
			BuscarC = BuscarC & "[yýÿYÝŸ]"
		Case "n","ñ"
			BuscarC = BuscarC & "[nñNÑ]"
		Case "c","ç"
			BuscarC = BuscarC & "[cçCÇ]"
		Case Else
			BuscarC = BuscarC & c
		End Select
	Next

	BuscaEnTexto( BuscarC, Primero_o_Todos )

End Sub

Sub BuscaEnTexto( BuscarC, Primero_o_Todos )
' Creada con la grabadora y adaptada para éste propósito
	Dim document   As Object
	Dim dispatcher As Object

	document   = ThisComponent.CurrentController.Frame
	dispatcher = CreateUNOService("com.sun.star.frame.DispatchHelper")

	Dim args1(18) As New com.sun.star.beans.PropertyValue
	args1(0).Name = "SearchItem.StyleFamily"
	args1(0).Value = 2
	args1(1).Name = "SearchItem.CellType"
	args1(1).Value = 0
	args1(2).Name = "SearchItem.RowDirection"
	args1(2).Value = True
	args1(3).Name = "SearchItem.AllTables"
	args1(3).Value = False
	args1(4).Name = "SearchItem.Backward"
	args1(4).Value = False
	args1(5).Name = "SearchItem.Pattern"
	args1(5).Value = False
	args1(6).Name = "SearchItem.Content"
	args1(6).Value = False
	args1(7).Name = "SearchItem.AsianOptions"
	args1(7).Value = False
	args1(8).Name = "SearchItem.AlgorithmType"
	args1(8).Value = 1
	args1(9).Name = "SearchItem.SearchFlags"
	args1(9).Value = 65536
	args1(10).Name = "SearchItem.SearchString"
	args1(10).Value = BuscarC
	args1(11).Name = "SearchItem.ReplaceString"
	args1(11).Value = ""
	args1(12).Name = "SearchItem.Locale"
	args1(12).Value = 255
	args1(13).Name = "SearchItem.ChangedChars"
	args1(13).Value = 2
	args1(14).Name = "SearchItem.DeletedChars"
	args1(14).Value = 2
	args1(15).Name = "SearchItem.InsertedChars"
	args1(15).Value = 2
	args1(16).Name = "SearchItem.TransliterateFlags"
	args1(16).Value = 1280
	args1(17).Name = "SearchItem.Command"
	args1(17).Value = Primero_o_Todos
	args1(18).Name = "Quiet"
	args1(18).Value = True

	dispatcher.executeDispatch(document, ".uno:ExecuteSearch", "", 0, args1())

End Sub
Muchas gracias de antemano a todos

Un saludo.

P.D. No creo que influya, pero uso LibreOffice 7.0.2
Última edición por RARG el Mié Ene 06, 2021 12:50 pm, editado 1 vez en total.
Intentando aprender un poco...
Usando LibreOffice versión 7.0.2 con W10 como principal, pero necesitando compatibilidad con versiones anteriores de LibreOffice sin posibilidades de actualizar a voluntad.
Longi
Mensajes: 804
Registrado: Dom Ene 20, 2013 9:05 pm
Ubicación: Ourense, Galicia, España

Re: Hacer búsquedas que ignoren las tildes en Calc

Mensaje por Longi »

Buenas!
Para empezar no soy calquero, sino básico (prefiero base a calc. Cosas que pasan!), por lo que la 'solución' no te la voy a dar, pero si tenemos en cuenta que Writer es un documento lleno de palabras, y la macro va buscando las palabras, podríamos tener en cuenta un razonamiento como el siguiente:
Calc es un documento lleno de celdas, y cada celda podríamos considerarla llena de palabras, es decir, como que hubiese tantos documentos Writer como celdas.
Resumiendo: Si la macro va bien en Writer, debía ir bien en cada celda de Calc, simplemente (mejor entrecomillamos lo del simplemente) sería cuestión de hacer dos ciclos: uno que recorra las filas y otro, dentro del anterior que recorra cada una de las celdas. Cuando éste último ha llegado a una celda, le seleccionas el texto como se haría en todo el documento de Writer y le aplicas la macro.
En hojas algo extensas puede ser muy lento, pero es el sistema que se me ocurrió. Seguro que hay más formas.
Si tengo un rato intento desarrollar la idea.
Un saludo! ;)
Openoffice 4.1.7, en Windows 10
Libreoffice 6.4.2, en Windows 10
RARG
Mensajes: 6
Registrado: Jue Abr 06, 2017 12:31 pm

Re: Hacer búsquedas que ignoren las tildes en Calc

Mensaje por RARG »

Buenas tardes

Lo primero de todo agradecer tu respuesta.

He estado intentando trabajar en esa idea, pero al final opté por usar el grabador de macros por sencillez, y logré desde el mismo realizar una búsqueda simple, pero no logro que reconozca los parámetros incluidos en cada uno de los casos, me imagino que sea porque no tengo bien configurados los argumentos.

Código: Seleccionar todo

REM  *****  BASIC  ****

Sub BuscaConSinTildesCalc()
' Busca la primera o todas las palabras que contiene cualquier tipo de coincidencia con las mismas vocales y cualquier tilde o sin ella
' Tilde == Acento

	Dim LoQueBusco As String, BuscarC As String
	Dim n As Long, c As String
	Dim Primero_o_Todos As Integer

	LoQueBusco=InputBox( "Teclea la palabra a buscar", "Buscar con o sin tildes")
	If LoQueBusco="" Then Exit Sub

	Primero_o_Todos = 1 ' Buscar todos = 1, Buscar el primero = 0

	For n=1 To Len(LoQueBusco)
		c = Mid(LCase(LoQueBusco),n,1)
		Select Case c
		Case "a","á","à","â","ä","ã", "å", "ă","ā","ą","ǎ" ' 
			BuscarC = BuscarC & "[aáàâäãåăāąǎAÁÀÂÄÃÅĂĀĄ]"
		Case "e","é","è","ê","ë","ē","ę","ě"
			BuscarC = BuscarC & "[eéèêëēęěEÉÈÊËĒĘ]"
		Case "i","í","ì","î","ï","ī","ǐ"
			BuscarC = BuscarC & "[iíìîïīǐIÍÌÎÏĪ]"
		Case "o","ó","ò","ô","ö", "õ", "ő","ō","ǒ"
			BuscarC = BuscarC & "[oóòôöõőōǒOÓÒÔÖÕŐŌ]"
		Case "u","ú","ù","û","ü","ŭ","ű","ū","ǔ","ǖ","ǘ","ǚ","ǜ"
			BuscarC = BuscarC & "[uúùûüŭűūǔǖǘǚǜUÚÙÛÜŬŰŪ]"
		Case "y","ý","ÿ"
			BuscarC = BuscarC & "[yýÿYÝŸ]"
		Case "n","ñ"
			BuscarC = BuscarC & "[nñNÑ]"
		Case "c","ç"
			BuscarC = BuscarC & "[cçCÇ]"
		Case Else
			BuscarC = BuscarC & c
		End Select
	Next

	BuscarSiguiente( BuscarC, Primero_o_Todos )

End Sub



sub BuscarSiguiente
rem ----------------------------------------------------------------------
rem define variables
dim document   as object
dim dispatcher as object
rem ----------------------------------------------------------------------
rem get access to the document
document   = ThisComponent.CurrentController.Frame
dispatcher = createUnoService("com.sun.star.frame.DispatchHelper")

rem ----------------------------------------------------------------------
dim args1(20) as new com.sun.star.beans.PropertyValue
args1(0).Name = "SearchItem.StyleFamily"
args1(0).Value = 2
args1(1).Name = "SearchItem.CellType"
args1(1).Value = 0
args1(2).Name = "SearchItem.RowDirection"
args1(2).Value = true
args1(3).Name = "SearchItem.AllTables"
args1(3).Value = false
args1(4).Name = "SearchItem.SearchFiltered"
args1(4).Value = false
args1(5).Name = "SearchItem.Backward"
args1(5).Value = false
args1(6).Name = "SearchItem.Pattern"
args1(6).Value = false
args1(7).Name = "SearchItem.Content"
args1(7).Value = false
args1(8).Name = "SearchItem.AsianOptions"
args1(8).Value = false
args1(9).Name = "SearchItem.AlgorithmType"
args1(9).Value = 0
args1(10).Name = "SearchItem.SearchFlags"
args1(10).Value = 0
args1(11).Name = "SearchItem.SearchString"
args1(11).Value = BuscarC
args1(12).Name = "SearchItem.ReplaceString"
args1(12).Value = ""
args1(13).Name = "SearchItem.Locale"
args1(13).Value = 255
args1(14).Name = "SearchItem.ChangedChars"
args1(14).Value = 2
args1(15).Name = "SearchItem.DeletedChars"
args1(15).Value = 2
args1(16).Name = "SearchItem.InsertedChars"
args1(16).Value = 2
args1(17).Name = "SearchItem.TransliterateFlags"
args1(17).Value = 256
args1(18).Name = "SearchItem.Command"
args1(18).Value = 1
args1(19).Name = "SearchItem.SearchFormatted"
args1(19).Value = false
args1(20).Name = "SearchItem.AlgorithmType2"
args1(20).Value = 1

dispatcher.executeDispatch(document, ".uno:ExecuteSearch", "", 0, args1())


end sub
He intentado optar por buscar los parámetros para encontrar su significado y saber exactamente que estoy modificando, puesto que creo que el error se encuentra ahí, pero creo que estoy en una época torpe...
Intentando aprender un poco...
Usando LibreOffice versión 7.0.2 con W10 como principal, pero necesitando compatibilidad con versiones anteriores de LibreOffice sin posibilidades de actualizar a voluntad.
Longi
Mensajes: 804
Registrado: Dom Ene 20, 2013 9:05 pm
Ubicación: Ourense, Galicia, España

Re: Hacer búsquedas que ignoren las tildes en Calc

Mensaje por Longi »

Buenas!
Lo que te respondí la primera vez demuestra dos cosas
1- Tengo cierta tendencia a opinar de aquello de lo que no tengo ni idea
2- Soy bastante cabezón.
Por supuesto la solución teórica que planteé no funciona de ninguna manera, al menos en las primeras pruebas, pero he visto que es descriptor de búsqueda es diferente para calc que para writer, así que he hecho un híbrido entre la macro de Salva y otra de Dandv (foro de inglés) con un añadido y parece que funciona. Selecciona las celdas donde se encuentren las palabras con o sin acentos extraños (al menos lo probé para la letra a).
La variable 'Primero_o_Todos' está con valor 1 de oficio, así que seleccionará todas las celdas que lo tengan. Si se varía a 0 solo buscará la siguiente (ya que el buscador está con Backwards como false, pero si se pone como true entonces buscaría hacia arriba)

Mira a ver si te sirve:

Código: Seleccionar todo

Sub BuscaConSinTildesCalc()

   Dim LoQueBusco As String, BuscarC As String
   Dim n As Long, c As String
   Dim Primero_o_Todos As Integer

   LoQueBusco=InputBox( "Teclea la palabra a BuscarC", "BuscarC con o sin tildes")
   If LoQueBusco="" Then Exit Sub

   Primero_o_Todos = 1 ' BuscarC todos = 1, BuscarC el primero = 0

   For n=1 To Len(LoQueBusco)
      c = Mid(LCase(LoQueBusco),n,1)

      Select Case c
      Case "a","á","à","â","ä","ã", "å", "ă","ā","ą","ǎ" '
         BuscarC = BuscarC & "[aáàâäãåăāąǎAÁÀÂÄÃÅĂĀĄ]"
      Case "e","é","è","ê","ë","ē","ę","ě"
         BuscarC = BuscarC & "[eéèêëēęěEÉÈÊËĒĘ]"
      Case "i","í","ì","î","ï","ī","ǐ"
         BuscarC = BuscarC & "[iíìîïīǐIÍÌÎÏĪ]"
      Case "o","ó","ò","ô","ö", "õ", "ő","ō","ǒ"
         BuscarC = BuscarC & "[oóòôöõőōǒOÓÒÔÖÕŐŌ]"
      Case "u","ú","ù","û","ü","ŭ","ű","ū","ǔ","ǖ","ǘ","ǚ","ǜ"
         BuscarC = BuscarC & "[uúùûüŭűūǔǖǘǚǜUÚÙÛÜŬŰŪ]"
      Case "y","ý","ÿ"
         BuscarC = BuscarC & "[yýÿYÝŸ]"
      Case "n","ñ"
         BuscarC = BuscarC & "[nñNÑ]"
      Case "c","ç"
         BuscarC = BuscarC & "[cçCÇ]"
      Case Else
         BuscarC = BuscarC & c
      End Select

   Next
   FindBackwards (BuscarC, Primero_o_Todos)
   
End Sub

Sub FindBackwards (BuscarC, Primero_o_Todos)
    doc = ThisComponent
    sheet = doc.getCurrentController.activeSheet
    search = sheet.createSearchDescriptor()
    With search
        .SearchString = BuscarC 
        .searchRegularExpression = True
        .SearchCaseSensitive = fALSE
        .SearchBackwards = False
        .SearchByRow = true
    End With
    If Primero_o_Todos=1 Then
    result = sheet.findAll(Search)
    End if
    If Primero_o_Todos=0 Then
    result = sheet.findNext(doc.currentSelection, search)
    End if
    doc.CurrentController.Select(result)
End Sub
Un saludo! ;)
Openoffice 4.1.7, en Windows 10
Libreoffice 6.4.2, en Windows 10
RARG
Mensajes: 6
Registrado: Jue Abr 06, 2017 12:31 pm

Re: Hacer búsquedas que ignoren las tildes en Calc

Mensaje por RARG »

¡¡¡¡Perfecto!!!!
Mil gracias, funciona a la perfección.
Intentando aprender un poco...
Usando LibreOffice versión 7.0.2 con W10 como principal, pero necesitando compatibilidad con versiones anteriores de LibreOffice sin posibilidades de actualizar a voluntad.
Responder