Соседняя ячейка ближайшего соответствия с использованием функций индекса и сопоставления

#excel #vba #excel-formula

#excel #vba #excel-формула

Вопрос:

У меня есть два столбца: время и позиция, и мне нужно найти соответствующее время позиции, ближайшей к переменной.

время: диапазон B: B позиция: диапазон C: C переменная = цель

Я смог сделать это в Excel, используя следующую формулу, но когда я делаю это в макросах (вставка Application.WorksheetFunction перед индексом, совпадение и минимум), я получаю ошибку

‘Ошибка времени выполнения ‘13’.

Я перечислил данные как диапазоны. Не уверен, что еще делать.

 =INDEX(data,MATCH(MIN(ABS(data-value)),ABS(data-value),0))
  

Комментарии:

1. можете ли вы добавить точный код, который вы использовали с Application.WorksheetFunction

Ответ №1:

Мне было на удивление сложно найти решение. Прежде всего, в vba нельзя вычислить вектор как разность двух других векторов (например, data-value). Я надеюсь, что это сработает для вас.

 Sub mm()
    Dim rdata As Range, rvalue As Range
    Set rdata = Range("A1:A20")
    Set rvalue = Range("B1:B20")
    Dim i As Long
    Dim dt As Variant, vl As Variant, AbsDelta As Variant
    dt = Application.WorksheetFunction.Transpose(rdata.value)
    vl = Application.WorksheetFunction.Transpose(rvalue.value)
    AbsDelta = Application.WorksheetFunction.Transpose(rdata.value) 'just for reserve place 
    For i = LBound(dt) To UBound(dt)
        AbsDelta(i) = Abs(dt(i) - vl(i)) 'This line is updated
    Next i
    Dim minAbsDelta As Double
    minAbsDelta = Application.WorksheetFunction.Min(AbsDelta)
    Range("C1").value = Application.WorksheetFunction.Index(dt, Application.WorksheetFunction.Match( _
        minAbsDelta, AbsDelta, 0))
End Sub
  

Комментарии:

1. Где будет значение поиска? Значение поиска находится в диапазоне B: B, но значение, которое я ищу, — это соответствующее время.

2. Мой код просто демонстрирует решение. Берет некоторую тестовую дату из «A1: A20» и «B1: B20», затем записывает результат в «C1». Я также обнаружил ошибку в коде. Смотрите обновленную версию.