Макросы на выборку в excel

Макрос для выборки данных из листа по условию

ska

Дата: Четверг, 10.03.2016, 17:02 |
Сообщение № 1

Группа: Пользователи

Ранг: Новичок

Сообщений: 22


Репутация:

0

±

Замечаний:
20% ±


Excel 2010

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

Например, при вводе вручную на листе «Выборка» значения ячейки «IDДанные» требуется вставить в определенные ячейки столбца 5, столбца 6 и столбца 7 данные из определенных ячеек листа «Данные» и соответствующей строки.

К сообщению приложен файл:

8533266.xlsx
(13.8 Kb)

 

Ответить

китин

Дата: Четверг, 10.03.2016, 17:07 |
Сообщение № 2

Группа: Модераторы

Ранг: Экселист

Сообщений: 6973


Репутация:

1063

±

Замечаний:
0% ±


Excel 2007;2010;2016

Именно макрос нужен?Здесь вполне формулами решаемо. Только поконкретнее из каких столбцов данные забирать


Не судите очень строго:я пытаюсь научиться
ЯД 41001877306852

 

Ответить

ska

Дата: Четверг, 10.03.2016, 17:12 |
Сообщение № 3

Группа: Пользователи

Ранг: Новичок

Сообщений: 22


Репутация:

0

±

Замечаний:
20% ±


Excel 2010

Суть в том, что для некоторых случаев не будет данных в листе «Данные» и придется их вносить руками, формулы полетят.
Столбцы могут быть разными, это не важно, интересен сам пример макроса. Важно выбрать данные из определенных ячеек определенной строки листа «Данные» и вставить их в определенные ячейки той строки, куда руками ввели значение «IDДанные»

 

Ответить

ska

Дата: Четверг, 10.03.2016, 17:20 |
Сообщение № 4

Группа: Пользователи

Ранг: Новичок

Сообщений: 22


Репутация:

0

±

Замечаний:
20% ±


Excel 2010

Может аналогичный пример кто подскажет?

 

Ответить

Manyasha

Дата: Четверг, 10.03.2016, 18:32 |
Сообщение № 5

Группа: Модераторы

Ранг: Старожил

Сообщений: 2198


Репутация:

898

±

Замечаний:
0% ±


Excel 2010, 2016

ska, конкретно по Вашему примеру:
[vba]

Код

Private Sub Worksheet_Change(ByVal Target As Range)
    Dim idData As Range
    Set idData = Intersect(Target, Columns(«b:b»))
    If Not idData Is Nothing Then
        Set shData = Sheets(«Данные»)
        For Each cell In idData
            If cell <> «» Then
                With shData
                    r = .Columns(1).Find(cell, , xlValues, xlWhole).Row
                    c = .Rows(1).Find(«Столбец5», , xlValues, xlWhole).Column
                    Cells(cell.Row, «e»).Resize(, 3) = .Cells(r, c + 1).Resize(, 3).Value
                End With
            Else
                Cells(cell.Row, «e»).Resize(, 3).ClearContents ‘если не надо, убрать
            End If
        Next cell
    End If
End Sub

[/vba]


ЯД: 410013299366744 WM: R193491431804

 

Ответить

ska

Дата: Четверг, 10.03.2016, 18:44 |
Сообщение № 6

Группа: Пользователи

Ранг: Новичок

Сообщений: 22


Репутация:

0

±

Замечаний:
20% ±


Excel 2010

Manyasha, огромное СПАСИБО!!!

 

Ответить

ska

Дата: Четверг, 10.03.2016, 19:48 |
Сообщение № 7

Группа: Пользователи

Ранг: Новичок

Сообщений: 22


Репутация:

0

±

Замечаний:
20% ±


Excel 2010

Manyasha, а при таком алгоритме есть ограничения на тип данных / объем данных и прочие моменты?

 

Ответить

 

Natali

Пользователь

Сообщений: 26
Регистрация: 28.12.2012

Добрый день, нужен макрос для выборки данных и заполнению таблицы.    
Файл стаблицами и условиями прилагаю. Помогите с макросом.

 

По Вашему алгоритму:  
1. Ищем на исходной таблице значения с номером 76232 (строки с 29 по 58)  
2. Находим максимальное АБСОЛЮТНОЕ значение из колонки N в найденных строках (161,091) и соответствующие значения Му (-1,707) и Мz(-8,428)  
3. Суммируем значения =161,091+(-1,707)+(-8,428)=150,956  
4. Находим следующее максимальное абсолютное значение из колонки N в найденных строка (160,497), Му(-1,93), Mz(-8.437)  
5. Суммируем 160,497-1,93-8,437=150,13  
6. Сравниваем — наибольший результат дает 1 комбинация (150,956)  
7. Записываем в строку 3 таблицы на листе 1 значения -161,091  -1,707 -8,428  
Пока все правильно?  
«…дальше все тоже самое, но только по колонке Му» — не понял вообще. В туже строку таблицы результатов писать? Максимальное абсолютное значение складывать с N и Мz?  

  Как надо-то?  
Наверное, было бы лучше, если б Вы в примере хотя б 2 строчки заполнили в результирующей таблице руками с пояснениями — это так получилось, это сяк и т.д.  
Пока я не могу понять алгоритм заполнения.  

    ВАУ! 44288

 

Natali

Пользователь

Сообщений: 26
Регистрация: 28.12.2012

Заполнила результирующую таблицу, разным цветом выделила выбранные значения по N и My

 

Natali

Пользователь

Сообщений: 26
Регистрация: 28.12.2012

Уважаемые форумчане!  

  Помогите, очень надо решить данную задачку, а знаний в макрасах чуть-чуть….

 

Natali

Пользователь

Сообщений: 26
Регистрация: 28.12.2012

Макрос выборки данных по колонке N написала:  

  Public Sub Заполнить максзначение по N()  
   Const rowStart = 8  
   Const colID = 1  
   Const colN = 4    
   Const colMy = 6    
   Const colMz = 7      
   Const rowResStart = 3    
   Const colResID = 7      
   Const colResN = 2    
   Const colResMy = 3    
   Const colResMz = 4    
   Const shtSource = «1. Усилия и напряжения комбин»  
   Const shtResult = «Лист1»  

         Dim lngRow As Long  
   Dim lngInd As Long  
   Dim strRead As String  
   Dim strFind As String  
   Dim varN As Variant  
   Dim varMy As Variant  
   Dim varMz As Variant  
   Dim varNewN As Variant  
   Dim varNewMy As Variant  
   Dim varNewMz As Variant  

               lngInd = rowResStart  
   strRead = Trim$(ActiveWorkbook.Sheets(shtResult).Cells(lngInd, colResID).Value)  
   Do While strRead <> «»  

                 If IsNumeric(strRead) Then  
           varN = 0  
           varMy = 0  
           varMz = 0  
           lngRow = rowStart  
           strFind = Trim$(ActiveWorkbook.Sheets(shtSource).Cells(lngRow, colID).Value)  
           Do While strFind <> «»  

                                 If CLng(strFind) > CLng(strRead) Then Exit Do  

                                 If CLng(strFind) = CLng(strRead) Then  
                   varNewN = ActiveWorkbook.Sheets(shtSource).Cells(lngRow, colN).Value  
                   varNewMy = ActiveWorkbook.Sheets(shtSource).Cells(lngRow, colMy).Value  
                   varNewMz = ActiveWorkbook.Sheets(shtSource).Cells(lngRow, colMz).Value  

                                         If Abs(varNewN) >= Abs(varN) Then  
                       varN = varNewN  
                       varMy = varNewMy  
                       varMz = varNewMz  
                   End If  

                                     End If  

                                                   lngRow = lngRow + 1  
               strFind = Trim$(ActiveWorkbook.Sheets(shtSource).Cells(lngRow, colID).Value)  
           Loop  

                                       ActiveWorkbook.Sheets(shtResult).Cells(lngInd, colResN).Value = varN  
           ActiveWorkbook.Sheets(shtResult).Cells(lngInd, colResMy).Value = varMy  
           ActiveWorkbook.Sheets(shtResult).Cells(lngInd, colResMz).Value = varMz  

                 End If  

                 lngInd = lngInd + 1  
       strRead = Trim$(ActiveWorkbook.Sheets(shtResult).Cells(lngInd, colResID).Value)  
   Loop  

      End Sub  

      а как и что дальше незнаю……  
Помогите, пожлуйста!

 

Hugo

Пользователь

Сообщений: 23253
Регистрация: 22.12.2012

Честно говоря, не разобрался… слишком как-то сложно.  
Я пошёл другим путём, пока не дошёл, но заготовку могу показать, может сами доделаете быстрее.  
Нужные значения уже нашёл, осталось их скопировать в таблицу.  
Доделать аналогичный поиск по второму столбцу номеров (пока не думал, как и куда лучше вставить) и динамически определить диапазоны ( и нединамически переменные :))  

  Sub tt()  
   Dim a, b  
   a = [g3:g10] ‘ массив номеров
   b = Sheets(1).[a2:f178] ‘ массив значений
   For i = 1 To UBound(a) ‘цикл по номерам  
       If a(i, 1) > 0 Then ‘только значения объединённых ячеек  
       maxb = 0: maxb2 = 0: maxbind = 0: maxb2ind = 0 ‘обнуляем максимальные и номера нужных индексов значений массива  
           For ii = 1 To UBound(b) ‘цикл по значениям  
               If b(ii, 1) = a(i, 1) Then ‘если совпадает  
                   If Abs(b(ii, 4)) > maxb Then ‘если максимальное  
                       maxb2 = maxb: maxb2ind = maxbind ‘запоминаем предыдущее максимальное и его положение в массиве  
                       maxb = Abs(b(ii, 4)): maxbind = ii ‘запоминаем  максимальное и его положение в массиве  
                   End If  
               End If  
           Next  
           ‘сравниваем суммы  
           If Abs(b(maxbind, 4)) + Abs(b(maxbind, 5)) + Abs(b(maxbind, 6)) >= Abs(b(maxb2ind, 4)) + Abs(b(maxb2ind, 5)) + Abs(b(maxb2ind, 6)) Then  
           MsgBox maxbind ‘озвучиваем индекс нужного значения массива  
           Else  
           MsgBox maxb2ind  
           End If  
       End If  
   Next  
End Sub

 

Hugo

Пользователь

Сообщений: 23253
Регистрация: 22.12.2012

эээ, не по по второму столбцу номеров, а определение максимальных по My…

 

Hugo

Пользователь

Сообщений: 23253
Регистрация: 22.12.2012

стоп, ошибка в алгоритме определения немаксимального… после максимума меньшее не определяется.

 

Hugo

Пользователь

Сообщений: 23253
Регистрация: 22.12.2012

 

