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

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

18 Июнь 2021, 14:50 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
Новости: Здесь можно поблагодарить участников форума Улыбка
 
   Начало   Помощь Поиск Войти Регистрация    задать вопрос  
Страниц: 1 2 »   Вниз
  Печать  
Автор Тема: Как получить имя поименованной ячейки?  (Прочитано 1033 раз)
0 Пользователей и 1 Гость смотрят эту тему.
Kadet
Форумчанин
***
Offline Offline

Сообщений: 427


« Стартовое сообщение: 26 Май 2021, 07:26 »

Добрый день, уважаемые коллеги!
Столкнулся с такой проблемой.
Делаю много поименованных ячеек:
Код:
i = 0
j = 0
oDoc = ThisComponent
oSheet = oDoc.Sheets(0)
oNamedRanges = oDoc.NamedRanges
oNamedRanges.addNewByName("CellName", oSheet.getCellByPosition(j, i).AbsoluteName, oSheet.getCellByPosition(j, i).CellAddress, 0)
Обращаться к этим ячейкам и получать данные из них становится легко:
Код:
oPole = oSheet.getCellRangeByName("CellName").String

Однако, возникла обратная необходимость. На ячейках стоит листенер, который следит за их изменением. И поэтому есть необходимость получить имя ячейки, в которой произошло изменение.
Никак не могу получить это имя. Подскажите, пожалуйста, решение.
Записан
mikekaganski
Гуру
*******
Offline Offline

Пол: Мужской
Расположение: Хабаровск -> Москва
Сообщений: 2 108


« Ответ #1: 26 Май 2021, 08:38 »

Перебором. Ячейка может входить в любое число именованных диапазонов.
Записан

С уважением,
Михаил Каганский
economist
Форумчанин
***
Offline Offline

Сообщений: 1 495


« Ответ #2: 26 Май 2021, 09:14 »

Имена есть в структуре ThisComponent.NamedRanges Работать с ними в LO - то еще удовольствие.

Адрес ячейки в Листнере - совпадет с активной ячейкой, на Форуме есть готовая функция от @eeigor getActiveCell

В похожей ситуации - отдал под это дело листик, где вывел построчно адреса/имена. Знаю адрес - беру рядом имя и наоборот.

PS Решения наверняка тут: https://forum.openoffice.org/en/forum/viewtopic.php?f=9&t=83753&hilit=get+name+of+cell+namedranges#p389060
« Последнее редактирование: 26 Май 2021, 09:18 от economist » Записан

Руб. за сто, что Питоньяк
Любит водку и коньяк!
Потому что мне, без оных, -
Не понять его никак...
Kadet
Форумчанин
***
Offline Offline

Сообщений: 427


« Ответ #3: 26 Май 2021, 09:59 »

Перебором. Ячейка может входить в любое число именованных диапазонов.
Перебором не красиво и долго выходит.
Имена есть в структуре ThisComponent.NamedRanges Работать с ними в LO - то еще удовольствие.
Имена нашёл. Структуру нашёл. В листенере ячейку ловлю через oEvent.Source.
Пытался поймать имя занося полученную по Event ячейку в новый Rang. Не получается. Ща поизучаю ссылку. Может что полезное подчерпну.
Спасибо!
« Последнее редактирование: 26 Май 2021, 10:01 от Kadet » Записан
economist
Форумчанин
***
Offline Offline

Сообщений: 1 495


« Ответ #4: 26 Май 2021, 10:05 »

Ну и вот "ленивое" решение на VBA, если мы говорим про одиночные имен. ячейки (нужна та же функция getActiveCell)

Код:
Option VBASupport 1

Sub ActiveCellName
For Each nm In ActiveWorkbook.Names
ac_adr = mid(getActiveCell(ThisComponent.CurrentController).AbsoluteName,2)
ac_adr = "=" & replace(ac_adr, ".", "!") ' привели к Excel-адресу, настройки LO кмк не влияют 
if ac_adr = nm.RefersTo then msgbox nm.Name ' имя акт яч
Next
End sub
Записан

Руб. за сто, что Питоньяк
Любит водку и коньяк!
Потому что мне, без оных, -
Не понять его никак...
Kadet
Форумчанин
***
Offline Offline

Сообщений: 427


« Ответ #5: 26 Май 2021, 10:21 »

А вообще, вопрос стоит совсем в другом.
Мне нужно временно сохранить изменяемые данные при переформировании документа.

Вот документ. Проект. В нём есть вариаторы (подчёркнуты красненьким). Они изменяемые. Их можно менять и эти изменения должны использоваться при новом пересчёте. А вот при каждом пересчёте все листы документа (кроме нулевого) удаляются и заново формируются.
И ещё - места у этих вариаторов не фиксированы, а меняются в зависимости от масштабов, от размеров чертежей, параметров объекта и разрешений разных компов и т.д.. Т.е. - по адресу ячеек получать данные с них не получается.

