Условное форматирование

Автор Alder, 12 февраля 2015, 11:17

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

JohnSUN

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

Цитата: Alder от 12 мая 2016, 09:42
...знаю только как делать циклы в Pascele.
Как выкрикивает Якубович, "Нет! Нет такой буквы в этом слове!"  ;D
Владислав Орлов aka JohnSUN
Благодарить-не зазорно.
Подарить благо создателям офиса, нашему ресурсу, мне

Alder

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

rami

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

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

Alder

Пытаюсь разобраться как переписать данные.
Т.е. 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

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

Alder

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

JohnSUN

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

Alder


JohnSUN

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

Исходный текст макроса у тебя ещё сохранился? Тогда прямо перед строкой "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)
Владислав Орлов aka JohnSUN
Благодарить-не зазорно.
Подарить благо создателям офиса, нашему ресурсу, мне