VBA извлекает строки между двумя символами - PullRequest
0 голосов
/ 24 мая 2019

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

Хотя я предоставил выражение Dim для строки textBetween, я получаю сообщение об ошибке msg "Ошибка msg" Переменная объекта или С переменной блока не установлено ". Я не могу понять, почему.

Код взят из excel vba - извлекать текст из 2 символов , так что все должно быть просто, верно? Ну не для меня!

Я возился с ним несколько часов безрезультатно.

   Sub FindStrings()

   Dim sheet2 As Worksheet
   Dim i As Integer
   Dim openPos As Long
   Dim clsPos As Long
   Dim textBetween As String
   openPos = 0

   'Using for loop to find the i th occurrence of at '@' for openPos
   For i = 1 To 8

   'get position of start of string
    openPos = InStr(openPos + i, sheet2.Range("H8"), "@", vbTextCompare)     

    'Error msg "Object variable or With block variable not set

    'get position of end of string
    clsPos = InStr(openPos + 1 + i, sheet2.Range("H8"), "@", 
    vbTextCompare)  'End of string

   'get the mid string value between openPos and clsPos
   '
    textBetween = Mid(sheet2.Range("H8").Value, openPos + 1, clsPos - 
    openPos - 1)
    MsgBox ("textBetween  " & "i" & textBetween)

   'write to sheet
    sheet2.Cells(7 + i, 8).Value = textBetween

    Next i

    End Sub

Я ожидаю записи строк на листе. Сообщение об ошибке: «Ошибка msg» Переменная объекта или переменная блока не установлена ​​»

Ответы [ 2 ]

1 голос
/ 24 мая 2019
Dim sheet2 As Worksheet
...
sheet2.Range("H8")

Вы объявили sheet2 var, но никогда не Set его объекту листа.По совпадению второй рабочий лист в книге имеет свойство Worksheet.Codename , которое можно использовать в качестве ссылки на объект.Ссылка sheet2.Range("H8") будет работать, если вы собираетесь ссылаться на этот лист;объявление Dim sheet2 As Worksheet не нужно.Если вы намереваетесь сослаться на другой лист, не используйте sheet2 , так как может возникнуть путаница между кодовым именем второго листа и объявленной переменной, представляющей заданный объект.Вам также потребуется Set var для объекта листа.

'write to sheet
 sheet2.Cells(7 + i, 8).Value = textBetween

Выше записывает textBetween в sheet2.Range("H8") во время первой итерации цикла For ... Next,Последующие циклы перечитывают перезаписанное значение, поэтому ваши результаты не будут такими, как вы ожидаете.

Лучший вариант - разбить строку на массив с нулями и выбрать фрагмент, который вы хотите вернуть.Функция UserDefined может использоваться в общедоступной подпрограмме или непосредственно на рабочем листе.

Option Explicit

Sub FindStrings()

    Dim i As Long
    Dim textBetween As String

    For i = 1 To 8

        textBetween = FindNthString(Sheet2.Range("H8").Value, i)

        'write to sheet
        Sheet2.Cells(8 + i, "H").Value = textBetween

    Next i

End Sub

Function FindNthString(str As String, ndx As Long, _
                       Optional delim As String = "@")

    FindNthString = CVErr(xlErrNA)

    'Split uses a zero-based array by default
    'the first 'piece' is at position 0
    ndx = ndx - 1

    If UBound(Split(str, delim)) >= ndx And ndx >= 0 Then

        FindNthString = Split(str, delim)(ndx)

    End If

End Function

введите описание изображения здесь

1 голос
/ 24 мая 2019

Вам необходимо установить / создать объект sheet2, прежде чем вы сможете его использовать, т.е.

Dim sheet2 as Worksheet

Set sheet2 = Sheets("Sheet2")

В качестве альтернативы, если вы изменили ссылку на имя листа в VBE с "Лист 2" на лист2, вам больше не нужно объявлять лист2 как рабочий лист.

...