Hugo

Пользователь

Сообщений: 23253
Регистрация: 22.12.2012

Проверяйте.  
Не понял, что там справа внизу за маленькие таблицы (Выборка по максимальному N).  
Но и их сформировать не трудно.

 

Natali

Пользователь

Сообщений: 26
Регистрация: 28.12.2012

Большое спасибо! это почти то, что надо )  
вот если бы для позиции он делал бы проверку не по одному номеру(из колонки G) а по обоим номерам (G и H)  
и почему то когда я добавляю новые позиции (337, 338 итд) он отказыается считать дальше…  

  А в остальном все супер!

 

Hugo

Пользователь

Сообщений: 23253
Регистрация: 22.12.2012

{quote}{login=Natali}{date=08.10.2010 07:22}{thema=}{post}Большое спасибо! это почти то, что надо )  
вот если бы для позиции он делал бы проверку не по одному номеру(из колонки G) а по обоим номерам (G и H)  
и почему то когда я добавляю новые позиции (337, 338 итд) он отказыается считать дальше…  

  А в остальном все супер!{/post}{/quote}  

  Да, точно, забыл массив «c» сделать динамическим. Надо так изменить этот блок:  

     a = Range(«g3:g» & Range(«G» & Rows.Count).End(xlUp).Row)  ‘ массив номеров  
   b = Sheets(1).Range(«a2:f» & Sheets(1).Range(«F» & Rows.Count).End(xlUp).Row)    ‘ массив значений  
   ReDim c(1 To Range(«G» & Rows.Count).End(xlUp).Row, 1 To 3) ‘массив результатов  

  Но тут рассчитано, что в столбце G будут объединённые попарно ячейки — иначе может места для всех значений не хватить. А так берётся двойное количество объединённых -1  + 2(шапка) — как раз хватает с хвостиком :)  
А вот про «а по обоим номерам (G и H)» не понял — где номера из Н на первом листе, и куда писать полученные данные, если их получим?  
Но имхо это можно сделать вторым аналогичным кодом вторым заходом, если вставить в этот будет затруднительно — меняем в этом коде привязку к диапазонам и всё.

 

Natali

Пользователь

Сообщений: 26
Регистрация: 28.12.2012

УРРРАААА )))) работает!!!    
В том файле приведена только маленькая часть таблицы, в которую элементы из столбца H не попали…реальная таблица имеет порядка 20000 строк )    

  Мы уже получили необходимый нам результат — 6 значений! которые относятся к позиции из первого столбца. Но эта позиция состоит из нескольких элементов. (К примеру Поз. 333 из элементов 76232 и 81984). Тоесть нам надо сделать ту же самую выборку, только в более широком диапазоне

 

Hugo

Пользователь

Сообщений: 23253
Регистрация: 22.12.2012

Ну так если в моём коде разберётесь (я думаю можно разобраться) — его легко масштабировать и переделывать.  
А скорость на массивах позволяет и несколько разных копий кода в цепочку ставить — будет вместо 3-х секунд 6 работать…

 

Natali

Пользователь

Сообщений: 26
Регистрация: 28.12.2012

разберусь! огромное спасибо! )

 

Natali

Пользователь

Сообщений: 26
Регистрация: 28.12.2012

Hugo, уделите еще минуточку пожалуйста…  
Мне кажется, что решение второго максимума должно немного по другому выглядеть…  

  If Abs(b(ii, 4)) > maxb2 Then      
   If Abs(b(ii, 4)) > maxb Then  
       maxb2 = maxb: maxb2ind = maxbind      
       maxb = Abs(b(ii, 4)): maxbind = ii      
   Else                              
       maxb2 = Abs(b(ii, 4)): maxbind = ii        
   End If  
End If  

  Я правильно думаю?

 

Hugo

Пользователь

Сообщений: 23253
Регистрация: 22.12.2012

Да, что-то там у меня неправильно… хотя результат от Вашего кода на примере не отличается.  
Но проверка условия в Вашем коде  
If Abs(b(ii, 4)) > maxb Then  
у Вас лишняя, т.к. это проверено уже выше по коду и там уже присвоено  
maxb = Abs(b(ii, 4))  
т.е. Abs(b(ii, 4)) > maxb уже никогда не будет.  
А только Ваш код без моей первой проверки результат дат совсем другой.  
Я ведь тоже такую задачу раньше не решал — так что решаю эту головоломку на равне с Вами, тут уже не знания ВБА нужны, а чисто логика…  
Подумаю попозже, что-то пока не складывается.

 

Hugo

Пользователь

Сообщений: 23253
Регистрация: 22.12.2012

Вроде так правильно (на оба столбца, N и My), взгляните со стороны:  

                     If Abs(b(ii, 4)) > maxb Then    ‘если максимальное  
                       maxb2 = maxb: maxb2ind = maxbind    ‘запоминаем предыдущее максимальное и его положение в массиве  
                       maxb = Abs(b(ii, 4)): maxbind = ii    ‘запоминаем  максимальное и его положение в массиве  
                   End If  

                     If Abs(b(ii, 4)) <> maxb Then    ‘ отсекаем обработку первого максимального  
                       If Abs(b(ii, 4)) > maxb2 Then    ‘если второе максимальное  
                           maxb2 = Abs(b(ii, 4)): maxb2ind = ii    ‘запоминаем  максимальное и его положение в массиве  
                       End If  
                   End If  

                     If Abs(b(ii, 5)) > maxbmy Then    ‘если максимальное  
                       maxbmy2 = maxbmy: maxbmy2ind = maxbmyind    ‘запоминаем предыдущее максимальное и его положение в массиве  
                       maxbmy = Abs(b(ii, 5)): maxbmyind = ii    ‘запоминаем  максимальное и его положение в массиве  
                   End If  
                   If Abs(b(ii, 5)) <> maxbmy Then    ‘ отсекаем обработку первого максимального  
                       If Abs(b(ii, 5)) > maxbmy2 Then    ‘если второе максимальное  
                           maxbmy2 = Abs(b(ii, 5)): maxbmy2ind = ii    ‘запоминаем  максимальное и его положение в массиве  
                       End If  
                   End If

 

Natali

Пользователь

Сообщений: 26
Регистрация: 28.12.2012

Хм…мне кажется, что у нас одно и тоже написано, только мы по разному отсекаем maxb…а в моем коде просто ошибка была в 6ой строке:  
maxb2 = Abs(b(ii, 4)): maxbind = ii  
а должно быть:  
maxb2 = Abs(b(ii, 4)): maxb2ind = ii  
И тогда все получается…  

  Скажите еще пожалуйста, вот эта строка  
maxb2 = Abs(b(ii, 4)): maxb2ind = ii  
это тоже самое что две строки:  
maxb2 = Abs(b(ii, 4))  
maxb2ind = ii  
?  

  И еще вопросик…  
For ii = 1 To UBound(b)  
Здесь не должно быть случаем  
For ii = 1 To (UBound(b)-1)  
а то он мне иногда пишет subscript out of range или что-то такое… )

 

Hugo

Пользователь

Сообщений: 23253
Регистрация: 22.12.2012

Да, двоеточие объединяет строки, так бывает удобнее группировать связанные действия.  
По поводу For ii = 1 To UBound(b) — посмотрите в отлfдчике, какое значение в этот момент принимает ii. Я думаю, что ii не выходит за границы, а причина в другой переменной, может перепутано типа b(i,1) вместо b(ii,1).

 

Natali

Пользователь

Сообщений: 26
Регистрация: 28.12.2012

Hugo! Спасите! )))    
Итак, все у меня готово, все фенечки сделаны…  
но есть какой-то внутренний косяк, и я понять совершенно не могу, почему он возникает…  
Точнее я понимаю почему он возникает, но с чем это может быть связано — понять совершенно не могу ((    
С заполнением желтых строк — все отлично. А вот заполнение зеленых строк зависит от положения искомой строки в базе данных. Почему-то получается, если требуемая строка является первой в рассматриваемом массиве, то скрипт выдает мне какую то чушь:  
Скрипт предполагает запоминание трех максимальных значений, и потом выборку из них оптимального, а в результатом почему то является четвертый максимум… (    

  Что поделать не знаю! Может примерно подскажите в каком направлении копаться?  
<EM><STRONG>Файл удален</STRONG> — велик размер — [<STRONG>МОДЕРАТОРЫ</STRONG>]</EM>

 

Hugo

Пользователь

Сообщений: 23253
Регистрация: 22.12.2012

Файл взять успел.  
Кода много.  
Смотрю…

 

ситуация кажется немного прояснилась )  
Ошибка кроется где то на этапе «сравниваем суммы»…  

  Если убрать коэффициенты, из проверочных условий, то скрипт работает стабильно, независимо от положения строк…    
Но мне нужны эти коэффициенты.    
Суть как раз в том, что бы выбрать 3 максимальных значения из базы данных по одному условию, а затем по другим критериям из трёх максимальных выбрать искомое…

 

Hugo

Пользователь

Сообщений: 23253
Регистрация: 22.12.2012

В 174 строке правильно? :)  
Вот это  
               If (0.1 * Abs(b(maxbind, 4)) + Abs(b(maxbind, 5)) + Abs(b(maxbind, 6))) > (0.1 * Abs(b(maxbm3ind, 4)) + Abs(b(maxbm3ind, 5)) + Abs(b(maxbm3ind, 6))) Then  

  там не надо maxbmind?

 

Natali

Пользователь

Сообщений: 26
Регистрация: 28.12.2012

Жесть (((    
это было проверено на 20 раз…потрачен целый день… ((( чертова невнимательность!  

  Спасибо Вам огромное!

 

Hugo

Пользователь

Сообщений: 23253
Регистрация: 22.12.2012

Легко выявил в Notepad++ — там при клике на слове подсвечиваются все такие слова.  
Так легко увидеть сбой порядка переменных, если можно так сказать :)

 

Natali

Пользователь

Сообщений: 26
Регистрация: 28.12.2012

Век живи век учись! хороший прием )    
у меня правда возникало желание заменить все эти «maxbm3ind…maxm3ind» на что-то более читаемое типа «x3…y3», но лень пересилила…видимо зря )    

  Сижу оцениваю результат, с тем что было выбрано раньше «ручным» методом! После проверки 100 значений ни одного сбоя, зато отлавливаются неучтенные опасные сочетания. Я в восторге! )

 

Hugo

Пользователь

Сообщений: 23253
Регистрация: 22.12.2012

Красивый код получился, аккуратный такой :)  
А переменные мне и самому не нравятся, но так сначала начал — думал не о переменных, а об алгоритме, наспех буквы добавлял, чтоб отличались :)  
Так теперь заменой поменяйте.

 

Natali

Пользователь

Сообщений: 26
Регистрация: 28.12.2012

нет уж! )    
пускай остаётся! как «наследие автора», на память! )

 

