Возможно ли получить в макрос из ячейки объект ЯЧЕЙК(А|И)

Автор JumboFrame, 24 апреля 2018, 06:28

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

JumboFrame

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

JumboFrame

#2
Спасибо!
Собственно я задачу немножко иначе решил.
Было несколько справочных таблиц с условиями, пример:
>=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
   


JohnSUN

Так ты же не о том спросил!
Цитата: JumboFrame от 24 апреля 2018, 12:08
Но проверки на ПУСТОТУ  не получалось, пустые ячейки оказывались равны "0" double
Если тебе только это нужно - забудь про первый ответ, не используй дурных рекомендаций  ;D
Ты про 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

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

JumboFrame

#5
Цитата: JohnSUN от 24 апреля 2018, 10:50Function 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

JumboFrame

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

JohnSUN

Может, в настройках собака порылась?
Владислав Орлов aka JohnSUN
Благодарить-не зазорно.
Подарить благо создателям офиса, нашему ресурсу, мне

JumboFrame


bigor

#9
В Libre 5.4 - не ищет пустые, isEmpty(rSource(i,j)) - возвращает 0
в Libre 6 - все работает
Поддержать разработчиков LibreOffice можно можно тут, а наш форум вот тут

JumboFrame

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

JohnSUN

Ну, это один из возможных вариантов. Давай попробуем пожевать основную задачу. Можешь показать свой справочник коэффициентов, как он устроен?
Владислав Орлов aka JohnSUN
Благодарить-не зазорно.
Подарить благо создателям офиса, нашему ресурсу, мне

JumboFrame

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

JumboFrame

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

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

JohnSUN

(Это тебе не спалось или у тебя там такой часовой пояс?)
Ну, хорошо. А такой вариант попробовать не хочешь?
Владислав Орлов aka JohnSUN
Благодарить-не зазорно.
Подарить благо создателям офиса, нашему ресурсу, мне