Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Delphi Новый топик    Ответить
Топик располагается на нескольких страницах: 1 2      [все]
 Ексель, как быстро считать цвета ячеек?  [new]
Конор-
Guest
Чтобы быстро считать данные использую

var
  App: Variant;
  Sheet: OLEVariant;
  FData: OLEVariant;
begin
    App := CreateOleObject('Excel.Application');
    App.Workbooks.Open(FileName);
    Sheet := App.Workbooks[1].WorkSheets[1];
    FData := Sheet.UsedRange.Value;
    ShowMessage(FData[1,1]);

А как подправить, чтобы так же считывал цвета? Возможно
FData := Sheet.UsedRange.Interior.Color;
А дальше не знаю.
2 окт 18, 17:39    [21693050]     Ответить | Цитировать Сообщить модератору
 Re: Ексель, как быстро считать цвета ячеек?  [new]
Гаджимурадов Рустам
Member

Откуда:
Сообщений: 59204
А что значит "быстро считать цвета"?
Количество ячеек определённого цвета?

Posted via ActualForum NNTP Server 1.5

2 окт 18, 18:51    [21693152]     Ответить | Цитировать Сообщить модератору
 Re: Ексель, как быстро считать цвета ячеек?  [new]
Конор-
Guest
Гаджимурадов Рустам, в общем да. Нужно пройтись по всем строкам и узнать кол-во ячеек определённого цвета в каждой строке.
    for i := 1 to Rows do
    begin
      k := 0;
      for j := 1 to Cols do
        if (Sheet.Cells[i, j].Interior.Color = Color) then
          Inc(k);

      if (k > 0) then Inc(K0);
      if (k = 1) then Inc(k1);
      if (k = 2) then Inc(k2);
      if (k = 3) then Inc(k3);
      if (k = 4) then Inc(k4);
    end;
2 окт 18, 19:08    [21693172]     Ответить | Цитировать Сообщить модератору
 Re: Ексель, как быстро считать цвета ячеек?  [new]
Jonnik
Member

Откуда:
Сообщений: 122
Гаджимурадов Рустам
А что значит "быстро считать цвета"?
Количество ячеек определённого цвета?


Использование метода "FData := Sheet.UsedRange" позволяет выделить участок листа и одним махом скопировать от туда данные.
Например, если мне надо считать 300 000 ячеек, то таким методом я могу их считать за 10-15 сек. Методом перебора каждой ячейки это займет вечность. Но этот метод работает думаю только с текстом. И я сам пару лет назад спрашивал тут как можно так же и цвет ячейки получить и набор ссыллок в каждой ячейки и как так же считать объединенные ячейки. Но тогда вариантов не нашлось. Может сейчас это кто-то подскажет если это возможно.
2 окт 18, 19:21    [21693192]     Ответить | Цитировать Сообщить модератору
 Re: Ексель, как быстро считать цвета ячеек?  [new]
Гаджимурадов Рустам
Member

Откуда:
Сообщений: 59204
Циклы не устраивают скоростью или чем?
Можно использовать Find, будет быстрее.

Но готового метода, возвращающего число по
формату/цвету я не припомню и вряд ли он есть.

Хотя, чисто теоретически, можно покопаться в
ConditionalFormatting в последних версиях Excel -
возможно там есть что-то подобное...

Posted via ActualForum NNTP Server 1.5

2 окт 18, 19:27    [21693199]     Ответить | Цитировать Сообщить модератору
 Re: Ексель, как быстро считать цвета ячеек?  [new]
Гаджимурадов Рустам
Member

Откуда:
Сообщений: 59204
Jonnik> Например, если мне надо считать 300 000 ячеек
Jonnik> Методом перебора каждой ячейки это займет вечность.

У меня почему-то не занимало. Не моментально, конечно, но не вечность.

Posted via ActualForum NNTP Server 1.5

2 окт 18, 19:29    [21693202]     Ответить | Цитировать Сообщить модератору
 Re: Ексель, как быстро считать цвета ячеек?  [new]
Jonnik
Member

Откуда:
Сообщений: 122
Гаджимурадов Рустам
Циклы не устраивают скоростью или чем?
Можно использовать Find, будет быстрее.

Но готового метода, возвращающего число по
формату/цвету я не припомню и вряд ли он есть.