Natali

Пользователь

Сообщений: 26
Регистрация: 28.12.2012

#30

17.10.2010 08:54:50

А можно ли как нибудь огразиновать выборку по диаграмме? )  
В каждом конкретном случае у меня есть область, имеющая 6 нижних значений и 6 верхних.    
Надо что бы полученные нами N, My, Mz он сверял со значениями диаграммы, и если они попадают в эту область, он записывал идентификатор диаграммы, если не удовлетворяется, переходил к следующей.  

   Это вообще возможно? ) Диаграммы хитрые, как их вообще описать математически не понимаю…

Прикрепленные файлы

  • post_164633.jpg (74.64 КБ)

Содержание

  • Выполнение выборки
    • Способ 1: применение расширенного автофильтра
    • Способ 2: применение формулы массива
    • Способ 3: выборка по нескольким условиям с помощью формулы
    • Способ 4: случайная выборка
  • Вопросы и ответы

Выборка в Microsoft Excel

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

Выполнение выборки

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

Способ 1: применение расширенного автофильтра

Наиболее простым способом произвести отбор является применение расширенного автофильтра. Рассмотрим, как это сделать на конкретном примере.

  1. Выделяем область на листе, среди данных которой нужно произвести выборку. Во вкладке «Главная» щелкаем по кнопке «Сортировка и фильтр». Она размещается в блоке настроек «Редактирование». В открывшемся после этого списка выполняем щелчок по кнопке «Фильтр».
    Включение фильтра в Microsoft Excel

    Есть возможность поступить и по-другому. Для этого после выделения области на листе перемещаемся во вкладку «Данные». Щелкаем по кнопке «Фильтр», которая размещена на ленте в группе «Сортировка и фильтр».

  2. Включение фильтра через вкладку Данные в Microsoft Excel

  3. После этого действия в шапке таблицы появляются пиктограммы для запуска фильтрования в виде перевернутых острием вниз небольших треугольников на правом краю ячеек. Кликаем по данному значку в заглавии того столбца, по которому желаем произвести выборку. В запустившемся меню переходим по пункту «Текстовые фильтры». Далее выбираем позицию «Настраиваемый фильтр…».
  4. Переход в настраиваемый фильтр в Microsoft Excel

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

    Давайте в качестве примера зададим условие так, чтобы отобрать только значения, по которым сумма выручки превышает 10000 рублей. Устанавливаем переключатель в позицию «Больше». В правое поле вписываем значение «10000». Чтобы произвести выполнение действия, щелкаем по кнопке «OK».

  6. Пользвательский фильтр в Microsoft Excel

  7. Как видим, после фильтрации остались только строчки, в которых сумма выручки превышает 10000 рублей.
  8. Результаты фильтрации в Microsoft Excel

  9. Но в этом же столбце мы можем добавить и второе условие. Для этого опять возвращаемся в окно пользовательской фильтрации. Как видим, в его нижней части есть ещё один переключатель условия и соответствующее ему поле для ввода. Давайте установим теперь верхнюю границу отбора в 15000 рублей. Для этого выставляем переключатель в позицию «Меньше», а в поле справа вписываем значение «15000».

    Кроме того, существует ещё переключатель условий. У него два положения «И» и «ИЛИ». По умолчанию он установлен в первом положении. Это означает, что в выборке останутся только строчки, которые удовлетворяют обоим ограничениям. Если он будет выставлен в положение «ИЛИ», то тогда останутся значения, которые подходят под любое из двух условий. В нашем случае нужно выставить переключатель в положение «И», то есть, оставить данную настройку по умолчанию. После того, как все значения введены, щелкаем по кнопке «OK».

  10. Установка верхней границы в пользовательском фильтре в Microsoft Excel

  11. Теперь в таблице остались только строчки, в которых сумма выручки не меньше 10000 рублей, но не превышает 15000 рублей.
  12. Результаты фильтрации по нижней и верхней границе в Microsoft Excel

  13. Аналогично можно настраивать фильтры и в других столбцах. При этом имеется возможность сохранять также фильтрацию и по предыдущим условиям, которые были заданы в колонках. Итак, посмотрим, как производится отбор с помощью фильтра для ячеек в формате даты. Кликаем по значку фильтрации в соответствующем столбце. Последовательно кликаем по пунктам списка «Фильтр по дате» и «Настраиваемый фильтр».
  14. Переход к фильтрации по дате в Microsoft Excel

  15. Снова запускается окно пользовательского автофильтра. Выполним отбор результатов в таблице с 4 по 6 мая 2016 года включительно. В переключателе выбора условий, как видим, ещё больше вариантов, чем для числового формата. Выбираем позицию «После или равно». В поле справа устанавливаем значение «04.05.2016». В нижнем блоке устанавливаем переключатель в позицию «До или равно». В правом поле вписываем значение «06.05.2016». Переключатель совместимости условий оставляем в положении по умолчанию – «И». Для того, чтобы применить фильтрацию в действии, жмем на кнопку «OK».
  16. Пользвательский фильтр для формата даты в Microsoft Excel

  17. Как видим, наш список ещё больше сократился. Теперь в нем оставлены только строчки, в которых сумма выручки варьируется от 10000 до 15000 рублей за период с 04.05 по 06.05.2016 включительно.
  18. Результаты фильтрации по сумме и дате в Microsoft Excel

  19. Мы можем сбросить фильтрацию в одном из столбцов. Сделаем это для значений выручки. Кликаем по значку автофильтра в соответствующем столбце. В выпадающем списке щелкаем по пункту «Удалить фильтр».
  20. Удаление фильтра с одного из столбцов в Microsoft Excel

    Lumpics.ru

  21. Как видим, после этих действий, выборка по сумме выручки будет отключена, а останется только отбор по датам (с 04.05.2016 по 06.05.2016).
  22. Ограничения только по дате в Microsoft Excel

  23. В данной таблице имеется ещё одна колонка – «Наименование». В ней содержатся данные в текстовом формате. Посмотрим, как сформировать выборку с помощью фильтрации по этим значениям.

    Кликаем по значку фильтра в наименовании столбца. Последовательно переходим по наименованиям списка «Текстовые фильтры» и «Настраиваемый фильтр…».

  24. Переход к текстовой фильтрации в Microsoft Excel

  25. Опять открывается окно пользовательского автофильтра. Давайте сделаем выборку по наименованиям «Картофель» и «Мясо». В первом блоке переключатель условий устанавливаем в позицию «Равно». В поле справа от него вписываем слово «Картофель». Переключатель нижнего блока так же ставим в позицию «Равно». В поле напротив него делаем запись – «Мясо». И вот далее мы выполняем то, чего ранее не делали: устанавливаем переключатель совместимости условий в позицию «ИЛИ». Теперь строчка, содержащая любое из указанных условий, будет выводиться на экран. Щелкаем по кнопке «OK».
  26. Пользвательский фильтр для формата текста в Microsoft Excel

  27. Как видим, в новой выборке существуют ограничения по дате (с 04.05.2016 по 06.05.2016) и по наименованию (картофель и мясо). По сумме выручки ограничений нет.
  28. Ограничения по дате и по наименованию в Microsoft Excel

  29. Полностью удалить фильтр можно теми же способами, которые использовались для его установки. Причем неважно, какой именно способ применялся. Для сброса фильтрации, находясь во вкладке «Данные» щелкаем по кнопке «Фильтр», которая размещена в группе «Сортировка и фильтр».
    Очистка фильтра в Microsoft Excel

    Второй вариант предполагает переход во вкладку «Главная». Там выполняем щелчок на ленте по кнопке «Сортировка и фильтр» в блоке «Редактирование». В активировавшемся списке нажимаем на кнопку «Фильтр».

Очистка фильтра во вкладке Главная в Microsoft Excel

При использовании любого из двух вышеуказанных методов фильтрация будет удалена, а результаты выборки – очищены. То есть, в таблице будет показан весь массив данных, которыми она располагает.

Фильтр сброшен в Microsoft Excel

Урок: Функция автофильтр в Excel

Способ 2: применение формулы массива

Сделать отбор можно также применив сложную формулу массива. В отличие от предыдущего варианта, данный метод предусматривает вывод результата в отдельную таблицу.

  1. На том же листе создаем пустую таблицу с такими же наименованиями столбцов в шапке, что и у исходника.
  2. Создание пустой таблицы в Microsoft Excel

  3. Выделяем все пустые ячейки первой колонки новой таблицы. Устанавливаем курсор в строку формул. Как раз сюда будет заноситься формула, производящая выборку по указанным критериям. Отберем строчки, сумма выручки в которых превышает 15000 рублей. В нашем конкретном примере, вводимая формула будет выглядеть следующим образом:

    =ИНДЕКС(A2:A29;НАИМЕНЬШИЙ(ЕСЛИ(15000<=C2:C29;СТРОКА(C2:C29);"");СТРОКА()-СТРОКА($C$1))-СТРОКА($C$1))

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

  4. Ввод формулы в Microsoft Excel

  5. Так как это формула массива, то для того, чтобы применить её в действии, нужно нажимать не кнопку Enter, а сочетание клавиш Ctrl+Shift+Enter. Делаем это.
  6. Формула массива введена в столбец наименований в Microsoft Excel

  7. Выделив второй столбец с датами и установив курсор в строку формул, вводим следующее выражение:

    =ИНДЕКС(B2:B29;НАИМЕНЬШИЙ(ЕСЛИ(15000<=C2:C29;СТРОКА(C2:C29);"");СТРОКА()-СТРОКА($C$1))-СТРОКА($C$1))

    Жмем сочетание клавиш Ctrl+Shift+Enter.

  8. Формула массива введена в столбец даты в Microsoft Excel

  9. Аналогичным образом в столбец с выручкой вписываем формулу следующего содержания:

    =ИНДЕКС(C2:C29;НАИМЕНЬШИЙ(ЕСЛИ(15000<=C2:C29;СТРОКА(C2:C29);"");СТРОКА()-СТРОКА($C$1))-СТРОКА($C$1))

    Опять набираем сочетание клавиш Ctrl+Shift+Enter.

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

  10. Формула массива введена в столбец выручки в Microsoft Excel

  11. Как видим, таблица заполнена данными, но внешний вид её не совсем привлекателен, к тому же, значения даты заполнены в ней некорректно. Нужно исправить эти недостатки. Некорректность даты связана с тем, что формат ячеек соответствующего столбца общий, а нам нужно установить формат даты. Выделяем весь столбец, включая ячейки с ошибками, и кликаем по выделению правой кнопкой мыши. В появившемся списке переходим по пункту «Формат ячейки…».
  12. Переход к форматировани ячеек в Microsoft Excel

  13. В открывшемся окне форматирования открываем вкладку «Число». В блоке «Числовые форматы» выделяем значение «Дата». В правой части окна можно выбрать желаемый тип отображения даты. После того, как настройки выставлены, жмем на кнопку «OK».
  14. Установка формата даты в Microsoft Excel

  15. Теперь дата отображается корректно. Но, как видим, вся нижняя часть таблицы заполнена ячейками, которые содержат ошибочное значение «#ЧИСЛО!». По сути, это те ячейки, данных из выборки для которых не хватило. Более привлекательно было бы, если бы они отображались вообще пустыми. Для этих целей воспользуемся условным форматированием. Выделяем все ячейки таблицы, кроме шапки. Находясь во вкладке «Главная» кликаем по кнопке «Условное форматирование», которая находится в блоке инструментов «Стили». В появившемся списке выбираем пункт «Создать правило…».
  16. Переход к созданию правила в Microsoft Excel

  17. В открывшемся окне выбираем тип правила «Форматировать только ячейки, которые содержат». В первом поле под надписью «Форматировать только ячейки, для которых выполняется следующее условие» выбираем позицию «Ошибки». Далее жмем по кнопке «Формат…».
  18. Переход к выбору формата в Microsoft Excel

  19. В запустившемся окне форматирования переходим во вкладку «Шрифт» и в соответствующем поле выбираем белый цвет. После этих действий щелкаем по кнопке «OK».
  20. Формат ячеек в Microsoft Excel

  21. На кнопку с точно таким же названием жмем после возвращения в окно создания условий.

