Форум поддержки пользователей. LibreOffice, Apache OpenOffice, OpenOffice.org

Форум поддержки пользователей. LibreOffice, Apache OpenOffice, OpenOffice.org

18 Октябрь 2018, 21:18 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
Новости: Здесь можно поблагодарить участников форума Улыбка
 
   Начало   Помощь Поиск Войти Регистрация    задать вопрос  
Страниц: 1 2 »   Вниз
  Печать  
Автор Тема: Возможно ли получить в макрос из ячейки объект ЯЧЕЙК(А|И)  (Прочитано 1097 раз)
0 Пользователей и 1 Гость смотрят эту тему.
JumboFrame
Участник
**
Offline Offline

Сообщений: 13


« Стартовое сообщение: 24 Апрель 2018, 06:28 »

Суть, хочу получить в параметры функции уже готовый объект содержащий конкретную ячейку или диапазон ячеек как ОБЪЕКТ!
Текущая реализация LibreOffice (да и Apache тоже) похоже не позволяет это сделать. Точнее сделать позволяет но только при вызове этого макроса из другого макроса(которые и вытаскивает объект из координат или именованного диапазона).

Вопроса, соответственно - ДВА.
1. Может я что то пропустил, и можно вызвать функцию-макрос(Basic) ?
"=AAAA(B2:C4)"
Function AAAA(oCELL as VARIANT) AS String
 ' Work with oCELL as OBJECT, not as range values(double,string, etc)
 ' Работать с oCELL  как ОБЪЕКТОМ, а не с обычным диапазоном-массивом обычных данных
end function

2. А почему так не сделано?

P.S. в существующих ограничениях убедился на собственном примере и комментарии с https://stackoverflow.com/questions/33059048/function-accessing-cell-range
Записан
JohnSUN
Капитана в тот день называли на "ты"
Гуру
*******
Offline Offline

Пол: Мужской
Расположение: Киев
Сообщений: 2 593


Помогаю людям и компьютерам понимать друг друга


WWW
« Ответ #1: 24 Апрель 2018, 09:17 »

1. Можно. Это один из очень немногих случаев, когда VBA в StarBasic действительно полезен может быть использован:
Код:
Rem Attribute VBA_ModuleType=VBAModule
Option VBASupport 1
Option Explicit

Function getRangeInfo(ByVal rSource As Range) As String
Dim oCellRange As Variant
  oCellRange = rSource.getCellRange()
Rem Дальше с диапазоном oCellRange делай что хочешь. Например, так:
    getRangeInfo = Join(oCellRange.getFormulaArray()(0)," ")
End Function
2. Почему не сделано? Просто не там искал  Подмигивающий
3. А зачем оно тебе собссно? Какую задачу хочешь решить-то?
Записан

Владислав Орлов aka JohnSUN
Благодарить-не зазорно.
Подарить благо создателям офиса, нашему ресурсу, мне
JumboFrame
Участник
**
Offline Offline

Сообщений: 13


« Ответ #2: 24 Апрель 2018, 12:08 »

Спасибо!
Собственно я задачу немножко иначе решил.
Было несколько справочных таблиц с условиями, пример:
>=1      <3         Koif_1
>=3       <3.5     Koif_2
ПУСТО   >0        Koif_3
и так далее.
И сооружал функцию наподобии VLOOKUP, только выбор на основе справочных таблиц вытаскивать коэффициент если он входит в условие.
function VLOOKUP_BETWEEN(range as variant, MinID,MaxID, KoeffID) as variant
Но проверки на ПУСТОТУ  не получалось, пустые ячейки оказывались равны "0" double
И на данный момент соорудил на основе ИМЕНОВАННЫХ диапазонов
function VLOOKUP_BETWEEN(rangeName as String, MinID,MaxID, KoeffID) as variant
И далее уже
oCellRange = ThisComponent.NamedRanges.getByName(rangeName).ReferredCells
   

« Последнее редактирование: 24 Апрель 2018, 12:43 от JumboFrame » Записан
JohnSUN
Капитана в тот день называли на "ты"
Гуру
*******
Offline Offline

Пол: Мужской
Расположение: Киев
Сообщений: 2 593


Помогаю людям и компьютерам понимать друг друга


WWW
« Ответ #3: 24 Апрель 2018, 12:50 »

Так ты же не о том спросил!
Но проверки на ПУСТОТУ  не получалось, пустые ячейки оказывались равны "0" double
Если тебе только это нужно - забудь про первый ответ, не используй дурных рекомендаций  Смеющийся
Ты про isEmpty слышал? Там какая штука получается - "0" double ты действительно получишь для пустых ячеек и для ячеек с настоящими нулями. А вот если каждый из элементов входного массива будешь проверять с помощью функции isEmpty, то пустые ячейки отловишь легко:
Код:
Function getRangeInfo1(rSource As Variant) As String
Dim i As Long, j As Long, res As String
res = ""
  For i = LBound(rSource) To UBound(rSource)
  For j = LBound(rSource,2) To UBound(rSource,2)
  If isEmpty(rSource(i,j)) Then res = res + " " + i + "/" + j
  Next j
  Next i
  If Len(res) Then
    getRangeInfo1 = "Пустые ячейки:" & res
    Else
    getRangeInfo1 = "Пустых ячеек не найдено"
    EndIf
End Function
Остаётся отловить ячейки с пробелами - они вроде как и не пустые  Подмигивающий
Записан

Владислав Орлов aka JohnSUN
Благодарить-не зазорно.
Подарить благо создателям офиса, нашему ресурсу, мне
JumboFrame
Участник
**
Offline Offline

Сообщений: 13


« Ответ #4: 24 Апрель 2018, 13:27 »

