Добрый день! Пожалуйста помогите переделать из VBA в OpenO...

Автор ForumOOo (бот), 9 октября 2014, 14:35

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

Pavv

Если честно то с регулярными выражениями вообще не дружу. Все что вы написали - я не понял :)

Но предполагаю что такой вариант также возможен. Попробую в этом тоже поразбираться

JohnSUN

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

Pavv

Вот по поводу единички че написано:
ЦитироватьПри экспорте таблицы в Microsoft Excel используйте для параметра "Режим" значение=1, чтобы результаты в Excel не отличались от Calc.
https://help.libreoffice.org/scalc/SC_HID_FUNC_OBERGRENZE?Language=ru&System=WIN&Version=4.3#bm_id3152530

А на счет написать макрос, даже и не знаю. В принципе этот вариант работает. Но если у вас есть время и желание, я бы посмотрел ваш вариант (поучился бы заодно, на примерах так сказать).

RAN


JohnSUN

Ну, у меня получилось вот такое:
Sub roundingIncrements
Dim oSheet As Variant
Dim oReplDescr As Variant
Dim oFound As Variant
Dim oFoundAlarm As Variant
Const srch1="(=)(CEILING\()(.+)(\$Пересчет)(.+)(;50;1\))" ' Округление с единичкой
Const srch2="(=)(CEILING\()(.+)(\$Пересчет)(.+)(;50\))" ' Округление без единички
Const repl1="$1$3$4$5"
Const srch3="(=)(.+)(\$Пересчет)(.+)"
Const repl3="=CEILING($2$3$4;50;1)"
Const srchAlarm="(=)(CEILING\()(CEILING\()(.+)(;50;1\))" ' Поиск лишних округлений
Const replAlarm="$1$3$4"
oSheet = ThisComponent.getCurrentController().getActiveSheet() ' Получаем текущий лист
oReplDescr = oSheet.createReplaceDescriptor() ' Для него создаем "описатель замен"
oReplDescr.SearchRegularExpression = True ' Будем использовать регулярные выражения
REM Первая пачка замен - убираем все CEILING(...;50;1)
oReplDescr.setSearchString(srch1)
oReplDescr.setReplaceString(repl1)
oFound = oSheet.replaceAll(oReplDescr)
REM Вторая пачка замен - убираем все CEILING(...;50)
oReplDescr.setSearchString(srch2)
oFound = oSheet.replaceAll(oReplDescr)
REM Если какие-то нестандартные CEILING еще остались - не страшно, обернём их в еще один CEILING
oReplDescr.setSearchString(srch3)
oReplDescr.setReplaceString(repl3)
oFound = oSheet.replaceAll(oReplDescr)
REM Если случайно округлили округлённое - откатить назад
oReplDescr.setSearchString(srchAlarm)
oReplDescr.setReplaceString(replAlarm)
oFoundAlarm = oSheet.replaceAll(oReplDescr)
MsgBox("Обработано "+(oFound-oFoundAlarm)+" ячеек", 64, "Готово!")
End Sub
Владислав Орлов aka JohnSUN
Благодарить-не зазорно.
Подарить благо создателям офиса, нашему ресурсу, мне

Pavv

Что то у меня пишет - "Обработано 0 ячеек" и никаких изменений. Правильно ли я понял, что макрос убирает все CEILING ?  Если да, то как бы нужно все наоборот. Наоборот округлить там, где еще нет округлений.

rami

Нужно заменить плюсы на & в MsgBox:MsgBox "Обработано " & oFound-oFoundAlarm & " ячеек", 64, "Готово!"
Макрос работает.

Pavv

Наверное я делаю что то не так. У меня не работает (макрос с рег. выражениями).

rami

Замените константы на эти:
Const srch1="(=)(CEILING\()(.+)(Пересчет)(.+)(;50;1\))" ' Округление с единичкой
Const srch2="(=)(CEILING\()(.+)(Пересчет)(.+)(;50\))" ' Округление без единички
Const repl1="$1$3$4$5"
Const srch3="(=)(.+)(Пересчет)(.+)"
Const repl3="=CEILING($2$3$4;50;1)"
Const srchAlarm="(=)(CEILING\()(CEILING\()(.+)(;50;1\))" ' Поиск лишних округлений
Const replAlarm="$1$3$4"

А старые закоментируйте на всякий случай

Pavv

Вот теперь заработало. Вообще это очень хороший вариант. Даже выделять ничего не нужно.
А какой диапазон ячеек он проверяет?

rami

#25
Цитата: Pavv от 15 ноября 2014, 20:19А какой диапазон ячеек он проверяет?
Весь лист, например:
oSheet.replaceAll(oReplDescr)
Если нужен диапазон, то oSheet заменяем на диапазон oRange (после определения диапазона)

Если мои поправки у вас работают, то старые удалите, чтоб не путались.

Pavv

Rami, все понял спасибо.

А если имеем прайс вида - см картинку. Т.е. в ячейках просто ОБЫЧНЫЕ числа (без всякий = и формул)
И их вот надо заменить на =CEILING(число*(1+Пересчет!$I$11/100);50;1)
Это же тоже можно с помощью рег выражений сделать.

Pavv


RAN

Цитата: Pavv от 15 ноября 2014, 20:34И их вот надо заменить на =CEILING
Вот никак в толк не могу взять, зачем?
Не проще все посчитать макросом, и выгрузить не формулы, а значения?

Pavv

#29
Просто бывают ситуации, когда поставщик НЕ присылает прайс а по телефону говорит , ну типа цены поменялись на 2 процента, и мы  в пересчете ставим например вместо 40%  -  42%. Как то так. В общем нужно чтобы был ручной ввод коэфициента пересчета на всякий случай. Вот ситуация с долларом - цены меняли чуть ли не по два раза на дню (за последние 2 недели). И только вчера после "устаканивания" доллара прислали новый прайс. Ну в общем как говорится у каждого свои тараканы  ;D