Функция фильтрации по какому-либо текстовому значение в каком-либо столбце с выводом данных на новый лист является весьма типичной для стандартных обработок файла. Множественные фильтры также могут состоять из ряда одиночных, с удалением промежуточных результатов. Рассмотрим код:
Sub Filt
Dim oDescriptor,oNewDescriptor,bCopyOutputData as Boolean, bUseCriteria as Boolean
oDoc = ThisComponent
oSheet = ThisComponent.getSheets().getByIndex(0)
oAddr = oSheet.getCellRangeByName("A1:L65535").getRangeAddress()
oDoc.DatabaseRanges.addNewByName("MyName", oAddr)
oRange = oDoc.DatabaseRanges.getByName("MyName")
set oDescriptor = oRange.getFilterDescriptor
oSheet = ThisComponent.createInstance ("com.sun.star.sheet.Spreadsheet")
ThisComponent.Sheets.insertByName ("Торговый зал", oSheet)
oCellAddress = ThisComponent.Sheets (1).getCellByPosition(0, 0).getCellAddress()
oFD = oRange.getFilterDescriptor()
With oFD
.CopyOutputData = True
.OutputPosition = (oCellAddress)
End With
oField = createUnoStruct("com.sun.star.sheet.TableFilterField")
With oField
.Field = 4
.Operator = com.sun.star.sheet.FilterOperator.EQUAL
.StringValue = "Торговый зал"
End With
oFD.setFilterFields(Array(oField))
oRange.refresh()
End Sub
Отсюда, и в дальнейшем, я буду сперва предоставлять чистый код макроса, а затем приводить этот же код с комментариями, чтобы было понятно, за что какая строчка отвечает.
Комментарии в StarBasic можно писать прямо по коду - они не влияют на ход выполнения программы. Строчка комментария начинается со слова REM или с символа апострофа - ' (любой вариант как вам удобно). Комментарий идет выше строки, которую он поясняет. Комментарии можно писать на любом языке, в т.ч. на русском.
Sub Filt
' Стандартная строка определения диапазонов и дескрипторов:
Dim oDescriptor,oNewDescriptor,bCopyOutputData as Boolean, bUseCriteria as Boolean
' Определяем переменную oDoc - она будет обозначать текущий документ
oDoc = ThisComponent
' Определяем номер листа где находятся исходные данные для фильтрации, в данном
' случае это первый лист (нулевой)
oSheet = ThisComponent.getSheets().getByIndex(0)
' Определяем область фильтрации, с какого по какой столбцы будут отфильтрованны
' на новый лист, если у вас справа есть ненужные стоблцы, область можно обрезать,
'оставив лишь нужные. Начало диапазона обычно всегда начинается с ячейки А1
' концом диапазона всегда лучше объявлять конечную ячейку последнего столбца в
' диапазоне (65535), чтобы не зависеть от возможной разной размерности диапазонов
oAddr = oSheet.getCellRangeByName("A1:L65535").getRangeAddress()
' Даем имя этому диапазону - любое на ваш выбор, но только на латинице
' двух одинаковых имен в одной книге быть не может
oDoc.DatabaseRanges.addNewByName("MyName", oAddr)
oRange = oDoc.DatabaseRanges.getByName("MyName")
' устанавливаем область фильтрации (стандартная строчка)
set oDescriptor = oRange.getFilterDescriptor
' Вставляем новый лист в книгу, с нужным нам именем, на который будут 'отфильтрованы данные
oSheet = ThisComponent.createInstance ("com.sun.star.sheet.Spreadsheet")
ThisComponent.Sheets.insertByName ("Торговый зал", oSheet)
'Определяем ячейку верхнюю левую для вывода отфильтрованного диапазона
' в индексном формате, в данном случае это будет ячейка (0,0) или А1 на листе 2
' который мы назвали Торговый зал
oCellAddress = ThisComponent.Sheets (1).getCellByPosition(0, 0).getCellAddress()
' Стандартная конструкция вывода:
oFD = oRange.getFilterDescriptor()
With oFD
.CopyOutputData = True
.OutputPosition = (oCellAddress)
End With
' Создаем фильтр:
oField = createUnoStruct("com.sun.star.sheet.TableFilterField")
With oField
'В этой строчке мы определяем номер столбца по которому будет проводится фильтр
' по заданному значению, в данном случае это столбец 9. Нумерация столбцов, как и
' нумерация листов начинается с 0. 0 - это первый столбец на листе.
.Field = 8
' Определяем критерий фильтрации, окончание этой строки, определяет, как именно
'нужно отфильтровать данные слово EQUAL обозначает РАВНО, NOT_EQUAL - не
'равно
.Operator = com.sun.star.sheet.FilterOperator.EQUAL
'Определяем, какому значению должна быть равна (или не равна) строка в заданном
'диапазоне
.StringValue = "Торговый зал"
' Завершаем процесс установкой массива и его обновлением (стандартные строки)
End With
oFD.setFilterFields(Array(oField))
oRange.refresh()
'Завершаем программу
End Sub
Задача:
1. Скопировать первоначальный код и запустить его в отчете Реестр документов по МХ.
2. С отфильтрованных данных сделать фильтр по следующему столбцу по критерию не равно "Производство" и вывести его на новый лист. Для данного задания вы будете должны в исходном коде переделать:
а) номер листа с которого забираются данные
б) имя фильтруемого диапазона
в) другое произвольное имя вставляемого листа
г) другие данные для листа вывода
д) другой столбец фильтрации
е) другой критерий фильтрации
ж) другое значение строки для фильтрации
P.S, Для текстовых фильтров также разрешается фильтрация по пустому значению
.StringValue = ""
прочеркам и любым символам
.StringValue = "-"
Иногда, в БД в текстовую строку добавляют невидимые пробелы, вы пытаетесь отфильтровать только по тексту, но фильтр работает не корректно - проверьте - можно нужно вставить несколько пробелов (проще скопировать и вставить строку). Например:
.StringValue = "шт "
Sub Filt
Dim oDescriptor,oNewDescriptor,bCopyOutputData as Boolean, bUseCriteria as Boolean
oDoc = ThisComponent
oSheet = ThisComponent.getSheets().getByIndex(0)
oAddr = oSheet.getCellRangeByName("A1:L65535").getRangeAddress()
oDoc.DatabaseRanges.addNewByName("MyName", oAddr)
oRange = oDoc.DatabaseRanges.getByName("MyName")
set oDescriptor = oRange.getFilterDescriptor
oSheet = ThisComponent.createInstance ("com.sun.star.sheet.Spreadsheet")
ThisComponent.Sheets.insertByName ("Торговый зал", oSheet)
oCellAddress = ThisComponent.Sheets (1).getCellByPosition(0, 0).getCellAddress()
oFD = oRange.getFilterDescriptor()
With oFD
.CopyOutputData = True
.OutputPosition = (oCellAddress)
End With
oField = createUnoStruct("com.sun.star.sheet.TableFilterField")
With oField
.Field = 4
.Operator = com.sun.star.sheet.FilterOperator.EQUAL
.StringValue = "Торговый зал"
End With
oFD.setFilterFields(Array(oField))
oRange.refresh()
End Sub
Отсюда, и в дальнейшем, я буду сперва предоставлять чистый код макроса, а затем приводить этот же код с комментариями, чтобы было понятно, за что какая строчка отвечает.
Комментарии в StarBasic можно писать прямо по коду - они не влияют на ход выполнения программы. Строчка комментария начинается со слова REM или с символа апострофа - ' (любой вариант как вам удобно). Комментарий идет выше строки, которую он поясняет. Комментарии можно писать на любом языке, в т.ч. на русском.
Sub Filt
' Стандартная строка определения диапазонов и дескрипторов:
Dim oDescriptor,oNewDescriptor,bCopyOutputData as Boolean, bUseCriteria as Boolean
' Определяем переменную oDoc - она будет обозначать текущий документ
oDoc = ThisComponent
' Определяем номер листа где находятся исходные данные для фильтрации, в данном
' случае это первый лист (нулевой)
oSheet = ThisComponent.getSheets().getByIndex(0)
' Определяем область фильтрации, с какого по какой столбцы будут отфильтрованны
' на новый лист, если у вас справа есть ненужные стоблцы, область можно обрезать,
'оставив лишь нужные. Начало диапазона обычно всегда начинается с ячейки А1
' концом диапазона всегда лучше объявлять конечную ячейку последнего столбца в
' диапазоне (65535), чтобы не зависеть от возможной разной размерности диапазонов
oAddr = oSheet.getCellRangeByName("A1:L65535").getRangeAddress()
' Даем имя этому диапазону - любое на ваш выбор, но только на латинице
' двух одинаковых имен в одной книге быть не может
oDoc.DatabaseRanges.addNewByName("MyName", oAddr)
oRange = oDoc.DatabaseRanges.getByName("MyName")
' устанавливаем область фильтрации (стандартная строчка)
set oDescriptor = oRange.getFilterDescriptor
' Вставляем новый лист в книгу, с нужным нам именем, на который будут 'отфильтрованы данные
oSheet = ThisComponent.createInstance ("com.sun.star.sheet.Spreadsheet")
ThisComponent.Sheets.insertByName ("Торговый зал", oSheet)
'Определяем ячейку верхнюю левую для вывода отфильтрованного диапазона
' в индексном формате, в данном случае это будет ячейка (0,0) или А1 на листе 2
' который мы назвали Торговый зал
oCellAddress = ThisComponent.Sheets (1).getCellByPosition(0, 0).getCellAddress()
' Стандартная конструкция вывода:
oFD = oRange.getFilterDescriptor()
With oFD
.CopyOutputData = True
.OutputPosition = (oCellAddress)
End With
' Создаем фильтр:
oField = createUnoStruct("com.sun.star.sheet.TableFilterField")
With oField
'В этой строчке мы определяем номер столбца по которому будет проводится фильтр
' по заданному значению, в данном случае это столбец 9. Нумерация столбцов, как и
' нумерация листов начинается с 0. 0 - это первый столбец на листе.
.Field = 8
' Определяем критерий фильтрации, окончание этой строки, определяет, как именно
'нужно отфильтровать данные слово EQUAL обозначает РАВНО, NOT_EQUAL - не
'равно
.Operator = com.sun.star.sheet.FilterOperator.EQUAL
'Определяем, какому значению должна быть равна (или не равна) строка в заданном
'диапазоне
.StringValue = "Торговый зал"
' Завершаем процесс установкой массива и его обновлением (стандартные строки)
End With
oFD.setFilterFields(Array(oField))
oRange.refresh()
'Завершаем программу
End Sub
Задача:
1. Скопировать первоначальный код и запустить его в отчете Реестр документов по МХ.
2. С отфильтрованных данных сделать фильтр по следующему столбцу по критерию не равно "Производство" и вывести его на новый лист. Для данного задания вы будете должны в исходном коде переделать:
а) номер листа с которого забираются данные
б) имя фильтруемого диапазона
в) другое произвольное имя вставляемого листа
г) другие данные для листа вывода
д) другой столбец фильтрации
е) другой критерий фильтрации
ж) другое значение строки для фильтрации
P.S, Для текстовых фильтров также разрешается фильтрация по пустому значению
.StringValue = ""
прочеркам и любым символам
.StringValue = "-"
Иногда, в БД в текстовую строку добавляют невидимые пробелы, вы пытаетесь отфильтровать только по тексту, но фильтр работает не корректно - проверьте - можно нужно вставить несколько пробелов (проще скопировать и вставить строку). Например:
.StringValue = "шт "
Комментариев нет:
Отправить комментарий