powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Ексель, как быстро считать цвета ячеек?
25 сообщений из 31, страница 1 из 2
Ексель, как быстро считать цвета ячеек?
    #39711875
Конор-
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Чтобы быстро считать данные использую

Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
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]);


А как подправить, чтобы так же считывал цвета? Возможно
Код: pascal
1.
FData := Sheet.UsedRange.Interior.Color;

А дальше не знаю.
...
Рейтинг: 0 / 0
Ексель, как быстро считать цвета ячеек?
    #39711963
Гаджимурадов Рустам
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А что значит "быстро считать цвета"?
Количество ячеек определённого цвета?
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Ексель, как быстро считать цвета ячеек?
    #39711970
Конор-
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Гаджимурадов Рустам, в общем да. Нужно пройтись по всем строкам и узнать кол-во ячеек определённого цвета в каждой строке.
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
    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;
...
Рейтинг: 0 / 0
Ексель, как быстро считать цвета ячеек?
    #39711978
Jonnik
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Гаджимурадов РустамА что значит "быстро считать цвета"?
Количество ячеек определённого цвета?


Использование метода "FData := Sheet.UsedRange" позволяет выделить участок листа и одним махом скопировать от туда данные.
Например, если мне надо считать 300 000 ячеек, то таким методом я могу их считать за 10-15 сек. Методом перебора каждой ячейки это займет вечность. Но этот метод работает думаю только с текстом. И я сам пару лет назад спрашивал тут как можно так же и цвет ячейки получить и набор ссыллок в каждой ячейки и как так же считать объединенные ячейки. Но тогда вариантов не нашлось. Может сейчас это кто-то подскажет если это возможно.
...
Рейтинг: 0 / 0
Ексель, как быстро считать цвета ячеек?
    #39711982
Гаджимурадов Рустам
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Циклы не устраивают скоростью или чем?
Можно использовать Find, будет быстрее.

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

Хотя, чисто теоретически, можно покопаться в
ConditionalFormatting в последних версиях Excel -
возможно там есть что-то подобное...
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Ексель, как быстро считать цвета ячеек?
    #39711984
Гаджимурадов Рустам
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Jonnik> Например, если мне надо считать 300 000 ячеек
Jonnik> Методом перебора каждой ячейки это займет вечность.

У меня почему-то не занимало. Не моментально, конечно, но не вечность.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Ексель, как быстро считать цвета ячеек?
    #39712028
Jonnik
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Гаджимурадов РустамЦиклы не устраивают скоростью или чем?
Можно использовать Find, будет быстрее.

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

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


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

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

Код: pascal
1.
2.
3.
4.
  var
    FData : OLEVariant;

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



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



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

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

Код: pascal
1.
FData := WorkSheet.Range[Excel.Cells[1,1], Excel.Cells[Rows,Cols]].MergeArea.Cells[1, 1].Value;
...
Рейтинг: 0 / 0
Ексель, как быстро считать цвета ячеек?
    #39712030
Гаджимурадов Рустам
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Jonnik> FData := WorkSheet.Range[Excel.Cells[1,1], Excel.Cells[Rows,Cols]].Interior.Color;
Jonnik> Но оно не работает так.

Да, так не сработает (да и со скрытыми надо проверить).
Равно как CountIf/CountFormat для цвета нету (пока).
Я же сразу сказал - пусть пишет макрос или функцию.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Ексель, как быстро считать цвета ячеек?
    #39712036
Конор-
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Я так и подумал, что не получится, но т.к. опыта мало решил удостоверится у профи. Спасибо!
...
Рейтинг: 0 / 0
Ексель, как быстро считать цвета ячеек?
    #39712046
Соколинский Борис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Гаджимурадов РустамЦиклы не устраивают скоростью или чем?

В VBA циклы по номерам крайне неэффективны - там все как хеш-таблицы хранится.
IEnumVariant/for each дает прирост скорости пропорционально количеству элементов.
...
Рейтинг: 0 / 0
Ексель, как быстро считать цвета ячеек?
    #39712059
Гаджимурадов Рустам
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Я знаю, но for each суть тот же цикл.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Ексель, как быстро считать цвета ячеек?
    #39712073
