Страницы: 1
RSS
Формула определяющая номер строки (например) для ячейки в которой хоть что-нть есть
 
=МИН(ЕСЛИ(ДЛСТР(СТРОКА(Лист1!1:65536))>0;СТРОКА(Лист1!1:65536)))  
/как формула массива/  
 
по задумке должна возвращать номер первой по счету строки в которой хоть что-нибудь есть  
(формула находится на листе Лист2, книга с этими листами создана и сохранена)  
 
почему она не работает?
 
Потому, что, если ее чуть преобразовать, то получим  
=МИН(ЕСЛИ(ДЛСТР(1:65536)>0;СТРОКА(Лист1!1:65536)));  
в любом случае ДЛСТР(1:65536)>0=истина;  
если проверять по столбцу А:А, то  
=МИН(ЕСЛИ(ДЛСТР(A1:A65536);СТРОКА(Лист1!1:65536)))  
не проверял
 
Потому что минимальная длинна строки массива СТРОКА(Лист1!1:65536)= 1
 
Формула  
=МИН(ЕСЛИ(ДЛСТР(1:65536)>0;СТРОКА(Лист1!1:65536)))  
 
вероятно, должна считать то что нужно, но после ввода ее в ячеку было получено сообщение суть которого в том, что ресурсы Эксель закончились... И это при том, что это единственная формула в книге...  
 
Вопрос остался: с пом. формулы определить номер самой первой по счету строки в которой находится хотя бы что-то (любое значение). Но чтобы формуле, конечно, хватало ресурсов..  
:-)
 
1. Если хотите искать по всему листу, то формула должна быть на другом листе - иначе циклическая ссылка.  
2. Для поиска по всему листу поставте комп по-мощнее; 64 бит операционку и 8 гигов памяти...  
Вывод - в этом случае макрос незаменим.
 
=ПОИСКПОЗ("*";A:A;)
 
{quote}{login=Excel-Ok}{date=21.03.2011 01:48}{thema=}{post}=ЕСЛИ(ДЛСТР(1:65536);СТРОКА(1:65536)){/post}{/quote}  
Вы заставляете Excel создавать массив из (хорошо еще, если Excel-2003) 65536*256 значений, вот он и возмущается. И правильно делает :)  
Задайте диапазон ячеек. И такой, чтобы формула в него не попадала (зацикливание).
 
{quote}{login=Казанский}{date=21.03.2011 02:07}{thema=}{post}=ПОИСКПОЗ("*";A:A;){/post}{/quote}  
только для строк. числа, даты и логические значения не найдет.
фрилансер Excel, VBA - контакты в профиле
"Совершенствоваться не обязательно. Выживание — дело добровольное." Э.Деминг
 
{quote}{login=ikki}{date=21.03.2011 02:15}{thema=Re: }{post}{quote}{login=Казанский}{date=21.03.2011 02:07}{thema=}{post}=ПОИСКПОЗ("*";A:A;){/post}{/quote}  
только для строк. числа, даты и логические значения не найдет.{/post}{/quote}М-да, действительно. Такой вот костыль, массив:  
 
=ПОИСКПОЗ("?";ЛЕВСИМВ(A:A;1);)
 
{quote}{login=Казанский}{date=21.03.2011 02:28}{thema=Re: Re: }  
=ПОИСКПОЗ("?";ЛЕВСИМВ(A:A;1);){/post}{/quote}  
 
другое дело :)  
работает также =ПОИСКПОЗ(0;ЕСЛИ(ЕПУСТО(A:A);1;0);0) (тоже массив)  
 
интересно... что быстрее?..  
 
