Вставить заголовок диаграммы из ячейки листа

Автор tagezi, 1 июля 2016, 13:55

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

tagezi

Вроде всё просто, но что-то у меня ошибка 5 Неправильный вызов процедуры постоянно вываливается.


'aTempAddres - временный массив
Dim aTempAddres(0 to 4) As String
'oDlg.GetControl("TextField" & (iTitleTable + 5)).Text содержит строку вида $'Cash flow'.$A$31
'дербаню строку вырезая всё лишнее
aTempAddres = Split(oDlg.GetControl("TextField" & (iTitleTable + 5)).Text, "$")
aTempAddres = Split(aTempAddres(1)&aTempAddres(2)&aTempAddres(3), "'")
aTempAddres = Split(aTempAddres(1)&aTempAddres(2), "."
'на выходе имею aTempAddres(0) = Cash flow, aTempAddres(1) = A31

'получаю ячейку как объект
oCellCopy = oDoc.getByName(aTempAddres(0)).getCellRangeByName(aTempAddres(1))

'получаю значения в окно диалога
'в моём случае три раза повторяется Чистая приведённая стоимость
print  oCellCopy.String, oCellCopy.Formula, oCellCopy.FormulaLocal

'Запихиваю в заголовок и макрос вываливается с кодом 5
oChartDoc.getTitle().String = oCell.String


Либо я что-то упускаю, либо я не понимаю кода ошибки.
Какую нужно использовать процедуру вызова, чтобы скопировать значение ячейки в переменную?
(x86_64) Kubuntu 16.04.3 - LibreOffice 6.0.2 / 6.1 alpha

rami

Заголовок — это строка, а не объект содержащий строку.

Попробуй так в последней строке кода:oChartDoc.Title=oCell.String

tagezi

Цитата: rami от  1 июля 2016, 14:05
Заголовок — это строка, а не объект содержащий строку.

Попробуй так в последней строке кода:oChartDoc.Title=oCell.String
Нет, дело не в этом. Вот так прекрасно всё работает.
oChartDoc.getTitle().String = "Оно тебе нада?"

Так, отбой тревоги.. глаз замылился, не так переменную написал :)))
А я тут уже 2 час ... Уже мозг кипит :)
Спасибо за ответ. Наверное и не обратил бы на это внимания.
(x86_64) Kubuntu 16.04.3 - LibreOffice 6.0.2 / 6.1 alpha

JohnSUN

А зачем ты парсишь строку адреса? Не хочешь просто дернуть значение ячейки через oDoc.getSheets().getCellRangesByName(oDlg.GetControl("TextField" & (iTitleTable + 5)).Text)...
Владислав Орлов aka JohnSUN
Благодарить-не зазорно.
Подарить благо создателям офиса, нашему ресурсу, мне

tagezi

Цитата: JohnSUN от  1 июля 2016, 14:53
А зачем ты парсишь строку адреса? Не хочешь просто дернуть значение ячейки через oDoc.getSheets().getCellRangesByName(oDlg.GetControl("TextField" & (iTitleTable + 5)).Text)...
Вообще,  я думал я один люблю такие монструозные конструкции :))
Парсил именно для того чтобы выделить из адреса имя листа и имя ячейки.
Не получается, вываливается в ошибкой 423 Свойство или метод не найдены
Я немного передохну, потом попробую ещё...
Хотя, может ЛО просто не может разобрать вложенные конструкции в данном случае.

Если хочешь сам пощупать, я загрузил всё на github. Макрос в документе thesis project assessment.ods.
(x86_64) Kubuntu 16.04.3 - LibreOffice 6.0.2 / 6.1 alpha

rami

tagezi, снеси всё что есть у тебя на компе (ну ладно, не всё, а только файл конфигурации). А теперь попробуй запустить твой "шайтан арба" заново. При открытии диалога все поля пустые, если их правильно заполнить, то после запуска выдаёт ошибку "Поле адреса показателя NPV пусто!". Если файл конфигурации заполнить вручную, то другая засада: заполнив поля в диалоге из конфиг. файла макрос сравнивает только что заполненные поля с файлом конфигурации обнаруживает, что нет изменений и пропускает обновление листа и данных, но так как ты выложил документ с листом Interim calculation без данных, то макрос только гоняет пустые ячейки по кругу (а если ячейки заполнить бредом, то по кругу будет бред носиться). Исправляй.

tagezi

(x86_64) Kubuntu 16.04.3 - LibreOffice 6.0.2 / 6.1 alpha

rami

Цитата: tagezi от  1 июля 2016, 16:35Буду курить.
Курить вредно, скушай конфетку ;D

tagezi

