JumboFrame
Участник

Offline
Сообщений: 13
|
Суть, хочу получить в параметры функции уже готовый объект содержащий конкретную ячейку или диапазон ячеек как ОБЪЕКТ! Текущая реализация 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
|
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. А зачем оно тебе собссно? Какую задачу хочешь решить-то?
|
|
|
Записан
|
|
|
|
JumboFrame
Участник

Offline
Сообщений: 13
|
Спасибо! Собственно я задачу немножко иначе решил. Было несколько справочных таблиц с условиями, пример: >=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
|
Так ты же не о том спросил! Но проверки на ПУСТОТУ не получалось, пустые ячейки оказывались равны "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
Остаётся отловить ячейки с пробелами - они вроде как и не пустые 
|
|
|
Записан
|
|
|
|
JumboFrame
Участник

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

Offline
Сообщений: 13
|
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
Сообщений: 13
|
Прилагаю файл на тестирование. Сообщайте результаты ячейки "C1"
|
|
|
Записан
|
|
|
|
JohnSUN
|
Может, в настройках собака порылась?
|
|
|
Записан
|
|
|
|
JumboFrame
Участник

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

Offline
Сообщений: 13
|
Всем спасибо! Будем знать, но с учетом многих WinXP, пока остаемся на старом варианте с "именованым диапазоном" .
|
|
|
Записан
|
|
|
|
JohnSUN
|
Ну, это один из возможных вариантов. Давай попробуем пожевать основную задачу. Можешь показать свой справочник коэффициентов, как он устроен?
|
|
|
Записан
|
|
|
|
JumboFrame
Участник

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

Offline
Сообщений: 13
|
Прилагаю слегка причёсанный вариант своей функции Увы отсутствуют некоторые проверки на корректность принимаемых в функцию значений. Основная проблема, которую вижу, в возможном применении в таблице дробных условий. Т.е. будет число в формате "<=-1,06" , и это будет строкой с десятичным разделителем ",". А если на другом компе другой разделитель - то будет ошибка.
Как вытащить в бейсике, текущий символ десятичной точки - пока не знаю.
|
|
|
Записан
|
|
|
|
JohnSUN
|
(Это тебе не спалось или у тебя там такой часовой пояс?) Ну, хорошо. А такой вариант попробовать не хочешь?
|
|
|
Записан
|
|
|
|
|