Почему Excel VBA перезаписывает эти значения объекта - PullRequest
1 голос
/ 07 июня 2019

Я пытаюсь создать список объектов в VBA, но создается впечатление, что новые объекты не создаются, а значения обновляются до одного экземпляра класса.

Это класс

' ---------------------------------------------------------------
'
' Class to represent Program Increment
'
' ---------------------------------------------------------------

Public name As String

Public sprints As New Collection

Это телефонный код:

' get the unique pi values
Dim piList As New Collection
For r = firstRow To lastRow
    currentVal = Cells(r, 2)
    On Error Resume Next
        Dim currentPi As New ProgramIncrement
        currentPi.name = currentVal
        piList.Add currentPi, currentVal
    On Error GoTo 0
Next

Это вывод для первого пи enter image description here

А это выход для второго пи enter image description here

Я не вижу, что я делаю неправильно, основываясь на таких онлайн-документах. https://analystcave.com/vba-vba-class-tutorial/

Ответы [ 2 ]

6 голосов
/ 07 июня 2019

As New создает автоматически созданный объект.Dim операторы не являются исполняемыми, поэтому на самом деле есть только один объект.

Удалите As New и используйте операторы Set ... = New для создания новых объектов.

Dim currentPi As ProgramIncrement
Set currentPi = New ProgramIncrement

Dimвнутри цикла нет никакой разницы - с одной стороны, это облегчает последующий рефакторинг и извлечение тела цикла в его собственную область действия процедуры;с другой стороны, можно прочитать так, как будто новая переменная создается на каждой итерации, но это не так, как работают области действия в VBA: наименьшая область действия - область действия процедуры - блоки (например, тела цикла) несфера что угодно.

0 голосов
/ 07 июня 2019

Это сработало в ответ на Матье Гиндона.

Dim piList As New Collection
Dim currentPi As ProgramIncrement
For r = firstRow To lastRow
    currentVal = Cells(r, 2)
    Set currentPi = New ProgramIncrement
    currentPi.name = currentVal
    On Error Resume Next
        piList.Add currentPi, currentVal
    On Error GoTo 0
Next
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...