Это глава из книги Билла Джелена Гуру Excel расширяют горизонты: делайте невозможное с Microsoft Excel.
Задача: требуется формула, которая позволяла найти первое непустое значение в строке, т.е., возвращала бы номер первой непустой ячейки в строке. Предположим, что данные представлены в столбцах С:K (рис. 1).
Рис. 1. Формула находит первую непустую ячейку в каждой строке и возвращает ее номер в массиве
Скачать заметку в формате Word или pdf, примеры в формате Excel
Решение: формула в А2: =ПОИСКПОЗ(1;ИНДЕКС(1-ЕПУСТО(C2:K2);1;0);0). Хотя эта формула имеет дело с массивом ячеек, она в конечном счете возвращает одно значение, так что использовать при вводе нажатие Ctrl+Shift+Enter не требуется (о формулах массива см. Майкл Гирвин. Ctrl+Shift+Enter. Освоение формул массива в Excel).
Рассмотрим работу формулы подробнее. Функция ЕПУСТО возвращает ИСТИНА, если ячейка является пустой, и ЛОЖЬ, если ячейка – не пустая. Посмотрите на строку данных в С2:К2. ЕПУСТО(С2:К2) возвратит массив: {ИСТИНА;ИСТИНА;ЛОЖЬ;ИСТИНА;ИСТИНА;ИСТИНА;ИСТИНА;ИСТИНА;ИСТИНА}.
Обратите внимание, что далее этот массив вычитается из 1. При попытке использовать значения ИСТИНА и ЛОЖЬ в математической формуле, значение ИСТИНА интерпретируется как 1, а значение ЛОЖЬ – как 0. Задавая 1-ЕПУСТО(С2:К2), вы преобразуете массив логических значений ИСТИНА/ЛОЖЬ в числовую последовательность нулей и единиц: {0;0;1;0;0;0;0;0;0}.
Итак, фрагмент формулы 1-ЕПУСТО(С2:К2) возвращает массив {0;0;1;0;0;0;0;0;0}. Это немного странно, так как от такого фрагмента Excel ожидает, что вернется одно значение. Странно, но не смертельно. Функция ИНДЕКС также обычно возвращает одно значение. Но вот, что написано в Справке Excel: Если указать в качестве аргумента номер_строки или номер_столбца значение 0 (ноль), функция ИНДЕКС возвратит массив значений для целого столбца или целой строки соответственно. Чтобы использовать значения, возвращенные как массив, введите функцию ИНДЕКС как формулу массива в горизонтальный диапазон ячеек для строки и в вертикальный — для столбца.
Если функция ИНДЕКС возвращает массив, ее можно использовать внутри других функций, ожидающих, что аргумент является массивом.
Итак, указав в качестве третьего аргумента функции ИНДЕКС(1-ЕПУСТО(C2:K2);1;0) значение ноль, мы получим массив {0;0;1;0;0;0;0;0;0}.
Функция ПОИСКПОЗ выполняет поиск искомого значения в одномерном массиве и возвращает относительную позицию первого найденного совпадения. Формула =ПОИСКПОЗ(1,МАССИВ,0) просит Excel найти номер ячейки в МАССИВЕ, которая содержит первую встретившуюся единицу. Функция ПОИСКПОЗ определяет в каком столбце содержится первая непустая ячейка. Когда вы просите ПОИСКПОЗ найти первую 1 в массиве {0;0;1;0;0;0;0;0;0}, она возвращает 3.
Итак =ПОИСКПОЗ(1;ИНДЕКС(1-ЕПУСТО(C2:K2);1;0);0) превращается в =ПОИСКПОЗ(1;{0;0;1;0;0;0;0;0;0};0) и возвращает результат 3.
В этот момент, вы знаете, что третий столбец строки С2:К2 содержит первое непустое значение. Отсюда довольно просто, используя функцию ИНДЕКС, узнать само это первое непустое значение: =ИНДЕКС(МАССИВ;1;3) или =ИНДЕКС(C2:K2;1;ПОИСКПОЗ(1;ИНДЕКС(1-ЕПУСТО(C2:K2);1;0);0)).
Результат: 3
Рис. 2. Формула находит первую непустую ячейку в каждой строке и возвращает значение этой ячейки
Дополнительные сведения: если все ячейки пустые, то формула возвращает ошибку #Н/Д.
Альтернативные стратегии: когда вы из единицы вычитаете значение ЕПУСТО, вы преобразуете логические значения ИСТИНА/ЛОЖЬ в числовые 1/0. Вы могли бы пропустить этот шаг, но тогда вам придется искать ЛОЖЬ в качестве первого аргумента функция ПОИСКПОЗ: =ИНДЕКС(C2:K2;1;ПОИСКПОЗ(ЛОЖЬ;ИНДЕКС(ЕПУСТО(C2:K2);1;0);0)).
Источник.
Доброго времени суток форумчане. Помогите с решением проблемы. Какую формулу применить для определения первой заполненной ячейки (столбец F). Ни чего не нашел подходящего. Попытался обойти поиск первой заполненной ячейки так: в голубой ячейки вписал такую формулу =ПОИСКПОЗ(E1+307;E:E) и думал сделать СМЕЩ на соседнюю ячейку, но не могу получить ссылку на последнюю заполненную ячейку. |
|
vikttur Пользователь Сообщений: 47199 |
Без формул массива, попроще: Формула массива: |
JayBhagavan Пользователь Сообщений: 11833 ПОЛ: МУЖСКОЙ | Win10x64, MSO2019x64 |
rumpelshtitchen, здравия. Не совсем понятно, что значит первая заполненная? IMHO, первая заполненная в зел. столб. — яч. F7. <#0> |
Catboyun Пользователь Сообщений: 1631 |
формула массива:
не обратил внимания — правильно у vikttur Изменено: Catboyun — 23.01.2016 15:06:57 |
vikttur Пользователь Сообщений: 47199 |
Еще, если по примеру: начало вторых измерений=конец первых — искать последнее значение столбца Е |
rumpelshtitchen Пользователь Сообщений: 136 |
#6 23.01.2016 15:10:25
нет, нет…. это моя недоработка, мне необходима формула которая определит первую заполненную ячейку (число) |
||
gling Пользователь Сообщений: 4024 |
#7 23.01.2016 15:17:25 Для первого в Е
Для последнего в F если нет пустых ячеек в столбце между числами
или формула массива
Прикрепленные файлы
|
||||||
Благодарю всех за ответы, но к сожалению это не совсем то что нужно, ну или я рукожоп))))), все выше предложенные варианты выдают ссылку на 14 строку столбца F, а как получить ссылку на ячейку F14 (первая заполненная ячейка для данного варианта), с учетом возможности изменения данной ячейкb (первой заполненной) в диапазоне F1;F100, то есть в диапазоне F1;F100 первой заполненной ячейкой может стать любая… Изменено: rumpelshtitchen — 23.01.2016 15:35:24 |
|
vikttur Пользователь Сообщений: 47199 |
#9 23.01.2016 15:53:25
А кто писал номер в ячейке? Так и поняли, что нужно положение значения. |
||
gling Пользователь Сообщений: 4024 |
А Вы пробовали формулу массива из сообщения #4 только для столбца F, или третью формулу из сообщения #7 изменив 25 на 100? Если да, то что в них не так? |
да, и в том и в том случае выдает «Н/Д» |
|
vikttur Пользователь Сообщений: 47199 |
#12 23.01.2016 17:47:06
Это когда вводить формулу Ctrl+Shift+Enter и она обрамится фигурными скобками. |
||
vikttur,и в том и в том случае выдает цифру 14, я так понимаю это номер строки…. |
|
vikttur Пользователь Сообщений: 47199 |
Кто мешает искать в диапазоне по номеру строки? Посмотрите время размещения сообщений с ответами. Разница между сообщениями с ответами по первому вопросу (секунды, минуты) и ответы после уточнения. Заметно, да? |
дорогие друзья, применил вот такую формулу =ИНДЕКС(E1:E25;ПОИСКПОЗ(9^9;E1:E25))….в принципе то же самое, что и такая ПРОСМОТР(9E+307;E:E) выбирает в желтом столбце последнее значение это «6».. а возможно такое, что бы данный элемент формулы.ПОИСКПОЗ(9^9;E1:E25) был заменен номером ячейки которая нам нужна, ну что то вроде такого:=ИНДЕКС(E1:E25;СМЕЩ(Е14;1;0)) где Е14 является данным куском формулы ПОИСКПОЗ(9^9;E1:E25)???? Изменено: rumpelshtitchen — 23.01.2016 23:33:40 |
|
Catboyun Пользователь Сообщений: 1631 |
#16 24.01.2016 07:50:11
Вам нравятся летучие формулы? |
||
rumpelshtitchen Пользователь Сообщений: 136 |
#17 24.01.2016 11:36:14
нет, нет, мне они не нравятся, но другого варианта в данной ситуации я просто не нашел, спасибо за формулу, формула работает, показывает значение в первой заполненной ячейке, при условии что в данном столбике нет пустых ячеек. |
||
Catboyun Пользователь Сообщений: 1631 |
#18 25.01.2016 07:37:51
=ИНДЕКС(E:E;ПОИСКПОЗ(9^9;E:E)-СЧЁТ(E:E)+1)
если есть пустые, не массивная:
|
||||||
Хитрости »
6 Май 2011 34874 просмотров
Как определить первую заполненную ячейку на листе?
Иногда помимо определения последней заполненной ячейки на листе необходимо определять и первую. Обычно это необходимо для поиска заголовка таблицы, если таблица «плавающая». Т.е. таблица может менять свое положение на листе, а найти где эта таблица начинается все же необходимо, чтобы производить действия исключительно внутри нужных данных. Чтобы найти первую заполненную ячейку с просмотром на всем листе можно применить такой код:
Sub Get_First_Cell() Dim lFirstRow As Long, lFirstCol As Long, rFndRng As Range 'проверяем, есть ли данные в первой ячейке диапазона данных If ActiveSheet.UsedRange.Cells(1, 1) <> "" Then lFirstRow = ActiveSheet.UsedRange.Row lFirstCol = ActiveSheet.UsedRange.Column Else 'ищем ячейку с любым значением(так же с формулой) Set rFndRng = ActiveSheet.UsedRange.Find("*", , xlFormulas, xlWhole) If rFndRng Is Nothing Then MsgBox "Лист не содержит данных", vbInformation, "Информация": Exit Sub End If lFirstRow = rFndRng.Row: lFirstCol = rFndRng.Column End If MsgBox "Номер строки первой заполненной ячейки: " & lFirstRow & vbNewLine & _ "Номер столбца первой заполненной ячейки: " & lFirstCol End Sub
Как видите — все довольно просто. Никаких особых заморочек и трудностей.
Если необходимо определить первую заполненную ячейку в определенном столбце:
Sub Get_First_Cell_InColumn() Dim lFirstRow As Long, rFndRng As Range 'проверяем, есть ли данные в первой ячейке столбца B (2) If ActiveSheet.Columns(2).Rows(1) <> "" Then lFirstRow = 1 Else 'ищем ячейку с любым значением(так же с формулой) Set rFndRng = ActiveSheet.Columns(2).Find("*", , xlFormulas, xlWhole) If rFndRng Is Nothing Then MsgBox "Лист не содержит данных", vbInformation, "Информация": Exit Sub End If lFirstRow = rFndRng.Row End If MsgBox "Номер строки первой заполненной ячейки столбца B: " & lFirstRow End Sub
Если найти нужно первую ячейку, но не учитывая скрытые(т.е. игнорировать при этом скрытые строки и столбцы), то можно попробовать применить такой код:
Sub Get_First_Cell_IgnoreHiddenCells() Dim lFirstRow As Long, lFirstCol As Long, rFndRng As Range 'делаем пропуск ошибок на случай, если на листе нет данных On Error Resume Next 'ищем ячейку с любым значением(так же с формулой) Set rFndRng = ActiveSheet.UsedRange.SpecialCells(xlCellTypeVisible).Find("*", , xlFormulas, xlWhole) 'не нашли ячейку - завершаем процедуру If rFndRng Is Nothing Then MsgBox "Лист не содержит данных", vbInformation, "Информация" Exit Sub Else'нашли ячейку - получаем данные по номеру строки и столбца lFirstRow = rFndRng.Row: lFirstCol = rFndRng.Column MsgBox "Номер строки первой заполненной ячейки: " & lFirstRow & vbNewLine & _ "Номер столбца первой заполненной ячейки: " & lFirstCol End If End Sub
Если искать первую ячейку необходимо не по наличию данных(коды выше определят ячейку, если в ней есть формула или значение), а исключительно по видимому значению(т.е. чтобы даже если в ячейке есть формула, но она не возвращает никакого значения, то такая ячейка не учитывалась), то в любом приведенном выше коде надо в строке:
.Find(«*», , xlFormulas, xlWhole)
заменить xlFormulas на xlValues
Так же см.:
Как определить последнюю ячейку на листе через VBA?
Статья помогла? Поделись ссылкой с друзьями!
Видеоуроки
Поиск по меткам
Access
apple watch
Multex
Power Query и Power BI
VBA управление кодами
Бесплатные надстройки
Дата и время
Записки
ИП
Надстройки
Печать
Политика Конфиденциальности
Почта
Программы
Работа с приложениями
Разработка приложений
Росстат
Тренинги и вебинары
Финансовые
Форматирование
Функции Excel
акции MulTEx
ссылки
статистика
Здравствуйте, форумчане! В Excel-e не новичок, пользуюсь давно, но вот перемкнуло: не получается построить формулу, выбирающую значение из первой непустой ячейки столбца. До сих пор использовал макросы или обходные пути, но чувствую, что должно быть более простое и быстрое решение. Устроит любая форма адресации — ссылка, смещение, номер строки. Заранее спасибо!
Позицию первой непустой ячейки можно вернуть так:
=ПОИСКПОЗ(«?»;A1:A10&»»;) — формула массива (текст и числа)
или:
=ПОИСКПОЗ(«*»;A1:A10 — обычная формула (только текст)
Ну и соответственно возврат самих значений:
=ВПР(«?»;A1:A10&»»;1;) — формула массива (текст и числа) — возвращает числа также в виде текста.
и
=ВПР(«*»;A1:A10;1;) — обычная формула (только текст)
Webmoney: E350157549801 Z116603216205 R268084006579
Не «массивная» формула для поиска номера строки:
=СУММПРОИЗВ(ПОИСКПОЗ(«*?*»;(«»&A1:A23);0))
Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы…
www.excel-vba.ru
Просто СПАСИБО [+оказать+]
Считаешь СПАСИБО мало? Яндекс.Деньги: 41001332272872; WM: R298726502453
Ну раз такое дело, во еще
=ПРОСМОТР(«»;A1:A10&»»;A2:A11)
Webmoney: E350157549801 Z116603216205 R268084006579
Цитата: Axacal от 27.06.2011, 13:40
Формула =ПРОСМОТР(«»;A1:A10&»»;A2:A11) на столбце со смещанным содержимым (пустые клетки, текст, числа) вообще ведет себя некорректно.
У меня работает, см. вложение.
Заодно добавил ещё свой вариантик формулы, который не предлагали ранее.
Цитата: Axacal от 27.06.2011, 13:40
Что означает приклеивание амперсандом пробела к адресу массива (A1:A10&»»)?
Замена пустых строк строками нулевой длинны.
Еще вариант немассивной:
=ПОИСКПОЗ("*?";ИНДЕКС(""&A1:A23;);)
ЦитироватьКстати, что означает приклеивание амперсандом пробела к адресу массива (A1:A10&»»)?
цифры в массиве становятся текстовыми данными
Хочется добавить:
Сцепляется не с пробелом, а со строкой нулевой длины.
Для корректной работы формулы: =ПРОСМОТР(«»;A1:A10&»»;A2:A11) требуется хотябы одна пустая верхняя ячейка.
Webmoney: E350157549801 Z116603216205 R268084006579
Возникла похожая, но «обратная» задача: найти первую пустую строку.
В принципе, мне удались решения с доп. столбцом и с формулой массива, но хочется упростить задачу.
Есть ли у кого-нибудь идеи?
пока придумалась такая формула массива:
=СУММ(C4:ИНДЕКС(C4:$C$13;ПОИСКПОЗ(» «;» «&B4:$B$13;0))*D4:ИНДЕКС(D4:$D$13;ПОИСКПОЗ(» «;» «&B4:$B$13;0)))
Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы…
www.excel-vba.ru
Просто СПАСИБО [+оказать+]
Считаешь СПАСИБО мало? Яндекс.Деньги: 41001332272872; WM: R298726502453
Finding the first blank cell in your workbook can become a fairly repetitive task, especially in situations like adding new rows into a large data set. In this article, we are going to show you how to find the first blank cell in a range in Excel, and also show you how to create a hyperlink to cells directly.
Download Workbook
Formula
Finding the position: {=MATCH(TRUE,ISBLANK(RANGE),0)}
The address: { =CELL(«address»,INDEX(RANGE,MATCH(TRUE,ISBLANK(RANGE),0)))
Hyperlink: {=HYPERLINK(“#”&CELL(«address»,INDEX(RANGE,MATCH(TRUE,ISBLANK(RANGE),0))))}
* range is the reference from the work range
** {} characters are put by Excel automatically. Do not type them.
How it works
Excel doesn’t have a built-in formula to find the first blank cell in a range. However, there is the ISBLANK function, which tests a cell, and returns a Boolean value according to its content. The function returns TRUE if cell is blank, FALSE otherwise. Thus, finding the first FALSE value means to find the first blank cell.
MATCH function can help locate a TRUE value. Once the position is found, you can use it with the INDEX function to return its reference. CELL and HYPERLINK functions can use the reference information to display the address and create a hyperlink.
The problem is that the ISBLANK function can only work with a single cell. You need to use a helper column to populate TRUE and FALSE values which doesn’t sound too practical. Instead, you can forego using a helper column by using an array function.
Use the reference of your range of values in the ISBLANK function. This action will return an array of Boolean values. The first FALSE value indicates the position of the first blank cell in the range. Wrap the function with MATCH to get the position.
Use Ctrl + Shift + Enter key combination instead of just pressing the Enter key to enter the formula as an array formula.
=MATCH(TRUE,ISBLANK(B5:B12),0)
Return address of the first blank cell
The INDEX function has a lesser known feature which is returning the cell reference, instead of its value. Once the reference is found, you can use it with other functions that need a reference. The CELL function is one of them.
The CELL function can return the address of a reference. If you need the address as a string, use the following formula.
=CELL(«address»,INDEX(B5:B12,MATCH(TRUE,ISBLANK(B5:B12),0)))
As you have guess already, this formula needs Ctrl + Shift + Enter as well.
Hyperlink to the first blank cell
The HYPERLINK function has a unique ability like converting a text into a hyperlink. You can create hyperlinks anywhere on an Excel workbook. Just remember to add a “#” character in front. “#” character tells Excel that the following path is an Excel reference.
=HYPERLINK(«#»&CELL(«address»,INDEX(B5:B12,MATCH(TRUE,ISBLANK(B5:B12),0))))