Хотя, чисто теоретически, можно покопаться в
ConditionalFormatting в последних версиях Excel -
возможно там есть что-то подобное...


Да, используя OLE и просто бегать циклами это долго, если у тебя много данных.

А используюя это, можно гораздо быстрее получить данные

  var
    FData : OLEVariant;

  FData := WorkSheet.Range[Excel.Cells[1,1], Excel.Cells[Rows,Cols]].Value; 


И он думал, что есть вариант это сделать как
FData := WorkSheet.Range[Excel.Cells[1,1], Excel.Cells[Rows,Cols]].Interior.Color;


Но оно не работает так.

Так же как и так не работает считывание объединенных ячеек.

FData := WorkSheet.Range[Excel.Cells[1,1], Excel.Cells[Rows,Cols]].MergeArea.Cells[1, 1].Value;
2 окт 18, 20:01    [21693251]     Ответить | Цитировать Сообщить модератору
 Re: Ексель, как быстро считать цвета ячеек?  [new]
Гаджимурадов Рустам
Member

Откуда:
Сообщений: 59204
Jonnik> FData := WorkSheet.Range[Excel.Cells[1,1], Excel.Cells[Rows,Cols]].Interior.Color;
Jonnik> Но оно не работает так.

Да, так не сработает (да и со скрытыми надо проверить).
Равно как CountIf/CountFormat для цвета нету (пока).
Я же сразу сказал - пусть пишет макрос или функцию.

Posted via ActualForum NNTP Server 1.5

2 окт 18, 20:04    [21693258]     Ответить | Цитировать Сообщить модератору
 Re: Ексель, как быстро считать цвета ячеек?  [new]
Конор-
Guest
Я так и подумал, что не получится, но т.к. опыта мало решил удостоверится у профи. Спасибо!
2 окт 18, 20:10    [21693274]     Ответить | Цитировать Сообщить модератору
 Re: Ексель, как быстро считать цвета ячеек?  [new]
Соколинский Борис
Member

Откуда: Москва
Сообщений: 8346
Гаджимурадов Рустам
Циклы не устраивают скоростью или чем?

В VBA циклы по номерам крайне неэффективны - там все как хеш-таблицы хранится.
IEnumVariant/for each дает прирост скорости пропорционально количеству элементов.
2 окт 18, 20:28    [21693294]     Ответить | Цитировать Сообщить модератору
 Re: Ексель, как быстро считать цвета ячеек?  [new]
Гаджимурадов Рустам
Member

Откуда:
Сообщений: 59204
Я знаю, но for each суть тот же цикл.

Posted via ActualForum NNTP Server 1.5

2 окт 18, 20:40    [21693312]     Ответить | Цитировать Сообщить модератору
 Re: Ексель, как быстро считать цвета ячеек?  [new]
Соколинский Борис
Member

Откуда: Москва
Сообщений: 8346
Гаджимурадов Рустам,
Я имел в виду VBA-шный "for each cell in range".
А как дельфя такую конструкцию будет компилить (и будет ли вообще) - без понятия.
2 окт 18, 20:55    [21693335]     Ответить | Цитировать Сообщить модератору
 Re: Ексель, как быстро считать цвета ячеек?  [new]
Гаджимурадов Рустам
Member

Откуда:
Сообщений: 59204
Аналогично.

Posted via ActualForum NNTP Server 1.5

2 окт 18, 20:59    [21693345]     Ответить | Цитировать Сообщить модератору
 Re: Ексель, как быстро считать цвета ячеек?  [new]
Гаджимурадов Рустам
Member

Откуда:
Сообщений: 59204
Кстати, если бы Find возвращал "адекватный" Range
(или Find2/FindAll, который это делал), а не только
первую ячейку - сабж был бы решён. И не только сабж.

Posted via ActualForum NNTP Server 1.5

2 окт 18, 21:02    [21693347]     Ответить | Цитировать Сообщить модератору
 Re: Ексель, как быстро считать цвета ячеек?  [new]
X-Cite
Member

Откуда: Минск
Сообщений: 1134
Фильтр по цвету ячейки и потом просто Count оставшихся?
function AutoFilter(Field: OleVariant; Criteria1: OleVariant; Operator_: XlAutoFilterOperator; 
                        Criteria2: OleVariant; VisibleDropDown: OleVariant; out RHS: OleVariant): HResult; stdcall;
