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