но... автору темы надо было не это :(
фрилансер Excel, VBA - контакты в профиле
"Совершенствоваться не обязательно. Выживание — дело добровольное." Э.Деминг
 
Эту формулу можно упростить:  
 
=ПОИСКПОЗ(ЛОЖЬ;ЕПУСТО(A:A);)  
 
Но есть нюанс: она считает непустой ячейку, в которой содержится пустая строка, например формула ="" или результат копирования-вставки как значения такой ячейки.  
Предыдущие формулы такую ячейку считают пустой.
 
{quote}{login=Казанский}{date=21.03.2011 02:46}{thema=ikki}{post}Эту формулу можно упростить:  
 
=ПОИСКПОЗ(ЛОЖЬ;ЕПУСТО(A:A);)  
 
Но есть нюанс: она считает непустой ячейку, в которой содержится пустая строка, например формула ="" или результат копирования-вставки как значения такой ячейки.  
Предыдущие формулы такую ячейку считают пустой.{/post}{/quote}  
 
угум. я тоже думал, что можно упростить.  
но упрощенная - она работает НЕПРАВИЛЬНО.    
например, если в первой ячейке пусто, во второй - дата, а третья снова пустая, то такая формула дает #Н/Д.    
а вот если третья - тоже дата, то результат равен 3.  
 
неупрощенная - работает правильно во всех случаях.  
вообще-то странно.  
 
пс. у меня Excel 2003... можть, глючный какой?
фрилансер Excel, VBA - контакты в профиле
"Совершенствоваться не обязательно. Выживание — дело добровольное." Э.Деминг
 
{quote}{login=Казанский}{date=21.03.2011 02:46}{thema=ikki}{post}Эту формулу можно упростить:  
 
=ПОИСКПОЗ(ЛОЖЬ;ЕПУСТО(A:A);){/post}{/quote}  
=ПОИСКПОЗ(ЛОЖЬ;ЕПУСТО(A:A);0) (по умолчанию  1)
 
Нет. Если бы было так =ПОИСКПОЗ(ЛОЖЬ;ЕПУСТО(A:A))  
это было бы как по умолчанию =ПОИСКПОЗ(ЛОЖЬ;ЕПУСТО(A:A);1)  
 
А =ПОИСКПОЗ(ЛОЖЬ;ЕПУСТО(A:A);) эквивалентно =ПОИСКПОЗ(ЛОЖЬ;ЕПУСТО(A:A);0)
 
{quote}{login=Михаил}{date=21.03.2011 03:22}{thema=Re: ikki}{post}{quote}{login=Казанский}{date=21.03.2011 02:46}{thema=ikki}{post}Эту формулу можно упростить:  
 
=ПОИСКПОЗ(ЛОЖЬ;ЕПУСТО(A:A);){/post}{/quote}  
=ПОИСКПОЗ(ЛОЖЬ;ЕПУСТО(A:A);0) (по умолчанию  1){/post}{/quote}  
 
разобрался.  
мне, кшн, стыдно, но страна должна знать своих героев.  
Excel реабилитирован.  
оказалось, что это я глючный :)  
 
формулы =ПОИСКПОЗ(ЛОЖЬ;ЕПУСТО(A:A);) и =ПОИСКПОЗ(ЛОЖЬ;ЕПУСТО(A:A);0) - это одно и то же.  
но, если умудриться не заметить последний ";" в первой формуле, т.е. набрать =ПОИСКПОЗ(ЛОЖЬ;ЕПУСТО(A:A)), то она, есс-но будет понята как =ПОИСКПОЗ(ЛОЖЬ;ЕПУСТО(A:A);1) и будет работать "неправильно".  
 
вот такие нюансы.
фрилансер Excel, VBA - контакты в профиле
"Совершенствоваться не обязательно. Выживание — дело добровольное." Э.Деминг
 
Вероятно, что то, что хочется формулами сделать не удастся..  
:(
 
{quote}{login=Казанский}{date=21.03.2011 03:31}{thema=}{post}Нет.{/post}{/quote}  
ну вот ) пока писал, а тут уже и ответ готов.  
но я таки сам допёр. :)
фрилансер Excel, VBA - контакты в профиле
"Совершенствоваться не обязательно. Выживание — дело добровольное." Э.Деминг
 
{quote}{login=Excel-Ok}{date=21.03.2011 03:36}{thema=}{post}Вероятно, что то, что хочется формулами сделать не удастся..  
:({/post}{/quote}  
встроенными функциями - наверное, нет.  
но, если Вам так принципиально наличие формулы, то можно сделать UDF, а в макросе - поиск или перебор в цикле For Each.  
но всё равно, как Вам уже сказали, циклических ссылок создавать не нужно.  
то есть можно искать по всему листу (если очень надо), но с другого листа.
фрилансер Excel, VBA - контакты в профиле
"Совершенствоваться не обязательно. Выживание — дело добровольное." Э.Деминг
 
=ПОИСКПОЗ(;--ЕПУСТО(A1:A100);)
 
Ну вот, пришел Формулист :)  
В данном случае один минус лишний: =ПОИСКПОЗ(;-ЕПУСТО(A:A);)  
 