Создание условия форматирования в Microsoft Excel

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

Выборка сделана в Microsoft Excel

Урок: Условное форматирование в Excel

Способ 3: выборка по нескольким условиям с помощью формулы

Так же, как и при использовании фильтра, с помощью формулы можно осуществлять выборку по нескольким условиям. Для примера возьмем всю ту же исходную таблицу, а также пустую таблицу, где будут выводиться результаты, с уже выполненным числовым и условным форматированием. Установим первым ограничением нижнюю границу отбора по выручке в 15000 рублей, а вторым условием верхнюю границу в 20000 рублей.

  1. Вписываем в отдельном столбце граничные условия для выборки.
  2. Условия в Microsoft Excel

  3. Как и в предыдущем способе, поочередно выделяем пустые столбцы новой таблицы и вписываем в них соответствующие три формулы. В первый столбец вносим следующее выражение:

    =ИНДЕКС(A2:A29;НАИМЕНЬШИЙ(ЕСЛИ(($D$2=C2:C29);СТРОКА(C2:C29);"");СТРОКА(C2:C29)-СТРОКА($C$1))-СТРОКА($C$1))

    В последующие колонки вписываем точно такие же формулы, только изменив координаты сразу после наименования оператора ИНДЕКС на соответствующие нужным нам столбцам, по аналогии с предыдущим способом.

    Каждый раз после ввода не забываем набирать сочетание клавиш Ctrl+Shift+Enter.

  4. Результат выборки по нескольким условиям в Microsoft Excel

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

Изменение результатов выборки в Microsoft Excel

Способ 4: случайная выборка

В Экселе с помощью специальной формулы СЛЧИС можно также применять случайный отбор. Его требуется производить в некоторых случаях при работе с большим объемом данных, когда нужно представить общую картину без комплексного анализа всех данных массива.

  1. Слева от таблицы пропускаем один столбец. В ячейке следующего столбца, которая находится напротив первой ячейки с данными таблицы, вписываем формулу:

    =СЛЧИС()

    Эта функция выводит на экран случайное число. Для того, чтобы её активировать, жмем на кнопку ENTER.

  2. Случайное число в Microsoft Excel

  3. Для того, чтобы сделать целый столбец случайных чисел, устанавливаем курсор в нижний правый угол ячейки, которая уже содержит формулу. Появляется маркер заполнения. Протягиваем его вниз с зажатой левой кнопкой мыши параллельно таблице с данными до её конца.
  4. Маркер заполнения в Microsoft Excel

  5. Теперь у нас имеется диапазон ячеек, заполненный случайными числами. Но, он содержит в себе формулу СЛЧИС. Нам же нужно работать с чистыми значениями. Для этого следует выполнить копирование в пустой столбец справа. Выделяем диапазон ячеек со случайными числами. Расположившись во вкладке «Главная», щелкаем по иконке «Копировать» на ленте.
  6. Копирование в Microsoft Excel

  7. Выделяем пустой столбец и кликаем правой кнопкой мыши, вызывая контекстное меню. В группе инструментов «Параметры вставки» выбираем пункт «Значения», изображенный в виде пиктограммы с цифрами.
  8. Вставка в Microsoft Excel

  9. После этого, находясь во вкладке «Главная», кликаем по уже знакомому нам значку «Сортировка и фильтр». В выпадающем списке останавливаем выбор на пункте «Настраиваемая сортировка».
  10. Переход к настраиваемой сортировке в Microsoft Excel

  11. Активируется окно настройки сортировки. Обязательно устанавливаем галочку напротив параметра «Мои данные содержат заголовки», если шапка имеется, а галочки нет. В поле «Сортировать по» указываем наименование того столбца, в котором содержатся скопированные значения случайных чисел. В поле «Сортировка» оставляем настройки по умолчанию. В поле «Порядок» можно выбрать параметр как «По возрастанию», так и «По убыванию». Для случайной выборки это значения не имеет. После того, как настройки произведены, жмем на кнопку «OK».
  12. Настройка сортировки в Microsoft Excel

  13. После этого все значения таблицы выстраиваются в порядке возрастания или убывания случайных чисел. Можно взять любое количество первых строчек из таблицы (5, 10, 12, 15 и т.п.) и их можно будет считать результатом случайной выборки.

Случайная выборка в Microsoft Excel

Урок: Сортировка и фильтрация данных в Excel

Как видим, выборку в таблице Excel можно произвести, как с помощью автофильтра, так и применив специальные формулы. В первом случае результат будет выводиться в исходную таблицу, а во втором – в отдельную область. Имеется возможность производить отбор, как по одному условию, так и по нескольким. Кроме того, можно осуществлять случайную выборку, использовав функцию СЛЧИС.

Еще статьи по данной теме:

Помогла ли Вам статья?

Отбор уникальных значений из списка в VBA Excel с помощью объекта Collection. Выгрузка уникальных элементов в ListBox и ячейки рабочего листа. Скачать файл с примером кода.

Отбор уникальных значений из списка

При написании макросов для работы с данными в VBA Excel иногда возникает необходимость отбора уникальных значений из списка с повторяющимися элементами. Для этого можно воспользоваться следующим кодом:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

Sub ОтборУникальных()

‘Объявляем переменные

‘myRange — диапазон ячеек, заполненный исходным списком элементов

‘myCell — отдельная ячейка диапазона

‘myCollection — коллекция

‘myElement — элемент коллекции (должен быть типа «Variant»)

Dim myRange As Range, myCell As Range, myCollection As New Collection, _

myElement As Variant, i As Long

‘присваиваем переменной myRange диапазон ячеек с исходным списком элементов

Set myRange = Range(«A1:A20»)

‘заполняем новую коллекцию уникальными элементами

On Error Resume Next

For Each myCell In myRange

myCollection.Add CStr(myCell.Value), CStr(myCell.Value)

Next myCell

On Error GoTo 0

На этом отбор уникальных значений завершен. Коллекция заполнена уникальными элементами.

Добавление уникальных элементов в ListBox

Теперь можно добавить уникальные значения в ListBox, если перед этим создать форму UserForm1 и на нее добавить элемент управления ListBox1:

For Each myElement In myCollection

UserForm1.ListBox1.AddItem myElement

Next myElement

ListBox заполнен уникальными значениями из коллекции. Другие способы заполнения ListBox и ComboBox смотрите здесь.

Запись уникальных значений на рабочий лист

А так можно добавить уникальные элементы в ячейки столбца «В» активного рабочего листа:

For Each myElement In myCollection

i = i + 1

Cells(i, 2) = myElement

Next myElement

При необходимости сортируем полученный список в столбце «В»:

Range(Cells(1, 2), Cells(i, 2)).Sort Key1:=Range(«B1»), Order1:=xlAscending, _

Header:=xlGuess, OrderCustom:=1, MatchCase:=False, Orientation:=xlTopToBottom

А также можно отобразить количество найденных уникальных элементов, если, конечно, на форму UserForm1 добавлен элемент управления Label1:

UserForm1.Label1.Caption = «Уникальных элементов: « & myCollection.Count

‘отображаем форму

UserForm1.Show

End Sub

Если вам необходимо в ListBox или ComboBox загрузить отсортированный список, его элементы можно добавить с листа Excel после сортировки, в данном примере из диапазона Range(Cells(1, 2), Cells(i, 2)).

Обратите внимание, что в представленном коде VBA Excel для отбора уникальных значений из списка, выгрузки их в ListBox и записи на рабочий лист идет сплошная нумерация от Sub ОтборУникальных() и до End Sub.

Для наглядного ознакомления с работой представленного кода вы можете скачать демонстрационный файл.


Смотрите, как удалить повторяющиеся значения из диапазона ячеек в VBA Excel с помощью метода Range.RemoveDuplicates и отобрать уникальные значения из списка с помощью объекта Dictionary.


0 / 0 / 1

Регистрация: 25.06.2013

Сообщений: 176

1

Excel

Написать макрос выборки данных из таблицы и сумма этих значений

04.09.2019, 09:43. Показов 4324. Ответов 9


Студворк — интернет-сервис помощи студентам

Всем привет.

Появилась необходимость с помощью макроса из данных в таблице сделать определённую выборку с подсчётом суммы.

Чтобы слишком долго не объяснять, я прикрепляю скриншот подобной таблицы.
Столбец слева — это то, что мы имеем на входе.
Столбец справа — то, что нужно получить после активации макроса.
Цвета сделаны лишь для наглядности и значения никакого не имеют.

На всякий случай прикрепляю табличный файл для экспериментов.

p.s. понимаю, что выглядит это не как просьба помочь, а скорее «сделайте за меня всё — от и до», и просто «спасибо» кому-то будет недостаточно, поэтому готов скинуть на пиво/чай/хлеб/воду/сигареты/мыло/нужное_подчеркнуть, не смотря на то, что потом мне это всё мне потом нужно будет переделать и адаптировать под свои нужды.

Миниатюры

Написать макрос выборки данных из таблицы и сумма этих значений
 



0



6875 / 2807 / 533

Регистрация: 19.10.2012

Сообщений: 8,562

04.09.2019, 11:00

2

