Как найти () строку таблицы? - PullRequest
0 голосов
/ 15 января 2020

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

foundRow = Worksheets("Data").ListObjects("tableName").Range.Find("searchTerm").Row + 1 'Offset 1 because of the header

myArray = Worksheets("Data").ListObjects("tableName").ListRows(foundRow).Range

I проверил обе строки кода в непосредственном окне, и они делают то, что я хочу, но я получаю «Ошибка времени выполнения 9»: Подскритель вне диапазона »из первой строки, когда я помещаю его в код. Может кто-нибудь сказать мне, что я сделал не так? Или, может быть, есть лучший способ сделать это?

Ответы [ 3 ]

1 голос
/ 15 января 2020

Используйте свойство DatabodyRange, чтобы избежать неловких смещений для учета заголовков, и Match(), чтобы найти значение в первом столбце:

Sub tester()

    Dim m, lo As ListObject, myArray

    Set lo = Worksheets("Data").ListObjects("tableName")

    m = Application.Match("searchTerm", lo.ListColumns(1).DataBodyRange, 0)

    If Not IsError(m) Then
        myArray = lo.DataBodyRange.Rows(m).Value
    End If

End Sub
0 голосов
/ 15 января 2020

Это смущает ... Я поставил свои переменные в кавычки, которые вызывали ошибку: (

В любом случае, спасибо Тиму Уильямсу за то, что он научил меня примерно Application.Match (вместо Range.Find()) и .DataBodyRange для упрощения результата адреса. Я решил не использовать IsError, потому что если код ничего не находит, то я допустил ошибку. Вот решение, на котором я остановился:

myArray = Application.Transpose(Application.Transpose(Worksheets("Data").ListObjects(tableName).ListRows( _
Application.Match(searchTerm, Worksheets("Data").ListObjects(tableName).ListColumns(1).DataBodyRange)).Range))

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

0 голосов
/ 15 января 2020

Другой вариант использования On Error Resume Next

Примечания:

  • Вам не нужно готовить рабочую книгу или рабочий лист, если вы собираетесь посмотреть в книге, где выполняется макрос.
  • Вы можете использовать Range("TableName").ListObject
  • При использовании On Error Resume Next убедитесь, что вы не пропускаете другие ошибки, и сбросьте обработчик ошибок с помощью On Error Goto 0 или что вы установили.

Public Sub GetRowDataIntoArray()

    Dim rowFound As Long
    Dim rowData As Variant

    On Error Resume Next

    ' This would search in column 1 the search term and return the row if found, or raise an error if not
    rowFound = Range("tableName").ListObject.ListColumns(1).DataBodyRange.Find("searchTerm").Row

    If Err.Number = 0 Then
        rowData = Range("tableName").ListObject.DataBodyRange.Rows(rowFound).Value
    End If

    On Error GoTo 0

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