Значение Application.Match - «Ошибка 2015», но значения поиска и значения массива равны - PullRequest
0 голосов
/ 24 октября 2019

Я использую функцию Application.MATCH в операторе If / Then, чтобы определить, следует ли продолжить процедуру или выйти из оператора. Если совпадение выдает ошибку, оно покидает оператор If и переходит к следующему оператору If / Then, но если ошибка не выдается, то она продолжается вниз по кроличьей норе. Проблема, которую я наблюдаю, состоит в том, что совпадение выдает ошибку там, где она не должна, если она закодирована правильно. ;)

Это третья итерация, которую я создал во всей этой процедуре. Что касается этой конкретной проблемы, я попытался изменить переменную поискового массива соответствия с Range на Cells, но это тоже не сработало (см. Непосредственно ниже).

Dim TC13 As Variant: TC13 = WB13.Worksheets("TEST KEYS").Range("$C" & M13F3)

Dim TC13 As Variant: TC13 = WB13.Worksheets("TEST KEYS").Cells(M13F3, 3)

Все мои часы остались одинаковыми в обоих случаях (снимок экрана VBA ниже). Непосредственно ниже приведен дополнительный код ...

Sub MATCH()

   ' Start position
   ThisWorkbook.Worksheets("MATCHES").Activate
   Cells(2, 1).Activate
   ' Calculate max rows among sheets
   Dim MX1 As Range: Set MX1 = Worksheets("SOURCES").Range("D2:D7") 'LIVE worksheets
   Dim MX2 As Range: Set MX2 = Worksheets("SOURCES").Range("D12:D17") 'TEST worksheets
   Dim MX As Integer: MX = WorksheetFunction.Max(MX1, MX2) 'Max of 2 lines above

   ' Variables for 'Kept' worksheet
   Dim Filename2 As Variant: Filename2 = Worksheets("SOURCES").Range("A2") & ".xlsx"
   Dim WB2 As Workbook: Set WB2 = Workbooks(Filename2)
   Dim LB2 As Variant: LB2 = WB2.Worksheets("LIVE KEYS").Range("$B$1:$B$" & MX)
   Dim LC2 As Variant: LC2 = WB2.Worksheets("LIVE KEYS").Range("$C$1:$C$" & MX)
   Dim LF2 As Variant: LF2 = WB2.Worksheets("LIVE KEYS").Range("$F$1:$F$" & MX)

   Dim Filename13 As Variant: Filename13 = Worksheets("SOURCES").Range("A13") & ".xlsx"
   Dim WB13 As Workbook: Set WB13 = Workbooks(Filename13)
   Dim TF13 As Variant: TF13 = WB13.Worksheets("TEST KEYS").Range("$F$1:$F$" & MX) ' Range to search on current workbook/sheet for the table's Primary Key

   Dim Filename14 As Variant: Filename14 = Worksheets("SOURCES").Range("A14") & ".xlsx"
   Dim WB14 As Workbook: Set WB14 = Workbooks(Filename14)
   Dim TF14 As Variant: TF14 = WB14.Worksheets("TEST KEYS").Range("$F$1:$F$" & MX) ' Range to search on current workbook/sheet for the table's Primary Key

   ' Calculation Loop
   For X = 2 To 5 'change to MX when done testing and troubleshooting

      ' Active row number
      Dim AR As Integer: AR = ActiveCell.Row
      ' Match values from 'Kept' work sheet
      Dim MV(1 To 3) As Variant 'TEST KEPT FROM MERGE
      MV(1) = WB2.Worksheets("LIVE KEYS").Range("$B" & AR)
      MV(2) = WB2.Worksheets("LIVE KEYS").Range("$C" & AR)
      MV(3) = WB2.Worksheets("LIVE KEYS").Range("$F" & AR)

      ' Match operation/results between 'Kept' and non 'Kept' sheets

      Dim M13F3 As Variant: M13F3 = Application.MATCH(MV(3), TF13, 0) ' Match results for Primary Key range

      If Not IsError(M13F3) _
      Then ' this value has a match in the Primary Key column...
         Dim TC13 As Variant: TC13 = WB13.Worksheets("TEST KEYS").Range("$C" & M13F3) ' Match results for cell in row found from Primary Key for the Cst Column
         Dim M13C2 As Variant: M13C2 = Application.MATCH(MV(2), TC13, 0)
         If Not IsError(M13C2) _
         Then ' this value has a match in the above row's corresponding cell...
             Dim TB13 As Variant: TB13 = WB13.Worksheets("TEST KEYS").Range("$B" & M13F3) ' Match results for cell in row found from Primary Key for the Table
             Dim M13B1 As Variant: M13B1 = Application.MATCH(MV(1), TB13, 0)
             If Not IsError(M13B1) _
             Then ' all three values on the same row match and the whole row's range (A-F) can be pasted into the MATCHES workbook/sheet
                     Dim TR13 As Variant: TR13 = WB13.Worksheets("TEST KEYS").Range("$A$" & M13F3 & ":$F$" & M13F3)
                     Worksheets("MATCHES").Range("$A$" & AR & ":$F$" & AR) = TR13
                     MsgBox "MATCH : 13"
             End If
         End If

      ElseIf 1 = 1 Then GoTo F14
F14:       Dim M14F3 As Variant: M14F3 = Application.MATCH(MV(3), TF14, 0) ' Match results for Primary Key range
      End If

      If Not IsError(M14F3) _
      Then ' this value has a match in the Primary Key column...

      ' MORE CODE HERE
      End If
      ' MORE CODE HERE

      Y = X + 1
      Cells(Y, 1).Activate

   Next
   MsgBox "GAME OVER"

End Sub

VBA_Watches_Locals

От совпадения я ожидаю либо целое число, либо ошибку.

Кстати, я видел «0», созданный на более ранних итерациях матча. Я знаю, что Match предоставляет позицию (строку) и ожидал, что это будет «1», а мой диапазон равен одной ячейке, но я не могу найти в Интернете ничего, объясняющего, что вывод «0» ...?

PS - Я писал о проблемах с более ранней итерацией этой процедуры и просто хочу добавить это здесь и для записи: For, If, ElseIf, Else Application.Match Loop производит неверные результаты

ОБНОВЛЕНИЕ (10/29): Что касается строки кода, которой я поделился перед тем, как поделиться всей процедурой, я изменил часть Range / Cells с фактического диапазона и теперь больше не получаю ошибку.

... ДО: TC13 = WB13.Worksheets("TEST KEYS").Range("$C" & M13F3)

...... ПОСЛЕ: TC13 = WB13.Worksheets("TEST KEYS").Range("$C" & M13F3 & ":$D" & M13F3)

ошибка может быть связана с тем, что мой код не ссылается на массив . ^

^ https://docs.microsoft.com/en-us/office/vba/api/excel.worksheetfunction.match

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...