отправлять регулярные выражения в массив строк - PullRequest
0 голосов
/ 23 января 2012

Я пытаюсь получить приведенный ниже код для отправки результатов поиска по регулярному выражению в массив строк.Как я могу это сделать?

Когда я меняю имя на массив строк, т.е. Dim name() as String VBA выдает исключение несоответствия типов.Есть идеи, что я могу сделать, чтобы это исправить?

Большое спасибо.

 Do While Not EOF(1)
    Line Input #1, sText
    If sText <> "" Then


       Dim Regex As Object, myMatches As Object

       ' instantiates regexp object
       Set Regex = CreateObject("VBScript.RegExp")
       With Regex
            .MultiLine = False
            .Global = True
            .IgnoreCase = False
            .Pattern = "^Personal\sname\s*[:]\s*"
       End With

       ' get name, seperated from Personal Name
       If Regex.test(sText) Then

            Set myMatches = Regex.Execute(sText)
            Dim temp As String
            temp = Regex.Replace(sText, vbNullString)
            Regex.Pattern = "^[^*]*[*]+"
            Set myMatches = Regex.Execute(temp)
            Dim temp2 As String
            temp2 = myMatches.Item(0)
            name = Trim(Left(temp2, Len(temp2) - 3))

        End If
    End If
Loop

Ответы [ 2 ]

3 голосов
/ 23 января 2012

Не следует использовать «имя» в качестве имени переменной, поскольку оно конфликтует со свойством Excel.Вместо этого попробуйте sName или sNames, где s - для строки.

Для массива вам необходимо задать ему размер, прежде чем можно будет присвоить значение каждому элементу.

Dim sNames(4) As String  '// Or Dim sNames(1 To 4) As String

sName(1) = "John"
...
sName(4) = "Sam"

или, если выне знаю общее количество элементов (имен) для начала:

Dim sNames() As String
Dim iTotalNames As Integer

iTotalNames = '// Some code here to determine how many names you will have

ReDim sNames(iTotalNames) '// You can also use ReDim Preserve if you have existing elements

sName(1) = "John"
...
sName(4) = "Sam"

Так что я подозреваю, что вам понадобится что-то вроде:

  Dim sNames() As String
  Dim iTotalNames As Integer

  '// Your code ....

  iTotalNames = iTotalNames + 1
  ReDim Preserve sNames(iTotalNames)
  sNames(iTotalNames) = Trim(Left(temp2, Len(temp2) - 3))

  '// Rest of your code ...

Также в VBA все измеренияпеременные должны быть в верхней части модуля.

0 голосов
/ 05 февраля 2012

изменение

'call this "A"
Dim temp2 As String
temp2 = myMatches.Item(0)

до

'stick this at the top
 redim temp2(0 to 0)

'replace "A" with this
 new_top = ubound(temp2)+1
 redim preserve temp2 (0 to new_top)
 temp2(new_top) = myMatches.Item(0)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...