Как настроить формулу Array, используя Index / match в VBA, чтобы получить первую ячейку соответствия - PullRequest
0 голосов
/ 16 октября 2018

Я пытаюсь настроить формулу массива в цикле for для частичного совпадения строки со списком имен на другом листе с именем Имя проекта .Это должен быть конечный продукт Я получил формулу, работающую в электронной таблице, используя метод из exceljet , но я столкнулся с ошибкой "Требуется объект", когда пытался преобразовать ее в VBA,Ячейки (i, 6) - это расположение строки, которую я пытаюсь сделать частичным совпадением с именами проекта.Столбец не должен быть «6», это где пожалуйста, помогите.Спасибо!

Sub Shortname()

Dim SRng As Variant
Dim SName As Integer
Dim SNrow As Integer
Dim PLcol As Integer
Dim PLrow As Integer

     Worksheets(3).Activate

     SNrow = Cells(Rows.Count, 1).End(xlUp).Row

     SRng = Range(Cells(2, 1), Cells(SNrow, 1)).Value

     Worksheets(2).Activate

     PLcol = Cells(1, Columns.Count).End(xlToLeft).Column + 1
     PLrow = Cells(Rows.Count, 1).End(xlUp).Row

     For i = 2 To PLrow

         Cells(i, PLcol).Value = Application.WorksheetFunction.Index(SRng, Application.WorksheetFunction.Match("TRUE", Application.WorksheetFunction.IsNumber(Application.WorksheetFunction.Search(SRng.Value, Cells(i, 6))), 0), 1)

     Next i

End Sub

1 Ответ

0 голосов
/ 16 октября 2018

Mysterious Variable (SRng)

Я бы написал код примерно так ( не решение просто более читаемая версия):

Sub Shortname()
    Dim SRng As Variant
    Dim SName As Integer
    Dim SNrow As Integer
    Dim PLcol As Integer
    Dim PLrow As Integer
    'Missing Declaration
    Dim i As Long
    'To avoid jumping around worksheets do NOT use Activate or Select
    With Worksheets(3)
        SNrow = .Cells(Rows.Count, 1).End(xlUp).Row
        SRng = .Range(Cells(2, 1), Cells(SNrow, 1)).Value
    End With
    With Worksheets(2)
        PLcol = .Cells(1, Columns.Count).End(xlToLeft).Column + 1
        PLrow = .Cells(Rows.Count, 1).End(xlUp).Row
    End With
    With Application.WorksheetFunction
        For i = 2 To PLrow
            'Run-time error 424: Object required
            Worksheets(2).Cells(i, PLcol).Value = .Index(SRng, .Match("TRUE", _
                .IsNumber(.Search(SRng.Value, Cells(i, 6))), 0), 1)
        Next i
    End With
End Sub

Ошибка(загадка) лежит в переменной SRng.Почему это объявлено как вариант?Если это String, объявите его как String и измените строку SRng = .Range(Cells(2, 1), Cells(SNrow, 1)).Value на

SRng = .Range(Cells(2, 1), Cells(SNrow, 1)).Address

Если это объект Range, объявите его как Range и удалите .Value, но тогда вы все равно получите ошибкув цикле For Next , поскольку вы используете SRng.Value в части Search оператора, но диапазон не имеет значения (возможно, вы хотели использовать что-то подобное SRng.Cells(i, 6).Value).

Если это не поможет вам предоставить дополнительную информацию, например образец листа (ов), чтобы увидеть, что находится в ячейках, диапазонах ... и объяснить, что именно вы ищете, вДля следующего цикла.

...