Я пытаюсь сохранить данные в словаре, объявленном в модуле класса. Я использовал словарь в модуле класса, потому что количество групп и связанных с ними точек данных неизвестно в начале. Приведенный ниже код компилируется, но операторы dRATIO.exists
в модуле класса и возвращают false (однако при первом проходе оператор отладки в модуле класса дает правильное значение, после этого ошибки), а затем Function GetRATIO
возвращает 999. Любые предложения ?Excel VBA, записывающий данные в словарь в модуле класса
'CODE IN A CLASS MODULE CALLED clsIVDATA
Option Explicit
Public dRATIO
Public dIV
'
Sub Init(RATIO As Variant, IV As Variant, KEY As String)
'Dim I As Long
Dim VAL As String
Dim RowKeys
Dim COLKEYS
Set dRATIO = CreateObject("Scripting.Dictionary")
Set dIV = CreateObject("Scripting.Dictionary")
dRATIO.ADD ITEM:=RATIO, KEY:=KEY
dIV.ADD ITEM:=RATIO, KEY:=KEY
Debug.Print dRATIO.Exists("1")
Debug.Print dRATIO.ITEM("1")
End Sub
Function GetRATIO(KEY As String)
If dRATIO.Exists(KEY) Then
GetRATIO = dRATIO(KEY)
Else
GetRATIO = 999 'or raise an error...
End If
End Function
Function NO_VALUES()
NO_VALUES = dRATIO.COUNT
End Function
Function GetIV(KEY As String)
If dIV.Exists(KEY) Then
GetIV = dIV(KEY)
Else
GetIV = 999 'or raise an error...
End If
End Function
'=====================================================
'CODE IN A NORMAL MODULE
Sub tstclass()
Dim RATIO() As Variant
Dim IV() As Variant
Dim I As Integer
Dim dctSKEW As Object
Set dctSKEW = CreateObject("Scripting.Dictionary")
dctSKEW.ADD "APZ4", New clsIVDATA
RATIO = Array(0.879, 0.843, 0.802, 0.756, 0.658)
IV = Array(0.165, 0.156, 0.145, 0.136, 0.125)
For I = 1 To 5
KEY = CStr(I)
dctSKEW("APZ4").Init RATIO(I), IV(I), KEY
Next I
Debug.Print dctSKEW("APZ4").GetRATIO("1")
Debug.Print dctSKEW("APZ4").GetRATIO("2")
Debug.Print dctSKEW("APZ4").NO_VALUES
End Sub
попробуйте заменить 'dctSKEW (" APZ4 ") .Введите RATIO (I), IV (I), KEY' с' dctSKEW.Item ("APZ4"). Init RATIO (I), IV (I), KEY' –
@ vba4all Спасибо, но это не сработало. Я думаю, что элемент словаря назначается в модуле класса, а не модулем, поэтому это изменение не будет иметь значения. Поэтому я думаю, что проблема связана с функциями GetRatio или GetIV dRATIO.Exists (KEY) возвращает false, и поэтому возвращается 999 – Zeus
. DRATIO.Add KEY, RATIO и dIV.Add KEY, IV ... KEY then VALUE. http://stackoverflow.com/questions/915317/does-vba-have-dictionary-structure – dee