Функция возвращает значение ячейки, а не местоположение ячейки - VBA - PullRequest
0 голосов
/ 11 апреля 2019

Я пытаюсь настроить функцию для Regex, которая возвращает cell.address.Он работает на 99%, за исключением того, что он возвращает значение ячейки test против местоположения ячейки, и я не могу это выяснить.

Отладка:

Там написано Object variable or with block variable not set, еслиЯ Dim celladdr As Range

, но если я это закомментирую, то ошибка изменится на Object doesn't support this property or method, и я смогу увидеть, что celladdr = test.

Затем я попытался Set celladdr = Range(celladdr.Address) и получил Object Required.

Кто-нибудь может указать на ошибку?

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

Public Sub TESTING()
  Dim celladdr As Range
  celladdr = RegExFunc("TEST")
  ActiveSheet.celladdr.Select
End Sub
''''''''''''''''''''''''''''''''''''''''''''''''''''
''''''''''''''''''''''''''''''''''''''''''''''''''''
''''''''''''''''''''''''''''''''''''''''''''''''''''
Public Function RegExFunc(var) As Variant
  RegExSearchPattern = RegExPattern(var)
  RegExFunc = RegExSearch(RegExSearchPattern)
End Function
''''''''''''''''''''''''''''''''''''''''''''''''''''
''''''''''''''''''''''''''''''''''''''''''''''''''''
''''''''''''''''''''''''''''''''''''''''''''''''''''
Public Function RegExPattern(my_string) As Variant
  RegExPattern = "([a-z]{4})"
End Function
''''''''''''''''''''''''''''''''''''''''''''''''''''
''''''''''''''''''''''''''''''''''''''''''''''''''''
''''''''''''''''''''''''''''''''''''''''''''''''''''
Public Function RegExSearch(strPattern) As Range
    Dim regexp As Object
    Dim rcell As Range, rng As Range
    Dim strInput As String

    Set regexp = CreateObject("vbscript.regexp")
    Set rng = Range("A1:Z255")

    For Each rcell In rng.Cells

        If rcell <> "" Then

            If strPattern <> "" Then
            strInput = rcell.Value

            With regexp
                .Global = False
                .MultiLine = False
                .ignoreCase = True
                .Pattern = strPattern
            End With

            If regexp.Test(strInput) Then
                MsgBox rcell & " Matched in Cell" & rcell.Address
                Set RegExSearch = Range(rcell.Address)
                MsgBox RegExSearch
            End If
            End If
        End If
    Next
End Function

Ответы [ 2 ]

1 голос
/ 11 апреля 2019

Были различные случаи, когда вам нужно было Set объект, и один, в котором требовалось Dim. Так как вы объявили почти все как Вариант, это немного затрудняет точную разбивку. По моему опыту лучше всего всегда специально объявлять переменные в VBA.

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

Public Sub TESTING()
  Dim celladdr As Range
  Set celladdr = RegExFunc("TEST")
  celladdr.Select
End Sub

Public Function RegExFunc(var As String) As Range
Dim RegExSearchPattern As String
  RegExSearchPattern = RegExPattern(var)
  Set RegExFunc = RegExSearch(RegExSearchPattern)
End Function
''''''''''''''''''''''''''''''''''''''''''''''''''''
''''''''''''''''''''''''''''''''''''''''''''''''''''
''''''''''''''''''''''''''''''''''''''''''''''''''''
Public Function RegExPattern(my_string As String) As String
  RegExPattern = "([a-z]{4})"
End Function
''''''''''''''''''''''''''''''''''''''''''''''''''''
''''''''''''''''''''''''''''''''''''''''''''''''''''
''''''''''''''''''''''''''''''''''''''''''''''''''''
Public Function RegExSearch(strPattern As String) As Range
    Dim regexp As Object
    Dim rcell As Range, rng As Range
    Dim strInput As String

    Set regexp = CreateObject("vbscript.regexp")
    Set rng = Range("A1:Z255")

    For Each rcell In rng.Cells

        If rcell <> "" Then

            If strPattern <> "" Then
            strInput = rcell.Value

            With regexp
                .Global = False
                .MultiLine = False
                .ignoreCase = True
                .Pattern = strPattern
            End With

            If regexp.Test(strInput) Then
                MsgBox rcell & " Matched in Cell" & rcell.Address
                Set RegExSearch = Range(rcell.Address)
                MsgBox RegExSearch
            End If
            End If
        End If
    Next
End Function
1 голос
/ 11 апреля 2019

Адрес ячейки - это просто строка; Вы не установите его, просто назначьте его с =.

RegExSearch = rcell.Address

... вернет абсолютный адрес ячейки.

Возможно, вы захотите выйти из цикла For Each rcell In rng.Cells, если шаблон найден. Кажется, нет смысла продолжать, если только вы не хотите, чтобы адреса ячеек объединения всех совпадающих ячеек.

        If regexp.Test(strInput) Then
            MsgBox rcell & " Matched in Cell" & rcell.Address
            RegExSearch = rcell.Address
            MsgBox RegExSearch
            Exit For
        End If

Вы устанавливаете идентичные аргументы RegEx внутри цикла. Переместите присвоение аргумента над циклом For Each rcell In rng.Cells.

    With regexp
        .Global = False
        .MultiLine = False
        .ignoreCase = True
        .Pattern = strPattern
    End With

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