Delphi excel включить фильтр

Обновлено: 07.07.2024

Delphi Tokyo, Excel 2016. Используя программу Delphi, я управляю Excel. Я пытаюсь удалить все строки на одном листе, ЗА ИСКЛЮЧЕНИЕМ строк, которые имеют определенное значение в определенном столбце . Например, у меня есть список предприятий, где столбец 3 - это ГОРОД компании. Мне нужно удалить все строки, ЗА ИСКЛЮЧЕНИЕМ города в («Чикаго», «Денвер», «Колумбус»). Я создал и просмотрел макрос Excel, чтобы увидеть, как это делает Excel . В частности, он включает автофильтр, выбирает все значения, ЗА ИСКЛЮЧЕНИЕМ этих городов, а затем удаляет их. У меня вопрос . как мне узнать, какие значения находятся в этом столбце .

Вот код макроса VBA .

Что мне нужно сделать, так это построить массив ВСЕХ городов, ЗА ИСКЛЮЧЕНИЕМ тех, которые я хочу удалить. Автофильтр знает, что такое все уникальные значения . Как мне читать Автофильтр (он же список уникальных значений), кроме простого перебора всех строк?

2 ответа

Автофильтр знает все уникальные значения . Как читать Автофильтр

Я не думаю, что вы можете прочитать уникальные значения из автофильтра. Если вы посмотрите на определенные свойства filter, среди них нет уникальных значений, только диапазон ячеек, с которым работает фильтр.

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

Итак, вам придется каким-то образом самостоятельно перебирать диапазон.

Что мне нужно сделать, так это построить массив ВСЕХ городов, ЗА ИСКЛЮЧЕНИЕМ тех, которые я хочу удалить.

На самом деле это намного проще сделать в коде Delphi, если игнорировать автофильтр Excel, потому что найти уникальные значения ячеек в диапазоне Excel с помощью кода Delphi почти тривиально.

Ниже я покажу, как сделать Delphi-эквивалент формулы Кодерре в этот ответ. Выбирайте, какой вы предпочитаете.

Запустите новый проект Delphi VCL и поместите в него TCheckListBox. Затем скомпилируйте и выполните приведенный ниже код. Код заполняет диапазон Excel такими значениями, как A, B и C, а затем извлекает уникальные значения и заполняет ими ChecklistBox. После этого вы можете использовать состояния отдельных флажков для обработки диапазона Excel любым способом.

Кстати, если вы посмотрите на одну из единиц импорта для объектов автоматизации Excel, например Excel2000.Pas, вы увидите, что в нем определен интерфейс для IAutoFilter, так что вы могли бы получить доступ к нему из кода Delphi, если бы действительно захотели.

Кстати, если бы я делал это сам, я бы, вероятно, выполнял манипуляции с данными в SQL, обращаясь к электронной таблице с помощью объекта ADO, такого как TAdoQuery, потому что такие операции, как «удалить все строки, в которых какое-то значение столбца отсутствует в списке значений» взывает к такому обращению.

Как вам сказали, уникальные значения недоступны из AutoFilter , и было бы довольно сложно имитировать функциональность ручной настройки фильтрации, которую вы пытались достичь.

Я предлагаю использовать Range.AdvancedFilter вместо Range.AutoFilter . У него более простой способ определения критериев фильтрации.

Макрос, который вы вызовете из Delphi, выглядит так:

Это работает в унисон с данными, которые у вас есть в MyRange , и критериями, которые у вас есть в CriteriaRange .

enter image description here

(Я использовал разделенное представление, чтобы уменьшить размер изображения. Все строки с 4 по 19 содержат данные)

У вас есть намного больше столбцов, но мы можем продемонстрировать, как фильтр работает с этими тремя столбцами. Диапазон данных ( MyRange ) должен включать заголовки данных. Заголовок поля "Город" City совпадает с заголовком CriteriaRange .

CriteriaRange - интересный. У нас есть три ячейки заголовка, все с именем поля City . Тогда у нас есть три критерия: <>Denver , <>Chicago и <>Dallas . Критерии, которые находятся в одной строке, образуют между собой логическую функцию AND , а <> , конечно же, означает not equal to . Итак, критерий выбора становится select records where City is not Denver and City is not Chicago and City is not Dallas .

