We use UBound and LBound functions to get the length of an Array in Excel VBA. In this article, we will discuss them in detail.
Syntax: UBound() function
UBound (arrayname, [ dimension ])
Parameters:
- arrayname: required. Array variable name
- dimension: optional
Returns: Return upper limit of an array dimension.
Syntax: LBound() Function
LBound (arrayname, [ dimension ])
Parameters:
- arrayname : required. Array variable name
- dimension : optional
Returns: Return lower limit of an array dimension
Sample Data:
VBA Code to get the length of Array (one-dimensional array):
Declare Variables:
Declaring a customer array with the size of 10.
Sub oneDimArrayLength() ' Array variable Declaration Dim customer (1 To 10) As String
Assign values to array elements
customer(1) = "ANTON" customer(2) = "BERGS" customer(3) = "BOLID" customer(4) = "KOENE" customer(5) = "FRANS"
Use UBound function to get the size of an array and Message box to display the result
'Message box to popup length of 1D array MsgBox "Array has " & UBound(customer) & " element(s)." End Sub
To Run VBA Code
Press Alt+F8 to popup macro window. Select ” oneDimArrayLength” and Click Run button.
Output
VBA Code to get the length of Array (multi-dimensional array)
Declaring variables:
Declaring ProdAndCustomer multi-dimensional array size of 10 rows and 2 columns
Sub twoDimArrayLength() ' Array variable Declaration Dim ProdAndCustomer(1 To 10, 1 To 2) As String, noOfRow As Integer, noOfCol As Integer, noOfElements As Integer
Assign values to array elements
ProdAndCustomer(1, 1) = "Alice Mutton" ProdAndCustomer(2, 1) = "Boston Crab Meat" ProdAndCustomer(3, 1) = "Camembert Pierrot" ProdAndCustomer(4, 1) = "Alice Mutton" ProdAndCustomer(5, 1) = "Ipoh Coffee" ProdAndCustomer(1, 2) = "ANTON" ProdAndCustomer(2, 2) = "BERGS" ProdAndCustomer(3, 2) = "BOLID" ProdAndCustomer(4, 2) = "BOTTM" ProdAndCustomer(5, 2) = "FURIB"
Compute Number of Rows, Number of Columns using UBound and LBound function. Multiply by noOfRow and noOfCol variable to get Number of elements in multi-dimensional array.
noOfRow = UBound(ProdAndCustomer, 1) - LBound(ProdAndCustomer, 1) + 1 noOfCol = UBound(ProdAndCustomer, 2) - LBound(ProdAndCustomer, 2) + 1 noOfElements = noOfRow * noOfCol
Message box to popup result
'Message box to popup length of 1D array MsgBox "Array has " & noOfElements & " element(s)." End Sub
To Run VBA Code
Press Alt+F8 to popup macro window. Select ” twoDimArrayLength” and Click Run button.
Output:
Содержание
- Процедура подсчета значений в столбце
- Способ 1: индикатор в строке состояния
- Способ 2: оператор СЧЁТЗ
- Способ 3: оператор СЧЁТ
- Способ 4: оператор СЧЁТЕСЛИ
- Вопросы и ответы
В некоторых случаях перед пользователем ставится задача не подсчета суммы значений в столбце, а подсчета их количества. То есть, попросту говоря, нужно подсчитать, сколько ячеек в данном столбце заполнено определенными числовыми или текстовыми данными. В Экселе существует целый ряд инструментов, которые способны решить указанную проблему. Рассмотрим каждый из них в отдельности.
Читайте также: Как посчитать количество строк в Excel
Как посчитать количество заполненных ячеек в Экселе
Процедура подсчета значений в столбце
В зависимости от целей пользователя, в Экселе можно производить подсчет всех значений в столбце, только числовых данных и тех, которые соответствуют определенному заданному условию. Давайте рассмотрим, как решить поставленные задачи различными способами.
Способ 1: индикатор в строке состояния
Данный способ самый простой и требующий минимального количества действий. Он позволяет подсчитать количество ячеек, содержащих числовые и текстовые данные. Сделать это можно просто взглянув на индикатор в строке состояния.
Для выполнения данной задачи достаточно зажать левую кнопку мыши и выделить весь столбец, в котором вы хотите произвести подсчет значений. Как только выделение будет произведено, в строке состояния, которая расположена внизу окна, около параметра «Количество» будет отображаться число значений, содержащихся в столбце. В подсчете будут участвовать ячейки, заполненные любыми данными (числовые, текстовые, дата и т.д.). Пустые элементы при подсчете будут игнорироваться.
В некоторых случаях индикатор количества значений может не высвечиваться в строке состояния. Это означает то, что он, скорее всего, отключен. Для его включения следует кликнуть правой кнопкой мыши по строке состояния. Появляется меню. В нем нужно установить галочку около пункта «Количество». После этого количество заполненных данными ячеек будет отображаться в строке состояния.
К недостаткам данного способа можно отнести то, что полученный результат нигде не фиксируется. То есть, как только вы снимете выделение, он исчезнет. Поэтому, при необходимости его зафиксировать, придется записывать полученный итог вручную. Кроме того, с помощью данного способа можно производить подсчет только всех заполненных значениями ячеек и нельзя задавать условия подсчета.
Способ 2: оператор СЧЁТЗ
С помощью оператора СЧЁТЗ, как и в предыдущем случае, имеется возможность подсчета всех значений, расположенных в столбце. Но в отличие от варианта с индикатором в панели состояния, данный способ предоставляет возможность зафиксировать полученный результат в отдельном элементе листа.
Главной задачей функции СЧЁТЗ, которая относится к статистической категории операторов, как раз является подсчет количества непустых ячеек. Поэтому мы её с легкостью сможем приспособить для наших нужд, а именно для подсчета элементов столбца, заполненных данными. Синтаксис этой функции следующий:
=СЧЁТЗ(значение1;значение2;…)
Всего у оператора может насчитываться до 255 аргументов общей группы «Значение». В качестве аргументов как раз выступают ссылки на ячейки или диапазон, в котором нужно произвести подсчет значений.
- Выделяем элемент листа, в который будет выводиться итоговый результат. Щелкаем по значку «Вставить функцию», который размещен слева от строки формул.
- Тем самым мы вызвали Мастер функций. Переходим в категорию «Статистические» и выделяем наименование «СЧЁТЗ». После этого производим щелчок по кнопке «OK» внизу данного окошка.
- Мы переходим к окну аргументов функции СЧЁТЗ. В нём располагаются поля ввода аргументов. Как и количество аргументов, они могут достигать численности 255 единиц. Но для решения поставленной перед нами задачи хватит и одного поля «Значение1». Устанавливаем в него курсор и после этого с зажатой левой кнопкой мыши выделяем на листе тот столбец, значения в котором нужно подсчитать. После того, как координаты столбца отобразились в поле, жмем на кнопку «OK» в нижней части окна аргументов.
- Программа производит подсчет и выводит в ячейку, которую мы выделяли на первом шаге данной инструкции, количество всех значений (как числовых, так и текстовых), содержащихся в целевом столбце.
Как видим, в отличие от предыдущего способа, данный вариант предлагает выводить результат в конкретный элемент листа с возможным его сохранением там. Но, к сожалению, функция СЧЁТЗ все-таки не позволяет задавать условия отбора значений.
Урок: Мастер функций в Excel
Способ 3: оператор СЧЁТ
С помощью оператора СЧЁТ можно произвести подсчет только числовых значений в выбранной колонке. Он игнорирует текстовые значения и не включает их в общий итог. Данная функция также относится к категории статистических операторов, как и предыдущая. Её задачей является подсчет ячеек в выделенном диапазоне, а в нашем случае в столбце, который содержит числовые значения. Синтаксис этой функции практически идентичен предыдущему оператору:
=СЧЁТ(значение1;значение2;…)
Как видим, аргументы у СЧЁТ и СЧЁТЗ абсолютно одинаковые и представляют собой ссылки на ячейки или диапазоны. Различие в синтаксисе заключается лишь в наименовании самого оператора.
- Выделяем элемент на листе, куда будет выводиться результат. Нажимаем уже знакомую нам иконку «Вставить функцию».
- После запуска Мастера функций опять перемещаемся в категорию «Статистические». Затем выделяем наименование «СЧЁТ» и щелкаем по кнопке «OK».
- После того, как было запущено окно аргументов оператора СЧЁТ, следует в его поле внести запись. В этом окне, как и в окне предыдущей функции, тоже может быть представлено до 255 полей, но, как и в прошлый раз, нам понадобится всего одно из них под названием «Значение1». Вводим в это поле координаты столбца, над которым нам нужно выполнить операцию. Делаем это все тем же образом, каким выполняли данную процедуру для функции СЧЁТЗ: устанавливаем курсор в поле и выделяем колонку таблицы. После того, как адрес столбца был занесен в поле, жмем на кнопку «OK».
- Результат тут же будет выведен в ячейку, которую мы определили для содержания функции. Как видим, программа подсчитала только ячейки, которые содержат числовые значения. Пустые ячейки и элементы, содержащие текстовые данные, в подсчете не участвовали.
Урок: Функция СЧЁТ в Excel
Способ 4: оператор СЧЁТЕСЛИ
В отличие от предыдущих способов, использование оператора СЧЁТЕСЛИ позволяет задавать условия, отвечающие значения, которые будут принимать участие в подсчете. Все остальные ячейки будут игнорироваться.
Оператор СЧЁТЕСЛИ тоже причислен к статистической группе функций Excel. Его единственной задачей является подсчет непустых элементов в диапазоне, а в нашем случае в столбце, которые отвечают заданному условию. Синтаксис у данного оператора заметно отличается от предыдущих двух функций:
=СЧЁТЕСЛИ(диапазон;критерий)
Аргумент «Диапазон» представляется в виде ссылки на конкретный массив ячеек, а в нашем случае на колонку.
Аргумент «Критерий» содержит заданное условие. Это может быть как точное числовое или текстовое значение, так и значение, заданное знаками «больше» (>), «меньше» (<), «не равно» (<>) и т.д.
Посчитаем, сколько ячеек с наименованием «Мясо» располагаются в первой колонке таблицы.
- Выделяем элемент на листе, куда будет производиться вывод готовых данных. Щелкаем по значку «Вставить функцию».
- В Мастере функций совершаем переход в категорию «Статистические», выделяем название СЧЁТЕСЛИ и щелкаем по кнопке «OK».
- Производится активация окошка аргументов функции СЧЁТЕСЛИ. Как видим, окно имеет два поля, которые соответствуют аргументам функции.
В поле «Диапазон» тем же способом, который мы уже не раз описывали выше, вводим координаты первого столбца таблицы.
В поле «Критерий» нам нужно задать условие подсчета. Вписываем туда слово «Мясо».
После того, как вышеуказанные настройки выполнены, жмем на кнопку «OK».
- Оператор производит вычисления и выдает результат на экран. Как видим, в выделенной колонке в 63 ячейках содержится слово «Мясо».
Давайте немного изменим задачу. Теперь посчитаем количество ячеек в этой же колонке, которые не содержат слово «Мясо».
- Выделяем ячейку, куда будем выводить результат, и уже описанным ранее способом вызываем окно аргументов оператора СЧЁТЕСЛИ.
В поле «Диапазон» вводим координаты все того же первого столбца таблицы, который обрабатывали ранее.
В поле «Критерий» вводим следующее выражение:
<>Мясо
То есть, данный критерий задает условие, что мы подсчитываем все заполненные данными элементы, которые не содержат слово «Мясо». Знак «<>» означает в Экселе «не равно».
После введения этих настроек в окне аргументов жмем на кнопку «OK».
- В предварительно заданной ячейке сразу же отображается результат. Он сообщает о том, что в выделенном столбце находятся 190 элементов с данными, которые не содержат слово «Мясо».
Теперь давайте произведем в третьей колонке данной таблицы подсчет всех значений, которые больше числа 150.
- Выделяем ячейку для вывода результата и производим переход в окно аргументов функции СЧЁТЕСЛИ.
В поле «Диапазон» вводим координаты третьего столбца нашей таблицы.
В поле «Критерий» записываем следующее условие:
>150
Это означает, что программа будет подсчитывать только те элементы столбца, которые содержат числа, превышающие 150.
Далее, как всегда, жмем на кнопку «OK».
- После проведения подсчета Excel выводит в заранее обозначенную ячейку результат. Как видим, выбранный столбец содержит 82 значения, которые превышают число 150.
Таким образом, мы видим, что в Excel существует целый ряд способов подсчитать количество значений в столбце. Выбор определенного варианта зависит от конкретных целей пользователя. Так, индикатор на строке состояния позволяет только посмотреть количество всех значений в столбце без фиксации результата; функция СЧЁТЗ предоставляет возможность их число зафиксировать в отдельной ячейке; оператор СЧЁТ производит подсчет только элементов, содержащих числовые данные; а с помощью функции СЧЁТЕСЛИ можно задать более сложные условия подсчета элементов.
Массивы в VBA Excel: одномерные, многомерные и динамические. Объявление и использование массивов. Операторы Public, Dim и ReDim. Функции Array, LBound, UBound.
Массивы – это множества однотипных элементов, имеющих одно имя и отличающиеся друг от друга индексами. Они могут быть одномерными (линейными), многомерными и динамическими. Массивы в VBA Excel, как и другие переменные, объявляются с помощью операторов Dim и Public. Для изменения размерности динамических массивов используется оператор ReDim. Массивы с заранее объявленной размерностью называют статическими.
Одномерные массивы
Объявление одномерных (линейных) статических массивов в VBA Excel:
Public Massiv1(9) As Integer Dim Massiv2(1 To 9) As String |
В первом случае публичный массив содержит 10 элементов от 0 до 9 (нижний индекс по умолчанию — 0, верхний индекс — 9), а во втором случае локальный массив содержит 9 элементов от 1 до 9.
По умолчанию VBA Excel считает в массивах нижним индексом нуль, но, при желании, можно сделать нижним индексом по умолчанию единицу, добавив в самом начале модуля объявление «Option Base 1».
Многомерные массивы
Объявление многомерных статических массивов в VBA Excel аналогично объявлению одномерных массивов, но с добавлением размерностей дополнительных измерений через запятую:
‘Массив двухмерный Public Massiv1(3, 6) As Integer ‘Массив трехмерный Dim Massiv2(1 To 6, 1 To 8, 1 To 5) As String ‘Массив четырехмерный Dim Massiv3(9, 9, 9, 9) As Date |
Третий массив состоит из 10000 элементов — 10×10×10×10.
Динамические массивы
Динамические массивы в VBA Excel, в отличие от статических, объявляются без указания размерности:
Public Massiv1() As Integer Dim Massiv2() As String |
Такие массивы используются, когда заранее неизвестна размерность, которая определяется в процессе выполнения программы. Когда нужная размерность массива становится известна, она в VBA Excel переопределяется с помощью оператора ReDim:
Public Massiv1() As Integer Dim Massiv2() As String ReDim Massiv1(1 To 20) ReDim Massiv2(3, 5, 4) |
При переопределении размерности массива вместо верхнего индекса можно использовать переменную:
Dim Massiv1() as Variant, x As Integer x = 20 ReDim Massiv1(1 To x) |
Переопределять размерность динамических массивов в процессе работы программы можно неоднократно, как по количеству измерений, так и по количеству элементов в измерении.
С помощью оператора ReDim невозможно изменить обычный массив, объявленный с заранее заданной размерностью. Попытка переопределить размерность такого массива вызовет ошибку компиляции с сообщением: Array already dimensioned (Массив уже измерен).
При переопределении размерности динамических массивов в VBA Excel теряются значения их элементов. Чтобы сохранить значения, используйте оператор Preserve:
Dim Massiv1() As String ——— операторы ——— ReDim Massiv1(5, 2, 3) ——— операторы ——— ReDim Preserve Massiv1(5, 2, 7) |
Обратите внимание!
Переопределить с оператором Preserve можно только последнюю размерность динамического массива. Это недоработка разработчиков, которая сохранилась и в VBA Excel 2016. Без оператора Preserve можно переопределить все размерности.
Максимальный размер
Размер массива – это произведение длин всех его измерений. Он представляет собой общее количество элементов, содержащихся в данный момент в массиве.
По информации с сайта разработчиков, максимальный размер массивов зависит от операционной системы и доступного объема памяти. Использование массивов, размер которых превышает объем доступной оперативной памяти компьютера, приводит к снижению скорости, поскольку системе необходимо выполнять запись данных и чтение с диска.
Использование массивов
Приведу два примера, где не обойтись без массивов.
1. Как известно, функция Split возвращает одномерный массив подстрок, извлеченных из первоначальной строки с разделителями. Эти данные присваиваются заранее объявленному строковому (As String) одномерному динамическому массиву. Размерность устанавливается автоматически в зависимости от количества подстрок.
2. Данные в массивах обрабатываются значительно быстрее, чем в ячейках рабочего листа. Построчную обработку информации в таблице Excel можно наблюдать визуально по мерцаниям экрана, если его обновление (Application.ScreenUpdating) не отключено. Чтобы ускорить работу кода, можно значения из диапазона ячеек предварительно загрузить в динамический массив с помощью оператора присваивания (=). Размерность массива установится автоматически. После обработки данных в массиве кодом VBA полученные результаты выгружаются обратно на рабочий лист Excel. Обратите внимание, что загрузить значения в диапазон ячеек рабочего листа через оператор присваивания (=) можно только из двумерного массива.
Функции Array, LBound, UBound
Функция Array
Функция Array возвращает массив элементов типа Variant из первоначального списка элементов, перечисленных через запятую. Нумерация элементов в массиве начинается с нуля. Обратиться к элементу массива можно, указав в скобках его номер (индекс).
Sub Test1() Dim a() As Variant a = Array(«text», 25, «solo», 35.62, «stop») MsgBox a(0) & vbNewLine & a(1) & vbNewLine _ & a(2) & vbNewLine & a(3) & vbNewLine & a(4) End Sub |
Скопируйте код в модуль VBA Excel и запустите его на выполнение. Информационное сообщение MsgBox покажет значения массива, извлеченные по индексу.
Функция LBound
Функция LBound возвращает значение типа Long, равное наименьшему (нижнему) доступному индексу в указанном измерении массива.
Синтаксис:
LBound (arrayname[, dimension])
- arrayname — это имя переменной массива, является обязательным аргументом;
- dimension — это номер измерения массива, необязательный аргумент, по умолчанию принимает значение 1.
Наименьший индекс по-умолчанию может быть равен 0 или 1 в зависимости от настроек оператора Option Base. Нижняя граница архива, полученного с помощью функции Array, всегда равна 0.
При объявлении переменных массивов или переопределении их размерности наименьшие индексы могут быть любыми целыми числами, в том числе отрицательными.
Функция UBound
Функция UBound возвращает значение типа Long, равное наибольшему (верхнему) доступному индексу в указанном измерении массива.
Синтаксис:
UBound( arrayname[, dimension])
- arrayname — это имя переменной массива, является обязательным аргументом;
- dimension — это номер измерения массива, необязательный аргумент, по умолчанию принимает значение 1.
Функция UBound используется вместе с функцией LBound для определения размера массива.
Sub Test2() Dim a(—2 To 53) As String MsgBox «Наименьший индекс = « & LBound(a) & _ vbNewLine & «Наибольший индекс = « & UBound(a) End Sub |
Скопируйте код в модуль VBA Excel и запустите его на выполнение. Информационное сообщение MsgBox покажет значения наименьшего и наибольшего индекса переменной массива a.
Обход массива циклом
Обход одномерного массива циклом For… Next, в котором для определения границ массива используются функции UBound и LBound:
Sub Test3() Dim a() As Variant, i As Long a = Array(«text», 25, «solo», 35.62, «stop») For i = LBound(a) To UBound(a) Debug.Print «a(« & i & «) = « & a(i) Next End Sub |
Результат работы цикла вы увидите в окне Immediate.
Очистка (обнуление) массивов
Первый способ
Очистить любой массив, статический или динамический, без использования цикла можно с помощью оператора Erase. Термин «обнуление» можно применить только к массиву числового типа.
Dim Massiv1(4, 3) As String, Massiv2() As Variant ——— операторы ——— ‘переопределяем динамический массив ReDim Massiv2(2, 5, 3) ——— операторы ——— ‘очищаем массивы Erase Massiv1 Erase Massiv2 |
Обратите внимание, что оба массива при таком способе очистки будут возвращены в исходное состояние, которое они имели сразу после объявления:
- статический Massiv1 сохранит размерность (4, 3);
- динамический Massiv2 не сохранит размерность ().
Второй способ
Динамический массив можно очистить (обнулить) без использования цикла с помощью оператора ReDim. Просто переопределите его с той же размерностью.
Dim Massiv() As Double ——— операторы ——— ‘переопределяем массив ReDim Massiv(5, 6, 8) ——— операторы ——— ‘очищаем массив ReDim Massiv(5, 6, 8) |
Skip to content
В статье предлагается несколько различных формул для выполнения поиска в двумерном массиве значений Excel. Просмотрите эти варианты и выберите наиболее для вас подходящий.
При поиске данных в электронных таблицах Excel чаще всего вы будете искать вертикально в столбцах или горизонтально в строках. Но иногда вам нужно просматривать сразу два условия – как строки, так и столбцы. Другими словами, вы стремитесь найти значение на пересечении определенной строки и столбца. Это называется матричным поиском (также известным как двумерный или поиск в диапазоне). Далее показано, как это можно сделать различными способами.
- Поиск в массиве при помощи ИНДЕКС ПОИСКПОЗ
- Формула ВПР и ПОИСКПОЗ для поиска в диапазоне
- Функция ПРОСМОТРX для поиска в строках и столбцах
- Формула СУММПРОИЗВ для поиска по строке и столбцу
- Поиск в матрице с именованными диапазонами
Поиск в массиве при помощи ИНДЕКС ПОИСКПОЗ
Самый популярный способ выполнить двусторонний поиск в Excel — использовать комбинацию ИНДЕКС с двумя ПОИСКПОЗ. Это разновидность классической формулы ПОИСКПОЗ ИНДЕКС , к которой вы добавляете еще одну функцию ПОИСКПОЗ, чтобы получить номера строк и столбцов:
ИНДЕКС( массив_данных ; ПОИСКПОЗ( значение_вертикальное ; диапазон_поиска_столбец ; 0), ПОИСКПОЗ( значение_горизонтальное ; диапазон_поиска_строка ; 0))
В этом способе, как и во всех остальных, мы используем поиск по двум условиям. Первое из них должно обнаружить совпадение в определенном столбце (в заголовках строк), а второе – в определенной строке (то есть, в заголовках столбцов). В результате мы имеем строку и столбец, которые соответствуют заданным условиям. А на пересечении их как раз и будут находиться искомые данные.
В качестве примера составим формулу для получения количества проданного товара за определённый период времени из таблицы, которую вы можете видеть ниже. Для начала определим все аргументы:
- Массив_данных — B2:E11 (ячейки данных, не включая заголовки строк и столбцов)
- Значение_вертикальное — H1 (целевой товар)
- Диапазон_поиска_столбец – A2:A11 (заголовки строк: названия напитков)
- Значение_горизонтальное — H2 (целевой период)
- Диапазон_поиска_строка — B1:E1 (заголовки столбцов: временные периоды)
Соедините все аргументы вместе, и вы получите следующую формулу для поиска числа в диапазоне:
=ИНДЕКС(B2:E11; ПОИСКПОЗ(H1;A2:A11;0); ПОИСКПОЗ(H2;B1:E1;0))
Как работает эта формула?
Хотя на первый взгляд это может показаться немного сложным, логика здесь простая. Функция ИНДЕКС извлекает значение из массива данных на основе номеров строк и столбцов, а две функции ПОИСКПОЗ предоставляют ей эти номера:
ИНДЕКС( B2:E11; номер_строки ; номер_столбца )
Здесь мы используем способность ПОИСКПОЗ возвращать относительную позицию значения в искомом массиве .
Итак, чтобы получить номер строки, мы ищем нужный нам товар (H1) в заголовках строк (A2:A11):
ПОИСКПОЗ(H1;A2:A11;0)
Чтобы получить номер столбца, мы ищем нужную нам неделю (H2) в заголовках столбцов (B1:E1):
ПОИСКПОЗ(H2;B1:E1;0)
В обоих случаях мы ищем точное совпадение, присваивая третьему аргументу значение 0.
В этом примере первое ПОИСКПОЗ возвращает 2, потому что нужный товар (Sprite) находится в ячейке A3, которая является второй по счёту в диапазоне A2:A11. Второй ПОИСКПОЗ возвращает 3, так как «Неделя 3» находится в ячейке D1, которая является третьей ячейкой в B1:E1.
С учетом вышеизложенного формула сводится к:
ИНДЕКС(B2:E11; 2 ; 3 )
Она возвращает число на пересечении второй строки и третьего столбца в матрице B2:E4, то есть в ячейке D3.
Думаю, вы понимаете, что аналогичным образом можно производить поиск в двумерном массиве Excel не только числа, но и текста. Тип данных здесь не имеет значения.
Формула ВПР и ПОИСКПОЗ для поиска в диапазоне
Другой способ выполнить матричный поиск в Excel — использовать комбинацию функций ВПР и ПОИСКПОЗ:
ВПР( значение_вертикальное ; массив_данных ; ПОИСКПОЗ( значение_горизонтальное , диапазон_поиска_строка , 0), ЛОЖЬ)
Для нашего образца таблицы формула принимает следующий вид:
=ВПР(H1; A2:E11; ПОИСКПОЗ(H2;A1:E1;0); ЛОЖЬ)
Где:
- Массив_данных — B2:E11 (ячейки данных, не включая заголовки строк и столбцов)
- Значение_вертикальное — H1 (целевой товар)
- Значение_горизонтальное — H2 (целевой период)
- Диапазон_поиска_строка — А1:E1 (заголовки столбцов: временные периоды)
Основой формулы является функция ВПР, настроенная на точное совпадение (последний аргумент имеет значение ЛОЖЬ). Она ищет заданное значение (H1) в первом столбце массива (A2:E11) и возвращает данные из другого столбца в той же строке. Чтобы определить, из какого столбца вернуть значение, вы используете функцию ПОИСКПОЗ, которая также настроена на точное совпадение (последний аргумент равен 0):
ПОИСКПОЗ(H2;A1:E1;0)
ПОИСКПОЗ ищет текст из H2 в заголовках столбцов (A1:E1) и указывает относительное положение найденной ячейки. В нашем случае нужная неделя (3-я) находится в D1, которая является четвертой по счету в массиве поиска. Итак, число 4 идет в аргумент номер_столбца функции ВПР:
=ВПР(H1; A2:E11; 4; ЛОЖЬ)
Далее ВПР находит точное совпадение H1 со значением в A3 и возвращает значение из 4-го столбца в той же строке, то есть из ячейки D3.
Важное замечание! Чтобы формула работала корректно, диапазон_поиска (A2:E11) функции ВПР и диапазон_поиска (A1:E1) функции ПОИСКПОЗ должны иметь одинаковое количество столбцов. Иначе число, переданное в номер_столбца, будет неправильным (не будет соответствовать положению столбца в массиве данных).
Функция ПРОСМОТРX для поиска в строках и столбцах
Недавно Microsoft представила еще одну функцию в Excel, которая призвана заменить все существующие функции поиска, такие как ВПР, ГПР и ИНДЕКС+ПОИСКПОЗ. Помимо прочего, ПРОСМОТРX может смотреть на пересечение определенной строки и столбца:
ПРОСМОТРX( значение_вертикальное ; диапазон_поиска_столбец ; ПРОСМОТРX( значение_горизонтальное ; диапазон_поиска_строка ; массив_данных ))
Для нашего примера набора данных формула выглядит следующим образом:
=ПРОСМОТРX(H1; A2:A11; ПРОСМОТРX(H2; B1:E1; B2:E11))
Примечание. В настоящее время ПРОСМОТРX — это функция, доступная только подписчикам Office 365 и более поздних версий.
В формуле используется функция ПРОСМОТРX для возврата всей строки или столбца. Внутренняя функция ищет целевой период времени в строке заголовка и возвращает все значения для этой недели (в данном примере для 3-й). Эти значения переходят в аргумент возвращаемый_массив внешнего ПРОСМОТРX:
=ПРОСМОТРX(H1; A2:A11; {544:87:488:102:87:433:126:132:111:565})
Внешняя функция ПРОСМОТРX ищет нужный товар в заголовках столбцов и извлекает значение из той же позиции из возвращаемого_массива.
Формула СУММПРОИЗВ для поиска по строке и столбцу
Функция СУММПРОИЗВ чрезвычайно универсальна — она может делать множество вещей, выходящих за рамки ее предназначения, особенно когда речь идет об оценке нескольких условий.
Чтобы найти значение на пересечении определенных строки и столбца, используйте эту общую формулу:
СУММПРОИЗВ ( диапазон_поиска_столбец = значение_вертикальное ) * ( диапазон_поиска_строка = значение_горизонтальное), массив_данных )
Чтобы выполнить поиск данных в массиве по строке и столбцу в нашем наборе данных, формула выглядит следующим образом:
=СУММПРОИЗВ((A2:A11=H1)*(B1:E1=H2); B2:E11)
Приведенный ниже вариант также будет работать:
=СУММПРОИЗВ((A2:A11=H1)*(B1:E1=H2)*B2:E11)
Теперь поясним подробнее. В начале мы сравниваем два значения поиска с заголовками строк и столбцов (целевой товар в H1 со всеми наименованиями в A2: A11 и целевой период времени в H2 со всеми неделями в B1: E1):
(A2:A11=H1)*(B1:E1=H2)
Это дает нам два массива значений ИСТИНА и ЛОЖЬ, где ИСТИНА означает совпадения:
{ЛОЖЬ:ИСТИНА:ЛОЖЬ:ЛОЖЬ:ЛОЖЬ:ЛОЖЬ:ЛОЖЬ:ЛОЖЬ:ЛОЖЬ:ЛОЖЬ}) * ({ЛОЖЬ;ЛОЖЬ;ИСТИНА;ЛОЖЬ}
Операция умножения преобразует значения ИСТИНА и ЛОЖЬ в 1 и 0 и создает матрицу из 4 столбцов и 10 строк (строки разделяются двоеточием, а каждый столбец данных — точкой с запятой):
{0;0;0;0:0;0;1;0:0;0;0;0:0;0;0;0:0;0;0;0:0;0;0;0:0;0;0;0:0;0;0;0:0;0;0;0:0;0;0;0}
Функция СУММПРОИЗВ умножает элементы приведенного выше массива на элементы B2:E4, находящихся в тех же позициях:
{0;0;0;0:0;0;1;0:0;0;0;0:0;0;0;0:0;0;0;0:0;0;0;0:0;0; 0;0:0;0;0;0:0;0;0;0:0;0;0;0} * {455;345;544;366:65;77;87;56:766; 655;488;865:129;66;102;56:89;141;87;89:566;511;433;522:154; 144;126; 162:158;165;132;155:112;143;111; 125:677;466;565;766})
И поскольку умножение на ноль дает в результате ноль, остается только элемент, соответствующий 1 в первом массиве:
=СУММПРОИЗВ({0;0;0;0:0;0;87;0:0;0;0;0:0;0;0;0:0;0;0;0:0; 0;0;0:0;0;0;0:0;0;0;0:0;0;0;0:0;0;0;0})
Наконец, СУММПРОИЗВ складывает все элементы результирующего массива и возвращает значение 87.
Примечание . Если в вашей таблице несколько заголовков строк и/или столбцов с одинаковыми именами, итоговый массив будет содержать более одного числа, отличного от нуля. И все эти числа будут суммированы. В результате вы получите сумму значений, удовлетворяющую обоим критериям. Это то, что отличает формулу СУММПРОИЗВ от ПОИСКПОЗ и ВПР, которые возвращают только первое найденное совпадение.
Поиск в матрице с именованными диапазонами
Еще один достаточно простой способ поиска в массиве в Excel — использование именованных диапазонов. Рассмотрим пошагово:
Шаг 1. Назовите столбцы и строки
Самый быстрый способ назвать каждую строку и каждый столбец в вашей таблице:
- Выделите всю таблицу (в нашем случае A1:E11).
- На вкладке « Формулы » в группе « Определенные имена » щелкните « Создать из выделенного » или нажмите комбинацию клавиш Ctrl + Shift + F3.
- В диалоговом окне « Создание имени из выделенного » выберите « в строке выше » и « в столбце слева» и нажмите «ОК».
Это автоматически создает имена на основе заголовков строк и столбцов. Однако есть пара предостережений:
- Если ваши заголовки столбцов и/или строк являются числами или содержат определенные символы, которые не разрешены в именах Excel, то имена для таких столбцов и строк не будут созданы. Чтобы просмотреть список созданных имен, откройте Диспетчер имен (
Ctrl + F3
). Если некоторые имена отсутствуют, определите их вручную. - Если некоторые из ваших заголовков строк или столбцов содержат пробелы, то они будут заменены символами подчеркивания, например, Неделя_1.
Шаг 2. Создание формулы поиска по матрице
Чтобы получить значение из матрицы на пересечении определенной строки и столбца, просто введите одну из следующих общих формул в пустую ячейку:
=имя_строки имя_столбца
Или наоборот:
=имя_столбца имя_строки
Например, чтобы получить продажу Sprite в 3-й неделе, используйте выражение:
=Sprite неделя_3
То есть, имена диапазонов здесь разделены пробелом, который в данном случае является оператором пересечения массивов.
Если кому-то нужны более подробные инструкции, опишем весь процесс пошагово:
- В ячейке, в которой вы хотите отобразить результат, введите знак равенства (=).
- Начните вводить имя целевой строки, Sprite. После того, как вы введете пару символов, Excel отобразит все существующие имена, соответствующие вашему вводу. Дважды щелкните нужное имя, чтобы ввести его в формулу.
- После имени строки введите пробел , который в данном случае работает как оператор пересечения.
- Введите имя целевого столбца ( в нашем случае неделя_3 ).
- Как только будут введены имена строки и столбца, Excel выделит соответствующую строку и столбец в вашей таблице, и вы нажмете Enter, чтобы завершить ввод:
Ваш поиск нужной ячейки в массиве выполнен, найден результат 87.
Вот какими способами можно выполнять поиск в массиве значений – в строках и столбцах таблицы Excel. Я благодарю вас за чтение и надеюсь еще увидеть вас в нашем блоге.
Еще несколько материалов по теме:
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 |
Function ArrayCount(x) As Long 'Возвращает число элементов массива. Массив может быть любого типа и с любым числом размерностей. 'В случае если аргумент - не массив или неинициализированный массив, возвращает 0. Dim i As Long On Error Resume Next ArrayCount = UBound(x) - LBound(x) + 1 'реальное число элементов первой размерности, если массив "нормальный" '0 и err=9, если аргумент не массив или массив не инициализирован '0 в случае пустого массива, возвращаемого Split("") For i = 2 To 60 'F1: up to 60 multiple dimensions may be declared ArrayCount = ArrayCount * (UBound(x, i) - LBound(x, i) + 1) Select Case Err Case 0 'ничего не делать Case 9 'Subscript out of range Exit Function Case Else 'не массив ArrayCount = 0 Exit Function End Select Next End Function Sub test() Dim a(2, 3), b(1 To 2, -1 To 1, 2 To 5) As Single, c() As Byte Debug.Print ArrayCount(a), ArrayCount(b) ' 12 24 Debug.Print ArrayCount(c) '0 массив не инициализирован ReDim c(0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1) Debug.Print ArrayCount(c) '1048576 Debug.Print ArrayCount(Split("a s d")) '3 Debug.Print ArrayCount(Split("")) '0 у этого массива UBound=-1, LBound=0 Debug.Print ArrayCount(4) '0 не массив End Sub |
Как подсчитать сумму значений в ячейках таблицы Excel, наверняка, знает каждый пользователь, который работает в этой программе. В этом поможет функция СУММ, которая вынесена в последних версиях программы на видное место, так как, пожалуй, используется значительно чаще остальных. Но порой перед пользователем может встать несколько иная задача – узнать количество значений с заданными параметрами в определенном столбце. Не их сумму, а простой ответ на вопрос – сколько раз встречается N-ое значение в выбранном диапазоне? В Эксель можно решить эту задачу сразу несколькими методами.
Какой из перечисленных ниже способов окажется для вас наиболее подходящим, во многом зависит от вашей цели и данных, с которыми вы работаете. Одни операторы подойдут только для числовых данных, другие не работают с условиями, а третьи не зафиксируют результат в таблице. Мы расскажем обо всех методах, среди которых вы точно найдете тот, который наилучшим образом подойдет именно вам.
Содержание
- Метод 1: отображение количества значений в строке состояния
- Метод 2: применение функции СЧЕТЗ
- Метод 3: использование функции СЧЕТ
- Метод 4: оператор СЧЕТЕСЛИ
- Метод 5: использование оператора СЧЕТЕСЛИМН
- Метод 6: функция СЧИТАТЬПУСТОТЫ
- Заключение
Метод 1: отображение количества значений в строке состояния
Пожалуй, это самый легкий метод, который подойдет для работы с текстовыми и числовыми данными. Но он не способен работать с условиями.
Воспользоваться этим методом крайне просто: выделяем интересующий массив данных (любым удобным способом). Результат сразу появится в строке состояния (Количество). В расчете участвуют все ячейки, за исключением пустых.
Еще раз подчеркнем, что при таком методе учитываются ячейки с любыми значениями. В теории, можно вручную выделить только интересующие участки таблицы или даже конкретные ячейки и посмотреть результат. Но это удобно только при работе с небольшими массивами данных. Для больших таблиц существуют другие способы, которые мы разберем далее.
Другой минус этого метода состоит в том, результат сохраняется лишь до тех пор, пока мы не снимем выделение с ячеек. Т.е. придется либо запоминать, либо записывать результат куда-то отдельно.
Порой бывает, что по умолчанию показатель “Количество” не включен в строку состояния, однако это легко поправимо:
- Щелкаем правой клавишей мыши по строке состояния.
- В открывшемся перечне обращаем вниманием на строку “Количество”. Если рядом с ней нет галочки, значит она не включена в строку состояния. Щелкаем по строке, чтобы добавить ее.
- Все готово, с этого момента данный показатель добавится на строку состояния программы.
Метод 2: применение функции СЧЕТЗ
Данная функция позволяет сделать то же самое, но с одной существенной разницей – полученный результат будет зафиксирован. Остальные минусы предыдущего метода сохраняются, т.е. СЧЕТ3 не работает с условиями.
Функция СЧЕТ3 выполняет задачу по подсчету всех заполненных ячеек в заданном диапазоне (пустые не учитываются). Формула функции может выглядет по-разному:
- =СЧЕТЗ(ячейка1;ячейка2;…ячейкаN)
- =СЧЕТЗ(ячейка1:ячейкаN)
В первом случае функция выполнит подсчет всех перечисленных ячеек. Во втором – определит количество непустых ячеек в диапазоне от ячейки 1 до ячейки N. Обратите внимание, что количество аргументов функции ограничено на отметке 255.
Давайте попробуем применить функцию СЧЕТ3 на примере:
- Выбираем ячейку, где по итогу будет выведен результат подсчета.
- Переходим во вкладку “Формулы” и нажимаем кнопку “Вставить функцию”.Также можно кликнуть по значку «Вставить функцию» рядом со строкой формул.
- В открывшемся меню (Мастер функций) выбираем категорию «Статистические», далее ищем в перечне нужную функцию СЧЕТ3, выбираем ее и нажимаем OK, чтобы приступить к ее настройке.
- В окне «Аргументы функции» задаем нужные ячейки (перечисляя их или задав диапазон) и щелкаем по кнопке OK. Задать диапазон можно как с заголовком, так и без него.
- Результат подсчет будет отображен в выбранной нами ячейке, что изначально и требовалось. Учтены все ячейки с любыми данными (за исключением пустых).
Метод 3: использование функции СЧЕТ
Функция СЧЕТ подойдет, если вы работаете исключительно с числами. Ячейки, заполненные текстовыми значениями, этой функцией учитываться не будут. В остальном СЧЕТ почти идентичен СЧЕТЗ из ранее рассмотренного метода.
Так выглядит формула функции СЧЕТ:
- =СЧЕТ(ячейка1;ячейка2;…ячейкаN)
- =СЧЕТ(ячейка1:ячейкаN)
Алгоритм действий также похож на тот, что мы рассмотрели выше:
- Выбираем ячейку, где будет сохранен и отображен результат подсчета значений.
- Заходим в Мастер функций любым удобным способом, выбираем в категории “Статистические” необходимую строку СЧЕТ и щелкаем OK.
- В «Аргументах функции» задаем диапазон ячеек или перечисляем их. Далее жмем OK.
- В выбранной ячейке будет выведен результат. Функция СЧЕТ проигнорирует все ячейки с пустым содержанием или с текстовыми значениями. Таким образом, будет произведен подсчет исключительно тех ячеек, которые содержат числовые данные.
Метод 4: оператор СЧЕТЕСЛИ
Наконец, мы подошли к функции, которая способна сделать подсчет по определенным условиям. Оператор СЧЕТЕСЛИ создан именно для этой задачи. Все ячейки без данных и те, которые не отвечают заданным пользователем параметрам, данная функция игнорирует.
Синтаксис СЧЕТЕСЛИ типичен для всех операторов, работающих с условиями:
=СЧЕТЕСЛИ(диапазон;критерий)
Диапазон – область ячеек, внутри которой необходимо найти количество совпадений по заданному условию.
Критерий – конкретное условие, совпадение по которому ищет функция. Условие указывается в кавычках, может быть задано как в виде точного совпадения с введенным числом или текстом, или же как математическое сравнение, заданное знаками «не равно» («<>»), «больше» («>») и «меньше» («<»). Также предусмотрена возможность добавить условия «больше или равно» / «меньше или равно» («=>/=<»).
Разберем наглядно применение функции СЧЕТЕСЛИ:
- Давайте, к примеру, определим, сколько раз в столбце с видами спорта встречается слово «бег». Переходим в ячейку, куда нужно вывести итоговый результат.
- Одним из двух описанных выше способов входим в Мастер функций. В списке статистических функций выбираем СЧЕТЕСЛИ и кликаем ОК.
- Окно аргументов несколько отличается от тех, что мы видели при работе с СЧЕТЗ и СЧЕТ. Заполняем аргументы и кликаем OK.
- В поле «Диапазон» указываем область таблицы, которая будет участвовать в подсчете.
- В поле «Критерий» указываем условие. Нам нужно определить частоту встречаемости ячеек, содержащих значение “бег”, следовательно пишем это слово в кавычках. Кликаем ОК.
- Функция СЧЕТЕСЛИ посчитает и отобразит в выбранной ячейке количество совпадений с заданным словом. В нашем случае их 16.
Для лучшего понимания работы с функцией СЧЕТЕСЛИ попробуем изменить условие:
- Давайте теперь определим сколько раз в этом же столбце встречаются любые другие значения, кроме слова «бег».
- Выбираем ячейку, заходим в Мастер функций, находим оператор СЧЕТЕСЛИ, жмем ОК.
- В поле «Диапазон» вводим координаты того же столбца, что и в примере выше. В поле «Критерий» добавляем знак не равно («<>») перед словом «бег».
- После нажатия кнопки OK мы получаем число, которое сообщает нам, сколько в выбранном диапазоне (столбце) ячеек, не содержащих слово «бег». На этот раз количество равно 17.
Напоследок, можно разобрать работу с числовыми условиями, содержащими знаки «больше» («>») или «меньше» («<»). Давайте, например, выясним сколько раз в столбце “Продано” встречается значение больше 350.
- Выполняем уже привычные шаги по вставке функции СЧЕТЕСЛИ в нужную результирующую ячейку.
- В поле диапазон указываем нужный интервал ячеек столбца. Задаем условие “>350” в поле “Критерий” и жмем OK.
- В заранее выбранной ячейке получим итог – 10 ячеек содержат значения больше числа 350.
Метод 5: использование оператора СЧЕТЕСЛИМН
СЧЕТЕСЛИМН – функция, полностью аналогичная СЧЕТЕСЛИ, но позволяет ввести несколько диапазонов с одинаковыми или разными условиями.
Например, нам нужно посчитать количество товаров, которые проданы более 300 шт, а также, товары, чья стоимость более 6000 руб.
Разберем, как это сделать при помощи функцией ЧТОЕСЛИМН:
- В Мастере функций уже хорошо знакомым способом находим оператор СЧЕТЕСЛИМН, который находится все в той же категории “Статические” и вставляем в ячейку для вывода результата, нажав кнопку OK.
- Кажется, что окно настроек функции не отличается от СЧЕТЕСЛИ, но как только мы введем данные первого условия, появятся поля для ввода второго.
- В поле «Диапазон 1» вводим координаты столбца, содержащего данные по продажам в шт. В поле «Условие 1» согласно нашей задаче пишем “>300”.
- В «Диапазоне 2» указываем координатами столбца, который содержит данные по ценам. В качестве «Условия 2», соответственно, указываем “>6000”.
- Нажимаем OK и получаем в итоговой ячейке число, сообщающее нам, сколько раз в выбранных диапазонах встретились ячейки с заданными нами параметрами. В нашем примере число равно 14.
Метод 6: функция СЧИТАТЬПУСТОТЫ
В некоторых случаях перед нами может стоять задача – посчитать в массиве данных только пустые ячейки. Тогда крайне полезной окажется функция СЧИТАТЬПУСТОТЫ, которая проигнорирует все ячейки, за исключением пустых.
По синтаксису функция крайне проста:
=СЧИТАТЬПУСТОТЫ(диапазон)
Порядок действий практически ничем не отличается от вышеперечисленных:
- Выбираем ячейку, куда хотим вывести итоговый результат по подсчету количества пустых ячеек.
- Заходим в Мастер функций, среди статистических операторов выбираем “СЧИТАТЬПУСТОТЫ” и нажимаем ОК.
- В окне «Аргументы функции» указываем нужный диапазон ячеек и кликаем по кнопку OK.
- В заранее выбранной нами ячейке отобразится результат. Будут учтены исключительно пустые ячейки и проигнорированы все остальные.
Заключение
Программа Microsoft Excel – крайне мощный инструмент, способный решать множество проблем самого разного уровня сложности. Даже в простейшей задаче по подсчету количества значений программа может сильно облегчить жизнь пользователю, причем несколькими разными способами. На каком именно способе подсчета количества значений из перечисленных в данной статье остановиться – зависит от ваших целей и задач.
Если кратенько. Есть статистика за несколько лет, собраная в книгах (срезы за период). Её необходимо обработать, для этого нужно объединять несколько книг в одну. Часть данных переносится (типа «название» и т.п.), часть суммируется(сумма). Проблема в том что эксель 2003. И просто собрать данные на 1 лист я не могу. делаю следующее:
1. Открываю книги по очереди
2. Лист в массив загоняется
3. Массив обрабатывается, в результате имеем динамический массив с невыясненым кол-вом элементов
4. Эти массивы объединяются в один и вставляются в книгу. И тут желательно, чтобы пустых строк не было, т.к. не влезет и некрасиво.
Файл прилагаю. Его можно размножить (копированием) и посмотреть итог. код:
Sub массив3()
Dim aa(), bb() As Variant, cc() As Variant, dd(), ee(), gg(), hh(), ll(), a%, b%, c%, e%, f%, g%, h%
ReDim dd(1 To 1000, 1 To 4)
h = 1
With Application
v = .GetOpenFilename(«Excel Files (*.xl*),*.xl*,All Files (*.*),*.*», , «Выберите файлы», , True)
If Not IsArray(v) Then Exit Sub
.EnableEvents = False
.ScreenUpdating = False
.DisplayAlerts = False
For Each x In v
Application.Workbooks.Open (x)
d = 1
aa = [a1].CurrentRegion.Value
cc = [a1].CurrentRegion.Value
ReDim bb(1 To UBound(aa), 1 To 4)
For a = LBound(aa) To UBound(aa)
For b = a + 1 To UBound(aa)
If aa(a, 1) = aa(b, 1) And aa(a, 2) = aa(b, 2) Then aa(b, 1) = «»
Next b
Next a
For c = LBound(aa) To UBound(aa)
If aa(c, 1) <> «» Then: bb(d, 1) = aa(c, 1): bb(d, 2) = aa(c, 2): d = d + 1
Next c
For e = LBound(bb) To UBound(bb)
For f = LBound(cc) To UBound(cc)
If (bb(e, 1) = cc(f, 1)) And (bb(e, 2) = cc(f, 2)) Then bb(e, 3) = cc(f, 3): bb(e, 4) = bb(e, 4) + cc(f, 4)
Next f
Next e
ActiveWorkbook.Save
ActiveWorkbook.Close
.Workbooks.Add
[a1:d1].Resize(UBound(bb)) = bb
ee = [a1].CurrentRegion.Value
ActiveWorkbook.Close
For g = LBound(ee) To UBound(ee)
dd(h, 1) = ee(g, 1)
dd(h, 2) = ee(g, 2)
dd(h, 3) = ee(g, 3)
dd(h, 4) = ee(g, 4)
h = h + 1
Next g
Next
.Workbooks.Add
[a1:d1].Resize(UBound(dd)) = dd
d5 = 1
gg = [a1].CurrentRegion.Value
ll = [a1].CurrentRegion.Value
ReDim hh(1 To UBound(gg), 1 To 4)
For a5 = LBound(gg) To UBound(gg)
For b5 = a5 + 1 To UBound(gg)
If gg(a5, 1) = gg(b5, 1) And gg(a5, 2) = gg(b5, 2) Then gg(b5, 1) = «»
Next b5
Next a5
For c5 = LBound(gg) To UBound(gg)
If gg(c5, 1) <> «» Then: hh(d5, 1) = gg(c5, 1): hh(d5, 2) = gg(c5, 2): d5 = d5 + 1
Next c5
For e5 = LBound(hh) To UBound(hh)
For f5 = LBound(ll) To UBound(ll)
If (hh(e5, 1) = ll(f5, 1)) And (hh(e5, 2) = ll(f5, 2)) Then hh(e5, 3) = ll(f5, 3): hh(e5, 4) = hh(e5, 4) + ll(f5, 4)
Next f5
Next e5
.Workbooks.Add
[a1:d1].Resize(UBound(hh)) = hh
End With
End Sub
Содержание
- Виды массивов функций Excel
- Классика жанра – товарный чек
- Разрешите Вас… транспонировать?
- Функция СТРОКА
- Функция СТОЛБЕЦ
- Функция АДРЕС
- Функция ДВССЫЛ
- Функция ВЫБОР (CHOOSE)
- Функция ИНДЕКС (INDEX)
- Функция ПОИСКПОЗ (MATCH)
- Редактирование формулы массива
- Описание категории «Ссылки и массивы»
- ВПР
- Пример применения формулы массива
- ГПР
- Функции для работы со ссылками и массивами
- Функция ГПР
Массив – данные, объединенные в группу. В данном случае группой является массив функций в Excel. Любую таблицу, которую мы составим и заполним в Excel, можно назвать массивом. Пример:
В зависимости от расположения элементов различают массивы:
- одномерные (данные находятся в ОДНОЙ строке или в ОДНОМ столбце);
- двумерные (НЕСКОЛЬКО строк и столбцов, матрица).
Одномерные массивы бывают:
- горизонтальными (данные – в строке);
- вертикальными (данные – в столбце).
Примечание. Двумерные массивы Excel могут занимать сразу несколько листов (это сотни и тысячи данных).
Формула массива – позволяет обработать данные из этого массива. Она может возвращать одно значение либо давать в результате массив (набор) значений.
С помощью формул массива реально:
- подсчитать количество знаков в определенном диапазоне;
- суммировать только те числа, которые соответствуют заданному условию;
- суммировать все n-ные значения в определенном диапазоне.
Когда мы используем формулы массива, Excel видит диапазон значений не как отдельные ячейки, а как единый блок данных.
Классика жанра – товарный чек
Задача: рассчитать общую сумму заказа. Если идти классическим путем, то нужно будет добавить столбец, где перемножить цену и количество, а потом взять сумму по этому столбцу. Если же применить формулу массива, то все будет гораздо красивее:
- выделяем ячейку С7
- вводим с клавиатуры =СУММ(
- выделяем диапазон B2:B5
- вводим знак умножения (звездочка)
- выделяем диапазон C2:C5 и закрываем скобку функции СУММ – в итоге должно получиться так:
- чтобы Excel воспринял нашу формулу как формулу массива жмем не Enter, как обычно, а Ctrl + Shift + Enter
Вуаля!
Т.е. Excel произвел попарное умножение элементов массивов B2:B5 и C2:C5 и образовал новый массив стоимостей (в памяти компьютера), а затем сложил все элементы этого нового массива.
Обратите внимание на фигурные скобки, появившиеся в формуле – отличительный признак формулы массива. Вводить их вручную с клавиатуры бесполезно – они автоматически появляются при нажатии Ctrl + Shift + Enter.
Разрешите Вас… транспонировать?
При работе с таблицами часто возникает необходимость поменять местами строки и столбцы, т.е. развернуть таблицу на бок, чтобы данные, которые раньше шли по строке, теперь располагались в столбцах и наоборот. В математике такая операция называется транспонированием. При помощи формулы массива и функции ТРАНСП (TRANSPOSE) это делается на раз.
Допустим, имеем двумерный массив ячеек, который хотим транспонировать.
- Выделяем диапазон ячеек для размещения транспонированной таблицы. Поскольку исходный массив ячеек был 8 строк на 2 столбца, то надо выделить диапазон пустых ячеек размером 2 строки на 8 столбцов.
- вводим функцию транспонирования =ТРАНСП(
- в качестве аргумента функции выделяем наш массив ячеек A1:B8
жмем Ctrl + Shift + Enter и получаем “перевернутый массив” в качестве результата:
Функция СТРОКА
Определяет и возвращает номер строки указанной ссылкой ячейки.
Синтаксис: =СТРОКА([ссылка]), где аргумент «ссылка» не является обязательным. Если он опущен, но возвращается номер текущей строки.
Пример использования:
=СТРОКА(D4) – результат 4.
=СТРОКА() – функция вернет номер строки, в которой она расположена.
Функция СТОЛБЕЦ
Возвращает номер столбца ячейки, указанной ссылкой.
Синтаксис: =СТОЛБЕЦ([ссылка]), где «ссылка» не обязательный аргумент. По умолчанию возвращается номер текущего столбца.
Пример использования:
=СТОЛБЕЦ(C4) – формула вернет значение 3.
=СТОЛБЕЦ() – функция возвращает номер столбца, в котором расположена.
Функция АДРЕС
Возвращает текст, представляющий адрес ячейки, заданной номерами строки и столбца.
Синтаксис: =АДРЕС(строка; столбец; [тип_закрепления]; [стиль_ссылки]; [имя_листа]), где:
- Строка – обязательный аргумент. Число, представляющая номер строки, для которой необходимо вернуть адрес;
- Столбец – обязательный аргумент. Число, представляющее номер столбца целевой ячейки.
- тип_закрепления – необязательный аргумент. Число от 1 до 4, обозначающее закрепление индексов ссылки:
- 1 – значение по умолчанию, когда закреплены все индексы;
- 2 – закрепление индекса строки;
- 3 – закрепление индекса столбца;
- 4 – адрес без закреплений.
- стиль_ссылки – необязательный аргумент. Логическое значение:
- ИСТИНА – формат ссылок «A1»;
- ЛОЖЬ – формат ссылок «R1C1».
- имя_листа – необязательный аргумент. Строка, представляющая имя листа, который необходимо добавить к тексту адреса ячейки.
Пример использования:
=АДРЕС=АДРЕС=АДРЕС=АДРЕС
Функция ДВССЫЛ
Преобразует адрес ссылки, заданный текстовой строкой, в ссылку на данный адрес.
Синтаксис: =ДВССЫЛ(адрес_ссылки; [стиль_ссылки]), где
- адрес_ссылки – обязательный аргумент. Строка, представляющая адрес ссылки на ячейку или диапазон. Например, “C3”, “R3C3” или “D8:D9”.
- стиль_ссылки – необязательный аргумент. Логическое значение, определяющее стиль ссылки:
- ИСТИНА – стиль A1. Является значением по умолчанию;
- ЛОЖЬ – стиль R1C1.
Пример использования:
=ДВССЫЛ(“a3”) – возвращает ссылку на ячейку A3.
=ДВССЫЛ(“r3c3”) – вернет ошибку #ССЫЛКА!, так как текст для ссылки в формате R1C1, а второй аргумент имеет значение по умолчанию.
=ДВССЫЛ(“r3c3”; ЛОЖЬ) – возвращает ссылку на ячейку C3.
=ДВССЫЛ(АДРЕС(СТРОКА(C3);СТОЛБЕЦ(C3))) – функция вернет аналогичный предыдущему примеру результат.
Вложение функции ДВССЫЛ со ссылкой на диапазон:
Функция ВЫБОР (CHOOSE)
Позволит вам выбрать значение из общего списка по указанному номеру позиции:
=ВЫБОР(2;”Стул”;”Стол”;”Шкаф”;”Диван”)
Функция ИНДЕКС (INDEX)
Эта функция возвращает указанное значение из одно- или двумерного диапазона:
=ИНДЕКС(A1:C6;4;3)
Как видно с примера, полученное значение 37, в указанном диапазоне стоит на пересечении строки №4 и столбика №3 в диапазоне A1:C6 указанном в формуле. В более простом примере показано как в диапазоне С1:С6, на 2 месте находится значение 15:
=ИНДЕКС(С1:С6;2)
Функция ПОИСКПОЗ (MATCH)
Эта функция вернет позицию значения, которое вы будете искать в указанном диапазоне:
=ПОИСКПОЗ(B3;B2:B5;0)
С примера вы можете видеть что слово «Стол» занимает 2 позицию в указанном диапазоне. Замечу, что третий аргумент в функции не является обязательным. При введенном значении 0, функция вернет ту позицию элемента массива, которое точно совпадает со значением, которое мы ищем. В случае, когда точное совпадение отсутствует, функция выдаст ошибку #Н/Д (#N/A).
Редактирование формулы массива
Если формула массива расположена не в одной ячейке (как в Примере 1), а в нескольких ячейках (как в Примере 2), то Excel не позволит редактировать или удалить одну отдельно взятую формулу (например в ячейке D10) и выдаст предупреждающее сообщение Невозможно изменить часть массива.
Для редактирования формулы массива необходимо выделить весь диапазон (A10:H11 в нашем случае) и изменить формулу в строке формул (или нажав F2). Затем необходимо повторить ввод измененной формулы массива, нажав сочетание клавиш Ctrl + Shift + Enter.
Excel также не позволит свободно перемещать ячейки, входящие в формулу массива или добавлять новые строки-столбцы-ячейки в диапазон формулы массива (т.е. в диапазон A10:H11 в нашем случае)
Описание категории «Ссылки и массивы»
Категория функций «Ссылки и массивы», другое название категории «Функции просмотра» используются для поиска значений в списках или таблицах, манипулирования диапазоном данных, а также, для получения дополнительной информации, например, информации о количестве строк или столбцов диапазона.
Ярким представителем функций данной категории является самая популярная функция ВПР, которая позволяет найти значение из ячейки диапазона, выполнив поиск в первом столбце этого же диапазона
Принцип работы функции ВПР из категории «Ссылки и массивы»
ВПР
Функция ВПР (VLOOKUP) ищет значение в крайнем левом столбце таблицы и возвращает значение ячейки, находящейся в указанном столбце той же строки.
- Вставляем функцию ВПР:
=ВПР(A2;$E$4:$G$7;3;ЛОЖЬ)
=VLOOKUP(A2,$E$4:$G$7,3,FALSE)
Пояснение:
- Функция ВПР ищет значение ID (104) в крайнем левом столбце диапазона $E$4:$G$7 и возвращает значение из третьего столбца той же строки (так как третий аргумент функции имеет значение 3).
- Четвёртый аргумент функции равен ЛОЖЬ (FALSE) – это значит, что либо будет найдено точное совпадение, либо будет показано сообщение об ошибке #Н/Д (#N/A).
- Потащите мышью, чтобы скопировать функцию ВПР из ячейки B2 вниз по столбцу до ячейки B11.Пояснение: Когда мы копируем функцию ВПР вниз, абсолютная ссылка $E$4:$G$7 остаётся неизменной, в то время как относительная ссылка A2 изменяется на A3, A4, A5 и так далее.
Пример применения формулы массива
Наиболее простой задачей, которой можно проиллюстрировать мощь формулы массива, является простой товарный чек. То есть у нас есть наименование товаров, их количество и цена за единицу. На выходе мы должны получить общую сумму покупки.
Как бы мы решали данную задачу стандартным образом?
Во-первых, мы бы получили итоговую сумму по каждому товару, перемножив количество товара на его цену.
Ну а затем просуммировали бы получение суммы, для получения итоговой. То есть нам бы потребовался дополнительный столбец для промежуточных вычислений.
Ту же самую задачу можно решить с помощью простейшей формулы массива.
Нам нужно получить сумму, поэтому воспользуемся соответствующей функцией СУММ. А вот суммировать мы должны произведение цены товара на его количество, что мы и сделаем – выбираем диапазон значений из столица B и умножаем его на аналогичный диапазон значений столбца C.
Если сейчас нажать Enter, то появится ошибка.
Так как мы в формуле использовали диапазоны (массивы) данных, то и формула должна быть формулой массива. Для этого нужно нажать сочетание клавиш Ctrl + Shift + Enter и получим результат.
Что произошло и как работает формула массива? Это важно понять, так как в дальнейшем можно будет применять формулы массива для решения намного более заковыристых задач…
Итак, при вычислении формулы массива Excel произвел попарное умножение значений диапазонов B2:B5 и C2:C5. В результате получился массив значений который был просуммирован соответствующей функцией. Мы получили только одно значение итоговой суммы без вспомогательных вычислений.
Обратите внимание на формулу в строке формул. Она заключена в фигурные скобки, которые указывают нам, что мы имеем дело с формулой массива.
Это не текстовые скобки, то есть нельзя их ввести с клавиатуры, чтобы сделать формулу формулой массива. Они появляются автоматически при нажатии сочетания клавиш Ctrl + Shift + Enter. Если после создания формулы массива вам необходимо ее отредактировать, то в конце необходимо вновь нажать сочетание клавиш, а не просто клавишу Enter.
ГПР
Похожим образом работает и функция ГПР (HLOOKUP):
Функции для работы со ссылками и массивами
В Excel имеется ряд функций для обработки ссылок и массивов: вычисление номеров строки или столбца таблицы по имени ссылки, определение количества столбцов (строк) ссылки или массива, выбор значения по номеру индекса и т. д.
Таблица 4.10. Функции для работы со ссылками и массивами.
АДРЕС | Создает адрес ячейки в виде текста, используя номер строки и номер столбца. |
ВПР | Просматривает левый столбец массива в поисках определенного значения и возвращает значение из указанной ячейки. |
ВЫБОР | Использует номер индекса, чтобы выбрать и вернуть значение из списка аргументов-значений. |
ГИПЕРССЫЛКА | Создание ссылки, открывающей документ, находящийся на жестком диске, сервере сети или Internet. |
ГПР | Просматривает верхнюю строку массива в поисках определенного значения и возвращает значение из указанной ячейки. |
двссыл | Возвращает ссылку, заданную аргументом ссылка на ячейку. |
ИНДЕКС | Выбирает по индексу значение из ссылки или массива. |
ОБЛАСТИ | Возвращает количество областей в ссылке. Область – это интервал смежных ячеек или отдельная ячейка. |
ПОИСКПОЗ | Возвращает относительную позицию элемента массива. |
ПОЛУЧИТЬ.ДАННЫЕ. СВОДНОЙ.ТАБЛИЦЫ | Получение данных сводной таблицы |
ПРОСМОТР | Ищет значения в векторе или массиве. |
СМЕЩ | Возвращает ссылку заданной высоты и ширины, отстоящую от другой ссылки на заданное количество строки и столбцов. |
СТОЛБЕЦ | Возвращает номер столбца по заданной ссылке. |
СТРОКА | Возвращает номер строки, определяемой ссылкой. |
ТРАНШ | Возвращает транспонированный массив. |
ЧИСЛСТОЛБ | Возвращает количество столбцов в ссылке или массиве. |
ЧСТРОК | Возвращает количество строк в ссылке или массиве. |
Функция ГПР
Горизонтальное первое равенство. Ищет совпадение по ключу в первой строке определенного диапазона и возвращает значение из указанной строки этого диапазона в совпавшем с ключом столбце.
Синтаксис: =ГПР(ключ; диапазон; номер_строки; [интервальный_просмотр]).
Так как функция аналогична функции ВПР, за исключением того, что использует горизонтальные таблицы вместо вертикальных, то описания и примеры использования подходят и для ГПР с учетом упомянутых различий.
Источники
- https://exceltable.com/master-klass/massivy-funktciy-excel
- https://www.planetaexcel.ru/techniques/2/91/
- https://office-menu.ru/uroki-excel/13-uverennoe-ispolzovanie-excel/45-funktsii-ssylok-i-massivov-excel
- https://topexcel.ru/5-osnovnyx-funkcii-dlya-raboty-s-massivami/
- https://msoffice-prowork.com/ref/excel/excelfunc/lookup-reference/
- https://office-guru.ru/excel/funkcii-excel-dlja-raboty-so-ssylkami-i-massivami-515.html
- https://zen.yandex.ru/media/id/5c4d8a530aaeef00ac928ac3/5cb46bff23aed400b46a0c52
- http://samoychiteli.ru/document37861.html