isEmpty использовал, и функция возвращала false для пустой ячейки. Причину не понял. Возможно из за форматирования ячейки.
P.S.
Впрочем если влез в это VBA и сделал хотя и коряво после многих лет забвения - это уже хорошо. Главное комментарий к макросу приписать, для потомков =)
Записан
JumboFrame
Участник
**
Offline Offline

Сообщений: 13


« Ответ #5: 26 Апрель 2018, 12:02 »

Function getRangeInfo1(rSource As Variant) As String
Сейчас проверил этот вариант, и он написал что "Пустых ячеек не найдено", хотя половина заданого диапазона ПУСТАЯ ! =)
Уточните пожалуйста в какой версии какого пакета проверяли?
P.S.
Версия: LibreOffice 5.4.4.2
ID сборки: 2524958677847fb3bb44820e40380acbe820f960
Потоков ЦП: 4; ОС:Windows 5.2; Отрисовка ИП: по умолчанию;
Локаль: ru-RU (ru_RU); Calc: group
Увы, новее не могу WinXP 64bit
« Последнее редактирование: 26 Апрель 2018, 12:03 от JumboFrame » Записан
JumboFrame
Участник
**
Offline Offline

Сообщений: 13


« Ответ #6: 26 Апрель 2018, 12:15 »

Прилагаю файл на тестирование. Сообщайте результаты ячейки "C1"

* TestMe.ods (12.17 Кб - загружено 5 раз.)
Записан
JohnSUN
Капитана в тот день называли на "ты"
Гуру
*******
Offline Offline

Пол: Мужской
Расположение: Киев
Сообщений: 2 593


Помогаю людям и компьютерам понимать друг друга


WWW
« Ответ #7: 26 Апрель 2018, 12:40 »

Может, в настройках собака порылась?


* ЗапускВLO.png (43.13 Кб, 618x617 - просмотрено 8 раз.)

* НольИлиПусто.png (37.91 Кб, 788x572 - просмотрено 9 раз.)
Записан

Владислав Орлов aka JohnSUN
Благодарить-не зазорно.
Подарить благо создателям офиса, нашему ресурсу, мне
JumboFrame
Участник
**
Offline Offline

Сообщений: 13


« Ответ #8: 26 Апрель 2018, 12:44 »

Мои настройки


* testme-screenshot.JPG (182.26 Кб, 1011x1035 - просмотрено 6 раз.)
Записан
Bigor
Опытный пользователь
***
Offline Offline

Пол: Мужской
Сообщений: 314


« Ответ #9: 26 Апрель 2018, 13:15 »

В Libre 5.4 - не ищет пустые, isEmpty(rSource(i,j)) - возвращает 0
в Libre 6 - все работает
« Последнее редактирование: 26 Апрель 2018, 13:19 от Bigor » Записан
JumboFrame
Участник
**
Offline Offline

Сообщений: 13


« Ответ #10: 26 Апрель 2018, 13:21 »

Всем спасибо!
Будем знать, но с учетом многих WinXP, пока остаемся на старом варианте с "именованым диапазоном"
.
Записан
JohnSUN
Капитана в тот день называли на "ты"
Гуру
*******
Offline Offline

Пол: Мужской
Расположение: Киев
Сообщений: 2 593


Помогаю людям и компьютерам понимать друг друга


WWW
« Ответ #11: 26 Апрель 2018, 14:07 »

Ну, это один из возможных вариантов. Давай попробуем пожевать основную задачу. Можешь показать свой справочник коэффициентов, как он устроен?
Записан

Владислав Орлов aka JohnSUN
Благодарить-не зазорно.
Подарить благо создателям офиса, нашему ресурсу, мне
JumboFrame
Участник
**
Offline Offline

Сообщений: 13


« Ответ #12: 26 Апрель 2018, 14:13 »

Смысла, честно не вижу. Обычная расчетная задача с разными коэффициентами с разными параметрами.
Попробую причесать свой макрос и выложит, но это уже завтра. А без причёсывания, только форум буду засорять.
У меня рабочий день заканчивается.
Записан
JumboFrame
Участник
**
Offline Offline

Сообщений: 13


« Ответ #13: 27 Апрель 2018, 05:51 »

Прилагаю  слегка причёсанный вариант своей функции
Увы отсутствуют некоторые проверки на корректность принимаемых в функцию значений.
Основная проблема, которую вижу, в возможном применении в таблице дробных условий.
Т.е. будет число в формате "<=-1,06" , и это будет строкой с десятичным разделителем ",". А если на другом компе другой разделитель - то будет ошибка.

Как вытащить в бейсике, текущий символ десятичной точки - пока не знаю.

* ExampleFunctionVLOOKUP_BETWEEN_COLUMN_2.ods (12.08 Кб - загружено 4 раз.)
Записан
JohnSUN
Капитана в тот день называли на "ты"
Гуру
*******
Offline Offline

Пол: Мужской
Расположение: Киев
Сообщений: 2 593


Помогаю людям и компьютерам понимать друг друга


WWW
« Ответ #14: 27 Апрель 2018, 06:59 »

(Это тебе не спалось или у тебя там такой часовой пояс?)
Ну, хорошо. А такой вариант попробовать не хочешь?

* ExampleFunctionVLOOKUP_TRADITIONAL_VARIANT.ods (13.72 Кб - загружено 5 раз.)
Записан

Владислав Орлов aka JohnSUN
Благодарить-не зазорно.
Подарить благо создателям офиса, нашему ресурсу, мне
Страниц: 1 2 »   Вверх
  Печать  
 
Перейти в:  

Powered by MySQL Powered by PHP Powered by SMF 1.1.21 | SMF © 2006-2009, Simple Machines Valid XHTML 1.0! Valid CSS!