Перевод: Insert into multiple selection not possible.

Автор eeigor, 26 ноября 2020, 11:03

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

eeigor

Ввод данных в несколько ячеек сразу: Ctrl+Enter в Excel   и   Alt+Enter в LO Calc.

Ошибка возникает, если выделено несколько диапазонов.
Сообщение об ошибке переведено неточно (En: Insert into multiple selection not possible.)
Как вариант: Вставить данные в несколько несмежных ячеек невозможно.
Ubuntu 18.04 LTS • LibreOffice 7.5.1.2 Community

bormant

На сегодняшний момент с учетом внесенных правок имеем:

Multiple Selection
Мультивыделение

Insert into multiple selection not possible
Невозможно вставить в мультивыделение

This function cannot be used with multiple selections.
Невозможно применить эту функцию к мультивыделению.


Можем пообсуждать термин.
Автору на яд. Поддержать форум.

eeigor

#2
Не очень понятно для «непосвящённого» (не интуитивно). Но переведено уже ближе к тексту. А текущий перевод похож на машинный.
UPD:
Терминология в тему: contiguous/non-adjacent - примыкающий, граничащий и наоборот.
Если мы выделяем несколько диапазонов, и они смежные, то LO Calc автоматически объединяет их (merge; и я это наблюдаю, осваивая Calc), и мы вполне можем вставить данные в такой диапазон - он будет один (но в Excel совершенно не так). Поэтому вышеуказанные термины лучше разъясняют смысл происходящего, чем термин "мультивыделение": это обязательно несмежные диапазоны.

Ещё раз: в Excel уже выделенную ячейку можно выделить повторно, нажав клавишу Ctrl и щёлкнув по ней мышью (цвет выделения при этом изменится на более серый и ещё серее), и это будет настоящее мультивыделение. Выделил в Excel одну и ту же ячейку 5 раз; проверил значение Selection.Count. Ответ: 5.
И пусть в исходном языке (multiple selection) ключевых слов нет, смысл происходящего именно в них.

Вставить данные в несколько несмежных диапазонов невозможно
It is impossible to insert data into multiple non-contiguous ranges (non-adjacent cells)

И, кстати, в Excel нет проблем со вставкой данных в несколько несмежных диапазонов. Для LO Calc - это ограничение, и ошибка связанная с ним. Значит, и разъяснить смысл этой ошибки следует более доходчиво.
Ubuntu 18.04 LTS • LibreOffice 7.5.1.2 Community

bormant

#3
Цитата: eeigor от 26 ноября 2020, 12:14обязательно несмежные диапазоны
Давайте вернемся от фантазий к суровой действительности.
Диапазоны смежные, но это мультивыделение, вставка блокируется.
Причем, если элементы мультивыделения будут кратны скопированным ячейкам, вставка будет осуществлена
Автору на яд. Поддержать форум.

eeigor

#4
bormant, как вам удалось получить (если верить выделению цветом) диапазоны неправильной формы (не прямоугольной)? Скриншот 1.
Я что-то не могу их мысленно "состыковать"...

Выделить несколько смежных диапазонов в коде можно, конечно...
   oRanges.addRangeAddress(oRange.RangeAddress, False)  'False - значит не объединять.

Но вот беда: при выделении диапазонов мышкой у меня все диапазоны объединяются в один, как если бы выполнялся метод:
   oRanges.addRangeAddress(oRange.RangeAddress, True)  'True - значит объединять

P.S. Я осваиваю Calc. Провожу аналогию с Excel. Могу ошибаться...

UPD: Проверил ещё раз. Моя правда: всё объединяется в один, и данные, введенные в активную ячейку, вставляются методом Alt+Enter во все выделенные ячейки диапазона.

Цитата: eeigor от 26 ноября 2020, 12:14Вставить данные в несколько несмежных диапазонов невозможно
А равно как и в несколько смежных. Вопрос в том, как их, смежные, выделить мышкой?
Ubuntu 18.04 LTS • LibreOffice 7.5.1.2 Community

bormant

