[RESUELTO] Como desplazarse por una seleccion o rango.

Desarrollo de Macros y programación en UNO, usar las API, llamar programas externos...
Responder
Avatar de Usuario
JoePublic
Mensajes: 36
Registrado: Dom Sep 06, 2020 5:34 pm

[RESUELTO] Como desplazarse por una seleccion o rango.

Mensaje por JoePublic »

TEMA: Como desplazarse por un rango de celdas con cursores. Cuando digo rango quiero decir "seleccion" dentro de una tabla.

Hola, me leido los capitulos del libro "Aprendiendo OOo Basic" de Mauricio para recorrer un rango o seleccion de celdas de una tabla grande, y he conseguido hacer la macro y funciona.

Miren el archivo que les adjunto con una macro. Alli hay una lista desde la columna A hasta la F
Y solo quiero seleccionar un rango de celdas por ejemplo: B3:D8

¿Como puedo recorrer o desplazarme por ese rango SELECCIONADO para obtener todos los valores uno a uno mediante un CURSOR. No quiero desplazarme por toda la tabla, solo por la parte seleccionada.
Quiero obtener el valor de cada celda seleccionada, transformarlo y luego volverlo a dejar en la misma celda de donde lo cogí.

Lo que intento hacer es lo que en VBA Excel se hace como:
For Each cell in Selection
Haz esto... (transforma el valor)
y luego vuelve a poner el valor en la misma celda que lo cogiste.
Next cell

Despues de leer el capitulo 6 (Referencia a rango de celdas) libro, he conseguido desplazarme por la selección como verán en la macro adjunta. (Pueden descargarse el archivo con el macro).

Pero ahora me gustaría hacer lo mismo con los CURSORES, ya que segun dicen es mas facil, pero al no tener un ejemplo, no logro navegar solo por la selección con el CURSOR.
Si alguien sabe como reducir el codigo con cursores o con otro metodo seria genial.

Después de varias horas con los cursores 'createCursorByRange(areaSeleccionada)', no veo como hacerlo.
No soy programador. Solo soy un aficionado entusiasta de Excel y Calc.
Si alguien puede poner el ejemplo completo aqui de desplazamiento con CURSOR, se lo agradeceré enormemente.
GRACIAS !!

Código: Seleccionar todo

Sub DireccionByPosition_RangoSeleccionado
'Macro de CALC que se desplaza por una selección, bien sea una celda o grupo de celdas contiguas (rango de celdas seleccionadas) para extraer el valor de ellas y volverlo a pegar en el mismo sitio, uno a uno.
'MACRO Version Inicial  1.0

Dim oSel As Object
Dim rangeName as String
Dim cellValue as Variant
Dim address As Object

Dim colStart as Long
Dim rowStart as Long
Dim colEnd as Long
Dim rowEnd as Long

Dim oColumns as Long
Dim oRows as Long

oSel = ThisComponent.getCurrentSelection() 'C4

Select Case oSel.getImplementationName()
	Case "ScCellObj" 'Si es una sola celda seleccionada.
		cellValue = oSel.getString()
		Msgbox cellValue
		oSel.setString(cellValue)
		
	Case "ScCellRangeObj" 'Si es un grupo de cledas contiguas (rango seleccionado)
	    address = oSel.RangeAddress 
	    
	    '**** Localizamos posiciones de indice del rango seleccionado *******************
	    colStart = address.StartColumn
	    rowStart = address.StartRow
	    colEnd = address.EndColumn
	    rowEnd = address.EndRow 
	    
	    'Numero totoal de columnas y filas
	    oColumns = oSel.getColumns().getCount()
		oRows =  oSel.getRows().getCount()
		
		'Empezamos a desplazarnos por las celdas del Rango por filas con este bucle.
		For Ro = 0 to oRows - 1
			For Col = 0 to oColumns -1
				cellValue = ThisComponent.getCurrentController.getActiveSheet().getCellByPosition( colStart + Col, rowStart + Ro ).getString()
				Msgbox cellValue
				ThisComponent.getCurrentController.getActiveSheet().getCellByPosition( colStart + Col, rowStart + Ro ).setString(cellValue)
			Next Col
		Next Ro
