Excel VBA: как использовать вложенные массивы - PullRequest
0 голосов
/ 08 ноября 2018

По сути, я хочу создать массив, в котором я могу использовать типы, и иметь его с течением времени. Так что это означает, что цель состоит в том, чтобы иметь массив, где я могу вызвать: Array(At a period = 1).Name.Variable = the expected Value. Итак, я проектировал массив, чтобы он выглядел так:

    { Period1:{ 
               {A:{Revenue:5,ROE:5%},
                B:{Revenue:7,ROE:8%}
               }
      Period2:{ 
               {A:{Revenue:5,ROE:5%},
                B:{Revenue:7,ROE:8%}
                }
     }

Я читаю эти значения из таблицы Excel, в которой есть Имена (A, B) с соответствующими значениями Выручки и ROE. Затем я использую эти значения, чтобы со временем что-то с ними сделать.

Это то, что я пытался получить, я получаю следующую ошибку компиляции: Только определенные пользователем типы в модулях открытых объектов могут быть принудительно преобразованы в вариант или из него или переданы функциям с поздней привязкой.

Option Explicit

Private Type RelationshipArray
    Revenue As Double
    ROE As Double
End Type

Public Type RelationshipProductCategory
      Period As Integer
      A as variant 
      B as variant
End Type
'
'Private this As RelationshipArray
'
'Public Property Get Revenue(ByVal value As Double) As Double
'    Revenue = this.Revenue
'End Property
'
'Public Property Get ROE(ByVal value As Double) As Double
'    ROE = this.ROE
'End Property



Function GetRelationshipValues(ByVal Period As Integer, ByRef B As Variant, ByRef A As Variant) As RelationshipProductCategory
    GetRelationshipValues.Period = Period
    GetRelationshipValues.A = A
    GetRelationshipValues.B = B

End Function


Sub RelationshipIncomeCalculation()
Dim ar(10)
Dim A As RelationshipArray
Dim B As RelationshipArray


'this table value is analogous to Range("A2") just more robust for my use
A.Revenue = TableValue("RelationShipIncomeInput", "A", "Revenue", 0, 0)
A.ROE = TableValue("RelationShipIncomeInput", "A", "ROE", 0, 0)

B.Revenue = TableValue("RelationShipIncomeInput", "B", "Revenue", 0, 0)
B.ROE = TableValue("RelationShipIncomeInput", "BUSINESS DEPOSITS", "ROE", 0, 0)
ar(0) = GetRelationshipValues(0, A,B)

1 Ответ

0 голосов
/ 15 июля 2019

Надеюсь, что мой ответ все еще помогает, но если вы уже преодолели проблему, было бы замечательно, если бы вы могли пометить это как ответ, если он вам подходит

По сути, вы не должны объявлять RelationshipArray и RelationshipProductCategory как Тип , но вместо этого Class Module (на что ссылаются «определяемые пользователем типы в модулях открытых объектов».

Например, щелкните правой кнопкой мыши проект и создайте модуль класса RelationshipArray и вставьте в него следующие элементы:

Public Revenue As Double
Public ROE As Double

И сделайте то же самое для RelationshipProductCategory.

Чтобы создатьновый экземпляр класса class, вы должны сделать

dim v as RelationshipArray
set v = new RelationshipArray

То же самое для установки его в элемент массива:

Dim ar(10) as RelationshipArray
Set ar(0) = v

Итак, ваш код должен выглядеть так:

Option Explicit

Function GetRelationshipValues(ByVal Period As Integer, ByRef B As Variant, ByRef A As Variant) As RelationshipProductCategory
    Dim rtn As RelationshipProductCategory
    Set rtn = New RelationshipProductCategory
    rtn.Period = Period
    Set rtn.A = A
    Set rtn.B = B
    Set GetRelationshipValues = rtn
End Function
Function TableValue(rel As String, prodasp As String, attr As String, v1 As Double, v2 As Double) As Double
    TableValue = Rnd
End Function

Sub RelationshipIncomeCalculation()
    Dim ar(10) as RelationshipProductCategory
    Dim A As RelationshipArray
    Dim B As RelationshipArray
    Set A = New RelationshipArray
    Set B = New RelationshipArray

    'this table value is analogous to Range("A2") just more robust for my use
    A.Revenue = TableValue("RelationShipIncomeInput", "A", "Revenue", 0, 0)
    A.ROE = TableValue("RelationShipIncomeInput", "A", "ROE", 0, 0)

    B.Revenue = TableValue("RelationShipIncomeInput", "B", "Revenue", 0, 0)
    B.ROE = TableValue("RelationShipIncomeInput", "BUSINESS DEPOSITS", "ROE", 0, 0)
    Set ar(0) = GetRelationshipValues(0, A, B)

    MsgBox "ar(0).A.Revenue = " & ar(0).A.Revenue
End Sub

Я рекомендую вам узнать больше о разнице между типом и модулем класса.По сути, модули классов более полезны для ИМО.

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