Цитата: eeigor от 26 ноября 2020, 20:04получить (если верить выделению цветом) диапазоны неправильной формы (не прямоугольной)? Скриншот 1.
Я что-то не могу их мысленно "состыковать"...
Два вертикальных выделения A1:A6,и B2:B6.
Автору на яд. Поддержать форум.

eeigor

Выделил. Результат - один диапазон, и никаких проблем со вставкой. Слиты, как и говорил выше.
Ubuntu 18.04 LTS • LibreOffice 7.5.1.2 Community

bormant

#7
Между ними разница только тут:
https://opengrok.libreoffice.org/xref/core/sc/source/ui/unoobj/cellsuno.cxx?r=bb06f513#1695

1695  void ScCellRangesBase::AddRange(const ScRange& rRange, const bool bMergeRanges)
1696  {
1697      if (bMergeRanges)
1698          aRanges.Join(rRange);
1699      else
1700          aRanges.push_back(rRange);
1701      RefChanged();
1702  }
1703 


Слитые -- это Join:
https://opengrok.libreoffice.org/xref/core/sc/source/ui/unoobj/cellsuno.cxx?r=bb06f513#9122

9122  void ScUniqueFormatsEntry::Join( const ScRange& rNewRange )
9123  {
9124      // Special-case handling for single range
9125 
9126      if ( eState == STATE_EMPTY )
9127      {
9128          aSingleRange = rNewRange;
9129          eState = STATE_SINGLE;
9130          return;
9131      }
9132      if ( eState == STATE_SINGLE )
9133      {
9134          if ( aSingleRange.aStart.Row() == rNewRange.aStart.Row() &&
9135               aSingleRange.aEnd.Row() == rNewRange.aEnd.Row() &&
9136               aSingleRange.aEnd.Col() + 1 == rNewRange.aStart.Col() )
9137          {
9138              aSingleRange.aEnd.SetCol( rNewRange.aEnd.Col() );
9139              return;     // still a single range
9140          }
9141 
9142          SCROW nSingleRow = aSingleRange.aStart.Row();
9143          aJoinedRanges.emplace( nSingleRow, aSingleRange );
9144          eState = STATE_COMPLEX;
9145          // continue normally
9146      }
9147 
9148      // This is called in the order of ScAttrRectIterator results.
9149      // rNewRange can only be joined with an existing entry if it's the same rows, starting in the next column.
9150      // If the old entry for the start row extends to a different end row, or ends in a different column, it
9151      // can be moved to aCompletedRanges because it can't be joined with following iterator results.
9152      // Everything happens within one sheet, so Tab can be ignored.
9153 
9154      SCROW nStartRow = rNewRange.aStart.Row();
9155      ScRowRangeHashMap::iterator aIter( aJoinedRanges.find( nStartRow ) );       // find the active entry for the start row
9156      if ( aIter != aJoinedRanges.end() )
9157      {
9158          ScRange& rOldRange = aIter->second;
9159          if ( rOldRange.aEnd.Row() == rNewRange.aEnd.Row() &&
9160               rOldRange.aEnd.Col() + 1 == rNewRange.aStart.Col() )
9161          {
9162              // extend existing range
9163              rOldRange.aEnd.SetCol( rNewRange.aEnd.Col() );
9164          }
9165          else
9166          {
9167              // move old range to aCompletedRanges, keep rNewRange for joining
9168              aCompletedRanges.push_back( rOldRange );
9169              rOldRange = rNewRange;  // replace in hash map
9170          }
9171      }
9172      else
9173      {
9174          // keep rNewRange for joining
9175          aJoinedRanges.emplace( nStartRow, rNewRange );
9176      }
9177  }


https://api.libreoffice.org/docs/idl/ref/interfacecom_1_1sun_1_1star_1_1sheet_1_1XSheetCellRangeContainer.html#a111ee349037459a5e0dcb0dbd4a5b61c
Цитировать
void addRangeAddress(
   [in] com::sun::star::table::CellRangeAddress    aCellRangeAddress,
   [in] boolean    bMergeRanges
)      
adds the given range to the collection of cell ranges.

Parameters
aCellRangeAddress
   contains the address of the new range.
bMergeRanges
   defines how the range should be added. To merge the ranges takes more time, but the memory usage is lower.
Автору на яд. Поддержать форум.

bormant