End Select
End Sub


Adjuntos
MyList.ods
(21.7 KiB) Descargado 250 veces
Última edición por JoePublic el Jue Ene 13, 2022 4:37 pm, editado 8 veces en total.
Usuario apasionado de las hojas de cálculo. Novato aprendiz de macros con OOo Basic y VBA.
LibreOffice Version: 6.4.3.2 (x64) y Sistema Operativo Windows 10 Home.
FJCC-ES
Mensajes: 873
Registrado: Mié Mar 25, 2009 1:19 am
Ubicación: Colorado, USA

Re: Como desplazarse por una seleccion con cursores.

Mensaje por FJCC-ES »

No creo que usando el cursor es más facil en este caso. El cursor en este código

Código: Seleccionar todo

oHoja = ThisComponent.Sheets.getByName(“Sheet2”)
oSel = ThisComponent.CurrentSelection
oCur = oHoja.createCursorByRange(oSel)
pertenece a la hoja, no a la selección. El método gotoStart manda oCur a la celda A1, no a la primera celda de oSel. Además, el cursor no tiene las propiedades String o Value, así que no es facíl cambiar los valores de las celdas. Yo prefiero usar el DataArray de oSel para cambiar los valores. Por ejemplo, si selecciono celdas en las columnas B – D, puedo cambiar sus valores con este código.

Código: Seleccionar todo

Sub Main
oSel = ThisComponent.CurrentSelection
DataArray = oSel.DataArray
numCol = oSel.Columns.Count
numFila = oSel.Rows.Count

For i = 0 to numFila - 1
  For j = 0 to numCol - 1
    SELECT CASE j
       CASE 0 'Nombre
         DataArray(i)(j) = DataArray(i)(j) & "X"
       CASE 1  'Fecha
         DataArray(i)(j) = DataArray(i)(j) + 1
       CASE 2 'Ciudad
         DataArray(i)(j) = "?"
    End SELECT
  next j
next i
oSel.DataArray = DataArray
End Sub
Avatar de Usuario
JoePublic
Mensajes: 36
Registrado: Dom Sep 06, 2020 5:34 pm

Re: Como desplazarse por una seleccion o rango.

Mensaje por JoePublic »

Muchas Gracias FJCC-ES,
Me has abierto los ojos al asignar la seleccion a un array para despues pegar los datos del array a la seleccion de nuevo de forma rápida y eficiente.
Ahora que veo que me confirmas que el Cursor no funciona para las selecciones de celdas, veo que no es una buena idea la opcion de usar cursores en este caso.

Voy a rediseñar mi macro inspirado en tu ejemplo y lo pondré más abajo.
Me gustaría saber la diferencia entre los metodos .DataArray y .getDataArray().
Última edición por JoePublic el Mié Nov 04, 2020 10:14 pm, editado 3 veces en total.
Usuario apasionado de las hojas de cálculo. Novato aprendiz de macros con OOo Basic y VBA.
LibreOffice Version: 6.4.3.2 (x64) y Sistema Operativo Windows 10 Home.
Avatar de Usuario
JoePublic
Mensajes: 36
Registrado: Dom Sep 06, 2020 5:34 pm

Re:[RESUELTO] Como desplazarse por una seleccion o rango.

Mensaje por JoePublic »

Hola,
Gracias a FJCC-ES.
La macro propuesta para sustituir al codigo de VBA para desplazarse por una selección conocida como:
For cell in Selection
Transforma el valor de la celda.
Nex cell
Es la siguiente: Adjunto el archivo al final con las macros propuestas!!. Espero que os sirva tanto como a mi.

Código: Seleccionar todo

Sub QuitaFormulas_PorSuValorActual
'Macro que sustituye las formulas de las celdas seleccionadas por su valor actual.
'La forma mas rápdia y simple es almacenar los valores de un rango a un array, para luego volcar los datos del array al rango seleccionado. De este modo quitamos las formulas y dejamos los datos en el formato que estaban en la ceda.

