Индекс соответствия в VBA, ссылающийся на таблицу - PullRequest
0 голосов
/ 28 февраля 2019

Я хочу обновить строку в моей таблице на основе ячейки на другом листе, и с этой целью я намерен использовать функцию сопоставления индекса.Когда я запускаю приведенный ниже код, я получаю сообщение об ошибке, что он не может получить свойство класса соответствия функции.Каков правильный синтаксис в этом отношении?

Sub Update_Customer()

' Declarations
Dim rng as listobject
Dim wf as application.worksheetfunction
Dim cs_sht as string
Set rng = Sheets(1).ListObjects("Table_Customer")
Set ws = ThisWorkbook.ActiveSheet
cs_sht = ws.Name

' ERROR RUNNING THIS LINE vvvvv
wf.Index(rng.ListColumns("Firstname"), wf.Match(cs_sht, rng.ListColumns("Customer ID"), 0)) = ws.Range("C_Firstname").Value

End Sub

1 Ответ

0 голосов
/ 01 марта 2019

Функции Excel должны быть вложенными, потому что значение ячейки нужно анализировать как один шаг.

Код VBA не должен делать это.Инструкции VBA работают лучше всего, и их легче отлаживать, когда вы разбиваете их и заставляете выполнять как можно меньше работы.

Так что вместо этого:

wf.Index(rng.ListColumns("Firstname"), wf.Match(cs_sht, rng.ListColumns("Customer ID"), 0))

Разделите это:

Dim matchResult As Long
matchResult = WorksheetFunction.Match(cs_sht, rng.ListColumns("Customer ID").DataBodyRange, 0)

Dim indexResult As Variant
indexResult = WorksheetFunction.Index(rng.ListColumns("FirstName").DataBodyRange, matchResult)

Обратите внимание, что вы получите ошибку во время выполнения, если любая из функций не сможет найти то, что ищет.Используйте On Error для обработки этого случая:

    On Error GoTo CleanFail

    Dim matchResult As Long
    matchResult = WorksheetFunction.Match(...)

    ...

    Exit Sub

CleanFail:
    MsgBox "Could not find record for '" & cs_sht & "'." & vbNewLine & Err.Description
End Sub

Избавьтесь от wf.Нет смысла копировать ссылки на объекты уже глобальных объектов.Чем меньше глобальных переменных вы используете, тем лучше.

если имя поменяется, я могу обновить таблицу, чтобы она соответствовала новому имени из моего листа

Вы не можете просто присвоить indexResult новому значению.indexResult не содержит ссылку на какую-либо ячейку, это всего лишь результат функции INDEX листа.Вам нужно использовать этот результат, чтобы получить ячейку, которую вы хотите изменить:

Dim targetCell As Range
Set targetCell = rng.ListColumns("FirstName").DataBodyRange.Cells(indexResult)
targetCell.Value = ws.Range("C_Firstname").Value
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...