Цитата: rami от  1 июля 2016, 15:40Курить вредно, скушай конфетку Смеющийся
А вот этого я не понимаю
'Создание графических форм
Sub CreateChart(iTitleTable As Integer, StartTableChart As Integer)
  Dim oSheet , oRect, oCharts, oChart, oChartDoc  As Object
  Dim sName, sDataRng As String
  Dim aTempAddres(0 to 4) As String
  Dim RangeAddress(0) As New com.sun.star.table.CellRangeAddress
  oRect = createObject("com.sun.star.awt.Rectangle")
    oRect.X = 1000
    oRect.Y = 4000
  If (oDlg.GetControl("CheckBox1").getState()) Then
oSheet = oDoc.getByName("Interim calculation")
If (iTitleTable > 1)  Then
    oRect.Y = 4500 + (4500 + 9000) * ( iTitleTable - 1 )
    End If
else
oSheet = oDoc.getByName(aComBox(iTitleTable))
End If
oRect.width = 20000
oRect.Height= 9000
    sName = "Chart" & iTitleTable
  RangeAddress(0).Sheet = oSheet.getRangeAddress().Sheet
RangeAddress(0).StartColumn = 0
RangeAddress(0).StartRow = (StartTableChart + 1)
RangeAddress(0).EndColumn = 11
RangeAddress(0).EndRow = (StartTableChart + nCount + 1)
oCharts = oSheet.getCharts()
oCharts.addNewByName(sName, oRect, RangeAddress(), True, True)
oChart = oCharts.getByName(sName)
oChart.setRanges(RangeAddress())
oChartDoc = oChart.getEmbeddedObject()
oChartDoc.setDiagram(oChartDoc.createInstance("com.sun.star.chart.LineDiagram"))
oChartDoc.HasLegend = True
If (oDlg.GetControl("TextField" & (iTitleTable + 5)).Text = "") Then
oChartDoc.getTitle().String = aComBox(iTitleTable)
else
aTempAddres = Split(oDlg.GetControl("TextField" & (iTitleTable + 5)).Text, "$")
aTempAddres = Split(aTempAddres(1)&aTempAddres(2)&aTempAddres(3), "'")
aTempAddres = Split(aTempAddres(1)&aTempAddres(2), "."
oCellCopy = oDoc.getByName(aTempAddres(0)).getCellRangeByName(aTempAddres(1))
'oCellCopy = oDoc.getSheets().getCellRangesByName(oDlg.GetControl("TextField" & (iTitleTable + 5)))
oChartDoc.getTitle.String = oCellCopy.String
End If
        'данные в строках
oChartDoc.getDiagram().DataRowSource = Rows
End Sub

oChartDoc.getDiagram().DataRowSource = Rows
Однозначно говорит что данные в строках, а у тебя в столбцах
Что ты с ней делаешь? :))
(x86_64) Kubuntu 16.04.3 - LibreOffice 6.0.2 / 6.1 alpha

rami