Добрый день.
Сделать можно, и сам алгоритм простой:
1. цикл по данным, собираем в одном словаре коллекцию номеров строк каждой встреченной фамилии, пусть согласно примера этой фамилией будет первое слово.
в другом словаре можно сразу собирать сумму ИТОГО, а можно эту сумму подсчитать позже.
2. циклом по этим словарям формируем итоговые таблицы (игнорируя фамилию «Без»), что в принципе не сложно, но вот тут заказан самый гемор — вся эта мишура с объединениями/рамочками/отступами (ну ладно сумма внизу, это хоть функционально) уж не знаю за сколько я бы взялся эту муть наводить…



1



3827 / 2254 / 751

Регистрация: 02.11.2012

Сообщений: 5,930

04.09.2019, 11:01

3

а сводная не проще? или просто фильтр «содержит»?



1



0 / 0 / 1

Регистрация: 25.06.2013

Сообщений: 176

04.09.2019, 11:32

 [ТС]

4

Hugo121,
1. Да, ключевым словом для поиска должна быть фамилия (инициалы не важны).
2. Нужно не игнорировать «фамилию без», а брать все одинаковые фамилии (их можно заранее все прописать вручную).
мишура вообще не нужна, необязательны объединения, рамки, цвета отступы и выделения.

Vlad999, нет, сводная таблица или фильтр не проще.
Нужно, чтобы всё это автоматом (при нажатии на кнопку макроса) считалось и рядом выводились итоги.



0



6875 / 2807 / 533

Регистрация: 19.10.2012

Сообщений: 8,562

04.09.2019, 11:43

5

Если заранее известен список фамилий — тогда даже проще: сперва создаём словарь из этого списка, затем циклом по данным для каждой фамилии из словаря собираем коллекцию её строк.
Тогда никакие «Без» в результат не попадут.
Но нужно предусмотреть чтоб не попутать например «Петров» и «Петров — Водкин» если вдруг бубут такие случаи (юзеры вручную фамилии набирают?).
Код сейчас написать не могу — нет сейчас возможности.



1



0 / 0 / 1

Регистрация: 25.06.2013

Сообщений: 176

04.09.2019, 11:49

 [ТС]

6

Hugo121, список фамилий на самом деле это теги, которые меняться не будут никогда и в другом виде/месте использоваться не будут.



0



es geht mir gut

11264 / 4746 / 1183

Регистрация: 27.07.2011

Сообщений: 11,437

06.09.2019, 13:05

7

Рафик, попробуйте так



1



es geht mir gut

11264 / 4746 / 1183

Регистрация: 27.07.2011

Сообщений: 11,437

06.09.2019, 13:11

8

Файл



1



0 / 0 / 1

Регистрация: 25.06.2013

Сообщений: 176

08.09.2019, 07:50

 [ТС]

9

SoftIce, посмотрел ваш вариант.
Для данной таблицы отлично работает. А можно сделать так, чтобы не маской вида «* *.*.» искать значения, а конкретно заранее ввести слова – «*Иванов*«, «*Петров*» … ?



0



es geht mir gut

11264 / 4746 / 1183

Регистрация: 27.07.2011

Сообщений: 11,437

08.09.2019, 08:28

10

Лучший ответ Сообщение было отмечено Рафик как решение

Решение

Цитата
Сообщение от Рафик
Посмотреть сообщение

заранее ввести слова

excel_xls.xls



1



Хитрости »

1 Май 2011              532184 просмотров


Как получить список уникальных(не повторяющихся) значений?

Представим себе большой список различных наименований, ФИО, табельных номеров и т.п. А необходимо из этого списка оставить список все тех же наименований, но чтобы они не повторялись — т.е. удалить из этого списка все дублирующие записи. Как это иначе называют: создать список уникальных элементов, список неповторяющихся, без дубликатов. Для этого существует несколько способов: встроенными средствами Excel, встроенными формулами и, наконец, при помощи кода Visual Basic for Application(VBA) и сводных таблиц. В этой статье рассмотрим каждый из вариантов.

  • При помощи встроенных возможностей Excel 2007 и выше
  • При помощи Расширенного фильтра
  • При помощи формул
  • При помощи кодов Visual Basic for Application(VBA) — макросы, включая универсальный код выборки из произвольного диапазона
  • При помощи сводных таблиц

при помощи встроенных возможностей Excel 2007 и выше

В Excel 2007 и 2010 это сделать проще простого — есть специальная команда, которая так и называется — Удалить дубликаты (Remove Duplicates). Расположена она на вкладке Данные (Data) подраздел Работа с данными (Data tools)

Как использовать данную команду. Выделяете столбец(или несколько) с теми данными, в которых надо удалить дублирующие записи. Идете на вкладку Данные (Data)Удалить дубликаты (Remove Duplicates).

Если выделить один столбец, но рядом с ним будут еще столбцы с данными(или хотя бы один столбец), то Excel предложит выбрать: расширить диапазон выборки этим столбцом или оставить выделение как есть и удалить данные только в выделенном диапазоне. Важно помнить, что если не расширить диапазон, то данные будут изменены лишь в одном столбце, а данные в прилегающем столбце останутся без малейших изменений.

Появится окно с параметрами удаления дубликатов

Ставите галочки напротив тех столбцов, дубликаты в которых надо удалить и жмете Ок. Если в выделенном диапазоне так же расположены заголовки данных, то лучше поставить флаг Мои данные содержат заголовки, чтобы случайно не удалить данные в таблице(если они вдруг полностью совпадают со значением в заголовке).


Способ 1: Расширенный фильтр

В случае с Excel 2003 все посложнее. Там нет такого инструмента, как Удалить дубликаты. Но зато есть такой замечательный инструмент, как Расширенный фильтр. В 2003 этот инструмент можно найти в ДанныеФильтрРасширенный фильтр. Прелесть этого метода в том, с его помощью можно не портить исходные данные, а создать список в другом диапазоне.

В 2007-2010 Excel, он тоже есть, но немного запрятан. Расположен на вкладке Данные (Data), группа Сортировка и фильтр (Sort & Filter)Дополнительно (Advanced)

Как его использовать: запускаем указанный инструмент — появляется диалоговое окно:

  • Обработка: Выбираем Скопировать результат в другое место (Copy to another location).
  • Исходный диапазон (List range): Выбираем диапазон с данными(в нашем случае это А1:А51).
  • Диапазон критериев (Criteria range): в данном случае оставляем пустым.
  • Поместить результат в диапазон (Copy to): указываем первую ячейку для вывода данных — любую пустую(на картинке — E2).
  • Ставим галочку Только уникальные записи (Unique records only).
  • Жмем Ок.

Примечание: если вы хотите поместить результат на другой лист, то просто так указать другой лист не получится. Вы сможете указать ячейку на другом листе, но…Увы и ах…Excel выдаст сообщение, что не может скопировать данные на другие листы. Но и это можно обойти, причем довольно просто. Надо всего лишь запустить Расширенный фильтр с того листа, на который хотим поместить результат. А в качестве исходных данных выбираем данные с любого листа — это дозволено.

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

Для этого надо просто в пункте Обработка выбрать Фильтровать список на месте (Filter the list, in-place).


Способ 2: Формулы

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

А

(

А1:А51

, где

А1

— заголовок). Выводить список мы будем в столбец

С

, начиная с ячейки

С2

. Формула в

C2

будет следующая:

{=ИНДЕКС($A$2:$A$51;НАИМЕНЬШИЙ(ЕСЛИ(СЧЁТЕСЛИ($C$1:C1;$A$2:$A$51)=0;СТРОКА($A$1:$A$50));1))}
{=INDEX($A$2:$A$51;SMALL(IF(COUNTIF($C$1:C1;$A$2:$A$51)=0;ROW($A$1:$A$50));1))}
Детальный разбор работы данной формулы приведен в статье: Как просмотреть этапы вычисления формул

Надо отметить, что эта формула является формулой массива. Об этом могут сказать фигурные скобки, в которые заключена данная формула. А вводится такая формула в ячейку сочетанием клавиш —

Ctrl

+

Shift

+

Enter

(при этом сами скобки вводить не надо — они появятся сами после ввода формулы тремя клавишами

Ctrl

+

Shift

+

Enter

). После того, как мы ввели эту формулу в

C2

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

#ЧИСЛО!(#NUM!)

— это значит все элементы отображены и ниже протягивать формулу нет смысла. Чтобы ошибку избежать и сделать формулу более универсальной(не протягивая каждый раз до появления ошибки) можно использовать нехитрую проверку:

для Excel 2007 и выше:
{=ЕСЛИОШИБКА(ИНДЕКС($A$2:$A$51;НАИМЕНЬШИЙ(ЕСЛИ(СЧЁТЕСЛИ($C$1:C1;$A$2:$A$51)=0;СТРОКА($A$1:$A$50));1));»»)}
{=IFERROR(INDEX($A$2:$A$51;SMALL(IF(COUNTIF($C$1:C1;$A$2:$A$51)=0;ROW($A$1:$A$50));1));»»)}
для Excel 2003:
{=ЕСЛИ(ЕОШ(НАИМЕНЬШИЙ(ЕСЛИ(СЧЁТЕСЛИ($C$1:C1;$A$2:$A$51)=0;СТРОКА($A$1:$A$50));1));»»;ИНДЕКС($A$2:$A$51;НАИМЕНЬШИЙ(ЕСЛИ(СЧЁТЕСЛИ($C$1:C1;$A$2:$A$51)=0;СТРОКА($A$1:$A$50));1)))}
{=IF(ISERR(SMALL(IF(COUNTIF($C$1:C1;$A$2:$A$51)=0;ROW($A$1:$A$50));1));»»;INDEX($A$2:$A$51;SMALL(IF(COUNTIF($C$1:C1;$A$2:$A$51)=0;ROW($A$1:$A$50));1)))}

Тогда вместо ошибки 

#ЧИСЛО!(#NUM!)

