Заполнить диапазон...

Автор МР, 2 августа 2021, 21:04

0 Пользователи и 1 гость просматривают эту тему.

МР

Возможно ли в Basic заполнить диапазон ячеек  сразу из массива ?  Аналогично  VBA-Excel  https://vremya-ne-zhdet.ru/vba-excel/diapazon-yacheyek-i-massiv-obmen-znacheniyami/ . Или заполнить диапазон из набора данных , аналогично CopyFromRecordset?

sokol92

Option Explicit
Sub TestDataArray
  Dim arr
  arr=ThisComponent.Sheets(0).getCellRangeByName("A1:C3").DataArray
  ThisComponent.Sheets(0).getCellRangeByName("A11:C13").setDataArray arr 
End Sub


Только arr после присвоения становится не двумерным массивом, как в Excel, а одномерным массивом, состоящим из одномерных массивов (типа Variant).
Владимир.

eeigor

И это означает, что обычный двумерный массив (строки-столбцы) надо перед присвоением диапазону ячеек преобразовать в массив массивов. Такую функцию надо иметь в своей библиотеке.
Ubuntu 18.04 LTS • LibreOffice 7.4.3.2 Community

sokol92

#3
Цитата: eeigor от  3 августа 2021, 09:12то обычный двумерный массив (строки-столбцы) надо перед присвоением диапазону ячеек преобразовать в массив массивов
Разработчики метода setDataArray проявили невиданную щедрость (;D) и разрешили этого не делать:

Sub TestDataArray2
 Dim arr(2,2), i1 As Long, i2 As Long
 For i1=Lbound(arr,1) To Ubound(arr,1)
   For i2=Lbound(arr,2) To Ubound(arr,2)
     arr(i1,i2)=i1+i2
   Next i2
 Next i1
 ThisComponent.Sheets(0).getCellRangeByName("A11:C13").setDataArray arr  
End Sub
Владимир.

eeigor

@sokol92, я вспомнил, что сам же "возмущался" по этому поводу. Но это работает в одну сторону.

https://forumooo.ru/index.php/topic,8403.msg56554.html#msg56554
Ubuntu 18.04 LTS • LibreOffice 7.4.3.2 Community

mikekaganski

#5
Цитата: sokol92 от  3 августа 2021, 13:12Разработчики метода setDataArray проявили невиданную щедрость

Нет, это не свойство setDataArray. Это особенность маршаллинга двумерного массива Basic в UNO-структуру [][]any
С уважением,
Михаил Каганский

eeigor

@MP, тема по ссылке выше (#4) существенно дополняет ответ на ваш вопрос. Посмотрите.
Ubuntu 18.04 LTS • LibreOffice 7.4.3.2 Community

sokol92

Михаил, спасибо за очередную ссылку (поставил смайлик в #3 с задержкой).
Владимир.

eeigor

Может, есть у кого что добавить по данному вопросу?
https://forumooo.ru/index.php/topic,8403.msg56562.html#msg56562
Ubuntu 18.04 LTS • LibreOffice 7.4.3.2 Community

sokol92

#9
Ссылка, указанная Михаилом, дает объяснение. Насколько я понимаю, при обращении к методу setDataArray компилятор Basic "преобразует" двумерный массив Basic в тип UNO sequence< sequence< any > >. То же будет и с другими методами с такой сигнатурой. Вряд ли стоит пользоваться этой недокументированной возможностью в серьезных приложениях.
Владимир.

eeigor

#10
"То же будет и с другими методами с такой сигнатурой".
Нет возможности поверить самому, но вопрос такой.
В VBA я могу заполнить список listbox/combobox, присвоив двумерный массив. А как здесь? Какой массив создавать? И можно ли инициализировать зараз массивом или только добавлять по одному элементу?
Ubuntu 18.04 LTS • LibreOffice 7.4.3.2 Community

sokol92

За исходные данные Listbox отвечает свойство StringItemList (массив строк).
Владимир.

eeigor

@sokol92, я имел в виду multicolumn list, если здесь такое есть, конечно. Но это уже оффтоп.
Ubuntu 18.04 LTS • LibreOffice 7.4.3.2 Community