Обнаружил странную ситуацию; удивляюсь, что впервые за 20 лет.
Есть Sub - Клиент и объект класса [ сейчас это специальный проект для демонстрации всем ].
Поставьте останов, как показано на картинке. Откройте окно Locals и нажмите, пожалуйста, [ , скажем 4 раза, ] [F5].
А теперь в окне Locals раскройте объект oTestVBA. Почему отличаются значения mForProperty и mForProperty ?
А если несколько раз раскрывать-закрывать объект oTestVBA, то можно увидеть и такое.
Встретилось мне все это при программировании/отладке программы, где мне нужна была Очередь. Реализовал через массив и пошли непонятные ошибки с индексами . . .
Такое впечатление, что при раскрытии объекта в окне Locals система пытается [ вроде ведь совершенно необходимо ] получить значения всех переменных - и, по непонятной причине, считает Property Get xxxName как переменную; происходит вызов Property Get и пошло-поехало. Естественно, после такого "пристального взгляда" системы на программу импульс и / или положение меняются и программа работает неверно.
Кстати, картинки и код класса немного устарели - я добавил еще Private Property Get - с ней та же история.
И еще - проверял на Excel 2003, 2007 ( Windows XP ), 2010 ( Windows 7 / 64 / Pack 1 ) - одинаково плохо.
Строка Watch показывает все верно - но только до тех пор, пока не скажешь, что хочешь ее Edit; и вот, ничего там не меняешь, но в зависимости от способа закрытия окошка редактирования : крестиком - ничего не меняется, а вот "правильное" [ OK ] сразу покажет значение из Locals.
Хорошо помню, как в переводной книге по VB6 [ она также входит в поставку Visual Studio 6 - но на английском ] написано : " ...не бойтесь использовать вместо переменных Property - все равно за кулисами переменная реализуется парой оных ...". Но хотелось бы - без таких последствий.
А может это все уже давно известно грамотным людям ? Тогда извините.
- Код: Выделить всё
' Attribute VB_Name = "modTestVBA"
Option Explicit
Sub TestVBA()
Dim oTestVBA As cTestVBA, j As Long
Set oTestVBA = New cTestVBA
For j = 1 To 4
oTestVBA.AddM
Next j
Set oTestVBA = Nothing
End Sub
'----------------------------------------------------------------------------------------
' VERSION 1.0 CLASS
' BEGIN
' MultiUse = -1 'True
' END
' Attribute VB_Name = "cTestVBA"
' Attribute VB_GlobalNameSpace = False
' Attribute VB_Creatable = False
' Attribute VB_PredeclaredId = False
' Attribute VB_Exposed = False
Option Explicit
Private mForFunction As Long, mForProperty As Long
Public Function anyFunctionFrom() As Long
anyFunctionFrom = mForFunction
mForFunction = mForFunction - 1
End Function
Public Property Get anyPropertyFrom() As Long
anyPropertyFrom = mForProperty
mForProperty = mForProperty - 1
End Property
Public Sub AddM()
mForProperty = mForProperty + 1
mForFunction = mForFunction + 1
End Sub
Private Sub Class_Initialize()
mForProperty = 7
mForFunction = 7
End Sub