у вас будут пустые ячейки(не совсем пустые, конечно — с формулами :-)).
Чуть подробнее про отличия и нюансы формул ЕСЛИОШИБКА и ЕСЛИ(ЕОШ можно прочесть в этой статье: Как в ячейке с формулой вместо ошибки показать 0


Для пользователей Excel 2021 выше, а так же пользователей Excel 365(с активной подпиской) — использовать формулы для извлечения уникальных элементов проще простого. В этих версиях появилась функция

УНИК(UNIQUE)

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

=УНИК($A$2:$A$51)
=UNIQUE($A$2:$A$51)

Что самое важное в данном случае — это функция динамического массива и вводить её надо только в одну ячейку C2, а результат она поместит сама в нужное количество ячеек.


Способ 3: код VBA

Данный подход потребует разрешения макросов и базовых знаний о работе с ними. Если не уверены в своих знаниях для начала рекомендую прочитать эти статьи:

  • Что такое макрос и где его искать? к статье приложен видеоурок
  • Что такое модуль? Какие бывают модули? потребуется, чтобы понять куда вставлять приведенные ниже коды

Оба приведенных ниже кода следует помещать в стандартный модуль. Макросы должны быть разрешены.

Исходные данные оставим в том же порядке — список с данными расположен в столбце «А«(А1:А51, где А1 — заголовок). Только выводить список мы будем не в столбец С, а в столбец Е, начиная с ячейки Е2:

Sub Extract_Unique()
    Dim vItem, avArr, li As Long
    ReDim avArr(1 To Rows.Count, 1 To 1)
    With New Collection
        On Error Resume Next
        For Each vItem In Range("A2", Cells(Rows.Count, 1).End(xlUp)).Value
            'Cells(Rows.Count, 1).End(xlUp) – определяет последнюю заполненную ячейку в столбце А
            .Add vItem, CStr(vItem)
            If Err = 0 Then
                li = li + 1: avArr(li, 1) = vItem
            Else: Err.Clear
            End If
        Next
    End With
    If li Then [E2].Resize(li).Value = avArr
End Sub

С помощью данного кода можно извлечь уникальные не только из одного столбца, но и из любого диапазона столбцов и строк. Если вместо строки
Range(«A2», Cells(Rows.Count, 1).End(xlUp)).Value
указать Selection.Value, то результатом работы кода будет список уникальных элементов из выделенного на активном листе диапазона. Только тогда неплохо бы и ячейку вывода значений изменить — вместо [E2] поставить ту, в которой данных нет.
Так же можно указать конкретный диапазон:

Или другой столбец:

Range("C2", Cells(Rows.Count, 3).End(xlUp)).Value

здесь отдельно стоит обратить внимание то, что в данном случае помимо изменения А2 на С2 изменилась и цифра 1 на 3. Это указание на номер столбца, в котором необходимо определить последнюю заполненную ячейку, чтобы код не просматривал лишние ячейки. Подробнее про это можно прочитать в статье: Как определить последнюю ячейку на листе через VBA?

Универсальный код выбора уникальных значений
Код ниже можно применять для любых диапазонов. Достаточно запустить его, указать диапазон со значениями для отбора только неповторяющихся(допускается выделение более одного столбца) и ячейку для вывода результата. Указанные ячейки будут просмотрены, из них будут отобраны только уникальные значения(пустые ячейки при этом пропускаются) и результирующий список будет записан, начиная с указанной ячейки.

Sub Extract_Unique()
    Dim x, avArr, li As Long
    Dim avVals
    Dim rVals As Range, rResultCell As Range
 
    On Error Resume Next
    'запрашиваем адрес ячеек для выбора уникальных значений
    Set rVals = Application.InputBox("Укажите диапазон ячеек для выборки уникальных значений", "Запрос данных", "A2:A51", Type:=8)
    If rVals Is Nothing Then 'если нажата кнопка Отмена
        Exit Sub
    End If
    'если указана только одна ячейка - нет смысла выбирать
    If rVals.Count = 1 Then
        MsgBox "Для отбора уникальных значений требуется указать более одной ячейки", vbInformation, "www.excel-vba.ru"
        Exit Sub
    End If
    'отсекаем пустые строки и столбцы вне рабочего диапазона
    Set rVals = Intersect(rVals, rVals.Parent.UsedRange)
    'если указаны только пустые ячейки вне рабочего диапазона
    If rVals Is Nothing Then
        MsgBox "Недостаточно данных для выбора значений", vbInformation, "www.excel-vba.ru"
        Exit Sub
    End If
    avVals = rVals.Value
    'запрашиваем ячейку для вывода результата
    Set rResultCell = Application.InputBox("Укажите ячейку для вставки отобранных уникальных значений", "Запрос данных", "E2", Type:=8)
    If rResultCell Is Nothing Then 'если нажата кнопка Отмена
        Exit Sub
    End If
    'определяем максимально возможную размерность массива для результата
    ReDim avArr(1 To Rows.Count, 1 To 1)
    'при помощи объекта Коллекции(Collection)
    'отбираем только уникальные записи,
    'т.к. Коллекции не могут содержать повторяющиеся значения
    With New Collection
        On Error Resume Next
        For Each x In avVals
            If Len(CStr(x)) Then 'пропускаем пустые ячейки
                .Add x, CStr(x) 'если добавляемый элемент уже есть в Коллекции - возникнет ошибка
                'если же ошибки нет - такое значение еще не внесено,
                'добавляем в результирующий массив
                If Err = 0 Then
                    li = li + 1
                    avArr(li, 1) = x
                Else
                    'обязательно очищаем объект Ошибки
                    Err.Clear
                End If
            End If
        Next
    End With
    'записываем результат на лист, начиная с указанной ячейки
    If li Then rResultCell.Cells(1, 1).Resize(li).Value = avArr
End Sub

Способ 4: Сводные таблицы

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

  • Выделяем один или несколько столбцов в таблице, переходим на вкладку Вставка(Insert) -группа Таблица(Table)Сводная таблица(PivotTable)
  • В диалоговом окне Создание сводной таблицы(Create PivotTable) проверяем правильность выделения диапазона данных (или установить новый источник данных)
  • указываем место размещения Сводной таблицы:
    • На новый лист (New Worksheet)
    • На существующий лист (Existing Worksheet)
  • подтверждаем создание нажатием кнопки OK

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

  • выделил диапазон A1:B51 на листе Извлечение по критерию
  • вызвал меню вставки сводной таблицы: вкладка Вставка(Insert) -группа Таблица(Table)Сводная таблица(PivotTable)
    выбрал вставить на новый лист(New Worksheet)
  • назвал этот лист Уникальные сводной таблицей
  • поле Данные поместил в область строк
  • поле ФИО в область фильтра. Почему? Чтобы удобно было выбирать одно или несколько ФИО и в сводной отображался бы список уникальных месяцев только для выбранных фамилий
    Отбор уникальных сводной таблицей

В чем неудобство работы со сводными в данном случае: при изменении в исходных данных сводную таблицу придется обновлять вручную: Выделить любую ячейку сводной таблицы -Правая кнопка мыши —Обновить(Refresh) или вкладка Данные(Data)Обновить все(Refresh all)Обновить(Refresh). А если исходные данные пополняются динамически и того хуже — надо будет заново указывать диапазон исходных данных. И еще один минус — данные внутри сводной таблицы нельзя менять. Поэтому если с полученным списком необходимо будет работать в дальнейшем, то после создания нужного списка при помощи сводной его надо скопировать и вставить на нужный лист.

Чтобы лучше понимать все действия и научиться обращаться со сводными таблицами настоятельно рекомендую ознакомиться со статьей Общие сведения о сводных таблицах — к ней приложен видеоурок, в котором я наглядно демонстрирую простоту и удобство работы с основными возможностями сводных таблиц.


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

Скачать пример:

  Tips_All_ExtractUnique.xls (108,0 KiB, 18 432 скачиваний)

Также см.:
Работа с дубликатами
Как подсчитать количество повторений
Общие сведения о сводных таблицах


Статья помогла? Поделись ссылкой с друзьями!

  Плейлист   Видеоуроки


Поиск по меткам



Access
apple watch
Multex
Power Query и Power BI
VBA управление кодами
Бесплатные надстройки
Дата и время
Записки
ИП
Надстройки
Печать
Политика Конфиденциальности
Почта
Программы
Работа с приложениями
Разработка приложений
Росстат
Тренинги и вебинары
Финансовые
Форматирование
Функции Excel
акции MulTEx
ссылки
статистика

Выделяем все пустые ячейки первой колонки новой таблицы. Устанавливаем курсор в строку формул. Как раз сюда будет заноситься формула, производящая выборку по указанным критериям. Отберем строчки, сумма выручки в которых превышает 15000 рублей. В нашем конкретном примере, вводимая формула будет выглядеть следующим образом:

=ИНДЕКС(A2:A29;НАИМЕНЬШИЙ(ЕСЛИ(15000
Если приходиться работать с большими таблицами определенно найдете в них дублирующийся суммы разбросаны вдоль целого столбца. В тоже время у вас может возникнуть необходимость выбрать данные из таблицы с первым наименьшим числовым значением, которое имеет свои дубликаты. Нужна автоматическая выборка данных по условию. В Excel для этой цели можно успешно использовать формулу в массиве.

Чтобы определить соответствующие значение первому наименьшему числу нужна выборка из таблицы по условию. Допустим мы хотим узнать первый самый дешевый товар на рынке из данного прайса:

Автоматическую выборку реализует нам формула, которая будет обладать следующей структурой:

=ИНДЕКС(диапазон_данных_для_выборки;МИН(ЕСЛИ(диапазон=МИН(диапазон);СТРОКА(диапазон)-СТРОКА(заголовок_столбца);””)))

В месте «диапазон_данных_для_выборки» следует указать область значений A6:A18 для выборки из таблицы (например, текстовых), из которых функция ИНДЕКС выберет одно результирующие значение. Аргумент «диапазон» означает область ячеек с числовыми значениями, из которых следует выбрать первое наименьшее число. В аргументе «заголовок_столбца» для второй функции СТРОКА, следует указать ссылку на ячейку с заголовком столбца, который содержит диапазон числовых значений.

Естественно эту формулу следует выполнять в массиве. Поэтому для подтверждения ее ввода следует нажимать не просто клавишу Enter, а целую комбинацию клавиш CTRL+SHIFT+Enter. Если все сделано правильно в строке формул появятся фигурные скобки.

Обратите внимание ниже на рисунок, где в ячейку B3 была введена данная формула в массиве:

Выборка соответственного значения с первым наименьшим числом:

С такой формулой нам удалось выбрать минимальное значение относительно чисел. Далее разберем принцип действия формулы и пошагово проанализируем весь порядок всех вычислений.

Как работает выборка по условию

Ключевую роль здесь играет функция ИНДЕКС. Ее номинальное задание – это выбирать из исходной таблицы (указывается в первом аргументе – A6:A18) значения соответственные определенным числам. ИНДЕКС работает с учетом критериев определённых во втором (номер строки внутри таблицы) и третьем (номер столбца в таблице) аргументах. Так как наша исходная таблица A6:A18 имеет только 1 столбец, то третий аргумент в функции ИНДЕКС мы не указываем.

Чтобы вычислить номер строки таблицы напротив наименьшего числа в смежном диапазоне B6:B18 и использовать его в качестве значения для второго аргумента, применяется несколько вычислительных функций.

Функция ЕСЛИ позволяет выбрать значение из списка по условию. В ее первом аргументе указано где проверяется каждая ячейка в диапазоне B6:B18 на наличие наименьшего числового значения: ЕСЛИB6:B18=МИНB6:B18. Таким способом в памяти программы создается массив из логических значений ИСТИНА и ЛОЖЬ. В нашем случаи 3 элемента массива будут содержат значение ИСТИНА, так как минимальное значение 8 содержит еще 2 дубликата в столбце B6:B18.

Следующий шаг – это определение в каких именно строках диапазона находится каждое минимальное значение. Это нам необходимо по причине определения именно первого наименьшего значения. Реализовывается данная задача с помощью функции СТРОКА, она заполняет элементы массива в памяти программы номерами строк листа. Но сначала от всех этих номеров вычитается номер на против первой строки таблицы – B5, то есть число 5. Это делается потому, что функция ИНДЕКС работает с номерами внутри таблицы, а не с номерами рабочего листа Excel. В тоже время функция СТРОКА умеет возвращать только номера строк листа. Чтобы не получилось смещение необходимо сопоставить порядок номеров строк листа и таблицы с помощи вычитанием разницы. Например, если таблица находится на 5-ой строке листа значит каждая строка таблицы будет на 5 меньше чем соответственная строка листа.

После того как будут отобраны все минимальные значения и сопоставлены все номера строк таблицы функция МИН выберет наименьший номер строки. Эта же строка будет содержать первое наименьшее число, которое встречается в столбце B6:B18. На основании этого номера строки функции ИНДЕКС выберет соответствующее значение из таблицы A6:A18. В итоге формула возвращает это значение в ячейку B3 в качестве результата вычисления.

Как выбрать значение с наибольшим числом в Excel

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

Если необходимо изменить условия формулы так, чтобы можно было в Excel выбрать первое максимальное, но меньше чем 70:

Как в Excel выбрать первое минимальное значение кроме нуля:

Как легко заметить, эти формулы отличаются между собой только функциями МИН и МАКС и их аргументами.

Скачать пример выборки из таблицы в Excel.

Теперь Вас ни что не ограничивает. Один раз разобравшись с принципами действия формул в массиве Вы сможете легко модифицировать их под множество условий и быстро решать много вычислительных задач.

Если Вы работаете с большой таблицей и вам необходимо выполнить поиск уникальных значений в Excel, соответствующие определенному запросу, то нужно использовать фильтр. Но иногда нам нужно выделить все строки, которые содержат определенные значения по отношению к другим строкам. В этом случаи следует использовать условное форматирование, которое ссылается на значения ячеек с запросом. Чтобы получить максимально эффективный результат, будем использовать выпадающий список, в качестве запроса. Это очень удобно если нужно часто менять однотипные запросы для экспонирования разных строк таблицы. Ниже детально рассмотрим: как сделать выборку повторяющихся ячеек из выпадающего списка.

Выбор уникальных и повторяющихся значений в Excel

Для примера возьмем историю взаиморасчетов с контрагентами, как показано на рисунке:

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

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

  1. Выделите первый столбец таблицы A1:A19.
  2. Выберите инструмент: «ДАННЫЕ»-«Сортировка и фильтр»-«Дополнительно».
  3. В появившемся окне «Расширенный фильтр» включите «скопировать результат в другое место», а в поле «Поместить результат в диапазон:» укажите $F$1.
  4. Отметьте галочкой пункт «Только уникальные записи» и нажмите ОК.

В результате мы получили список данных с уникальными значениями (фамилии без повторений).

Теперь нам необходимо немного модифицировать нашу исходную таблицу. Выделите первые 2 строки и выберите инструмент: «ГЛАВНАЯ»-«Ячейки»-«Вставить» или нажмите комбинацию горячих клавиш CTRL+SHIFT+=.

У нас добавилось 2 пустые строки. Теперь в ячейку A1 введите значение «Клиент:».

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

Перед тем как выбрать уникальные значения из списка сделайте следующее:

  1. Перейдите в ячейку B1 и выберите инструмент «ДАННЫЕ»-«Работа с данными»-«Проверка данных».
  2. На вкладке «Параметры» в разделе «Условие проверки» из выпадающего списка «Тип данных:» выберите значение «Список».
  3. В поле ввода «Источник:» введите =$F$4:$F$8 и нажмите ОК.

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

Примечание. Если данные для выпадающего списка находятся на другом листе, то лучше для такого диапазона присвоить имя и указать его в поле «Источник:». В данном случае это не обязательно, так как у нас все данные находятся на одном рабочем листе.

Выборка ячеек из таблицы по условию в Excel:

  1. Выделите табличную часть исходной таблицы взаиморасчетов A4:D21 и выберите инструмент: «ГЛАВНАЯ»-«Стили»-«Условное форматирование»-«Создать правило»-«Использовать формулу для определения форматируемых ячеек».
  2. Чтобы выбрать уникальные значения из столбца, в поле ввода введите формулу: =$A4=$B$1 и нажмите на кнопку «Формат», чтобы выделить одинаковые ячейки цветом. Например, зеленым. И нажмите ОК на всех открытых окнах.

Готово!

Как работает выборка уникальных значений Excel? При выборе любого значения (фамилии) из выпадающего списка B1, в таблице подсвечиваются цветом все строки, которые содержат это значение (фамилию). Чтобы в этом убедится в выпадающем списке B1 выберите другую фамилию. После чего автоматически будут выделены цветом уже другие строки. Такую таблицу теперь легко читать и анализировать.

Скачать пример выборки из списка с условным форматированием.

Принцип действия автоматической подсветки строк по критерию запроса очень прост. Каждое значение в столбце A сравнивается со значением в ячейке B1. Это позволяет найти уникальные значения в таблице Excel. Если данные совпадают, тогда формула возвращает значение ИСТИНА и для целой строки автоматически присваивается новый формат. Чтобы формат присваивался для целой строки, а не только ячейке в столбце A, мы используем смешанную ссылку в формуле =$A4.

Первый способ: Применение расширенного автофильтра На листе Excel необходимо выделить область, среди данных, которых и нужно осуществить выборку. Во вкладке «Главная» нажимаете «Сортировка и фильтр» (находится в блоке настроек «Редактирование»). Далее нажимаете на фильтр.

Можно сделать иначе, после выделения области переходите во вкладку «Данные» и нажимаете на «Фильтр», размещенной в группе «Сортировка и фильтр».

Когда эти действия выполнены, в шапке таблицы должны появиться пиктограммы для запуска фильтрования. Они будут отображены острием вниз небольшими треугольниками в правом крае ячеек. Нажимаете на этот значок в начале того столбца, по которому и собираетесь сделать выборку. Запуститься меню, в нем переходите в «Текстовые фильтры» и выбираете «Настраиваемый фильтр…».

Теперь должно активироваться окно пользовательской фильтрации. В нем задаете ограничение, по которому и будет осуществляться отбор. Можно выбрать одно из пяти предложенных видов условий: равно, не равно, больше, больше или равно, меньше.

После фильтрации остаются только те строчки, в которых сумма выручки превышает значение 10000 (как пример).

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

В таблице останутся только те строки, в которых сумма выручки не меньше 10000, но и не больше 15000.

В других столбцах выборка настраивается по аналогии. В нужном столбце нажимаете по значку фильтрации, а дальше последовательно кликаете по пунктам списка «Фильтр по дате» и «Настраиваемый фильтр».

Должно запуститься окно пользовательского автофильтра. Выполните, к примеру, отбор результатов в таблице с 4 по 6 мая 2016 года включительно. Нажимаете «После или равно», а в поле справа выставляете значение «04.05.2016». В нижнем блоке переключатель ставите в позицию «До или равно», а в правом поле вносите «06.05.2016». Переключатель совместимости условий оставляете в положении по умолчанию, то есть «И». Для применения фильтрации кликаете на ОК.

Список теперь должен сократиться еще больше, потому что останутся только строки, в которых сумма выручки варьируется от 10000 до 15000 и это за период с 04.05 по 06.05.2016 включительно.

В одном из столбцов при желании можно сбросить фильтрацию. К примеру, можно сделать это для значений выручки. Нажимаете на значок автофильтра в соответствующем столбце. Выбираете «Удалить фильтр».

Выборка по сумме выручки отключится и останется только отбор по датам (с 04.05.2016 по 06.05.2016).

В таблице есть и еще одна колонка под названием «Наименование». В ней расположенные данные в текстовом формате. По этим значениям тоже можно сформировать выборку. В наименовании столбца нажмите на значок фильтра. Переходите на «Текстовые фильтры», а затем «Настраиваемый фильтр…».

Снова откроется окно пользовательского фильтра, в котором можно сделать выборку, к примеру, по наименованиям «Мясо» и «Картофель». В первом блоке нужно установить переключатель в позиции «Равно» а в поле справа от него внести «Картофель». Переключатель нижнего блока поставить в позицию «Равно», а в поле напротив – «Мясо». Теперь следует установить переключатель совместимости условий в позиции «ИЛИ». Нажимаете ОК.

В новой выборке выставлены ограничения по дате (с 04.05.2016 по 06.05.2016) и по наименованию (Мясо и Картофель). Ограничений нет только по сумме выручки.

Можно фильтр удалить полностью и делается это теми же способами, которые применялись для его выставления. Для того чтобы сбросить фильтрацию во вкладке «Данные» нажмите на «Фильтр» в группе «Сортировка и фильтр».

Во втором варианте можно перейти во вкладку «Главная» и нажать там на «Сортировка и фильтр» в «Редактирование». Далее кликаете на «Фильтр».

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

Второй способ: Применение формулы массиваНа том же листе Excel создаете пустую таблицу с теми же наименованиями столбцов в шапке, которые имеются у исходника.

Все пустые ячейки необходимо выделить в первой колонке новой таблицы. В строку формул устанавливаете курсор, чтобы занести формулу — =ИНДЕКС(A2:A29;НАИМЕНЬШИЙ(ЕСЛИ(15000

Для применения формулы нужно нажать на клавиши Ctrl+Shift+Enter.

Выделяете второй столбец с датами и ставите курсор в строку формул, чтобы занести — =ИНДЕКС(B2:B29;НАИМЕНЬШИЙ(ЕСЛИ(15000

Таким же способ в столбец с выручкой вносите такую формулу — =ИНДЕКС(C2:C29;НАИМЕНЬШИЙ(ЕСЛИ(15000

Чтобы далее привести таблицу в презентабельный вид, нужно выделить весь столбец, в том числе и ячейки с ошибками, а далее нажимаете правой кнопкой мыши и выбираете «Формат ячейки…».

Откроется окно форматирования, в котором нужно выбрать вкладку «Число». В «Числовые форматы» выбираете «Дата». В правой части окна при желании можно выбрать тип отображаемой даты, а когда все настройки будут внесены, то кликнуть на ОК.

Теперь все будет красиво, и дата отобразится корректно. Если в ячейках отображается значение «#ЧИСЛО!», то нужно применить условное форматирование. Все ячейки таблицы следует выделить (кроме шапки) и, находясь во вкладке «Главная» нажать на «Условное форматирование» (в блоке инструментов «Стили»). Появится список, в котором следует выбрать «Создать правило…».

Выбираете правила «Форматировать только ячейки, которые содержат», а в первом поле, находящемся под строкой «Форматировать только ячейки, для которых выполняется следующее условие» выбрать «Ошибки» и нажать «Формат…».

Запустится окно форматирования, в котором переходите на «Шрифт» и выбираете белый цвет. Кликаете на ОК.

Далее нажимаете на кнопку с точно таким же названием после того как вернулись в окно создания условий.

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

Третий способ: Выборка по нескольким условиям с помощью формулыВ отдельном столбце следует внести граничные условия для выборки.

По очереди выделяете пустые столбцы новой таблицы, чтобы внести в них необходимые три формулы. В первый столбец вносите — =ИНДЕКС(A2:A29;НАИМЕНЬШИЙ(ЕСЛИ(($D$2=C2:C29);СТРОКА(C2:C29);»»);СТРОКА(C2:C29)-СТРОКА($C$1))-СТРОКА($C$1)). Далее в колонки вбиваете такие же формулы, только изменяете координаты после наименования оператора ИНДЕКС на те, которые нужны и соответствуют определенным столбцам. Все по аналогии с предыдущим способом. Каждый раз после того как делаете ввод, не забывайте нажимать сочетание клавиш Ctrl+Shift+Enter.

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

Четвертый способ: Случайная выборкаС левой стороны от таблицы нужно пропустить один столбец, а в ячейке следующего внести формулу — =СЛЧИС(), чтобы вывести на экран случайное число. Для ее активации нажимаете ENTER.

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

Диапазон ячеек будет содержать в себе формулу СЛЧИС, но работать с чистыми значениями не нужно. Копируете в пустой столбец справа и выделяете диапазон ячеек со случайными числами. Во вкладке «Главная» нажимаете на «Копировать».

Выделяете пустой столбец и нажимаете правой кнопкой мыши, чтобы вызвать контекстное меню. В группе инструментов «Параметры вставки» выбираете «Значения» (изображен в виде пиктограммы с цифрами).

Во вкладке «Главная» нажимаете на «Сортировка и фильтр», а затем «Настраиваемая сортировка».

Рядом с параметром «Мои данные содержат заголовки» ставите галочку. В строке «Сортировать по» указываете название того столбца, в котором находятся скопированные значения случайных чисел. В строке «Сортировка» настройки остаются по умолчанию. В строке «Порядок» выбираете параметр «По возрастанию» или «По убыванию». Кликаете на ОК.

Значения таблицы должны выстроиться в порядке возрастания или убывания случайных чисел. Любое количество первых строчек из таблицы можно взять и считать их результатом случайной выборки.

Функция UniqueValues возвращает коллекцию, содержащую уникальные непустые значения из диапазона ячеек (или массива)

Function UniqueValues(ByVal arr) As Collection
    ' функция получает в качестве параметра массив любой размерности
    ' возвращает коллекцию уникальных НЕПУСТЫХ значений
    Set UniqueValues = New Collection: On Error Resume Next
    For Each v In arr
        v = Trim(v): If Len(v) Then UniqueValues.Add CStr(v), CStr(v)
    Next v
End Function
 
 
Sub ПримерИспользования_UniqueValues()
    For Each v In UniqueValues([a3:b6500].Value)
        Debug.Print v
    Next
End Sub

Если же требуется найти уникальные значения в массиве из нескольких столбцов, или получить результат (уникальные значения) в виде массива (для последующей записи на лист, или в элемент управления типа ComboBox или ListBox), то используйте функцию UniqueValuesFromArray:
http://excelvba.ru/code/UniqueValuesFromArray

(добавлено)
Если диапазон состоит из нескольких несмежных диапазонов — то используйте такую функцию:

Function UniqueValuesFormRange(ByVal ra As Range) As Collection
    ' функция получает в качестве параметра диапазон ячеек
    ' возвращает коллекцию уникальных НЕПУСТЫХ значений
    Set UniqueValuesFormRange = New Collection: On Error Resume Next
    Dim ar As Range
    For Each ar In ra.Areas
        For Each v In ar.Value
            v = Trim(v): If Len(v) Then UniqueValuesFormRange.Add CStr(v), CStr(v)
        Next v
    Next ar
End Function

Пример её использования:

Sub ПримерИспользования_UniqueValuesFormRange()
    For Each v In UniqueValuesFormRange(Selection)
        Debug.Print v
    Next
End Sub
  • 41366 просмотров

Не получается применить макрос? Не удаётся изменить код под свои нужды?

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

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

Выйти из подобной ситуации поможет Excel.

Уверен, что ни для кого не секрет, что MS Excel имеет встроенный модуль VBA и надстройки, позволяющие подключаться к внешним источникам данных, то есть по сути является мощным инструментом для аналитики, а значит идеально подходит для решения подобных задач.

Для того чтобы обойти проблему, нам потребуется таблица с целевой выборкой, в которой содержатся идентификаторы, по которым можно достаточно корректно получить недостающую информацию (это может быть уникальный идентификатор, назовем его ID, или набор из данных, находящихся в разных столбцах), ПК с установленным MS Excel, и доступом к БД с недостающей информацией и, конечно, желание получить ту самую информацию.

Создаем в MS Excel книгу, на листе которой размещаем таблицу с идентификаторами, по которым будем в дальнейшем формировать запрос (если у нас есть уникальный идентификатор, для обеспечения максимальной скорости обработки таблицу лучше представить в виде одного столбца), сохраняем книгу в формате *.xlsm, после чего приступаем к созданию макроса.

Через меню «Разработчик» открываем встроенный VBA редактор и начинаем творить.

Sub job_sql() — Пусть наш макрос называется job_sql.

Пропишем переменные для подключения к БД, записи данных и запроса:

Dim cn As ADODB.Connection
Dim rs As ADODB.Recordset
Dim sql As String

Опишем параметры подключения:

sql = «Provider=SQLOLEDB.1;Integrated Security=SSPI;Persist Security Info=True;Data Source=Storoge.company.ru Storoge.»

Объявим процедуру свойства, для присвоения значения:

Set cn = New ADODB.Connection
cn.Provider = » SQLOLEDB.1″
cn.ConnectionString = sql
cn.ConnectionTimeout = 0
cn.Open

Вот теперь можно приступать непосредственно к делу.

Организуем цикл:

For i = 2 To 1000

Как вы уже поняли конечное значение i=1000 здесь только для примера, а в реальности конечное значение соответствует количеству строк в Вашей таблице. В целях унификации можно использовать автоматический способ подсчета количества строк, например, вот такую конструкцию:

Dim LastRow As Long
LastRow = ActiveSheet.UsedRange.Row — 1 + ActiveSheet.UsedRange.Rows.Count

Тогда открытие цикла будет выглядеть так:

For i = 2 To LastRow

Как я уже говорил выше MS Excel является мощным инструментом для аналитики, и возможности Excel VBA не заканчиваются на простом переборе значений или комбинаций значений. При наличии известных Вам закономерностей можно ограничить объем выгружаемой из БД информации путем добавления в макрос простых условий, например:

If Cells(i, 2) = «Ваше условие» Then

Итак, мы определились с объемом и условиями выборки, организовали подключение к БД и готовы формировать запрос. Предположим, что нам нужно получить информацию о размере ежемесячного платежа [Ежемесячный платеж] из таблицы [payments].[refinans_credit], но только по тем случаям, когда размер ежемесячного платежа больше 0

sql = «select [Ежемесячный платеж] from [PAYMENTS].[refinans_credit] » & _
«where [Ежемесячный платеж]>0 and [Номер заявки] ='» & Cells(i, 1) & «‘ «

Если значений для формирования запроса несколько, соответственно прописываем их в запросе:

«where [Ежемесячный платеж]>0 and [Номер заявки] = ‘» & Cells(i, 1) & «‘ » & _
» and [Дата платежа]='» & Cells(i, 2) & «‘»

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

Cells(i, 3) = sql

в третьем столбце записываются запросы.

Выполняем SQL запрос:

Set rs = cn.Execute(sql)

А чтобы хоть как-то наблюдать за выполнением макроса выведем изменение i в статус-бар

Application.StatusBar = «Execute script …» & i
Application.ScreenUpdating = False

Теперь нам нужно записать полученные результаты. Для этого будем использовать оператор Do While:

j = 0
Do While Not rs.EOF
For ii = 0 To rs.Fields.Count — 1
Cells(i, 4 + j + ii) = rs.Fields(0 + ii) ‘& «;»

Указываем ячейки для вставки полученных данных (4 в примере это номер столбца с которого начинаем запись результатов)

Next ii
j = j + rs.Fields.Count
s.MoveNext
Loop
rs.Close
End If

— закрываем цикл If, если вводили дополнительные условия

Next i
cn.Close
Application.StatusBar = «Готово»
End Sub

— закрываем макрос.

В дополнение хочу отметить, что данный макрос позволяет обращаться как к БД на MS SQL так и к БД Oracle, разница будет только в параметрах подключения и собственно в синтаксисе SQL запроса.

В приведенном примере для авторизации при подключении к БД используется доменная аутентификация.

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

sql = «Provider= SQLOLEDB.1;Password=********;User ID=********;Data Source= Storoge.company.ru Storoge;APP=SFM»

Но в этом случае при использовании макроса возникает риск компрометации Ваших учетных данных. Поэтому лучше программно удалять учетные данные после выполнения макроса. Разместим поля для ввода пароля и логина на листе и изменим макрос следующим образом:

sql = «Provider= SQLOLEDB.1;Password=» & Sheets(«Лист аутентификации»).TextBox1.Value & «;User ID=» & Sheets(«Лист аутентификации «).TextBox2.Value & «;Data Source= Storoge.company.ru Storoge;APP=SFM»

Место для расположения текстовых полей не принципиально, можно расположить их на листе с таблицей в первых строках, но мне удобней размещать поля на отдельном листе. Чтобы введенные учетные данные не сохранялись вместе с результатом выполнения макроса в конце исполняемого кода дописываем:

Sheets(«Выгрузка»).TextBox1.Value = «« Sheets(»Выгрузка«).TextBox2.Value = »»

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

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

Понравилась статья? Поделить с друзьями:
  • Максесли в excel не работает
  • Макросы на английском excel
  • Максесли excel 2016 нет в экселе скачать установить
  • Макросы на visual basic для word
  • Макросы на vba для word