Форум программистов, компьютерный форум, киберфорум
VBA
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.66/117: Рейтинг темы: голосов - 117, средняя оценка - 4.66
1 / 1 / 0
Регистрация: 17.11.2010
Сообщений: 40

фильтр (vba excel)

18.03.2011, 10:21. Показов 21938. Ответов 8
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Делаю фильтр на табличку. В первоначальном задании было достаточно просто, т.к. все укладывалось в автофильтр (1 запись - 1 строка). Но вот тз изменилось и теперь в исходной табличке МОГУТ быть объединенные ячейки.

На скринах для примера привожу 1) Исходную таблицу, 2) Результат работы автофильтра по запросу ФИО = Сидоров
Т.е. по правильному мне надо результат - целиком набор строк, относящихся к Сидорову, но мне выдает только 1-ю строку.

Не подскажите решения? А то пока что у меня в голове куча FOR-ов, IF-ов и вобще 100500 раз проверка всех строк таблицы перебором
Миниатюры
фильтр (vba excel)   фильтр (vba excel)  
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
18.03.2011, 10:21
Ответы с готовыми решениями:

VBA Excel. Фильтр по "ИЛИ"
Доброго всем дня! Ответ на вопрос будет, видимо, простой. Но я ищу его в нете три дня... Упрощённо - есть таблица 5 столбцов (A...E),...

Vba excel windows и vba excel Mac Os - Макинтош корявит шрифт
Всем привет, столкнулся с такой ситуацией. Макросы написаны на Excel 2016 Windows. Когда файл открывается и сохраняется на маке, весь...

VBA парсер выдает ошибку vba excel Run-time error '-2147319783 (80028019) и "microsoft ожидает пока другое приложение за
Добрый день, делаю свой первый парсер. Выдает ошибку vba excel Run-time error '-2147319783 (80028019) . одну категорию по каждому товару...

8
1 / 1 / 0
Регистрация: 17.11.2010
Сообщений: 40
18.03.2011, 10:34  [ТС]
p.s. Результат фильтра должен формировать новую таблицу на другом листе (это если вдруг принципиально как выводить результаты)
0
2309 / 1541 / 115
Регистрация: 13.06.2009
Сообщений: 5,575
18.03.2011, 14:32
Чтобы понять, о чём смысл, сделайте следующее:
  1. введите в ячейку A1 число 1; введите в ячейку A2 число 2;
  2. выделите ячейки B1:B2 - объедините их;
  3. скопируйте объединённые ячейки - выделите диапазон ячеек A1:A2 - щ. правой кн. мыши - Специальная вставка... - кружок Форматы - OK. В результате произошло объединение ячеек A1:A2, но если вы теперь уберёте объединение ячеек, то увидите, что данные в ячейках сохранены.
Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
Sub P2()
Dim Лист1 As Excel.Worksheet
Dim Временный As Excel.Worksheet
Dim LastRow As Long
Dim LastColomn As Long
Dim oFind As Excel.Range
Dim АдресПоиск As String
Dim АдресОбъединённых As String
Set Лист1 = ActiveWorkbook.Worksheets("Лист1")
With Лист1.UsedRange
    LastRow = .Rows.Count
    LastColomn = .Columns.Count
End With
With Лист1.Range(Лист1.Cells(1, 1), Лист1.Cells(LastRow, LastColomn))
    Application.FindFormat.Clear
    Application.FindFormat.MergeCells = True
    Set oFind = .Find(what:="", LookIn:=xlFormulas, LookAt:=xlWhole, SearchOrder:=xlByRows, _
        SearchDirection:=xlNext, MatchCase:=False, Searchformat:=True)
    If Not oFind Is Nothing Then
        АдресПоиск = oFind.Address
        Set Временный = ActiveWorkbook.Worksheets.Add
        Do
            АдресОбъединённых = oFind.MergeArea.Address
            oFind.MergeArea.Copy
            Лист1.Paste Destination:=Временный.Range("A1")
            oFind.MergeArea.UnMerge
            Лист1.Range(АдресОбъединённых).Value = Временный.Range("A1")
            Временный.Range("A1").MergeArea.Copy
            oFind.PasteSpecial xlPasteFormats
            Временный.Cells.Clear
            Временный.Cells.UnMerge
            Set oFind = .Find(what:="", After:=oFind, Searchformat:=True)
        Loop While Not oFind Is Nothing And oFind.Address <> АдресПоиск
    End If
