[RESUELTO] Introducir datos o poblar rango celdas con valores de un array

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] Introducir datos o poblar rango celdas con valores de un array

Mensaje por JoePublic »

¿Cómo introducir valores en rangos de celdas pertenecientes a una sola columna?. ¿Como Poblar un rango de celdas de una hoja con un array Bidimensional y con un array o matriz Unidimensional?

Tengo un array unidimensional con 7 valores y me gustaria introducirlos en la Columna A de forma HORIZONTAL:

Como ejemplo he puesto 2 arrays.
Uno es un arrayBidimensional y la introduccion de valores funciona de maravilla. Las celdas se poblan bien con el método setData() o setDataArray()

El arrayUnidimensional cuando lo poblo en una fila ("C6:I6") tambien se introducen bien los datos, porque se poblan de forma Horizontal.
Sin embargo cuando voy a poblar este mismo array unidimensional, en una columna ("A1:A7") salta un error y es:

Se ha producido una excepción
Type: com.sun.star.uno.RuntimeException
Message: .


Vean el ejemplo de aqui abajo. El macro funciona, y se ejecuta bien, pero al llegar a la linea citada, salta un error y no puede poblar las celdas de la columna.
¿Alguién sabe si existe algun método para poder poblar las celdas en modo Vertical, o hay que hacer un bucle con For To Next?
Esta es la linea donde sale el Error: oRango3.setData( arrayUnidimensional ) 'Error en este Rango.
GRACIAS !!

Código: Seleccionar todo

Sub Introducir7(mDatos2 as Variant)
'Poblar celdas en Vertical y Horizontal procedente los datos de un array.
Dim oHojaActiva As Object
Dim oRango1 As Object
Dim oRango2 As Object
Dim oRango3 As Object

Dim arrayBidimensional(2) as Variant
Dim arrayUnidimensional(0)  as Variant

arrayBidimensional(0) = Array(1,2,3)
arrayBidimensional(1) = Array(4,5,6)
arrayBidimensional(2) = Array(7,8,9)

arrayUnidimensional(0) = Array(1,2,3,4,5,6,7)

oHojaActiva = ThisComponent.getCurrentController().getActiveSheet()

oRango1 = oHojaActiva.getCellRangeByName("C1:E3")
oRango2 = oHojaActiva.getCellRangeByName("C6:I6")
oRango3 = oHojaActiva.getCellRangeByName("A1:A7")'Rango de una columna
'Insertamos la matriz completa
oRango1.setData( arrayBidimensional )
oRango2.setData( arrayUnidimensional )
oRango3.setData( arrayUnidimensional ) 'Error en este Rango para poblar el array Unidimensional de forma Vertical.
End Sub

Última edición por JoePublic el Jue Sep 21, 2023 2:36 pm, editado 5 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.
Karos
Mensajes: 45
Registrado: Mar Feb 02, 2021 7:53 pm

Re: Introducir valores en una Columna.

Mensaje por Karos »

Hum, igual debes programar en la macro que las celdas de destino en las que vas a copiar el contenido estén vacías o se puedan sobreescribir. Quizás LibreOffice necesita una instrucción específica de sobreescritura que autorice a introducir el contenido en las celdas, estén o no ocupadas.

Saludos.
Neftali R
Mensajes: 169
Registrado: Mar Jun 15, 2021 12:48 pm
Ubicación: Venezuela

Re: Introducir valores en una Columna.

Mensaje por Neftali R »

Eso es porque los rangos verticales siempre son matrices dentro de otra matriz, como en el caso del ArrayBidimensional, para introducir datos en las celdas A1:A7 tienes que hacer un array parecido a este:

ArrayUnidimensional(0) = Array(1)
ArrayUnidimensional(1) = Array(2)
ArrayUnidimensional(2) = Array(3)
ArrayUnidimensional(3) = Array(4)
ArrayUnidimensional(4) = Array(5)
ArrayUnidimensional(5) = Array(6)
ArrayUnidimensional(6) = Array(7)
 Editado: Si a tí tambien te parece engorroso tanto código para algo tan simple, puedes simplemente hacer uso de estas lineas de código para convertir una cadena de texto con un separador determinado en un Array Bidimencional: 

Código: Seleccionar todo

Sub ConvertirCadenaDeTextoAMatrizBidimencional
Dim sTexto As String, mMatriz()
Dim c As Integer

