Как исправить ошибку во время выполнения '91': переменная объекта или переменная блока не установлены - PullRequest
2 голосов
/ 24 октября 2019

Я настраиваю макрос, который открывает разные веб-сайты, в зависимости от того, какие ячейки идентификатора сделки не пустые в таблице Excel. Он создаст 4 объекта и сохранит объекты в коллекции. Я выбрал 4 в качестве произвольного числа, потому что мне никогда не понадобится больше 2, но я создал больше на всякий случай.

Макрос циклически просматривает таблицу Excel и выбирает столько идентификаторов сделок, сколько необходимо (идентификаторы сделок добавляются к URL-адресу для перехода на разные сайты), но когда я запускаю макрос, я получаю сообщение об ошибке "Переменная объекта или переменная блока не установлена ​​"в выделенной строке ниже. Пожалуйста, помогите, так как я не очень силен в VBA и учусь делать все возможное, чтобы автоматизировать некоторые вещи на работе

Я относительно новичок в VBA, поэтому я не знаю, что делать, чтобы это исправить. Любая помощь по этому вопросу будет принята с благодарностью. Спасибо enter image description here

Sub TransactionMatching()
    Dim first_day As String

    Dim ieapp As Object
    Dim ieapp2 As Object
    Dim ieapp3 As Object
    Dim ieapp4 As Object


    ' collection to hold deal names
    Dim dealnameArray As New Collection
    ' collection to hold deal IDs
    Dim dealIDArray As New Collection
    ' collection to hold required ieapp objects
    Dim totalDealObjectArray As New Collection

    ' add all ieapp objects to the collection
    totalDealObjectArray.Add ieapp
    totalDealObjectArray.Add ieapp2
    totalDealObjectArray.Add ieapp3
    totalDealObjectArray.Add ieapp4

    Windows("transaction_matching.xlsm").Activate

    ' loop through each row in the excel sheet and add the deal names and deal IDs...
    ' ...with check marks nect to them to their respective collections
    For i = 5 To 51
        If IsEmpty(Range("C" & i).Value) = False Then
            dealnameArray.Add (Range("A" & i).Value)
            dealIDArray.Add (Range("B" & i).Value)
        End If
    Next

    'get the required number of objects from the ieapp object collection
    For i = 1 To dealnameArray.Count - 1
        ' set each object in ieapp object collection to a new internet explorer object
        Set totalDealObjectArray(i) = New InternetExplorerMedium
        totalDealObjectArray(i).Visible = True

        ' define the last business day
        lastDay = DateSerial(Year(Date), Month(Date), 0)

        ' define the first day of the previous month
        first_day = lastDay - Day(lastDay) + 1

        With totalDealObjectArray(i)
            .navigate "http://website" & dealIDArray(i)
            Application.DisplayFullScreen = True
            Call busy((totalDealObjectArray(i)))
            Call DoThings((totalDealObjectArray(i)))
        End With
    Next

    Application.WindowState = xlNormal
    Application.WindowState = xlMaximized

End Sub

Ответы [ 2 ]

3 голосов
/ 24 октября 2019

Коллекции в VBA используют .Add и .Remove для добавления и удаления элементов. Изменение значений элементов в коллекции выполняется с помощью дополнительного кода - Как изменить значение элемента коллекции

collection.Item(N) отображает значение, но не изменяет его. Что касается кода, вы можете добавить новый объект, и таким образом он будет установлен:

Sub TransactionMatching()

    Dim i As Long
    Dim totalDealObject As New Collection

    totalDealObject.Add New InternetExplorerMedium
    totalDealObject.Add New InternetExplorerMedium
    totalDealObject.Add New InternetExplorerMedium
    totalDealObject.Add New InternetExplorerMedium

    For i = 1 To 4
        Debug.Print totalDealObject.Item(i).FullName
    Next

End Sub

Если задача состоит в добавлении элементов в коллекцию через цикл, то что-то вроде этого может работать, добавляя InternetExplorerMediumна каждой второй позиции коллекции:

Sub TransactionMatching()

    Dim i As Long
    Dim totalDealObject As New Collection

    For i = 1 To 10
        If i Mod 2 = 0 Then
            totalDealObject.Add New InternetExplorerMedium
        Else
            totalDealObject.Add i
        End If
    Next

End Sub

enter image description here

2 голосов
/ 24 октября 2019

Витя правильно определил проблему:

collection.Item(N) отображает значение, но не меняет его

Другими словами, оператор присваивания = НЕ идет против нулевой ссылки на объект по указанному индексу коллекции;левая цель назначения - член по умолчанию для извлеченного объекта , а поскольку извлеченный объект - Nothing, этот неявный вызов члена по умолчанию является причиной того, что вы получаете ошибку 91, потому что любой членвызов (явный или нет) для Nothing всегда будет выдавать ошибку 91.

Теперь, если ссылка была установлена ​​, все еще будет неявным членом по умолчаниювызов для разрешения LHS операции назначения;если у объекта нет элемента по умолчанию, ошибка времени выполнения будет 438 «объект не поддерживает свойство или метод».

элемент по умолчанию?

Многие классы имеют член по умолчанию . То есть член, который можно опустить. В качестве примера можно привести Collection.Item - эти два оператора делают одно и то же:

Debug.Print myCollection.Item(i)
Debug.Print myCollection(i) '<~ call to .Item default member is implicit

Rubberduck имеет несколько проверок кода, которые могли бы найти и предотвратить эту ошибку ... и другиеожидание, чтобы быть пойманным:

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