End With
Application.DisplayAlerts = False
Временный.Delete
Application.DisplayAlerts = True
Application.FindFormat.Clear
End Sub
1
1 / 1 / 0
Регистрация: 17.11.2010
Сообщений: 40
18.03.2011, 14:52  [ТС]
спасибо большое!

p.s. заодно узнал, что для определения последних строк и столбцов необязательно выделять диапазон...
( Range(Selection, ActiveCell.SpecialCells(xlLastCell)).Sel ect )
0
1 / 1 / 0
Регистрация: 17.11.2010
Сообщений: 40
24.03.2011, 09:41  [ТС]
Может быть все таки кто знает как передавать значения автофильтру через массив?

Вот как сие записывает автозапись макросов:

Visual Basic
1
2
3
4
5
6
7
8
9
Sub AutoFil()
' запись макроса автофильтра с выбором множественных значений (больше 2)
    Sheets(1).Select
    Range(Selection, ActiveCell.SpecialCells(xlLastCell)).Select
    Selection.AutoFilter
    ActiveSheet.Range("$A$5:$AF$77").AutoFilter Field:=2, Criteria1:=Array( _
        "запись 1", "запись 13", "запись 3", "запись 6"), Operator:= _
        xlFilterValues
End Sub
на основе этого я создатю массив и хочу передать его автофильтру

Visual Basic
1
2
3
4
5
6
7
    Dim ValueArr() ' массив значений
'    ...
'   тут заполнение массива ValueArr
'   ...
    Selection.AutoFilter
    ActiveSheet.Range("$A$5:$AF$77").AutoFilter Field:=2, Criteria1:=ValueArr, Operator:= _
        xlFilterValues
в таком виде ругается. Как подсунуть фильтру массив?
0
 Аватар для mc-black
2786 / 718 / 106
Регистрация: 04.02.2011
Сообщений: 1,443
24.03.2011, 11:52
В твоем вчерашнем примере при заполнении массива была допущена ошибка, забыл про ReDim в цикле, возможно дело в этом? Протестируй мой вариант исправления бага:
Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
Sub AutoFil()
    Dim i As Integer, s As Integer
    Dim ValueArr()
    s = 0
    For i = 0 To Me.ListBox1.ListCount - 1
        If Me.ListBox1.Selected(i) = True Then
            ReDim Preserve ValueArr(0 To s)
            ValueArr(s) = Me.ListBox1.List(i)
            s = s + 1
        End If
    Next i
 
'    ...
 
    Selection.AutoFilter
    ActiveSheet.Range(AF_Range).AutoFilter _
        Field:=Me.ComboBox2.ListIndex, _
        Criteria1:=ValueArr, _
        Operator:= xlFilterValues
 
End Sub
0
1 / 1 / 0
Регистрация: 17.11.2010
Сообщений: 40
24.03.2011, 14:23  [ТС]
да, из-за ReDim'a я в панике уже целую тему создал. Так что там все объяснили и массив наконец создается.

но вот как его потом в автофильтре использовать... пока перебираю все варианты, которые приходят в голову (ValueArr, ValueArr(), Array(ValueArr)... и т.п.). Не помогает

Добавлено через 1 час 6 минут
Вобщем проблема пока обрисовалась такая: проверил после заполнения массив - ВСЕ кроме последнего пустые Может потому и ругается автофильтр, что с EMPTY работать не хочет?

заполнение ТОЧНО идет не пучтыми значениями. При ReDim могут затираться уже введеные?
0
 Аватар для mc-black
2786 / 718 / 106
Регистрация: 04.02.2011
Сообщений: 1,443
24.03.2011, 14:29
Много вопросов. Отвечу на последний:
ReDim не будет затирать ранее добавленные данные, если его применять с модификатором Preserve:
Visual Basic
1
ReDim Preserve a(1 to 10) As String
0
1 / 1 / 0
Регистрация: 17.11.2010
Сообщений: 40
25.03.2011, 17:38  [ТС]
ну вобщем вид автофильтра

Visual Basic
1
2
3
4
5
6
7
Dim ValueArr() As Variant
 
ValueArr = Array("Val1", "Val2", "Val3") 
Selection.AutoFilter
ActiveSheet.Range(AF_Range).AutoFilter _
    Field:=Me.ComboBox2.ListIndex, Criteria1:=ValueArr, _
    Operator:= xlFilterValues