Я придумал именовать эти ячейки и добираться к ним через имена, но тут возник встречный вопрос с листерером.

Может есть какой-нибудь другой, более простой и удобный вариант временно сохранять данные и затем их использовать. И следить за их изменениями?

* Проект_демо.ods (73.41 Кб - загружено 7 раз.)
« Последнее редактирование: 26 Май 2021, 10:33 от Kadet » Записан
Kadet
Форумчанин
***
Offline Offline

Сообщений: 427


« Ответ #6: 26 Май 2021, 10:31 »

Ну, перебором (по предложенной ссылке) я и сам пробовал. Только не нравится этот метод. Думал, может есть какой-то другой, прямой и более простой способ, которого я не знаю.
« Последнее редактирование: 26 Май 2021, 10:33 от Kadet » Записан
economist
Форумчанин
***
Offline Offline

Сообщений: 1 495


« Ответ #7: 26 Май 2021, 10:33 »

Именованные ячейки оптимальны для изменяемых макропараметров без фиксированного A1-адреса.

Другое дело что параметрическое конструирование обычно делают вcё-таки CAD/САПР типа NanoCAD/OpenCAD/EasyCAD/AutoCAD итд. Все они позволяют передать макропараметры ДхШхВ итп скриптами (часто там VBA или Python).
Записан

Руб. за сто, что Питоньяк
Любит водку и коньяк!
Потому что мне, без оных, -
Не понять его никак...
Kadet
Форумчанин
***
Offline Offline

Сообщений: 427


« Ответ #8: 26 Май 2021, 10:36 »

Другое дело что параметрическое конструирование обычно делают вcё-таки CAD/САПР типа NanoCAD/OpenCAD/EasyCAD/AutoCAD итд. Все они позволяют передать макропараметры ДхШхВ итп скриптами (часто там VBA или Python).
Ну, это конечно, НО... задача не просто сделать проект, а совместить его с БД этих проектов, со статистикой, математикой, ком.предложениями и пр. пр. пр. Именно потому, что моя БД сделана на LO Base я и открывают "новые горизонты" в этой области.
« Последнее редактирование: 26 Май 2021, 10:56 от Kadet » Записан
economist
Форумчанин
***
Offline Offline

Сообщений: 1 495


« Ответ #9: 26 Май 2021, 10:38 »

не нравится этот метод.

От перебора можно отказаться, если имена ячейкам давать программно и... в виде адреса "_A1" :-)

Перебор сотен имен идет мгновенно, их можно поделить по листам и оптимизировать поиск, почему не использовать готовое и простое решение на том же VBA из #4?  
Записан

Руб. за сто, что Питоньяк
Любит водку и коньяк!
Потому что мне, без оных, -
Не понять его никак...
Kadet
Форумчанин
***
Offline Offline

Сообщений: 427


« Ответ #10: 26 Май 2021, 11:57 »

Просто, по поводу перебора у меня есть печальный опыт.
В этом же проекте все размеры проставлены с помощью врезок:
Код:
'**** Создать ТЕКСТОВЫЙ ФРЕЙМ ***************************************************************
Sub DrawTextField(xDoc, index%, Xpoz&, Ypoz&, lState, width, color&, oKegl, iRotAngle, sName$, tText)
Dim xPage as object, xShape as object, oSheet, oRange, oTCursor, oStart, sText, oText
Dim aPosition As New com.sun.star.awt.Point
Dim TheSize As New com.sun.star.awt.Size
Dim aFrameRect As New com.sun.star.awt.Rectangle
Dim oLineDash As New com.sun.star.drawing.LineDash

xPage = xDoc.DrawPages(index)
If IsNumeric(tText) Then
oSheet = xDoc.sheets(index)
oRange = oSheet.getCellByPosition(100,0)
oRange.NumberFormat = getNumberFormat(xDoc, "# ##0;[RED]-# ##0")
oSheet.getCellByPosition(100,0).Value = tText
sText = oSheet.getCellByPosition(100,0).String
oSheet.getCellByPosition(100,0).String = ""
Else
sText = tText
End If
' Первая линия ********************************
xShape = xDoc.createInstance("com.sun.star.drawing.TextShape")
xShape.LineColor = color
xShape.LineWidth = width
aPosition.X = Xpoz
aPosition.Y = Ypoz
xShape.setPosition(aPosition)
TheSize.width = 100
TheSize.height=100
xShape.setSize(TheSize)
aFrameRect.X = Xpoz
aFrameRect.Y = Ypoz
aFrameRect.width = 100
aFrameRect.height=100
xShape.FrameRect = aFrameRect
' xShape.FillColor = RGB(200, 200, 200)
' xShape.LineTransparence = 0
xShape.FillTransparence = 100
' xShape.LayerID = 0

