Переменная класса как счетчик цикла For в VBA - PullRequest
0 голосов
/ 01 июня 2018

У меня есть модуль класса с именем MyClass, с открытым целым числом:

Public i as Integer

Когда я пытаюсь использовать эту переменную в цикле For, например:

Dim MyInstance as MyClass: Set MyInstance = New MyClass
For MyInstance.i = 1 To 10
    Debug.Print "Hello"
Next

Я получаю ошибку: Требуется переменная.Не могу присвоить этому выражению

Я просмотрел справочную страницу , но не могу понять, как это применимо к моему делу.Соответствующий фрагмент: «Вы пытались использовать неизменную в качестве счетчика цикла в конструкции For...Next. Используйте переменную в качестве счетчика».Но i - это, в конце концов, переменная, а не функция Let Property или любое другое выражение.

Что не так с кодом?

РЕДАКТИРОВАТЬ: IСледует отметить, что причина, по которой я хочу, чтобы мой итератор был частью класса, заключается в том, что у меня есть несколько экземпляров класса, служащих различным целям в моем проекте, и есть несколько вложенных циклов For для каждого экземпляра класса.Поэтому стоит, чтобы итераторы принадлежали их соответствующим объектам, скажем:

For Client.i = 1 To Client.Count
    For Order.i = 1 To Order.Count
        For Item.i = 1 To Item.Count

и т. Д.

Я согласился на следующий обходной путь, но все еще не полностью удовлетворен им:

For ciii = 1 To Client.Count
    Client.i = ciii ' Client.i is later used in the code
    For oiii = 1 To Order.Count
        Order.i = oiii
        For iiii = 1 To Item.Count
            Item.i = iiii

Ответы [ 4 ]

0 голосов
/ 01 июня 2018

Если вам нужен обходной путь, чтобы перебрать свойство экземпляра, вы можете создать метод для его увеличения, изменить цикл на Do While ... Loop и вызвать этот метод перед вызовом цикла.

'Class Module
Option Explicit

Public i As Integer

Public Sub increment_i()
i = i + 1
End Sub

Private Sub Class_Initialize()
i = 0
End Sub

'Module
Sub loop_myclass()

Dim instance As MyClass: Set instance = New MyClass

Do While instance.i <= 10
'Instance property dependent code here
    Debug.Print instance.i
    instance.increment_i
Loop

End Sub
0 голосов
/ 01 июня 2018

Вы не можете использовать MyInstance.i в качестве счетчика приращений, но вы можете использовать его как терминатор;например, для i = 1 до MyInstance.i.

класс MyClass

Option Explicit

Public pi As Long

Public Property Get i() As Long
    i = pi
End Property

Public Property Let i(Value As Long)
    pi = Value
End Property

тестовая подпроцедура в Module1

Sub test()
    Dim MyInstance As MyClass, i As Long
    Set MyInstance = New MyClass
    MyInstance.i = 10
    For i = 1 To MyInstance.i
        Debug.Print "Hello"
    Next
End Sub
0 голосов
/ 01 июня 2018

ОК, я нашел ответ. есть справочная страница Microsoft для For ... Next loop относительно VB, но я думаю, что она также относится и к VBA.

Там написано:

Еслиобласть действия counter не является локальной для процедуры, возникает предупреждение во время компиляции.

Так что здесь обсуждать особо нечего, просто MS хочет, чтобы это было.Хотя я думаю, что если область действия больше, чем процедура, это не должно вызывать никаких проблем, но, очевидно, это так.

0 голосов
/ 01 июня 2018

Если вы хотите, чтобы общедоступная переменная цикла поместила ее в верхнюю часть стандартного модуля, т.е. объявите Public i в верхней части стандартного модуля.

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

Итак, стандартный код модуля будет:

Public i As Long

Sub ........

   For i = 1 To 10
       Debug.Print "Hello"
   Next i

End Sub ......

Если вы хотите, чтобы оно каким-то образом было свойством / методом, вам нужно определить геттеры и сеттеры (потенциально) в классе.А затем переписать код вашего модуля соответственно.Особенно, если вы планируете зацикливание с использованием i, вам понадобится метод инкремента в классе.

И да, я изменил i на Long, так как в этом случае, как я полагаю, нет никаких преимуществ его использования.объявлено как целое числоДлинная - более безопасная ставка для избежания потенциального переполнения.

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