VBA Subscript вне диапазона, проблема с разрешением имен? - PullRequest
0 голосов
/ 23 января 2019

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

Public Function namedColumnNo(heading As String, shtName As String) As Long
' Return the column number with named header text'
' on given worksheet.
Dim r As Range
Dim wks As Worksheet

Debug.Print shtName
'Exit Function

Set wks = Sheets(shtName)
wks.Range("1:1").Select
With wks
    r = .Range("1:1").Find(heading, LookIn:=xlValue)
    If r Is Nothing Then
        namedColumnNo = -1
    Else: namedColumnNo = r.Column
    End If

End With

End Function

Я использую эту тестовую подпрограмму для вызова функции:

Public Sub getCol()

Debug.Print "Find MidTemp on " & DataSht.RawDataSht
Debug.Print "Col " & namedColumnNo("MidTemp", DataSht.RawDataSht)

End Sub

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

Public Type dataShtNames
    HeaderSht As String
    RawDataSht As String
    ResultDataSht As String
End Type
Public DataSht As dataShtNames

С некомментированным оператором Exit Function переменные разрешаются OK с помощью операторов debug.print, которые я получаю

Find MidTemp on RawData
RawData:MidTemp
Col 0

Выход из функции для запуска из-за ошибки происходит в Set wks = Sheets(shtName) Если язамените аргумент shtName на фактическое имя листа в виде строки «RawData», затем ошибка переместится вниз на строку, используя второй аргумент heading.Если я заменит параметр на строку здесь, ошибка не исчезнет.Есть что-то, чего я здесь не хватаетНекоторая помощь будет высоко ценится.

1 Ответ

0 голосов
/ 23 января 2019

К сожалению, не могу комментировать, но на самом деле вы получаете ошибку out of range, потому что она должна быть LookIn:=xlValues там, где у вас есть LookIn:=xlValue

Как указывает @Mathieu, вам нужно исправитьдобавьте Set r = Find(heading, LookIn:=xlValues), чтобы установить диапазон для возвращаемого значения.

В качестве примечания - вы должны отбросить выделение.Это ничего не делает для вас.

With wks.Range("1:1")
   Set r = .Find(heading, LookIn:=xlValues)
    If r Is Nothing Then
        namedColumnNo = -1
    Else: namedColumnNo = r.Column
    End If

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