2 окт 18, 21:51    [21693405]     Ответить | Цитировать Сообщить модератору
 Re: Ексель, как быстро считать цвета ячеек?  [new]
DimaBr
Member

Откуда:
Сообщений: 10712
ИМХО, проще скриптом посчитать количество цветных ячеек, занести готовый результат куда нибудь в скрытую колонку, а из Delphi читать значение одной ячейки
2 окт 18, 22:02    [21693420]     Ответить | Цитировать Сообщить модератору
 Re: Ексель, как быстро считать цвета ячеек?  [new]
Гаджимурадов Рустам
Member

Откуда:
Сообщений: 59204
Автофильтр в последних версиях умеет фильтровать по формату (в т.ч. цвету) ?

Posted via ActualForum NNTP Server 1.5

2 окт 18, 22:15    [21693449]     Ответить | Цитировать Сообщить модератору
 Re: Ексель, как быстро считать цвета ячеек?  [new]
X-Cite
Member

Откуда: Минск
Сообщений: 1134
Гаджимурадов Рустам
Автофильтр в последних версиях умеет фильтровать по формату (в т.ч. цвету) ?

ActiveSheet.Range("$A$1:$C$4").AutoFilter Field:=1, Criteria1:=RGB(255, 192 _
        , 0), Operator:=xlFilterCellColor
2 окт 18, 22:16    [21693452]     Ответить | Цитировать Сообщить модератору
 Re: Ексель, как быстро считать цвета ячеек?  [new]
Гаджимурадов Рустам
Member

Откуда:
Сообщений: 59204
Ну круто. Если итоговый Range позволяет делать
Count c игнором невидимых строк - то сабж решён.

Posted via ActualForum NNTP Server 1.5

2 окт 18, 22:29    [21693475]     Ответить | Цитировать Сообщить модератору
 Re: Ексель, как быстро считать цвета ячеек?  [new]
DimaBr
Member

Откуда:
Сообщений: 10712
Автофильтр распостраняется на несколько колонок ???
2 окт 18, 23:17    [21693521]     Ответить | Цитировать Сообщить модератору
 Re: Ексель, как быстро считать цвета ячеек?  [new]
X-Cite
Member

Откуда: Минск
Сообщений: 1134
На VBA выглядит как-то так, перевести в OLE не проблема.

ActiveSheet.Range("$A$1:$C$5").AutoFilter Field:=1, Criteria1:=RGB(0, 112, 192), Operator:=xlFilterCellColor
        
    Dim rngArea As Range
    Dim lCount As Integer
    
    lCount = 0
    
    For Each rngArea In ActiveSheet.AutoFilter.Range.SpecialCells(xlCellTypeVisible).Areas
      lCount = lCount + rngArea.Rows.Count
    Next
    
    Dim Result
    Result = lCount - 1

Суть в том, что если фильтр содержит прерывающиеся области, то надо суммировать через Areas т.к. свойства у Range будут возвращать данные только первой области.
2 окт 18, 23:31    [21693527]     Ответить | Цитировать Сообщить модератору
 Re: Ексель, как быстро считать цвета ячеек?  [new]
X-Cite
Member

Откуда: Минск
Сообщений: 1134
DimaBr
Автофильтр распостраняется на несколько колонок ???

Естественно
ActiveSheet.Range("$A$1:$C$8").AutoFilter Field:=1, Criteria1:=RGB(0, 112, _
        192), Operator:=xlFilterCellColor
    ActiveSheet.Range("$A$1:$C$8").AutoFilter Field:=2, Criteria1:=RGB(255, 255 _
        , 0), Operator:=xlFilterCellColor
    ActiveSheet.Range("$A$1:$C$8").AutoFilter Field:=3, Criteria1:=RGB(192, 0, _
        0), Operator:=xlFilterCellColor
2 окт 18, 23:34    [21693529]     Ответить | Цитировать Сообщить модератору
 Re: Ексель, как быстро считать цвета ячеек?  [new]
Гаджимурадов Рустам
Member

Откуда:
Сообщений: 59204
X-Cite> Суть в том, что если фильтр содержит прерывающиеся
X-Cite> области, то надо суммировать через Areas

С прерывающимися понятно, а с пересекающимися (в т.ч. по нескольким колонкам) ?
Умозрительно (нет нужной версии Excel под рукой, чтобы проверить) - будут ошибки.

