Привет всем. Написал формулу, которая ищет первое значение в диапазоне, которое отличается от первого значения ячейки диапазона ={ПОИСКПОЗ(1;--($B$17:$B$63<>$B$17);0)} (например, 4 4 4 4 4 4 2 3 5 4 4 4 4 4, даст позицию 7)
Подскажите, пожалуйста, как это можно сделать? Спасибо заранее.
ПС если по сути задачи, мне нужно в VBA получить диапазон от первого значения до последнего одинакового. Первое значение диапазона по activecell находится, ни могу понять, как найти последнее. ППС пробовал *1 вместо --, тоже без успеха.
Евгений, файл-пример в студию)) если без него, то простой цикл по Range (просто, но не быстро) или забирать диапазон в массив и проверять уже массив (не особо сложнее, но много быстрее). А вообще напишите, какую именно задачу вы хотите решить этой функцией (собственно, надеялся это в примере увидеть). Есть подозрение, что можно по-другому её решить… И вообще, зачем вам формула именно массива??? В общем слишком много вопросов)))
Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел) ►Благодарности сюда◄
Function position_search(Диапазон As Range)
fr = Диапазон .Row
lr = Диапазон .Row + Диапазон .Rows.Count - 1
val_ = Cells(fr, Диапазон .Column).Value
For r = fr + 1 To lr
If Cells(r, Диапазон .Column).Value <> val_ Then
Exit For
End If
Next r
position_search = r - fr + 1
End Function
Sub bb()
Dim Range2 As Range, v
Set Range2 = Range("B17:B63")
v = Evaluate(Replace(Replace( _
"MATCH(TRUE,%rng%<>%cell%,)" _
, "%rng%", Range2.Address(, , Application.ReferenceStyle)) _
, "%cell%", Range2(1).Address(, , Application.ReferenceStyle)))
Debug.Print v
End Sub
Function FirstNonFirstPos&(rg As Range)
Dim s$
s = Join(WorksheetFunction.Transpose(WorksheetFunction.Transpose(rg.Value)), "")
FirstNonFirstPos = InStr(s, Left(Replace(s, Left(s, 1), ""), 1))
End Function
Программисты - это люди, решающие проблемы, о существовании которых Вы не подозревали, методами, которых Вы не понимаете!
Народ, спасибо огромное. Прошу прощения, что пример не приложил сразу, я в рабочем файле делал, не хотел палить. Я попробую предложенные решения, и выложу файл, который будет работать (там заодно будет понятно, что именно я пытаюсь сделать). Мне потребуется некоторое время, чтобы разобраться(
Раз уж на то пошло, то и решение с помощью массивов пусть будет))) работает и с текстом и с числами Формула НЕмассивная
Код
Option Explicit
Public Function ПоискПозицииОтличия(где_ищем As Range) As Long
Dim arr(), valFirst
Dim i&
If где_ищем.Cells.Count < 2 Then Exit Function
valFirst = где_ищем(1).Value
arr() = где_ищем.Value
For i = 2 To UBound(arr())
If arr(i, 1) <> valFirst Then ПоискПозицииОтличия = i: Exit Function
Next i
ПоискПозицииОтличия = 0
End Function
Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел) ►Благодарности сюда◄
В общем, попытался такой список сделать, чтобы окна сворачивались/разворачивались в зависимости от уровня отступов (indentlevel). Работает на уровне 4, на остальных нет. Надо, чтобы значение v было максимальным из двух возможных (на листе столбцы e:g). Не могу понять, почему VBA код не работает (логика replace сложна для меня).
Евгений написал: В общем, попытался такой список сделать, чтобы окна сворачивались/разворачивались в зависимости от уровня отступов
собсна, о чём я и говорил про конечную цель, напзвание темы и прочее))) продолжим: а эти списки вам на кой? Что вы пытаетесь сделать?
P.S.: по теме поста задача, как мне кажется, решена полностью
Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел) ►Благодарности сюда◄
Jack Famous написал: а эти списки вам на кой? Что вы пытаетесь сделать?
Строю в excel прототип для BI, внешний вид и прототип работы основных элементов. Конкретно этот список - меню. ... Сделал расчеты на листе, стало лучше работать, но все еще куча глюков... в общем, сложнее оказалось, чем сначала думал.