Страницы: 1
RSS
Перенос формулы массива в VBA, (или какой-то другой способ для решения задачи)
 
Привет всем.
Написал формулу, которая ищет первое значение в диапазоне, которое отличается от первого значения ячейки диапазона
={ПОИСКПОЗ(1;--($B$17:$B$63<>$B$17);0)}
(например, 4 4 4 4 4 4 2 3 5 4 4 4 4 4,  даст позицию 7)

Хочу эту логику в VBA перенести, но не знаю, как:
Код
WorksheetFunction.Match(1, --(Range2 <> ActiveCell.Offset(0, -2)), 0)

(это вариант совсем не работает)

Подскажите, пожалуйста, как это можно сделать? Спасибо заранее.

ПС если по сути задачи, мне нужно в VBA получить диапазон от первого значения до последнего одинакового. Первое значение диапазона по activecell находится, ни могу понять, как найти последнее.
ППС пробовал *1 вместо --, тоже без успеха.
Изменено: Евгений - 20.02.2018 16:34:46
 
Евгений, файл-пример в студию))
если без него, то простой цикл по Range (просто, но не быстро) или забирать диапазон в массив и проверять уже массив (не особо сложнее, но много быстрее).
А вообще напишите, какую именно задачу вы хотите решить этой функцией (собственно, надеялся это в примере увидеть). Есть подозрение, что можно по-другому её решить…
И вообще, зачем вам формула именно массива??? В общем слишком много вопросов)))
Изменено: Jack Famous - 20.02.2018 16:51:43
Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел) ►Благодарности сюда◄
 
а что может быть в исходных? (цифры / числа / еще что-то)
Программисты - это люди, решающие проблемы, о существовании которых Вы не подозревали, методами, которых Вы не понимаете!
 
Код
 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
Изменено: U_M0KRH - 20.02.2018 16:58:31
 
Евгений, например так
Код
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
Изменено: Jack Famous - 20.02.2018 18:05:52
Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел) ►Благодарности сюда◄
 
В общем, попытался такой список сделать, чтобы окна сворачивались/разворачивались в зависимости от уровня отступов (indentlevel).
Работает на уровне 4, на остальных нет.
Надо, чтобы значение v было максимальным из двух возможных (на листе столбцы e:g). Не могу понять, почему VBA код не работает (логика replace сложна для меня).

ПС большое спасибо всем, кто ответил)
Изменено: Евгений - 20.02.2018 20:12:07
 
Цитата
Евгений написал:
В общем, попытался такой список сделать, чтобы окна сворачивались/разворачивались в зависимости от уровня отступов
собсна, о чём я и говорил про конечную цель, напзвание темы и прочее)))
продолжим: а эти списки вам на кой? Что вы пытаетесь сделать?

P.S.: по теме поста задача, как мне кажется, решена полностью
Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел) ►Благодарности сюда◄
 
Цитата
Jack Famous написал:
а эти списки вам на кой? Что вы пытаетесь сделать?
Строю в excel прототип для BI, внешний вид и прототип работы основных элементов. Конкретно этот список - меню.
...
Сделал расчеты на листе, стало лучше работать, но все еще куча глюков... в общем, сложнее оказалось, чем сначала думал.
Изменено: Евгений - 22.02.2018 10:20:31
Страницы: 1
Наверх