Dim oSel as Object
Dim mySelectionDataArray as Variant
oSel = ThisComponent.CurrentSelection

Select Case oSel.getImplementationName()  'Mira que tipo de seleccion es. (celda, rango o multiples rangos dispersos)

	Case "ScCellObj", "ScCellRangeObj"   'Opción para celdas o rango contiguo seleccionado.
	mySelectionDataArray = oSel.DataArray 'Almacena valores de las celdas en un array.
'**** Aqui recorres el array (iteras por el array) para manipularlo y hacer lo que quieras con el. *****
	oSel.DataArray = mySelectionDataArray 'Vuelve a colocar valores del array a las celdas, sobreescribiendo las celdas con formulas, dejando el valor.
		
	Case Else
	MsgBox "Cuidado !! " & Chr(13) & "Debes seleccionar una celda o rango con celdas contiguas." & Chr(13) & "Por ejemplo rango: B3:D15"
End Select	
End Sub
Y si queremos transformar o manipular los valores de las celdas o incluso saber de que tipo son (como por ejemplo: String, Integer, Double, etc) realicé éste macro.

Código: Seleccionar todo

Sub QuitaEspacios_InicioFin
'Macro que recorre las celdas seleccionadas y Quita los espacios que haya delante y detras del valor de las celdas seleccionadas que contengan texto.
'La forma mas rápdia y con menos codigo es almacenar el rango seleccionado a un array, desplazarte por el array transformando los valores y luego volcar los datos del array al rango seleccionado.
Dim oSel as Object
Dim mySelectionDataArray as Variant

oSel = ThisComponent.CurrentSelection
'MsgBox "numCol: " & numCol & "  numFila: " & numFil

Select Case oSel.getImplementationName() 'Mira que tipo de seleccion es. (celda, rango o multiples rangos dispersos)

	Case "ScCellObj", "ScCellRangeObj"  'Opción para celdas o rango contiguo seleccionado.
		numCol = oSel.Columns.Count 'Obtenemos numero de columnas seleccionadas.
		numFila = oSel.Rows.Count 'Obtenemos numero de Filas seleccionadas.
		mySelectionDataArray = oSel.DataArray 'Almacena valor o valores en un array.
		'Empezamos a recorrer o desplazarnos por el array.
		For i = 0 to numFila - 1 'Elegimos la fila.
		  For j = 0 to numCol - 1 'Nos desplazamos por las columnas de la fila.
		  	If TypeName(mySelectionDataArray(i)(j))  = "String" Then 'Comprueba si el tipo de valor es Texto (String). Si no es texto salta al siguiente valor del array.
		  		'MsgBox mySelectionDataArray(i)(j) 'Si lo quieres visualizar 
		        mySelectionDataArray(i)(j) = Trim(mySelectionDataArray(i)(j)) 'Elimina espacios delante y detras del valor del texto y almacena el valor en el array.
		    End if
		  Next j
		Next i
		
		oSel.DataArray = mySelectionDataArray 'Vuelve a colocar valores en las celdas seleccionadas.
		
	Case Else
	MsgBox "Cuidado !! " & Chr(13) & "Debes seleccionar una celda o rango con celdas contiguas." & Chr(13) & "Por ejemplo rango: B3:D15"
End Select	
End Sub
Adjuntos
MyList2.ods
(24.07 KiB) Descargado 251 veces
Última edición por JoePublic el Jue Mar 04, 2021 1:05 pm, editado 2 veces en total.
Usuario apasionado de las hojas de cálculo. Novato aprendiz de macros con OOo Basic y VBA.
LibreOffice Version: 6.4.3.2 (x64) y Sistema Operativo Windows 10 Home.
FJCC-ES
Mensajes: 873
Registrado: Mié Mar 25, 2009 1:19 am
Ubicación: Colorado, USA

Re: [RESUELTO] Como desplazarse por una seleccion o rango.

Mensaje por FJCC-ES »

No hay diferencia entre
Datos = oSel.DataArray
y
Datos = oSel.getDataArray()

También se puede asignar valores al DataArray con
oSel.DataArray = Datos
o
oSel.setDataArray(Datos)
Responder