Nano Hash - криптовалюты, майнинг, программирование

Ошибка выполнения в макросе VBA

Я работаю над кодом VBA, чтобы захватить текст из электронной почты Outlook и поместить его на лист Excel, который я настроил. Я использую Excel 2010. Мое электронное письмо содержит следующую информацию:

Компания: ABC Company
Период занятий: с 29 октября 2013 г. по 22 октября 2014 г.

Я настроил цикл For With для просмотра электронной почты и вставил название компании в столбец A, первую дату (2013-10-29) в столбец B и другую дату (2014-10-22) в столбец C. Когда я запускаю свой код, я получаю сообщение об ошибке: Ошибка времени выполнения 5: недопустимый вызов процедуры или аргумент в строке кода ниже: vText2 = Trim(M.SubMatches(2))

Не могли бы вы сообщить мне, что я делаю неправильно. Часть моего кода ниже. Дайте мне знать, если мне нужно предоставить какую-либо дополнительную информацию.

sText = olItem.Body

Set Reg1 = CreateObject("VBScript.RegExp")

For i = 1 To 3

With Reg1
Select Case i
Case 1
.Pattern(Company\s[:]+\s(\w*\s*\w*\s*\w*\s*\w*\s*\w*\s*\w*\s*\w*\s*\w*\s*\w*\s*)\n)"
.Global = False
Case 2
.Pattern = "(Class Period\s*[:]+\s*([\d-\s]*))"
.Global = False
Case 3
.Pattern = "(through+\s*([\d-\s]*))"
.Global = False
End Select

End With

If Reg1.Test(sText) Then

Set M1 = Reg1.Execute(sText)
For Each M In M1
vText = Trim(M.SubMatches(1))
vText2 = Trim(M.SubMatches(2))
vText3 = Trim(M.SubMatches(3))
Next
End If
Next i

xlSheet.Range("A" & rCount) = vText
xlSheet.Range("B" & rCount) = vText2
xlSheet.Range("C" & rCount) = vText3

xlWB.Close 1

  • Я думаю, вы хотели написать .Pattern = "(Company, а не .Pattern(Company. Кроме того, \d-\s недействителен, используйте \d\s-. Я также думаю, что в ваших шаблонах нет submatch(3). 20.06.2015

Ответы:


1

Ошибка говорит о том, что указанный вами аргумент (индекс) недействителен для коллекции SubMatches, поскольку он превышает количество элементов в коллекции.

Помните также, что индекс SubMatches начинается с «0». Я предполагаю, что вы намеренно пропустили первый элемент в пользу элементов со второго по четвертый в коллекции.

Я думаю, вы ожидаете, что он будет добавлять совпадение в коллекцию каждый раз, когда он проходит через цикл for. Это не так. Новое совпадение заменяет старое совпадение, поэтому у вас всегда будет только один результат для работы за раз.

Вместо этого попробуйте что-то вроде этого:

Private Sub CommandButton1_Click()
    sText = "Company: ABC Company" & vbNewLine & "Class Period: 2013-10-29 through 2014-10-22" & vbNewLine
    Set Reg1 = CreateObject("VBScript.RegExp")

    vText = "Missing"
    vText2 = "Missing"
    vText3 = "Missing"

    For i = 1 To 3

        With Reg1
            Select Case i
            Case 1
                .Pattern = "(Company)\w*[:](.*?)\n"
                .Global = False
            Case 2
                .Pattern = "(Class Period\s*[:]+\s*([\d-\s]*))"
                .Global = False
            Case 3
                .Pattern = "(through+\s*([\d-\s]*))"
                .Global = False
            End Select

        End With


        If Reg1.Test(sText) Then
            Set M1 = Reg1.Execute(sText)
            For Each M In M1
                If M.SubMatches.Count > 0 Then
                    Select Case i
                    Case 1
                        vText = Trim(M.SubMatches(1))
                    Case 2
                        vText2 = Trim(M.SubMatches(1))
                    Case 3
                        vText3 = Trim(M.SubMatches(1))
                    End Select
                End If
            Next
        End If

        Next i

        xlSheet.Range("A" & rCount) = vText
        xlSheet.Range("B" & rCount) = vText2
        xlSheet.Range("C" & rCount) = vText3

        xlWB.Close 1

    End Sub

Обратите внимание, что мне пришлось изменить регулярное выражение вашей компании, чтобы заставить его работать. Ваш оригинальный мне не подошел.

19.06.2015
  • Спасибо. Я протестировал каждое регулярное выражение по отдельности и получил желаемый результат. Я ввожу код, который вы предоставили. В первом столбце указана дата 2014-10-22 вместо ABC Company, а следующие два столбца отсутствуют. 20.06.2015
  • @ user3483327 - Хорошо. Думаю, теперь я лучше понимаю, что происходит. Я отредактировал свой ответ. 20.06.2015
  • Новые материалы

    Кластеризация: более глубокий взгляд
    Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

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

    Частный метод Python: улучшение инкапсуляции и безопасности
    Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

    Как я автоматизирую тестирование с помощью Jest
    Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

    Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
    Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

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

    Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
    В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..