Цитата: tagezi от  1 июля 2016, 16:46Однозначно говорит что данные в строках, а у тебя в столбцах
Это ты лёжа на диване смотришь на график ;D ;D ;D
Цитата: tagezi от  1 июля 2016, 16:46Что ты с ней делаешь? )
Проблему я описал в предыдущем ответе. Если убрать проверку на изменение полей (в строке 282), то всегда удаляет старый лист, вставляет новый и правильно заполняет. Если эту проверку оставить, то просто гоняет по листу всё что там есть, и хорошо, если там были старые правильные расчёты, а если нет, то беда :(

tagezi

Цитата: rami от  1 июля 2016, 18:40
Цитата: tagezi от  1 июля 2016, 16:35Буду курить.
Курить вредно, скушай конфетку ;D
Ты мне можешь описать последовательность действий, как ты получил такую диаграмму?
Даже если удалить названия факторов, у меня она все равно получается в строках, а у тебя явно значения в столбцах.

Цитата: rami от  1 июля 2016, 16:14Проблему я описал в предыдущем ответе. Если убрать проверку на изменение полей (в строке 282), то всегда удаляет старый лист, вставляет новый и правильно заполняет. Если эту проверку оставить, то просто гоняет по листу всё что там есть, и хорошо, если там были старые правильные расчёты, а если нет, то беда Грустный
Ну, нужно подумать.
Постоянно удалять старый листы тоже не вариант, так как с листом могут работать, например выделить значения, которые почти не меняются или вообще не меняются, чтобы потом при очередном пересчете быстрее обратить на них внимание. Обычно, не меняющиеся значения показателей говорят о том что ошибка в модели. Правка модели может идти от пары секунд, до нескольких дней, и удобно когда есть напоминалка что вот сюда нужно посмотреть в первую очередь.
С этой точки зрения мне не нравиться то, что даже при незначительном изменении, листы всё равно пересоздаются.

Наверное, нужно проверять форматирование листа ещё.
(x86_64) Kubuntu 16.04.3 - LibreOffice 6.0.2 / 6.1 alpha

rami

Цитата: tagezi от  1 июля 2016, 17:25Ты мне можешь описать последовательность действий, как ты получил такую диаграмму?
О, это грустная история :( , ты не поверишь, но я скачал эту диаграмму вместе с файлом, что ты выложил, скачай сам по своей ссылке и проверь. В этом опасность, если в правильном файле сделать маленькую диверсию, которую никто не заметит, то и макрос вместо правильной перезаписи будет гонять по кругу эту диверсию.
Цитата: tagezi от  1 июля 2016, 17:25Даже если удалить названия факторов, у меня она все равно получается в строках, а у тебя явно значения в столбцах.
Это потому, что ты сделал работу которая в определённых узких рамках выполняется правильно, а чуть что не так, идёт в разнос. Работать с этим документом буду не я и не JohnSUN, а простые советские труженики, и ты услышишь простые слова идущие от всего сердца :o

Проверь документ, что ты выложил и замени его на правильный.

tagezi

Цитата: rami от  1 июля 2016, 17:28ты не поверишь, но я скачал эту диаграмму вместе с файлом, что ты выложил, скачай сам по своей ссылке и проверь.
Да, об имени файла я не подумал как-то, хотел сделать задел на будущее, но удалил пока, там много работы и я подобной не делал пока в ЛО.
Но диаграммы у меня всё равно выглядят нормально...

ЗЫ: хреновенький из меня программист оказывается, не умею я продумывать защиту от дурака, даже от самого себя  ;D
(x86_64) Kubuntu 16.04.3 - LibreOffice 6.0.2 / 6.1 alpha

rami

Цитата: tagezi от  1 июля 2016, 17:25Ты мне можешь описать последовательность действий, как ты получил такую диаграмму?
1. Удали лист Interim calculation (не обязательно)
2. Вызови диалог
3. Введи в поля неправильные данные см. картинку Бред в полях.png
4. Макрос будет работать до создания заготовки диаграммы (по умолчанию данные в столбцах), после чего будет прерван из-за неправильных данных в полях см. картинку Ошибка заполнения полей.png
5. Если на листе Interim calculation в ячейки G3:G8 записать формулу =$'Cash flow'.$B$31 и запустить макрос без изменения полей, то получишь "конфетку" ;D

Мне не нравится, что можно в одно поле забить один показатель (распил бюджета), а в заголовок поставить другой (ущерб нанесённый непогодой) 8-). Нужно как-то согласовывать связанные показатели и проверять их как можно раньше.

tagezi

Цитата: rami от  1 июля 2016, 19:111. Удали лист Interim calculation (не обязательно)
2. Вызови диалог
3. Введи в поля неправильные данные см. картинку Бред в полях.png
4. Макрос будет работать до создания заготовки диаграммы (по умолчанию данные в столбцах), после чего будет прерван из-за неправильных данных в полях см. картинку Ошибка заполнения полей.png
5. Если на листе Interim calculation в ячейки G3:G8 записать формулу =$'Cash flow'.$B$31 и запустить макрос без изменения полей, то получишь "конфетку" Смеющийся
Да, проверка хреновая, нужно менять парсинг на регексы, наверное. Или придумывать дополнительное что-то.
Я заметил, что я могу вообще вставить ссылку на любой файл туда.
Буду думать, думать есть над чем. Я привык использовать функцию поиска по строке, но что-то я не нашёл простого способа это сделать в ЛО, всё какими-то костылями и вагонетками. Но проверку полей нужно делать обязательно.
Пользователь, как ты только что показал, дурить может по страшному  ;D

Цитата: rami от  1 июля 2016, 22:11
Мне не нравится, что можно в одно поле забить один показатель (распил бюджета), а в заголовок поставить другой (ущерб нанесённый непогодой) 8-). Нужно как-то согласовывать связанные показатели и проверять их как можно раньше.
Согласен с этим, но.. Давай разберём простую ситуацию. Имеем модель, там написан название показателя, обычно она слева от значения показателя... не будем сейчас брать народы с письмом с права налево или с верху вниз, возьмём нас "русских".
Началька хотеть заголовку в таблице и диаграмм "Период окупаемости проекта КЛМН по договору от 99.99.9999 Г."
Редкий хомячок захочет вставлять такие названия прямо в модель потока, не удобно, да и не логично, и вот тут нужно поле в диалоге, чтобы можно было сделать название в другой ячейке и сослаться туда.
То что работник может перепутать правую руку и левую или намерено исказить, или непонимать применения инструментов, я думаю должен заботиться его начальник, а не я. Я могу только рассматривать случайные ошибки. Ты правильно отметил что значения в полях проверяются криво, это моя задача, предсказать неправильное действите. Но куда тыкает пользователь, это дело пользователя.
Во всяком случае, я не могу предсказать что должно быть написано в заголовке таблицы или диаграммы, единственное я могу сделать - автоматическую подстановку, если это требуется.
Я думаю так.
(x86_64) Kubuntu 16.04.3 - LibreOffice 6.0.2 / 6.1 alpha