будет радовать счастливых обладателей Office 2010... с остальными оно видимо не работает

Потому вопрос меняю. Про реализацию через автофильтр забудем. Можно ли передавать массив в sql-запрос (как переменную)?

Т.е. я создаю запрос через Microsoft Query. Снова включаю запись макроса, снова получаю макрос и снова вижу, что там явно указываются мои значения (те самые, которые я в предедущем варианте в массив запихал).

Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
Sub zapros()
'
' zapros
'
    Range("A1:A3").Select
    Range(Selection, ActiveCell.SpecialCells(xlLastCell)).Select
    ActiveWorkbook.Names.Add Name:="MyTabl", RefersToR1C1:="=СВОД!R1C1:R77C32" 
    Workbooks.Add
    Windows("СВОД.xls").Activate
    Windows("Книга1").Activate
    With ActiveSheet.ListObjects.Add(SourceType:=0, Source:= _
        "ODBC;DSN=Excel Files;DBQ=D:\MyPath\СВОД.xls;DefaultDir=D:\MyPath;DriverId=1046;MaxBufferSize=2048;PageTimeout=5;" _
        , Destination:=Range("$A$1")).QueryTable
        .CommandText = Array( _
        "SELECT MyTabl.`№п.п`, MyTabl.`Организация`, MyTabl.Сумма" & Chr(13) & "" & Chr(10) & "FROM `D:\MyPath\СВОД.xls`.MyTabl MyTabl" & Chr(13) & "" & Chr(10) & "WHERE (MyTabl.`Организация`='Орг 1') OR (MyTabl.`Организация`='Орг 1')" & Chr(13) & "" & Chr(10) & "ORDER BY MyTabl.`Организация`")
        .RowNumbers = False
        .FillAdjacentFormulas = False
        .PreserveFormatting = True
        .RefreshOnFileOpen = False
        .BackgroundQuery = True
        .RefreshStyle = xlInsertDeleteCells
        .SavePassword = False
        .SaveData = True
        .AdjustColumnWidth = True
        .RefreshPeriod = 0
        .PreserveColumnInfo = True
        .ListObject.DisplayName = "Query_запрос_из_Excel_Files"
        .Refresh BackgroundQuery:=False
    End With
End Sub
вот это мне надо повторить, но вместо явного указания полей и значений в SELECT'e использовать переменные и созданный ранее массив. Это реально сделать?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
25.03.2011, 17:38
Помогаю со студенческими работами здесь

Функциия excel в функции excel на vba
С помощью мастера записи матросов получил следующую функцию ActiveCell.FormulaR1C1 = &quot;=IFERROR...

фильтр Access VBA
есть 2 формы &quot;Поселить&quot; и &quot;Комнаты&quot;. надо чтобы кнопка &quot;Выбрать комнату&quot; выводила только те записи из формы &quot;Комнаты&quot;, у...

Фильтр Access VBA
При загрузке формы, стоит фильтр. В форме можно воспользоваться внутренним фильтром, но тогда фильтр при загрузке не действует. Как в...

Vba экспорт в excel по vba-фильтру
Работает VBA-фильтр, как сделать экспорт выбранных данных в Excel по средствам кнопки. Прошу о помощи

Фильтр по трём условиям на VBA
Доброго времени суток! Прошу помощи с БД. В форме formReqJob необходимо сделать фильтр по трем условиям. Код на VBA выдает непонятную мне...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
9
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Реализация движения на Box2D v3 - трение и коллизии с повёрнутыми стенами
8Observer8 20.02.2026
Содержание блога Box2D позволяет легко создать главного героя, который не проходит сквозь стены и перемещается с заданным трением о препятствия, которые можно располагать под углом, как верхнее. . .
Конвертировать закладки radiotray-ng в m3u-плейлист
damix 19.02.2026
Это можно сделать скриптом для PowerShell. Использование . \СonvertRadiotrayToM3U. ps1 <path_to_bookmarks. json> Рядом с файлом bookmarks. json появится файл bookmarks. m3u с результатом. # Check if. . .
Семь CDC на одном интерфейсе: 5 U[S]ARTов, 1 CAN и 1 SSI
Eddy_Em 18.02.2026
Постепенно допиливаю свою "многоинтерфейсную плату". Выглядит вот так: https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11617&stc=1&d=1771445347 Основана на STM32F303RBT6. На борту пять. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru