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

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

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

Войти
Новости: Часто задаваемые вопросы по LibreOffice и Apache OpenOffice.org
 
   Начало   Помощь Поиск Войти Регистрация    задать вопрос  
Страниц: « 1 2   Вниз
  Печать  
Автор Тема: Условное форматирование  (Прочитано 7292 раз)
0 Пользователей и 1 Гость смотрят эту тему.
JohnSUN
Капитана в тот день называли на "ты"
Гуру
*******
Offline Offline

Пол: Мужской
Расположение: Киев
Сообщений: 2 764


Помогаю людям и компьютерам понимать друг друга


WWW
« Ответ #15: 12 Май 2016, 11:12 »

К сожалению вкрутить это в 100500 документов не вижу резона.
Ну да. А раскрасить 100500 документов в красно-зелёные цвета резон видишь, да?
Легче сделать сразу 1 макрос на все случаи.
в Basice я ноль...
Отсюда и убеждённость в неимоверной лёгкости, наверное... Если хорошо подумать, то "вкрутить" ROUND() во все формулы можно одним Поиском/Заменой. И тогда первоначальный макрос сможет работать без дополнительных изменений. А округление до копеек на реальных деньгах - штука всегда полезная: меньше ошибок в итоговых цифрах.
В строке
Код:
oSearchResults = oCurrentSelection.findAll(oSearchDescriptor)
Я как понял записываются все выделенные ячейки, но почему через 1 проход через цикл значение oCurrentSelection пустое?
И как мой FIX мешает, понять не могу.
Ну, для начала пальцем ткни, о каком из .findAll() ты сейчас написал: о первом, который просто отыскивает на листе не пустые ячейки, или о втором, который на том же листе ищет значения из результатов предыдущего поиска?
И пустой, кажется, не oCurrentSelection (он не изменяется до конца макроса), а oSearchResults? Ну, пустой - значит искомое значение на листе не найдено. А не найдено потому, что ищешь не первоначальное значение 34818,299999997, которое просто на экране отображалось как 34818,3, а пропущенный через Fix/100. То есть уже тот, которого на листе нет и никогда не было...

...знаю только как делать циклы в Pascele.
Как выкрикивает Якубович, "Нет! Нет такой буквы в этом слове!"  Смеющийся
Записан

Владислав Орлов aka JohnSUN
Благодарить-не зазорно.
Подарить благо создателям офиса, нашему ресурсу, мне
Alder
Участник
**
Offline Offline

Сообщений: 24


« Ответ #16: 12 Май 2016, 11:25 »

Хм... ты подал хорошую идею сначала запилить FIX, а потом повторно взять данные. Не знаю что получится. но попробую.
Записан
rami
Гуру
*******
Offline Offline

Пол: Мужской
Сообщений: 2 725


MacBook Pro, LibreOffice и Apache OpenOffice


« Ответ #17: 12 Май 2016, 11:31 »

И как мой FIX мешает, понять не могу.
При использовании механизма поиска может быть три варианта:
1. ничего не найдено (oSearchResults=NULL) — так получается у вас, у JohnSUN этот вариант невозможен (объяснение ниже)
2. "поиск нашёл сам себя" — взяли критерий в ячейке и нашли "совпадение" в той же самой ячейке — нет дубликатов
3. найдено более одного совпадения — это дубликаты

Если в ячейке записано 12,3456789 (отображается 12,34), а вы с помощью FIX() обрезаете критерий поиска до 12,34, то поиск ничего не найдёт
Записан

Alder
Участник
**
Offline Offline

Сообщений: 24


« Ответ #18: 12 Май 2016, 14:55 »

Пытаюсь разобраться как переписать данные.
Т.е. 34 818,299999997 преобразовать в 34818,3 при помощи макроса.
Но у меня проблема с тем как надо записывать данные в файл.

Да и мой подход кажется не рациональным.
Слишком мало знаний =(

Код:
sub Fixik
Dim Fix0 As variant
Dim FixA As variant
Dim FixB As variant
Dim FixC as integer
Dim FixD as variant
Dim FixE as variant
Dim FixF as variant
Dim FixG as variant
Dim FixX as variant
Dim e as variant
Dim q as variant
Dim i&, j&, k&
Fix0 = ThisComponent.getCurrentSelection()
Sheet=ThisComponent.CurrentController.ActiveSheet
FixA=Sheet.createReplaceDescriptor()
FixA.SearchRegularExpression=1
FixA.setSearchString(".+")
FixB = Fix0.findAll(FixA)
FixD = Array()
For i=0 To FixB.getCount()-1
FixE = FixB.getByIndex(i)
FixG = FixE.getDataArray()
For j = LBound(FixG) To UBound(FixG)
FixF = FixG(j)
For k = LBound(FixF) To UBound(FixF)
FixX = FixF(k)
q = FixB.rowDescriptions(i)
e = FixB.ColumnDescriptions(i)
FixX = Fix(FixX*100)/100
Fix0.Sheets(0).getCellByPosition(q,e).setValue(FixX)
MSGBOX ( e)
Next k
Next j
Next i
End Sub
Записан
JohnSUN
Капитана в тот день называли на "ты"
Гуру
*******
Offline Offline

Пол: Мужской
Расположение: Киев
Сообщений: 2 764


Помогаю людям и компьютерам понимать друг друга


WWW
« Ответ #19: 12 Май 2016, 15:10 »

Ты мог бы минут на 20 отвлечься от кода и внятно объяснить, чего хочешь добиться в итоге?
Может, тебе и макрос не нужен, всё на формулах сделать и на реальном условном форматировании...
Записан

Владислав Орлов aka JohnSUN
Благодарить-не зазорно.
Подарить благо создателям офиса, нашему ресурсу, мне
Alder
Участник
**
Offline Offline

Сообщений: 24


« Ответ #20: 12 Май 2016, 15:54 »

У наших операторов ПК есть задача.
Проверить тонну таблиц Excel с разными данными 1С.
Эти Таблицы созданы изначально с формулами типа (Sum; =a-b и т.д.)
Зачем им это нужно я не знаю.
Но если автоматизировать УФ (Условное форматирование) в макрос, то процесс займет на файл не 2 мин. а 30 сек.
А УФ на каждую таблицу делать 45 сек. + 45 сек. добавить Round в зависимости от типа формулы.
И при этом копируют они из базы в рандомное место (хорошо хоть на одной страницы)
И таблицы имеют разный тип (тут итог сбоку, там снизу)
Поэтому ищу путь короче.
Записан
JohnSUN
Капитана в тот день называли на "ты"
Гуру
*******
Offline Offline

Пол: Мужской
Расположение: Киев
Сообщений: 2 764


Помогаю людям и компьютерам понимать друг друга


WWW
« Ответ #21: 12 Май 2016, 16:01 »

То есть для решаемой задачи абсолютно безразлично, останется ли формула на месте или превратиться в "просто число"? Главное, чтобы потом можно было правильно раскрасить?
Записан

Владислав Орлов aka JohnSUN
Благодарить-не зазорно.
Подарить благо создателям офиса, нашему ресурсу, мне
Alder
Участник
**
Offline Offline

Сообщений: 24


« Ответ #22: 12 Май 2016, 16:05 »

Все верно
Записан
JohnSUN
Капитана в тот день называли на "ты"
Гуру
*******
Offline Offline

Пол: Мужской
Расположение: Киев
Сообщений: 2 764


Помогаю людям и компьютерам понимать друг друга


WWW
« Ответ #23: 12 Май 2016, 16:09 »

Вот это-то и сбило с толку - мы тут обычно к формулам относимся гораздо бережнее, всё стараемся не испортить нечаянно...

Исходный текст макроса у тебя ещё сохранился? Тогда прямо перед строкой "REM Чтобы не перебирать кучу пустых ячеек" вставь такой фрагмент:
Код:
oDataArray = oCurrentSelection.getDataArray()
REM Перебираем все считанные строки
For j = LBound(oDataArray) To UBound(oDataArray)
oData = oDataArray(j)
REM Теперь перебираем все ячейки из очередной строки
For k = LBound(oData) To UBound(oData)
oElement = oData(k) ' Это - значение из ячейки "как есть"
REM Только в случае, если тип этого значения Double...
If VarType(oElement) = 5 Then
REM ... выполняем преобразование, похожее на твой вариант Fix'а
REM (полкопейки добавляем, чтобы не округлить слишком не в свою пользу)
oData(k) = Fix(oElement*100+0.5)/100
EndIf
Next k
REM Заталкиваем преобразованную строку в массив на старое место
oDataArray(j) = oData
Next j
REM И записываем преобразованный массив на старое место на листе книги
oCurrentSelection.setDataArray(oDataArray)
« Последнее редактирование: 12 Май 2016, 18:52 от JohnSUN » Записан

Владислав Орлов aka JohnSUN
Благодарить-не зазорно.
Подарить благо создателям офиса, нашему ресурсу, мне
Страниц: « 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!