[Решено] Range.Select не работает с множественным выбором

Автор Sirius34, 17 мая 2024, 12:52

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

Sirius34

Доброго времени суток всем!

Адаптирую xlsm-файл для возможного использования в Calc.
При работе часто приходится в зависимости от определённых условий динамически менять заливку ячеек. Код типовой
    Range("B2:B10").Select
    With Selection.Interior
        .Pattern = xlSolid
        .PatternColorIndex = xlAutomatic
        .Color = 65535
        .TintAndShade = 0
        .PatternTintAndShade = 0
    End With
С одной ячейкой или одним диапазоном проблем нет. Но при использовании множественного выбора (например, Range("B2:B10,D2:D10,J2:L10,N3,N7,N9").Select) в Excel всё отлично работает, а в Calc получаю сообщение об ошибке:
Ошибка времени выполнения Basic.
'1'
Вызвано исключение
Type: com.sun.star.uno.RuntimeException
Message: unsatisfied query for interface of type com.sun.star.beans.XPropertySet!.

Попробовал поэкспериментировать.
Range("B2:B10","D2:D10","J2:L10","N3","N7","N9").SelectЭтот вариант ошибки в Calc не вызвал, но обработал только ячейки из множественных диапазонов.
А вот при запуске в Excel получил сообщение об ошибке о неверном количестве аргументов.

Конечно, через "костыль" (разбивать диапазоны на фрагменты и циклом обрабатывать) это всё будет функционировать, но, блин, неудобно же...

Я что-то не так делаю? Или это особенность LO, которую (пока) не победить?

Massaraksh7

Цитата: Sirius34 от 17 мая 2024, 12:52Этот вариант ошибки в Calc не вызвал, но обработал только ячейки из множественных диапазонов.
А если записать так:
Range("B2:B10","D2:D10","J2:L10","N3:N3","N7:N7","N9:N9").Select

bigor

Цитата: Massaraksh7 от 17 мая 2024, 13:26А если записать так:
тоже не закрашивает, но там еще интереснее, если "N3","N7","N9" прописать вначале, закрашивается только диапазон N3:N7
Поддержать наш форум можно здесь

sokol92

#3
Цитата: Sirius34 от 17 мая 2024, 12:52Но при использовании множественного выбора (например, Range("B2:B10,D2:D10,J2:L10,N3,N7,N9").Select) в Excel всё отлично работает, а в Calc получаю сообщение об ошибке:

Запускаю

Sub Test
  Range("B2:B10,D2:D10,J2:L10,N3,N7,N9").Select
  Msgbox Selection.Address
End Sub

на Вашем примере.

Результат: $B$2:$B$10,$D$2:$D$10,$J$2:$L$10,$N$3,$N$7,$N$9

В Вашей функции multi_choice ошибка возникает в строке
        .Pattern = xlSolidВероятно, присвоение данного свойства не рассчитано на объекты, состоящие из нескольких прямоугольных диапазонов.

Не стоит использовать выделение в макросах без особой необходимости.
Попробуйте так:

Sub multi_choice2()
  Dim rg As Object, v

  For Each v In Array("B2:B10", "D2:D10", "J2:L10", "N3", "N7", "N9")
    Set rg = Range(v)
    With rg.Interior
        .Pattern = xlSolid
        .PatternColorIndex = xlAutomatic
        .Color = 65535
        .TintAndShade = 0
        .PatternTintAndShade = 0
    End With
  Next v
End Sub
Владимир.

Sirius34

Цитата: sokol92 от 17 мая 2024, 16:04Результат: $B$2:$B$10,$D$2:$D$10,$J$2:$L$10,$N$3,$N$7,$N$9
И у меня такой же результат, что говорит о принципиально верной обработке "множества".
Тем не менее, в данном случае я веду речь именно о Selection.Interior в контексте множественного выбора.

Sirius34

Собственно, если закомментить все операторы внутри With ... End With, то ошибки не будет :)

sokol92

Владимир.

Sirius34

Цитата: sokol92 от 17 мая 2024, 16:04В Вашей функции multi_choice ошибка возникает в строке
Код Выделить Развернуть
        .Pattern = xlSolidВероятно, присвоение данного свойства не рассчитано на объекты, состоящие из нескольких прямоугольных диапазонов.
А Вы пробовали закомментить именно эту строку?
Судя по всему - нет, иначе бы ответ был другим. А я пробовал.
Пришлось комментить все строки, пока не остались только With и End With.

Еще раз повторяю: ошибка возникает только при множественном выборе.

Собственно, первоначально эта ошибка вылезла при привязке выпадающих списков, но там скрипт по своей сути почти перманентный, т.к. завязан на открытие книги, поэтому я разбил его на части по количеству столбцов.
И там никаких .Pattern не было.
Но дальше у меня уже шли скрипты с динамически меняющимися диапазонами, поэтому пришлось анализировать код "покраски". И снова тот же трабл.

Sirius34

sokol92
Дополнение увидел позже. Исправляюсь :)
Посмотрел Ваш скрипт. В LO сработал, в Excel'е нет...
Потестил разные варианты, по итогу пришлось поправить немного.
Вот этот вариант работает и там, и там (потестил на 400-строчной книге, по времени вроде большой разницы не заметил).
Sub multi_choice2()
  Dim rg As Object

  For Each rg In Array("B2:B10", "D2:D10", "J2:L10", "N3", "N7", "N9")
    Range(rg).Select
    With Selection.Interior
        .Pattern = xlSolid
        .PatternColorIndex = xlAutomatic
        .Color = 65535
        .TintAndShade = 0
        .PatternTintAndShade = 0
    End With
  Next rg
End Sub

В целом, проблема решена.
Спасибо. Вопрос можно закрыть.