Цитата: eeigor от 26 ноября 2020, 20:20Результат - один диапазон, и никаких проблем со вставкой.
Вон там выше было 2 примера, во втором никаких проблем со вставкой, а в первом -- проблемы со вставкой. Оба выделения получены мышкой.
Автору на яд. Поддержать форум.

eeigor

#9
bormant, я провел тест на примере.
Sub TestMultiSelection()
   Dim oSheet, oRanges, oRange

   oRanges = ThisComponent.createInstance("com.sun.star.sheet.SheetCellRanges")
   oSheet = ThisComponent.CurrentController.ActiveSheet  '.Sheets.getByIndex(0)

   oRange = oSheet.getCellRangeByName("A1:A6")
   oRanges.addRangeAddress(oRange.RangeAddress, False)
   
   oRange = oSheet.getCellRangeByName("B1:B6")
   oRanges.addRangeAddress(oRange.RangeAddress, False)
   
   ThisComponent.CurrentController.select(oRanges)
   MsgBox oRanges.RangeAddressesAsString
End Sub


Комментарий. Можно создать в коде два смежных диапазона и выделить их (код выше), MsgBox покажет 2 диапазона, но на листе вставка в выделенные ячейки всё равно сработала, как если бы это был один диапазон. "Несмежность" - критична.
Заменил параметр False на True - MsgBox показала, что диапазон один, но это уже неважно.

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

Цитата: bormant от 26 ноября 2020, 20:40в первом -- проблемы со вставкой. Оба выделения получены мышкой
Дайте пошаговую инструкцию.

UPD: Вы увидите выделения, если будете выполнять макрос не из IDE, а через меню листа. Иначе выделения не увидите: проблема с активным дисплеем.
См. скриншот. Вот такой фокус: диапазона выделено два, но как бы один... И вставка в них прекрасно работает. Напомним, что через интерфейс пользователя я не смог получить такого. Впрочем, я не проверял: может, я выделяю несколько диапазонов, но факт в том, что вставка данных в них работает. А мы начали разговор с того, что это невозможно.
Ubuntu 18.04 LTS • LibreOffice 7.5.1.2 Community

eeigor

#10
Ну, кажется ясно, и я понял ваш пример. Вставить данные нельзя, если результирующее выделение непрямоугольной формы (!). Дополните прямоугольник, и всё сработает.

UPD: Пришлось проверить. При выделении мышкой выделение-таки множественное (я был неправ), достаточно нажимать клавишу Ctrl для добавления нового (смежность-несмежность роли не играет). Но если результирующее мультвыделение прямоугольной формы, проблем со вставкой нет, если непрямоугольной - ошибка вставки.
Уточняем: вставка в мультивыделение невозможна, если составляющие ее диапазоны несмежны, или смежны, но выделение имеет непрямоугольную форму.
Исходя из этого уточните сообщение об ошибке.
Спасибо.
Ubuntu 18.04 LTS • LibreOffice 7.5.1.2 Community

bormant

#11
Вот вам непрямоугольное.
ps. Кратное и некратное (было уже) ;)
Автору на яд. Поддержать форум.

eeigor

#12
Да, я написал чуть выше. Просто меня сбивала с толку красная рамка, обрамляющая диапазон, которая исчезала, если два диапазона смежны.
Ubuntu 18.04 LTS • LibreOffice 7.5.1.2 Community

bormant

Цитата: eeigor от 26 ноября 2020, 20:47
мы начали разговор с того, что это невозможно.
Мы начали разговор с того, что перевод неправильный, не отражает проблемы.

На самом деле:
- раньше в мультивыделения вставка не производилась,
- сейчас мультивыделение в некоторых случаях может стать препятствием для вставки. В этих случаях выводится сообщение:
Insert into multiple selection not possible
Невозможно вставить в мультивыделение

что в целом картину отражает верно.

Вероятно, есть смысл уточнить:
Невозможно вставить в это мультивыделение

В остальном, никакой проблемы для локализации не вижу.
Автору на яд. Поддержать форум.

eeigor

Согласен. И сам с чем-то разобрался. Маленький квест...
Ubuntu 18.04 LTS • LibreOffice 7.5.1.2 Community