sTexto = "1,2,3,4,5,6,7"
mMatriz() = Split(sTexto,",")

	For c = 0 to UBound(mMatriz)
	mMatriz(c)=Array(mMatriz(c)
	Next

End Sub

Sub ConvertirCadenaDeTextoAMatrizBidimencional2
Dim sTexto As String, mMatriz()
Dim c As Integer

sTexto = "1,5-2,4-3,3-4,8-5,5-6,1-7,7"
mMatriz() = Split(sTexto,"-")

	For c = 0 to UBound(mMatriz)
	mMatriz(c)=Split(mMatriz(c),",")
	Next

End Sub
Saludos.
LibreOffice 7.2.6.2 | Windows 7 Ultimate
Avatar de Usuario
JoePublic
Mensajes: 36
Registrado: Dom Sep 06, 2020 5:34 pm

Re: Introducir poblar valores en una Columna.

Mensaje por JoePublic »

Lo que necesito es poblar un array en un rango de celdas.
Cuando se trata de un array bidimensional lo hace bien, pero cuando se trata de un array unidimensional y quiero poblar una sola fila o columna con el array Unidimensional, me sale error.
Alquien puede ayudarme.
Miren el ejemplo Inicial. El primero que puse.
Aqui sale error: oRango2.setData( arrayUnidimensional )
Gracias.
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: Introducir poblar valores en una Columna.

Mensaje por FJCC-ES »

La matriz arrayUnidimensional tiene dos dimensiones. El código es

Código: Seleccionar todo

arrayUnidimensional(0) = Array(1,2,3,4,5,6,7)
y no es

Código: Seleccionar todo

arrayUnidimensional = Array(1,2,3,4,5,6,7)
Para imprimir un valor de arrayUnidimensional uso la linea

Código: Seleccionar todo

print arrayUnidimensional(0)(2)

Código: Seleccionar todo

REM  *****  BASIC  *****
Sub Introducir7(mDatos2 as Variant)
'Poblar celdas en Vertical y Horizontal procedente los datos de un array.
Dim oHojaActiva As Object
Dim oRango1 As Object
Dim oRango2 As Object
Dim oRango3 As Object

Dim arrayBidimensional(2) as Variant
Dim arrayUnidimensional(0)  as Variant
Dim arrayBidimensional_2(6) as Variant  'fjcc ########

arrayBidimensional(0) = Array(1,2,3)
arrayBidimensional(1) = Array(4,5,6)
arrayBidimensional(2) = Array(7,8,9)

arrayUnidimensional(0) = Array(1,2,3,4,5,6,7)

`fjcc ####################
arrayBidimensional_2(0) = Array(10)
arrayBidimensional_2(1) = Array(11)
arrayBidimensional_2(2) = Array(12)
arrayBidimensional_2(3) = Array(13)
arrayBidimensional_2(4) = Array(14)
arrayBidimensional_2(5) = Array(15)
arrayBidimensional_2(6) = Array(16)
`fjcc ###################
oHojaActiva = ThisComponent.getCurrentController().getActiveSheet()

oRango1 = oHojaActiva.getCellRangeByName("C1:E3")
oRango2 = oHojaActiva.getCellRangeByName("C6:I6")
oRango3 = oHojaActiva.getCellRangeByName("A1:A7")'Rango de una columna
'Insertamos la matriz completa
oRango1.setData( arrayBidimensional )
oRango2.setData( arrayUnidimensional )
oRango3.setData( arrayBidimensional_2 ) 

End Sub
Avatar de Usuario
JoePublic
Mensajes: 36
Registrado: Dom Sep 06, 2020 5:34 pm

Re: Introducir datos o poblar rango celdas con valores de un array

Mensaje por JoePublic »

Hola FJCC-ES,
Muchas GRACIAS por contestar.
Su ejemplo anterior funciona !!! y es muy ilustrativo.

No sabia que un array simple de una dimension no era asi:

Código: Seleccionar todo

Dim Otra_Unidimensional() as Variant
Otra_Unidimensional = Array(1,2,3,4,5,6,7)
Print Otra_Unidimensional (2)
'Imprime el valor 3 y no es necesario poner el indice de fila 0. Este numero obedece al numero de posicion dentro del array.
Porque yo suelo hacer macros y las utilizo, de modo que al sacar un valor de ese array lo hago solo con un índice y creía que el hecho de tener una o dos dimensiones correspondia a si le pones uno o dos indices al array para leerlo, de modo que en su ejemplo de aqui abajo al meter dos indices (0)(2) en el metodo Print arrayUnidimensional(0)(2) correspondía a arrays de dos dimensiones.

Así pues, creía que al poblar rango de celdas en una hoja volcando los datos de un array, se podria hacer con arrays simples, sin tener que convertirlos a los arrays que usted me muestra, que para mi son de dos dimensiones porque hay que colocarle el indice de fila y el indice de columna.

Código: Seleccionar todo

Dim arrayUnidimensional(0) as Variant
arrayUnidimensional(0) = Array(1,2,3,4,5,6,7)
Print arrayUnidimensional(0)(2)
'Imprime el valor 3, pero debemos indicar el indice de fila 0 más el indice de columna numero 2 que obedece al numero de posicion dentro de la fila 0.
En la foto muestro como se ve en el IDE de LibreOffice con los parentesis dobles e indices que utiliza uno y otro.
Dos arrays con sus dimensiones
Dos arrays con sus dimensiones
arrayUnidimenssional.jpg (51.88 KiB) Visto 2648 veces
1-Entonces, ¿No se puede poblar un rango de celdas de una hoja con un array simple, es decir con este: Otra_Unidimensional = Array(1,2,3,4,5,6,7) ???? (Con este array no puedo. Sale error). Parece que es necesario transformalo en array de dos indices -> arrayUnidimensional(0) = Array(1,2,3,4,5,6,7) (Este si que funciona es el ejemplo que Usted ha puesto).

2-Por otro lado tengo otra duda. Si el array tiene solo numeros, para poblar se utiliza el método .setData() y si el array es alfanumerico se utiliza el metodo .setDataArray(), Ejemplo:

Código: Seleccionar todo

oRango1.setData( arrayBidimensional )'para poblar array de nnumeros.
oRango5.setDataArray( arrayBidimensional_3 )'para poblar array alfanumerico (letras y numeros mezclados)
En el siguiente macro con datos alfanumericos me sale un error cuando voy a poblarlo en las celdas con el metodo .setDataArray()

Código: Seleccionar todo

Sub poblarRangoCeldas_3()
Dim oHojaActiva As Object
Dim oRango1 As Object
Dim oRango5 As Object

Dim arrayBidimensional(2) as Variant
arrayBidimensional(0) = Array(1,2,3)
arrayBidimensional(1) = Array("")'Faltan datos. Pero aqui no me sale error.
arrayBidimensional(2) = Array(7,8,"")

Dim arrayBidimensional_3(2) as Variant
'Array de 3 filas y 3 columnas. He vaciado algunos datos porque cuando se almacenan en el array, ese campo carece de datos.
arrayBidimensional_3(0) = Array(1,2,"Miguel") 'Estan todos los datos.
arrayBidimensional_3(1) = Array("",3) 'Aqui falta un dato, y es el de la ultima columna de esa fila.
arrayBidimensional_3(2) = Array(7,"Carol","") 'Estan todos los datos.

oHojaActiva = ThisComponent.getCurrentController().getActiveSheet()

oRango1 = oHojaActiva.getCellRangeByName("A1:C3")
oRango5 = oHojaActiva.getCellRangeByName("A6:C8")

oRango1.setData( arrayBidimensional )'No sale error cuando el array tiene letras o esta vacio.
oRango5.setDataArray( arrayBidimensional_3 )'Sale Error cuando alguna posicion no tiene valor, es decir esta vacia.

End Sub

Me sale un error al poblar un rango de celdas y es porque el array "arrayBidimensional_3" no esta lleno del todo y utilizo el metodo .setDataArray()
Si estuviera lleno con datos o con comillas no saldría error. Aun así las celdas se llenan con los datos que contiene el array.
Sin embargo el array primero arrayBidimensional al utilizar el metodo .setData() no sale error, pero el texto se ve reemplazado por ceros.

3-¿Sabe si hay alguna manera de poblar el array sin que salga esta ventana de error, me refiero a la linea: oRango5.setDataArray( arrayBidimensional_3 ) ????
Tengo que decir que el rango de celdas a poblar esta bien dimensionado.
Última edición por JoePublic el Jue Sep 21, 2023 11:00 am, editado 1 vez 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: Introducir poblar valores en una Columna.

Mensaje por FJCC-ES »

JoePublic escribió: Mié Sep 20, 2023 3:06 pm ¿No se puede poblar un rango de celdas de una hoja con un array simple
Que yo sepa, no hay manera de poner datos en un rango de celdas sin usar una matriz de dos dimensiones.
JoePublic escribió: Mié Sep 20, 2023 3:06 pm ¿Sabe si hay alguna manera de poblar el array sin que salga esta ventana de error
No sé cómo evitar el error cuando el array tiene elementos vacíos. La sorpresa es que setData() no echa un error.
Avatar de Usuario
JoePublic
Mensajes: 36
Registrado: Dom Sep 06, 2020 5:34 pm

Re: Introducir datos o poblar rango celdas con valores de un array

Mensaje por JoePublic »

Muchisimas GRACIAS FJCC-ES

Su ayuda ha resuelto mis dudas. AQUI DEJO LA SOLUCION.
Dejo aqui debajo como poblar un rango de celdas con un array.
Hay varios ejemplos para poblar desde un array bidimensional (dos dimensiones)
Tambien esta su ejemplo de poblar una fila Horizontal con 7 valores sólo o una columna vertical con otros valores.

Código: Seleccionar todo

Sub poblarRangoCeldas()
'Poblar celdas en Vertical y Horizontal procedente los datos de un array.
'Macro resuelto Gracias a FJCC-ES

'Todos los arrays a poblar en un rango de celdas deben ser bidirecccionales.
'En este ejemplo se ve como poblar una fila y una Columna, asi como una matriz de 3 x 3
'El mismo macro lo dejo en un archivo de calc aqui abajo al final.

Dim oHojaActiva As Object
Dim oRango1 As Object
Dim oRango2 As Object
Dim oRango3 As Object
Dim oRango4 As Object
Dim oRango5 As Object

Dim arrayBidimensional(2) as Variant
arrayBidimensional(0) = Array(1,2,3)
arrayBidimensional(1) = Array(4,5,6)
arrayBidimensional(2) = Array(7,8,9)

Dim arrayBidimensional_3(2) as Variant
arrayBidimensional_3(0) = Array(1,2,"Miguel")
arrayBidimensional_3(1) = Array(4,"Juan","")
arrayBidimensional_3(2) = Array(7,"Carol",250)


Dim Otro_Unidimensional() as Variant
Otro_Unidimensional = Array(1,2,3,4,5,6,7) 'Array simple

Dim arrayUnidimensional(0) as Variant
arrayUnidimensional(0) = Array(1,2,3,4,5,6,7)'Para poblar una fila.

Dim arrayBidimensional_2(6) as Variant  'fjcc ########
'fjcc #################### Para poblar una columna.
arrayBidimensional_2(0) = Array(10)
arrayBidimensional_2(1) = Array(11)
arrayBidimensional_2(2) = Array(12)
arrayBidimensional_2(3) = Array(13)
arrayBidimensional_2(4) = Array(14)
arrayBidimensional_2(5) = Array(15)
arrayBidimensional_2(6) = Array(16)

'fjcc ###################
oHojaActiva = ThisComponent.getCurrentController().getActiveSheet()
'Print arrayUnidimensional(0)(2)

oRango1 = oHojaActiva.getCellRangeByName("A1:C3")

oRango2 = oHojaActiva.getCellRangeByName("F2:L2")
oRango3 = oHojaActiva.getCellRangeByName("A12:A18")'Rango de una columna
oRango5 = oHojaActiva.getCellRangeByName("A6:C8")

columna = 6
fila = 10
ultimaColumna = Ubound(arrayBidimensional_3(0),1) 'Nos dice el indice de la ultima columna del array o matriz.
ultimaFila = Ubound(arrayBidimensional_3()) 'Nos dice el indice de la ultima fila del array o matriz
oRango6 = oHojaActiva.getCellRangeByPosition(columna, fila, columna+ultimaColumna, fila+ultimaFila)
Call HighlightRange (oRango6) 'Sombrea un rango de celdas. Sobrea el oRango6

'Insertamos la matriz completa
oRango1.setData( arrayBidimensional )'Este solo cuando el array contiene numeros.

oRango2.setData( arrayUnidimensional ) 'Puebla una fila y es una array Bidimensional de 1 fila.
'oRango2.setData( Otro_Unidimensional ) 'Sale error porque el array es un array Simple y debe ser Bidimensional.
oRango3.setData( arrayBidimensional_2 ) 'Puebla una columna y es un array Bidimensional de 7 filas.
oRango5.setDataArray( arrayBidimensional_3 )'Este cuando el array es alfanumerico. Cuidado !! Sale Error cuando alguna posicion del array no tiene valor, es decir, esta vacia.
oRango6.setDataArray( arrayBidimensional_3 )
End Sub

'*******************************************
Sub HighlightRange (oCursor)
'Colorea un rango de celdas y asi sabemos donde esta visualmeente.
'How to select & highlight a range in macro
'Solo crea el marco para remarcarlo y que se visualmente se vea coloreado, y así indicar al usuario que zona de rango esta seleccionada con el Cursor, nada mas.

'rg = thiscomponent.sheets(0).getCellRangeByName("C5:D8")
rg = oCursor
view = thiscomponent.getCurrentController()
frame = view.getFrame()

REM mandatory
' mri = createUnoService("mytools.Mri")
' mri.inspect(frame)

REM necessary
frame.activate()

REM optional
win = frame.getContainerWindow()
win.toFront()

view.select(rg)
End Sub
Poblar Array Unidimensional.ods
Archivo con el macro
(10.29 KiB) Descargado 106 veces
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.
Responder