:: Visual Foxpro, Foxpro for DOS
Re: Структурирование (группировка) в ексель из foxpro
vk65

Сообщений: 402
Дата регистрации: 08.04.2008
можно сделать условное форматирование:
.Cells(2, 1).Select && !
with .Cells(2, 1).Resize(lnRows + 9, 12)
.FormatConditions.Add(2,,'=ПРАВСИМВ($A2;4)="Итог"')
.FormatConditions(1).Interior.ColorIndex = 35
endwith
Ratings: 0 negative/1 positive
Re: Структурирование (группировка) в ексель из foxpro
ventall

Сообщений: 132
Дата регистрации: 29.11.2013
Именно то что нужно! не знал как обратиться к ячейке
.FormatConditions.Add(2,,'=ПРАВСИМВ($A2;4)="Итог"')
пробовал сравнивать значение через if substr(


Спасибо большое!
Ratings: 0 negative/0 positive
Re: Структурирование (группировка) в ексель из foxpro
Crispy

Сообщений: 18571
Дата регистрации: 16.05.2005
ventall
как понять какая строка будет .subtotal?

Если имелось в виду: "изменить форматирование для итоговой строки-столбца" - то все можно сделать несколько проще и универсальней, без привязки к тексту какой-то ячейки.
Для этого, после вставки всех ячеек таблицы, нужно просто использовать специальный экселевский параметр LastCell, после вставки таблицы, он принимает значение последней ячейки. Наглядно посмотреть его значение можно вручную - после вставки таблицы это та самая ячейка, на которую установится курсор после нажатия Ctrl+End.
Есть только единственный нюанс - LastCell удобнее всего использовать при вставке на чистый лист. Иначе, если всего лишь очистить через форматирование старую таблицу и вставить туда же новую, но например с меньшим числом столбцов-строк, LastCell так и будет хранить значение предыдущей таблицы. В чем можно убедиться, снова нажав Ctrl+End. Т.к. после простой очистки форматирования расположение последней ячейки сохраняется. Присвоение же своих значений LastCell в коде кажется невозможно (сейчас точно уже не помню, но вроде это только для чтения). Но в принципе, если вставлять таблицу на чистый лист - проблем никаких. (Ну в крайнем случае, можно конечно и удалить ее структуру строк-столбцов, чтобы новая таблица была больше или равна по размеру после такого удаления строк-столбцов, главное, чтобы не меньше старой).

А далее, имея значение LastCell, можно уже плясать от него - просто сдвигаясь вверх, вниз или влево-вправо на нужное число столбцов-строк.
Таким образом можно пожирнить например итоговую строку или итоговый столбец. Вставить туда формулу (удобно для дальнейшей работы с таблицей пользователя). Или например - вставить внизу под последней строкой подпись с фамилией, либо что-то еще другое.
Вот допустим у меня в макросе был такой фрагмент, жирнящий сетку для всех ячееек со сдвигом на 16 столбцов влево от последней ячейки, также жирнится шрифт и вставляется формула суммирования от 13 строки до предпоследней строки, в итоге получаем жирную итоговую строку с формулами по всем столбцам:
With Range(LastCell.Offset(0, -16), LastCell)
.Font.Bold = True
.Formula = "=SUM(R13C:R[-1]C)"
With .Borders(xlEdgeLeft)
.LineStyle = xlContinuous
.Weight = xlThin
End With
With .Borders(xlEdgeTop)
.LineStyle = xlContinuous
.Weight = xlThin
End With
With .Borders(xlEdgeBottom)
.LineStyle = xlContinuous
.Weight = xlThin
End With
With .Borders(xlEdgeRight)
.LineStyle = xlContinuous
.Weight = xlThin
End With
With .Borders(xlInsideVertical)
.LineStyle = xlContinuous
.Weight = xlThin
End With
With .Borders(xlInsideHorizontal)
.LineStyle = xlContinuous
.Weight = xlThin
End With
End With
В результате у пользователя при изменении в дальнейшем чисел в каких-то ячейках, итоги автоматически пересчитываются.

Или также вставить подпись ниже на 5 строк и левее на 16 столбцов:
LastCell.Offset(5, -16).FormulaR1C1 = "Главный бухгалтер"
LastCell.Offset(5, -12).FormulaR1C1 = "Такой-то Имя Отчество"

Т.е. думаю сам принцип понятен.
Ну и понятно, точно также обычным образом, весь этот VBA-код макроса адаптируется уже для использования в коде фокспро.


------------------
В действительности все иначе, чем на самом деле.
                                      (Антуан де Сент-Экзюпери)




Исправлено 3 раз(а). Последнее : Crispy, 10.01.19 17:50
Ratings: 0 negative/1 positive
Re: Структурирование (группировка) в ексель из foxpro
ventall

Сообщений: 132
Дата регистрации: 29.11.2013
заработало решение от vk65, мне нужно было Форматировать не последнюю строку, а каждую, в которой был подитог. спасибоза пример, попробую разобраться.
Ratings: 0 negative/0 positive
Re: Структурирование (группировка) в ексель из foxpro
Crispy

Сообщений: 18571
Дата регистрации: 16.05.2005
ventall

В принципе, после вставки любого блока ячеек, можно точно так же использовать LastCell - для форматирования по вышеприведенным примерам последних строки-столбца. При вставке следующего блока - снова, и т.д.


------------------
В действительности все иначе, чем на самом деле.
                                      (Антуан де Сент-Экзюпери)
Ratings: 0 negative/0 positive
Re: Структурирование (группировка) в ексель из foxpro
ventall

Сообщений: 132
Дата регистрации: 29.11.2013
Всем спасибо за помощь и советы! Очень многому научился. Тему можно закрывать.
Ratings: 0 negative/0 positive
Re: Структурирование (группировка) в ексель из foxpro
Igor Korolyov
Автор

Сообщений: 34580
Дата регистрации: 28.05.2002
Криспа, у него не вставляются диапазоны ячеек - у него используется механизм Subtotal самого экселя, чтобы понатыкать посередине имеющегося диапазона подитогов, которые по сути просто формулы.

Можно именно по признаку того что в соответствующей колонке находится формула и определять строки с итогами/подитогами.
#define xlExpression 2
WITH oSheet.UsedRange.FormatConditions.Add(xlExpression,,"=ISFORMULA($D1)")
.Interior.Color = RGB(192,255,255)
ENDWITH
Не уверен что в данном случае всегда работает нелокализованное имя функции (т.е. английское) - у кого эксель с русской локалью могут проверить Но совершенно точно то что текст для подписей будет локализован - т.е. там будет написано не "Итог", а к примеру "Total" - смотря какой язык выбран для интерфейса экселя.
Впрочем, если уровней группировки >1, и все поля группировки не пусты, то можно в качестве формулы использовать нечто типа
"=OR(ISBLANK($A1);ISBLANK($B1))" - т.е. если в первой либо второй колонке будет пусто (если это колонки группировки, то там и будет пусто в итоговых строках) то эту строку и надо красить. Такого рода условия позволят отделять подитоги разных уровней.


------------------
WBR, Igor
Ratings: 0 negative/1 positive
Re: Структурирование (группировка) в ексель из foxpro
Crispy

Сообщений: 18571
Дата регистрации: 16.05.2005
Igor Korolyov

Возможно и так. Кстати у МСО, сколько помнится, есть любопытная особенность - в русской локализации работает и английский синтаксис команд.
Когда-то, когда только появился опенофис, это помогло почти без проблем перевести на него экселевский лист со сложными вычислениями. Что любопытно, в опенофисе команды форматирования ячеек по цвету и пр. оказались в итоге даже удобнее, что позволило затем несколько и упростить сам код.


------------------
В действительности все иначе, чем на самом деле.
                                      (Антуан де Сент-Экзюпери)
Ratings: 0 negative/0 positive
Re: Структурирование (группировка) в ексель из foxpro
Igor Korolyov
Автор

Сообщений: 34580
Дата регистрации: 28.05.2002
У них там в объектной модели для ячеек есть пары свойств - Formula и FormulaLocal - как раз для "универсальный английской" и "зависящий от языка офиса" синтаксис формул. Но этот параметр не формула ячейки, и потому я не знаю чего там эксель ожидает Есть у него и тупняки в некоторых сложных случаях когда без глупого .Select() для "визуального выделения ячеек" не обойтись - хотя на кой чёрт что-то надо было бы выделять при програмной обработке


------------------
WBR, Igor
Ratings: 0 negative/0 positive
Re: Структурирование (группировка) в ексель из foxpro
ventall

Сообщений: 132
Дата регистрации: 29.11.2013
Добрый день, в продолжение темы
А возомжно что бы в одной итоговой строке не только сумирование но и минимум в нескольких колонках был?




.Subtotal(1, xlSum, @laTotalList,.t.,.f.,.t.) - только суммирует, но есть колонки которые не нужно суммировать а только показать либо то значение которое есть, либо минимальное
если добавить .Subtotal(1, xlMin, @laTotalList1,.f.,.f.,.t.) - добавляет новую группировку



Исправлено 4 раз(а). Последнее : ventall, 11.05.19 11:03
Ratings: 0 negative/0 positive
Re: Структурирование (группировка) в ексель из foxpro
Igor Korolyov
Автор

Сообщений: 34580
Дата регистрации: 28.05.2002
Возможно - Subtotal это просто инструмент для облегчения создания структуры и прописывания соответствующих формул. Используемая для "подитогов" функция SUBTOTAL позволяет не только суммировать, а и считать среднее, минимальное, максимальное, произведение, количество элементов, стандартное отклонение и дисперсию. Естественно сам инструмент Subtotal не рассчитан на задание для разных колонок разных функций, что не мешает после его применения пройтись по нужным ячейкам и поменять прописанную им функцию. В т.ч. и на вообще не SUBTOTAL а луюбую другую функцию.
Показывать "то значение которое есть" конечно же нельзя, поскольку инструмент добавляет новые строки, и в них по определению не может быть никаких значений - но так то нет ограничений на то что прописать в этих вновь добавленных строках.


------------------
WBR, Igor
Ratings: 0 negative/0 positive
Re: Структурирование (группировка) в ексель из foxpro
ventall

Сообщений: 132
Дата регистрации: 29.11.2013
понимаю что так примерно надо
.FormatConditions.Add(2,,'=ПРАВСИМВ($A2;4)="Итог"')
но дальше как указать минимальное значение конкретной колонки группы не знаю, простите =(
Ratings: 0 negative/0 positive
Re: Структурирование (группировка) в ексель из foxpro
Igor Korolyov
Автор

Сообщений: 34580
Дата регистрации: 28.05.2002
Не понял при чём тут формат...

В ячейке итоговой строки будет формула =SUBTOTAL(9;какой-то-диапазон) - 9 это номер функции суммирования. Ставишь вместо 9 к примеру 5 получаешь функцию MIN, ставишь 4 - получаешь MAX. При этом сохраняется весь функционал функции SUBTOTAL, как то пропуск скрытых ячеек и пропуск ячеек с такой же функцией SUBTOTAL.
Как половчее находить в документе строки итогов - ну это другой вопрос. Самое простое - поиском и заменой. Типа:
oSheet.Columns(5).Replace("=SUBTOTAL(9;","=SUBTOTAL(5;",2,1,.F.)
Заменяет в 5 колонке функцию суммирования на функцию минимума.
Если надо "поумнее" логику применять, ну можно в цикле пройтись по Rows, посмотреть их OutlineLevel, на основании этого в соответствующей строке и менять агрегирующую функцию для нужных колонок.
Полагаться на поиск строки "Итог" - ну я бы не стал, она от локализации зависит. Впрочем поиск и змена тоже, наверное от локализации зависит (у меня английская локаль, потому функция по английски называется, а не "промежуточные.итоги")


------------------
WBR, Igor
Ratings: 0 negative/1 positive
Re: Структурирование (группировка) в ексель из foxpro
ventall

Сообщений: 132
Дата регистрации: 29.11.2013
имелось в виду что я полагаюсь на поиск строки с "итог"
реально искал варианты подмены формулы, но не нашел
oSheet.Columns(5).Replace("=SUBTOTAL(9;","=SUBTOTAL(5;",2,1,.F.) - просто огромнейшее спасибо!
Ratings: 0 negative/0 positive


Извините, только зарегистрированные пользователи могут оставлять сообщения в этом форуме.

On-line: 31 (Гостей: 31)

© 2000-2024 Fox Club 
Яндекс.Метрика