Результат очень похож на ваш ручной тест AutoFilter .

enter image description here

Если процедура Public UseAdvancedFilter размещена в общедоступном модуле, ее можно вызвать непосредственно из Delphi, например:

При условии, что настройки безопасности этого не запрещают.

Приведенное выше решение соответствует вашей идее удаления всех ненужных строк данных. В случае, если вы действительно не хотите / не нуждаетесь в удалении ненужных данных, а скорее скрываете их, для копирования требуемых данных вы можете изменить приведенное выше следующим образом:

Измените диапазон критериев на

Да, это только одна колонка. Критерии в разных строках образуют между собой логическую функцию OR . Таким образом, выбор становится

Затем нам нужно изменить то, что макрос делает с выделением, например.

Это скопирует выбранные записи в место назначения для дальнейшей обработки.

Репутация: нет
Всего: нет

Подскажите пожалуйста как задать автофильтрование и группировку в Листе Excel из Delphi.
Методы диапазона следующие:
фильтр - Range[].AutoFilter(Field,Criteria1,Operator,Criteria2,VisibleDropDown)
группа - Range[].Group(Start, End_, By, Periods)

Расскажите по подробнее какие параметры что обозначают?

Репутация: нет
Всего: нет

Нашел небольшое упоминание автофильтра тут. По приведенному примеру в формируемом файле лишь появились значки выпадающих списков для фильтров. Может у кого нибудь есть более подробная информация о параметрах? Хотелось бы получить в выходном файле Excel фильтр как при создании его в Excel, т.е. с выпадающим списком критериев, а не сформированный по заданному условию.

Добавлено через 8 минут и 54 секунды
Появился так же вопрос, как программно установить закрепление области?

Репутация: нет
Всего: нет

И еще вопрос. Можно ли используя Paste/PasteSpecial скопировать размеры строк/столбцов из одной книги в другую или надо тупо вручную для каждого столбца/строки копировать значения? Может другой способ есть?

Репутация: нет
Всего: нет

Отвечаю сам себе. Для закрепления области необходимо:

Где, XL : TExcelApplication. Область закрепляется для текущего окна, книги, листа, диапазона. Т.е.

Закрепит область в текущем документе, выше 6 строки.

Репутация: нет
Всего: нет

Описанные проблемы с фильтром, группировкой и копированием пока существуют. Никто не подскажет?

Репутация: 1
Всего: 160

Excel Developer Reference

Если интересно где я это беру. Excel 2007 включаем вкладку Разработчик, на этой вкладке нажимаем кнопочку Visual Basic. В VB жмем F1, вводим запрос и пожалуйста!

Точно сказать не могу, но по моему в 2003 тоже есть этот самый Developer Reference!

P.S. На всякий случай файлик прикрепил ))

Цитата

Можно ли используя Paste/PasteSpecial скопировать размеры строк/столбцов из одной книги в другую или надо тупо вручную для каждого столбца/строки копировать значения?

