Как написать индекс и соответствовать в VBA - PullRequest
0 голосов
/ 26 июня 2019

Я получаю пустые результаты в своем рабочем листе, когда я запускаю index и match в VBA, и я не знаю почему ... пожалуйста, помогите.

У меня есть некоторые данные на рабочем листе details2, которые содержат идентификаторы, имена, стоимость обслуживания и даты в разных столбцах. У меня также есть частично похожая информация в другом рабочем листе, называемом прогнозом, но без столбца дат. Поскольку клиент может иметь несколько типов услуг, начиная с разных дат, я сопоставил идентификатор, имена, тип обслуживания и стоимость, чтобы извлечь нужные даты. Но я хочу написать это, используя VBA, чтобы сделать его гибким, потому что я выполняю это каждый месяц, и диапазоны данных могут меняться. Я уже пробовал использовать формулу массива и скопировал его, которые работают нормально. но когда я помещаю это в цикл, вывод ячеек остается пустым. Я ожидаю значения даты из листа DETAILS2 в столбце N другого листа но мой столбец N пуст ... другая часть программы работает нормально.

Это код, который я пробовал, который работает:

 With Test1Ws                   
  .Range("N3").FormulaArray = "=IFNA(INDEX(DETAILS2!$A$3:$Z$780,MATCH(1, 
  (DETAILS2!$A$3:$A$780=B3)*(DETAILS2!$B$3:$B$780=C3)* 
  (details2!$X$3:$X$780=F3)*(details2!$Y$3:$Y$780=G3),0),18),0)"
  .Range("N3").AutoFill .Range("N3:N" & Test1LastRow)
 End With

Это код, который я написал, пытаясь сделать его гибким для изменения диапазонов:

 With Test1Ws
  For x = 3 To Test1LastRow
      On Error Resume Next
      Test1Ws.Range("N" & x).Value = 
      Application.WorksheetFunction.IfNa(
      Application.WorksheetFunction.Index(CurrDeIndexRng,
      Application.WorksheetFunction.Match(1,(CurDeIdRng = .Range("B" & 
      x).Value) * (CurDeNameRng = .Range("C" & x).Value) * (CurDeServRng = 
      .Range("F" & x).Value) * (CurDeCstRng = .Range("G" & x).Value), 0), 
      18), 0)
   Next x
 End With

1 Ответ

0 голосов
/ 26 июня 2019

При использовании vba большую часть времени лучше избегать использования формул рабочего листа и просто циклических вариантов массивов.

With test1Ws
    Dim inpt() As Variant
    inpt = .Range(.Cells(3, 2), .Cells(Test1LastRow, 7)).Value

    Dim detlstrw As Long
    detlstrw = Worksheets("DETAILS2").Cells(Rows.Count, 1).End(xlUp).Row

    Dim search() As Variant
    search = Worksheets("DETAILS2").Range(Worksheets("DETAILS2").Cells(1, 1), Worksheets("DETAILS2").Cells(detlstrw, 25)).Value

    Dim outpt() As Variant
    ReDim outpt(1 To UBound(inpt, 1), 1 To 1)

    Dim x As Long
    For x = LBound(inpt, 1) To UBound(inpt, 1)
        outpt(x, 1) = 0
        Dim Y as Long
        For y = LBound(search, 1) To UBound(search, 1)
            If inpt(x, 1) = search(y, 1) And inpt(x, 2) = search(y, 2) And inpt(x, 5) = search(y, 24) And inpt(x, 6) = search(y, 25) Then
                outpt(x, 1) = search(y, 18)
                Exit For
            End If
        Next y
    Next x

    .Range("N3").Resize(UBound(outpt, 1), 1).Value = outpt
End With
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...