> Вероятно, что то, что хочется формулами сделать не удастся.. :(  
Ну почему же :)  
Вот функция для первых 999 строк Лист2, массив  
 
=МИН(СТРОКА(Лист2!1:999)*ЕСЛИ(ЕПУСТО(Лист2!1:999);9E+99;1))
 
До двух знаков ужмем? :)  
=ПОИСКПОЗ(;-(A:A="");)
 
вотЬ  
UDF  
вообще-то проверял, но, если чё - прошу сильно не бить.  
 
Public Function хотьчтонибудь(target As Range) As Long  
 Set r = target.Worksheet.UsedRange  
 хотьчтонибудь = 0  
 For Each c In r.Rows  
   If Not c.Find(What:="*", LookIn:=xlFormulas, _  
LookAt:=xlPart, MatchCase:=False) Is Nothing Then  
     хотьчтонибудь = c.Row  
     Exit Function  
   End If  
 Next c  
End Function  
 
применение: =хотьчтонибудь(Лист1!A:IV)  
можно и для текущего листа: =хотьчтонибудь(A:IV)
фрилансер Excel, VBA - контакты в профиле
"Совершенствоваться не обязательно. Выживание — дело добровольное." Э.Деминг
 
Если Find, то зачем цикл :)  
 
Set r = target.Worksheet.cells.Find(...  
if not r is nothing then хотьчтонибудь = r.row  
 
Только вот метод Find не работает в UDF в моем любимом 2000 :(
 
{quote}{login=Казанский}{date=21.03.2011 04:51}{thema=}{post}Если Find, то зачем цикл :)  
 
Set r = target.Worksheet.cells.Find(...  
if not r is nothing then хотьчтонибудь = r.row  
 
Только вот метод Find не работает в UDF в моем любимом 2000 :({/post}{/quote}  
 
мда... усложнил малость.  
все равно это должно работать быстрее, чем формулы массива, тем более смотрим не весь лист, а UsedRange.  
но, кшн, можно и без цикла.  
но тогда обязательно надо задать в Find SearchOrder:=xlByRows
фрилансер Excel, VBA - контакты в профиле
"Совершенствоваться не обязательно. Выживание — дело добровольное." Э.Деминг
 
{quote}{login=The_Prist}{date=21.03.2011 05:06}{thema=}{post}А вместо Find лучше вообще массивы использовать... {/quote}  
 
ну виртуозы!!!  
и, самое главное - обработает скрытые строки/столбцы и будет работать в любом Эксе, хоть в 97-м.  
 
The_Prist, снимаю шляпу.
фрилансер Excel, VBA - контакты в профиле
"Совершенствоваться не обязательно. Выживание — дело добровольное." Э.Деминг
 
Не спеши со шляпой ;)  
Сравни с дополненным вариантом:  
 
Public Function хотьчтонибудь(target As Range) As Long  
Dim avArr, lr As Long, lc As Long, r As Range  
Set r = target.Parent.UsedRange  
If r.Count = 1 Then  
   If r <> "" Then хотьчтонибудь = r.Row  
   Exit Function  
Else  
avArr = r.Value  
For lr = 1 To UBound(avArr, 1)  
For lc = 1 To UBound(avArr, 2)  
If Len(avArr(lr, lc)) Then  
хотьчтонибудь = lr: Exit For  
End If  
Next lc  
If хотьчтонибудь > 0 Then Exit For  
Next lr  
End If  
хотьчтонибудь = хотьчтонибудь + r.Row - 1  
End Function  
 
в случае если:  
- лист пустой;  
- занята одна ячейка;  
- Usedrange не начинается с 1 строки.  
 
Чтобы ф-я пересчитывалась при изменении на листе, надо добавить  
Application.Volatile
 
А макрофункции чего никто не предложил? :)  
На листе единственная заполненная ячейка - G18, формула в ней возвращает свое же местоположение по строкам. По идее, если заполнять данные выше ее - она должна возвращать номер первой строки, в которой есть данные. Хоть и работает это шустро, но к применению неудобно...
 
А где нужно размещать все эти "Public Function хотьчтонибудь(target As Range) As Long"? на этом же листе? они не зациклятся при этом?
Страницы: 1
Читают тему
Наверх