Соколинский Борис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Гаджимурадов Рустам,
Я имел в виду VBA-шный "for each cell in range".
А как дельфя такую конструкцию будет компилить (и будет ли вообще) - без понятия.
...
Рейтинг: 0 / 0
Ексель, как быстро считать цвета ячеек?
    #39712076
Гаджимурадов Рустам
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Аналогично.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Ексель, как быстро считать цвета ячеек?
    #39712078
Гаджимурадов Рустам
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Кстати, если бы Find возвращал "адекватный" Range
(или Find2/FindAll, который это делал), а не только
первую ячейку - сабж был бы решён. И не только сабж.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Ексель, как быстро считать цвета ячеек?
    #39712104
Фотография X-Cite
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Фильтр по цвету ячейки и потом просто Count оставшихся?
Код: pascal
1.
2.
function AutoFilter(Field: OleVariant; Criteria1: OleVariant; Operator_: XlAutoFilterOperator; 
                        Criteria2: OleVariant; VisibleDropDown: OleVariant; out RHS: OleVariant): HResult; stdcall;
...
Рейтинг: 0 / 0
Ексель, как быстро считать цвета ячеек?
    #39712110
DimaBr
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ИМХО, проще скриптом посчитать количество цветных ячеек, занести готовый результат куда нибудь в скрытую колонку, а из Delphi читать значение одной ячейки
...
Рейтинг: 0 / 0
Ексель, как быстро считать цвета ячеек?
    #39712114
Гаджимурадов Рустам
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Автофильтр в последних версиях умеет фильтровать по формату (в т.ч. цвету) ?
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Ексель, как быстро считать цвета ячеек?
    #39712116
Фотография X-Cite
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Гаджимурадов РустамАвтофильтр в последних версиях умеет фильтровать по формату (в т.ч. цвету) ?

Код: vbnet
1.
2.
ActiveSheet.Range("$A$1:$C$4").AutoFilter Field:=1, Criteria1:=RGB(255, 192 _
        , 0), Operator:=xlFilterCellColor
...
Рейтинг: 0 / 0
Ексель, как быстро считать цвета ячеек?
    #39712122
Гаджимурадов Рустам
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ну круто. Если итоговый Range позволяет делать
Count c игнором невидимых строк - то сабж решён.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Ексель, как быстро считать цвета ячеек?
    #39712136
DimaBr
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Автофильтр распостраняется на несколько колонок ???
...
Рейтинг: 0 / 0
Ексель, как быстро считать цвета ячеек?
    #39712139
Фотография X-Cite
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
На VBA выглядит как-то так, перевести в OLE не проблема.

Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
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 будут возвращать данные только первой области.
...
Рейтинг: 0 / 0
Ексель, как быстро считать цвета ячеек?
    #39712140
Фотография X-Cite
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
DimaBrАвтофильтр распостраняется на несколько колонок ???
Естественно
Код: vbnet
1.
2.
3.
4.
5.
6.
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
...
Рейтинг: 0 / 0
Ексель, как быстро считать цвета ячеек?
    #39712169
Гаджимурадов Рустам
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
X-Cite> Суть в том, что если фильтр содержит прерывающиеся
X-Cite> области, то надо суммировать через Areas

С прерывающимися понятно, а с пересекающимися (в т.ч. по нескольким колонкам) ?
Умозрительно (нет нужной версии Excel под рукой, чтобы проверить) - будут ошибки.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Ексель, как быстро считать цвета ячеек?
    #39712202
Фотография X-Cite
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Гаджимурадов РустамX-Cite> Суть в том, что если фильтр содержит прерывающиеся
X-Cite> области, то надо суммировать через Areas

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

Код: vbnet
1.
ActiveSheet.AutoFilter.Range.SpecialCells(xlCellTypeVisible)


Вернет Range только видимых строк состоящих из соответствующих Areas
...
Рейтинг: 0 / 0
Ексель, как быстро считать цвета ячеек?
    #39712203
Гаджимурадов Рустам
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Именно.

Строк, а не ячеек. Когда будут *пересечения* -
возможны нюансы (точнее, неверный результат).
Проверьте, у кого есть возможность, плиз.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
25 сообщений из 31, страница 1 из 2
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Ексель, как быстро считать цвета ячеек?
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]