If sName="" Then
xShape.Name = "Врезка"
Else
xShape.Name = sName
End If
xShape.RotateAngle = iRotAngle
xShape.CornerRadius = 20
xShape.LineStyle = lState

xShape.TextAutoGrowHeight = True
xShape.TextAutoGrowWidth = True
xShape.TextContourFrame = True

xPage.add(xShape)
oText = xShape.getText()
oTCursor = oText.createTextCursor()
oStart = oText.getStart() 'Курсор в начало текста, от него и пляшем
oStart.CharHeight = oKegl

' xShape.TextUpperDistance = 100
xShape.TextLeftDistance = 100
xShape.TextRightDistance = 100
' xShape.TextLowerDistance = 100
' xShape.LineEndCenter = True
xShape.TextHorizontalAdjust = 3
xShape.TextVerticalAdjust = 3
xShape.ParaAdjust = 3

' oStart.ParaTopMargin=100
oStart.ParaLeftMargin=100
oStart.ParaRightMargin=100
' oStart.ParaBottomMargin=100
oStart.ParaAdjust=3
oStart.ParaIsCharacterDistance=True
oStart.ParaIsForbiddenRules=True

oText.insertString(oStart, sText, False )
' xShape.String = sText

End Sub


Все эти врезки тоже поименованы. Однако, в отличие от ячеек calc достучавться к ним по имени нет никакой возможности. getByName - не работает, хотя имена их прекрасно получаются по oTextField.Name. При этом по getByIndex прекрасно достукивается. Поэтому приходится искать перебором.
Если это одиночный перебор, то куда ни шло. А вот когда включаешь сохранение всего проекта, и программа начинает перебирать все размеры перебором каждой врезки - это нечто.
В общем - долго приходится ждать.
Записан
economist
Форумчанин
***
Offline Offline

Сообщений: 1 495


« Ответ #11: 26 Май 2021, 12:45 »

Перебор "врезок" (Вставка - Текстовое поле) в Calc на неск. формах, да еще и с наведением красоты - канеш, будет долгим. Надо все минимизировать. 20 готовых врезок - могут вполне быстро обновляться.

Просто вы создали в Calc квази-САПР только ради расчетов, исходные данные для которых лежат в Base, а правильнее было бы упростить, вынеся визуализацию эскизного проекта во что-то другое. Любая девиация задачи - например склад в 2-х уровнях или T/Г-образный, или на большм уклоне - и Calc не справится. Точнее справится, но с трудом. То что уже есть сейчас - круто, и вполне оправдывает трудности, желаю довести продукт до ума, не расстраиваться из-за мелочей, быстрота не нужна, клиент подождет.

Кстати, Все программы для эскизного проектирования, начиная с "кетчупа" SketchUp - делают смету материалов со всеми итогами/м2/м3 итд. Остается проблема раскроя, вот её в "продажной" Base или чем-то еще как раз и решают макросами. Но чаще всего не решают никак.   
Записан

Руб. за сто, что Питоньяк
Любит водку и коньяк!
Потому что мне, без оных, -
Не понять его никак...
Kadet
Форумчанин
***
Offline Offline

Сообщений: 427


« Ответ #12: 26 Май 2021, 12:54 »

У меня так де была идея использовать для временного сохранения данных глобальную переменную-массив типа - com.sun.star.beans.PropertyValue. Однако, тут возникла та же проблема - по параметру Name обратиться не получается. Опять только перебором.
Записан
Kadet
Форумчанин
***
Offline Offline

Сообщений: 427


« Ответ #13: 26 Май 2021, 12:59 »

Кстати, Все программы для эскизного проектирования, начиная с "кетчупа" SketchUp - делают смету материалов со всеми итогами/м2/м3 итд. Остается проблема раскроя, вот её в "продажной" Base или чем-то еще как раз и решают макросами. Но чаще всего не решают никак.
Не совсем понял, что за слова вы произносите (с "кетчупа" SketchUp)... Языками не владею... Улыбка))))
Но я разберусь.

Следующий этап будет каркасник, а там без 3-D моделирования и графического конструктора не обойтись. Сейчас уже начинаю обдумывать с какой стороны подбираться к этой работе.
Записан
Kadet
Форумчанин
***
Offline Offline

Сообщений: 427


« Ответ #14: 26 Май 2021, 13:01 »

То что уже есть сейчас - круто, и вполне оправдывает трудности, желаю довести продукт до ума, не расстраиваться из-за мелочей, быстрота не нужна, клиент подождет.
Спасибо за поддержку.
Записан
Страниц: 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!