Posted via ActualForum NNTP Server 1.5

3 окт 18, 01:48    [21693583]     Ответить | Цитировать Сообщить модератору
 Re: Ексель, как быстро считать цвета ячеек?  [new]
X-Cite
Member

Откуда: Минск
Сообщений: 1134
Гаджимурадов Рустам
X-Cite> Суть в том, что если фильтр содержит прерывающиеся
X-Cite> области, то надо суммировать через Areas

С прерывающимися понятно, а с пересекающимися (в т.ч. по нескольким колонкам) ?
Умозрительно (нет нужной версии Excel под рукой, чтобы проверить) - будут ошибки.

ActiveSheet.AutoFilter.Range.SpecialCells(xlCellTypeVisible)

Вернет Range только видимых строк состоящих из соответствующих Areas
3 окт 18, 07:50    [21693632]     Ответить | Цитировать Сообщить модератору
 Re: Ексель, как быстро считать цвета ячеек?  [new]
Гаджимурадов Рустам
Member

Откуда:
Сообщений: 59204
Именно.

Строк, а не ячеек. Когда будут *пересечения* -
возможны нюансы (точнее, неверный результат).
Проверьте, у кого есть возможность, плиз.

Posted via ActualForum NNTP Server 1.5

3 окт 18, 08:00    [21693634]     Ответить | Цитировать Сообщить модератору
 Re: Ексель, как быстро считать цвета ячеек?  [new]
X-Cite
Member

Откуда: Минск
Сообщений: 1134
Что значит пересечения?

xlCellTypeVisible - возвращает Range всех видимых ячеек. В данном случае после применения фильтров.

AutoFilter.Range - как я понял это Range области фильтра.
3 окт 18, 11:45    [21693849]     Ответить | Цитировать Сообщить модератору
 Re: Ексель, как быстро считать цвета ячеек?  [new]
X-Cite
Member

Откуда: Минск
Сообщений: 1134
https://docs.microsoft.com/en-us/office/vba/api/excel.autofilter.range
3 окт 18, 11:46    [21693851]     Ответить | Цитировать Сообщить модератору
 Re: Ексель, как быстро считать цвета ячеек?  [new]
Гаджимурадов Рустам
Member

Откуда:
Сообщений: 59204
X-Cite> Что значит пересечения?

Ну, например, простейшее А1-А5, В2-В3.
Если автофильтр отфильтрует строки -
ячейки второго столбца проигнорируются
(как версия, не проверял).

В общем, тут проверять надо, с включением
xlCellTypeVisible и без него, а не гадать.

Posted via ActualForum NNTP Server 1.5

3 окт 18, 17:41    [21694391]     Ответить | Цитировать Сообщить модератору
 Re: Ексель, как быстро считать цвета ячеек?  [new]
X-Cite
Member

Откуда: Минск
Сообщений: 1134
Суть топика считать кол-во ячеек одного цвета.
Это значит надо будет фильтровать отдельно каждый столбец и по каждому столбцу отдельно получать кол-во видимых строк.
Если задать фильтр по двум столбцам - это будет фильтр AND а не OR.
3 окт 18, 18:04    [21694417]     Ответить | Цитировать Сообщить модератору
 Re: Ексель, как быстро считать цвета ячеек?  [new]
Гаджимурадов Рустам
Member

Откуда:
Сообщений: 59204
X-Cite> Это значит надо будет фильтровать отдельно каждый столбец
X-Cite> и по каждому столбцу отдельно получать кол-во видимых строк.

Именно. Т.е. никак не за 1 раз.

Posted via ActualForum NNTP Server 1.5

3 окт 18, 22:03    [21694625]     Ответить | Цитировать Сообщить модератору
 Re: Ексель, как быстро считать цвета ячеек?  [new]
X-Cite
Member

Откуда: Минск
Сообщений: 1134
Гаджимурадов Рустам
X-Cite> Это значит надо будет фильтровать отдельно каждый столбец
X-Cite> и по каждому столбцу отдельно получать кол-во видимых строк.

Именно. Т.е. никак не за 1 раз.

На многоядерных процах это не проблема... в PPL закинули по кол-ву ядер страниц и считаем себе в параллели...
3 окт 18, 23:46    [21694696]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: 1 2      [все]
Все форумы / Delphi Ответить