Похоже, что нельзя (( Придется тупо вручную. (((

Присоединённый файл ( Кол-во скачиваний: 27 )
Excel_Developer_Reference.docx 19,58 Kb

Пей, кури, пиши на си!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

Если Вам помогли, и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, Rrader, Girder.

[ Время генерации скрипта: 0.1040 ] [ Использовано запросов: 21 ] [ GZIP включён ]


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

Как, я уже говорил, на мой взгляд, фильтрация данных – это, грубо говоря, поиск данных. Но фильтрация данных проходит гораздо быстрее, чем обычный поиск по всей БД, с перебором каждой записи.
Давайте в этой статье и рассмотрим, как быстро можно осуществлять поиск данных, даже если БД имеет большой объем.
Ну, как я уже говорил, это фильтрация данных, кроме этого можно поиск организовать с помощью sql-запросов и с помощью функции Locate. Не забываем, что сейчас мы разговариваем про технологию ADO.

Давайте вернемся к нашему проекту, на форме у меня следующие компоненты:

Создадим в MS Access произвольную базу данных и таблицу в ней. У меня она получилась, следующей структуры:


Теперь необходимо сделать подключение к нашей БД, как это делать, мы рассматривали в данной статье, а также необходимо связать между собой компоненты. Для этого, выделяем компонент TADOQuery и в свойстве Connection, выбираем компонент TADOConenction. Далее, выделяем компонент TDataSource и в свойстве выбираем компонент TADOQuery. Затем, выделяем компонент TDBGrid и в свойстве DataSet выбираем компонент TDataSource. Все подключение к нашей БД настроено, теперь приступаем к поиску данных.

Первый способ

Фильтрация данных

Ну, тут много говорить не буду, уже итак все сказал, что фильтрация данных — это тот же поиск по определенному условию, который указывается в свойстве Filter, например

В данном свойстве, указывается поле, которое необходимо фильтровать и условия отбора. Работает достаточно быстро, при большом количестве записей. Не забываем, что его необходимо еще и активировать Filtered:=True

Второй способ

С помощью SQL-запросов

Ну, тут, я много ничего не буду говорить, так как мы много рассматривали подобных примеров, просто выбираем записи, по определенному условию, например:

Тут будут найдены записи, которые полностью удовлетворяют условию, а чтобы были найдены записи, по начальному совпадению, то необходимо использовать LIKE, например:

Данным способом, будут выбраны все записи, которые начинаются на Andr.

Третий способ

С помощью функции Locate

Есть также, замечательная функция, которая позволяет также находить записи по неполному совпадению, например:

Ну вот такая небольшая заметка, по поиску данных в БД, с использованием ADO. Исходники выкладывать не буду, так как тут итак, думаю, все понятно.

Работа с EXCEL из Delphi.


В этой статье я познакомлю вас как работать с MS Excel из Delphi. Данная статья может быть полезна людям, которые хотят научиться создавать различные отчеты в Excel из программ написанных на Delphi. Статья содержит справочные данные необходимые для работы с MS Excel. Здесь вы найдете информацию о том как:

- Подключить и правильно отключить интерфейс Excel;
- Как изменить размер, цвет и тип шрифта;
- Как выделить, объединить, заполнить и размножить диапазон ячеек;
- Как повернуть и отцентрировать текст;
- Как нарисовать границы ячеек;
- Как ввести формулу в ячейку и многое другое.

Работать будем через модуль ComObj, для этого в uses необходимо добавить модуль ComObj и модуль Excel_TLB (для MS Excel 2007).

Uses ……, ComObj, Excel_TLB;

Модуль Excel_TLB содержит необходимые константы для работы с Excel, его можно не подключать, но тогда придется в ручную прописывать значения всех используемых констант из этого модуля. Значения констант можно найти внутри модуля или в интернете, но для разных версий MS Excel они разные.
Внимание. Модуль Excel_TLB в других версиях MS Excel может называться по другому. Перед подключением модуля Excel_TLB, необходимо импортировать библиотеку Excel. Для этого выберите Component->Import Component->Import a Type Library-> находим MS Excel и следуем инструкциям.


В разделе описания переменных мы должны описать переменную типа Variant или OleVariant для подключения интерфейса Excel. Я описал переменную excel.

Form1: TForm1;
excel : variant; // Переменная в которой создаётся объект EXCEL

Создание документа

Внимание. Всегда когда создаете объект интерфейса, заключайте процедуру создания в модуль обработки ошибок:
try
создаем интерфейс;
формируем отчет;
освобождаем интерфейс;
Except
обрабатываем ошибки;
освобождаем интерфейс;
end;

Далее идет краткий справочник по основным функциям работы с EXCEL

// Чтоб не задавал вопрос о сохранении документа
excel.DisplayAlerts := false;

// создаем новый документ рабочую книгу
excel.WorkBooks.Add;

// Делаем его видимым данную функцию после отладки и тестирования лучше использовать в конце, после сформирования отчета (это ускоряет процесс вывода данных в отчет)
excel.Visible := true;

//задаем тип формул в формате R1C1
excel.Application.ReferenceStyle := xlR1C1;

// задаем тип формул в формате A1
excel.Application.ReferenceStyle := xlA1;

// задаем ширину первой и второй колонки
excel.WorkBooks[1].WorkSheets[1].Columns[1].ColumnWidth := 10;
excel.WorkBooks[1].WorkSheets[1].Columns[2].ColumnWidth := 20;

// Выравнивам первый ряд по центру по вертикали
excel.WorkBooks[1].WorkSheets[1].Rows[1].VerticalAlignment := xlCenter;

// Выравнивам первый ряд по центру по горизонтали
excel.WorkBooks[1].WorkSheets[1].Rows[1].HorizontalAlignment := xlCenter;

// Выравнивам в ячейке по левому краю
excel.WorkBooks[1].WorkSheets[1].Cells[3, 2].HorizontalAlignment := xlLeft;

// Выравнивам в ячейке по правому краю
excel.WorkBooks[1].WorkSheets[1].Cells[3, 4].HorizontalAlignment := xlRight;

// Поворачиваем слова под углом 90 градусов для второго ряда
excel.WorkBooks[1].WorkSheets[1].Rows[2].Orientation := 90;

//рисуем границы выделенного диапазона левая
excel.Selection.Borders[xlEdgeLeft].LineStyle := xlContinuous; // стиль линии сплошная
excel.Selection.Borders[xlEdgeLeft].Weight := xlMedium;// толщина линии

//рисуем границы выделенного диапазона верхняя
excel.Selection.Borders[xlEdgeTop].LineStyle := xlContinuous;
excel.Selection.Borders[xlEdgeTop].Weight := xlMedium;

//рисуем границы выделенного диапазона нижняя
excel.Selection.Borders[xlEdgeBottom].LineStyle := xlContinuous;
excel.Selection.Borders[xlEdgeBottom].Weight := xlMedium;

//рисуем границы выделенного диапазона правая
excel.Selection.Borders[xlEdgeRight].LineStyle := xlContinuous;
excel.Selection.Borders[xlEdgeRight].Weight := xlMedium;

//рисуем границы выделенного диапазона вертикальные внутрениие
excel.Selection.Borders[xlInsideVertical].LineStyle := xlContinuous;
excel.Selection.Borders[xlInsideVertical].Weight := xlMedium;

//рисуем границы выделенного диапазона горизонтальные внутрениие
excel.Selection.Borders[xlInsideHorizontal].LineStyle := xlContinuous;
excel.Selection.Borders[xlInsideHorizontal].Weight := xlMedium;

//отключаем предупреждения, чтобы не задавал вопросов о сохранении и других
excel.DisplayAlerts := False;

//закроем все книги
excel.Workbooks.Close;

//закрываем Excel
excel.Application.quit;

//освобождаем интерфейсы
excel := Unassigned;

//закроем все книги
excel.Workbooks.Close;

//закрываем Excel
excel.Application.quit;

//освобождаем интерфейсы
excel := Unassigned;
end;
end;

После сформирования документа или возникновении ошибки вы должны правильно освободить интерфейсы.
Иначе при закрытии Excel он скрывается с экрана, но если открыть диспетчер задач он продолжает там висеть и если данный процесс не завершить , то при каждом новом запуске их будет накапливаться больше и больше, пока компьютер не начнет виснуть. Поэтому обязательно необходимо освобождать все интерфейсы с вязанные с Excel с его книгами и листами.

Например так:
//закроем все книги
excel.Workbooks.Close;

//закрываем Excel
excel.Application.quit;

//освобождаем интерфейсы
sheet:=Unassigned; //интерфейс листа если он был создан
WorkBook := Unassigned;//интерфейс рабочей книги если он был создан
excel := Unassigned;//интерфейс самого предложения если он был создан


Ниже привожу пример вывода в Excel из Delphi таблицы умножения с подробными комментариями.

Работа с EXCEL из Delphi.

Работа с EXCEL из Delphi.

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, comobj, StdCtrls, Excel_TLB;

type
TForm1 = class(TForm)
Button1: TButton;
procedure Button1Click(Sender: TObject);
private
< Private declarations >
public
< Public declarations >
end;

var
Form1: TForm1;
excel: variant; // Переменная в которой создаётся объект EXCEL
MyData: variant; // Переменная в которой формируется таблица умножения
i,j:integer;
implementation

//объявляем вариантный массив
MyData := VarArrayCreate([1,9,1,9],varVariant);
for I := 1 to 9 do
for J := 1 to 9 do
MyData[i,j]:=i*j;

Читайте также: