Excel VBA Array - запись данных транзакции - PullRequest
0 голосов
/ 28 августа 2018

Я работаю с моделью Excel, которая используется для иллюстрации жизненного цикла пенсии. Эта конкретная модель может потребовать 100 000 транзакций, где транзакция определяется как движение баланса, как транзакция банковского счета.

Я могу сохранить баланс, используя объект сценариев словаря, и это работает очень хорошо. Однако я хотел бы сохранить отдельные транзакции наиболее эффективным способом и записать их на лист, как только мои вычисления будут завершены.

Для этого я снова использовал словарь (я подумал, что в более поздних версиях он может быть полезен, если нужно, чтобы ссылаться на него) с элементами модуля класса, однако это довольно медленно, чтобы записать всю информацию на лист после завершения в «для каждого» цикла.

Будет ли лучше использовать массив с preserve или есть лучший вариант? Можно было бы определить большое слово, 100 000 * x, и увеличить размер, если я достигну границы.

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

Спасибо

Public Sub pb_sbSaveToUnitTransactionDict( _
                lgCaseId As Long, _
                lgEventId As Long, _
                strTransactionType As String, _
                lgInvCovSeqNo As Long, _
                lgInvCovSegNo As Long, _
                lgBasketId As Long, _
                lgTransactionMonth As Long, _
                dblPremIndexRate As Double, _
                strUnitFundType As String, _
                dblFundGrowthRate As Double, _
                strUnitFundCode As String, _
                dblUnitFundPrice As Double, _
                dblUnitMovement As Double, _
                dblUnitMovNomValue As Double, _
                strTransactionBasisCode As String, _
                dblTransactionAmount As Double, _
                dblTransactionPercentage As Double, _
                dblTotalNomSplit As Double, _
                dblKeyNomSplit As Double)

'The purpose of this function is to save a unit transaction record to the unit
'transaction dictionary.

'Key: TRANSACTION ID
'Item: Class Module containing the following information
    'CASE_ID
    'EVENT_ID
    'TRANSACTION_ID
    'TRANSACTION_TYPE
    'INV_COV_SEQ_NO
    'INV_COV_SEG_NO
    'BASKET_ID
    'TRANSACTION_MONTH
    'PREM_INDEX_RATE
    'UNIT_FUND_TYPE
    'GROWTH_RATE
    'UNIT_FUND_PRICE
    'UNIT_MOVEMENT
    'UNIT_MOV_NOM_VALUE
    'TRANS_NOM_VALUE
    'TOT_NOM_SPLIT
    'KEY_NOM_SPLIT

'Version Control
'Version        Description                         Author      Date
'0.14           Creation of Policy Anniversary and  A.King      23/08/2018
'               Guarantee Maturity Events

Dim vntTransactionId As Variant
Dim lgEndRow As Long
Dim strSheetName As String

'Set up the Dictionary Item as a Class Module
Set clsMdlUnitTransactionItem = New clsUnitTransaction

'Get the end Row in the in the Unit Transaction Table
strSheetName = "Unit Transaction"
lgNextRow = Worksheets(strSheetName).Range("A8").End(xlDown).row

'Get the next transaction ID
vntTransactionId = pb_objUnitTransaction.Count
vntTransactionId = vntTransactionId + 1 + lgNextRow - gblConst_OuputStartRow

'Populate the Unit Transaction Dictionary Class Module Item
clsMdlUnitTransactionItem.lgCaseId = lgCaseId
clsMdlUnitTransactionItem.lgEventId = lgEventId
clsMdlUnitTransactionItem.lgTransactionId = vntTransactionId
clsMdlUnitTransactionItem.strTransactionType = strTransactionType
clsMdlUnitTransactionItem.lgInvCovSeqNo = lgInvCovSeqNo
clsMdlUnitTransactionItem.lgInvCovSegNo = lgInvCovSegNo
clsMdlUnitTransactionItem.lgBasketId = lgBasketId
clsMdlUnitTransactionItem.lgTransactionMonth = lgTransactionMonth
clsMdlUnitTransactionItem.dblPremIndexRate = dblPremIndexRate
clsMdlUnitTransactionItem.strUnitFundType = strUnitFundType
clsMdlUnitTransactionItem.dblFundGrowthRate = dblFundGrowthRate
clsMdlUnitTransactionItem.strUnitFundCode = strUnitFundCode
clsMdlUnitTransactionItem.dblUnitFundPrice = dblUnitFundPrice
clsMdlUnitTransactionItem.dblUnitMovement = dblUnitMovement
clsMdlUnitTransactionItem.dblUnitMovNomValue = dblUnitMovNomValue
clsMdlUnitTransactionItem.dblTotalNomSplit = dblTotalNomSplit
clsMdlUnitTransactionItem.dblKeyNomSplit = dblKeyNomSplit
clsMdlUnitTransactionItem.strTransactionBasisCode = strTransactionBasisCode
clsMdlUnitTransactionItem.dblTransactionAmount = dblTransactionAmount
clsMdlUnitTransactionItem.dblTransactionPercentage = dblTransactionPercentage

'Add to the Unit Transaction Dictionary
pb_objUnitTransaction.Add _
key:=vntTransactionId, _
item:=clsMdlUnitTransactionItem

End Sub



Public Sub pb_sbUnloadUnitTransactionDict()

'The purpose of this sub routine is to unload all unit transactions from the
'unit transaction dictionary that are no longer required to be stored in temporary
'memmory

'This routine will be called in the processing of a Policy Anniversary
'and Guarantee Maturity Investment Events

Dim lgPolicyYear
Dim dtmPolicyYearStartDate As Date
Dim dtmPOlicyYearEndDate As Date
Dim vntTransactionId As Variant
Dim strSheetName As String
Dim lgNextRow As Long

'Get the next row on the Unit Transaction Table
strSheetName = "Unit Transaction"
lgNextRow = Worksheets(strSheetName).Range("A8").End(xlDown).row

'Loop through each of the unit transactions during this policy year and
'populate the unit transaction table

For Each vntTransactionId In pb_objUnitTransaction

    ThisWorkbook.Sheets(strSheetName).Cells(lgNextRow + vntTransactionId, 1).Value = pb_objUnitTransaction(vntTransactionId).lgCaseId
    ThisWorkbook.Sheets(strSheetName).Cells(lgNextRow + vntTransactionId, 2).Value = pb_objUnitTransaction(vntTransactionId).lgEventId
    ThisWorkbook.Sheets(strSheetName).Cells(lgNextRow + vntTransactionId, 3).Value = pb_objUnitTransaction(vntTransactionId).lgTransactionId
    ThisWorkbook.Sheets(strSheetName).Cells(lgNextRow + vntTransactionId, 4).Value = pb_objUnitTransaction(vntTransactionId).strTransactionType
    ThisWorkbook.Sheets(strSheetName).Cells(lgNextRow + vntTransactionId, 5).Value = pb_objUnitTransaction(vntTransactionId).lgInvCovSeqNo
    ThisWorkbook.Sheets(strSheetName).Cells(lgNextRow + vntTransactionId, 6).Value = pb_objUnitTransaction(vntTransactionId).lgInvCovSegNo
    ThisWorkbook.Sheets(strSheetName).Cells(lgNextRow + vntTransactionId, 7).Value = pb_objUnitTransaction(vntTransactionId).lgBasketId
    ThisWorkbook.Sheets(strSheetName).Cells(lgNextRow + vntTransactionId, 8).Value = pb_objUnitTransaction(vntTransactionId).lgTransactionMonth
    ThisWorkbook.Sheets(strSheetName).Cells(lgNextRow + vntTransactionId, 9).Value = pb_objUnitTransaction(vntTransactionId).dblPremIndexRate
    ThisWorkbook.Sheets(strSheetName).Cells(lgNextRow + vntTransactionId, 10).Value = pb_objUnitTransaction(vntTransactionId).strUnitFundType
    ThisWorkbook.Sheets(strSheetName).Cells(lgNextRow + vntTransactionId, 11).Value = pb_objUnitTransaction(vntTransactionId).dblFundGrowthRate
    ThisWorkbook.Sheets(strSheetName).Cells(lgNextRow + vntTransactionId, 12).Value = pb_objUnitTransaction(vntTransactionId).strUnitFundCode
    ThisWorkbook.Sheets(strSheetName).Cells(lgNextRow + vntTransactionId, 13).Value = pb_objUnitTransaction(vntTransactionId).dblUnitFundPrice
    ThisWorkbook.Sheets(strSheetName).Cells(lgNextRow + vntTransactionId, 14).Value = pb_objUnitTransaction(vntTransactionId).dblUnitMovement
    ThisWorkbook.Sheets(strSheetName).Cells(lgNextRow + vntTransactionId, 15).Value = pb_objUnitTransaction(vntTransactionId).dblUnitMovNomValue
    ThisWorkbook.Sheets(strSheetName).Cells(lgNextRow + vntTransactionId, 16).Value = pb_objUnitTransaction(vntTransactionId).strTransactionBasisCode
    ThisWorkbook.Sheets(strSheetName).Cells(lgNextRow + vntTransactionId, 17).Value = pb_objUnitTransaction(vntTransactionId).dblTransactionAmount
    ThisWorkbook.Sheets(strSheetName).Cells(lgNextRow + vntTransactionId, 18).Value = pb_objUnitTransaction(vntTransactionId).dblTransactionPercentage
    ThisWorkbook.Sheets(strSheetName).Cells(lgNextRow + vntTransactionId, 19).Value = pb_objUnitTransaction(vntTransactionId).dblTotalNomSplit
    ThisWorkbook.Sheets(strSheetName).Cells(lgNextRow + vntTransactionId, 20).Value = pb_objUnitTransaction(vntTransactionId).dblKeyNomSplit


Next vntTransactionId


'Remove all records
pb_objUnitTransaction.RemoveAll

End Sub

1 Ответ

0 голосов
/ 28 августа 2018

Я выбрал вариант 1, и это экономит время.

Спасибо за вашу помощь @chrisNeilsen

Public pb_aryUnitTransaction(100000, 20) As Variant



Public Sub pb_sbUnloadUnitTransactionDict()

'The purpose of this sub routine is to unload all unit transactions from the
'unit transaction dictionary that are no longer required to be stored in temporary
'memmory

'This routine will be called in the processing of a Policy Anniversary
'and Guarantee Maturity Investment Events

Dim lgPolicyYear
Dim dtmPolicyYearStartDate As Date
Dim dtmPOlicyYearEndDate As Date
Dim vntTransactionId As Variant
Dim strSheetName As String
Dim lgNextRow As Long
Dim lgTransactionId As Long

'Get the next row on the Unit Transaction Table
strSheetName = "Unit Transaction"
'lgNextRow = Worksheets(strSheetName).Range("A8").End(xlDown).row


'Loop through each of the unit transactions during this policy year and
'save to unit transaction table

For Each vntTransactionId In pb_objUnitTransaction

    lgTransactionId = vntTransactionId
    pb_aryUnitTransaction(lgTransactionId - gblConst_OutputStartRow - 1, 0) = pb_objUnitTransaction(vntTransactionId).lgCaseId
    pb_aryUnitTransaction(lgTransactionId - gblConst_OutputStartRow - 1, 1) = pb_objUnitTransaction(vntTransactionId).lgEventId
    pb_aryUnitTransaction(lgTransactionId - gblConst_OutputStartRow - 1, 2) = pb_objUnitTransaction(vntTransactionId).lgTransactionId
    pb_aryUnitTransaction(lgTransactionId - gblConst_OutputStartRow - 1, 3) = pb_objUnitTransaction(vntTransactionId).strTransactionType
    pb_aryUnitTransaction(lgTransactionId - gblConst_OutputStartRow - 1, 4) = pb_objUnitTransaction(vntTransactionId).lgInvCovSeqNo
    pb_aryUnitTransaction(lgTransactionId - gblConst_OutputStartRow - 1, 5) = pb_objUnitTransaction(vntTransactionId).lgInvCovSegNo
    pb_aryUnitTransaction(lgTransactionId - gblConst_OutputStartRow - 1, 6) = pb_objUnitTransaction(vntTransactionId).lgBasketId
    pb_aryUnitTransaction(lgTransactionId - gblConst_OutputStartRow - 1, 7) = pb_objUnitTransaction(vntTransactionId).lgTransactionMonth
    pb_aryUnitTransaction(lgTransactionId - gblConst_OutputStartRow - 1, 8) = pb_objUnitTransaction(vntTransactionId).dblPremIndexRate
    pb_aryUnitTransaction(lgTransactionId - gblConst_OutputStartRow - 1, 9) = pb_objUnitTransaction(vntTransactionId).strUnitFundType
    pb_aryUnitTransaction(lgTransactionId - gblConst_OutputStartRow - 1, 10) = pb_objUnitTransaction(vntTransactionId).dblFundGrowthRate
    pb_aryUnitTransaction(lgTransactionId - gblConst_OutputStartRow - 1, 11) = pb_objUnitTransaction(vntTransactionId).strUnitFundCode
    pb_aryUnitTransaction(lgTransactionId - gblConst_OutputStartRow - 1, 12) = pb_objUnitTransaction(vntTransactionId).dblUnitFundPrice
    pb_aryUnitTransaction(lgTransactionId - gblConst_OutputStartRow - 1, 13) = pb_objUnitTransaction(vntTransactionId).dblUnitMovement
    pb_aryUnitTransaction(lgTransactionId - gblConst_OutputStartRow - 1, 14) = pb_objUnitTransaction(vntTransactionId).dblUnitMovNomValue
    pb_aryUnitTransaction(lgTransactionId - gblConst_OutputStartRow - 1, 15) = pb_objUnitTransaction(vntTransactionId).strTransactionBasisCode
    pb_aryUnitTransaction(lgTransactionId - gblConst_OutputStartRow - 1, 16) = pb_objUnitTransaction(vntTransactionId).dblTransactionAmount
    pb_aryUnitTransaction(lgTransactionId - gblConst_OutputStartRow - 1, 17) = pb_objUnitTransaction(vntTransactionId).dblTransactionPercentage
    pb_aryUnitTransaction(lgTransactionId - gblConst_OutputStartRow - 1, 18) = pb_objUnitTransaction(vntTransactionId).dblTotalNomSplit
    pb_aryUnitTransaction(lgTransactionId - gblConst_OutputStartRow - 1, 19) = pb_objUnitTransaction(vntTransactionId).dblKeyNomSplit


Next vntTransactionId

'Copy the array to the Unit Transaction Spread Sheet
lgNextRow = Worksheets(strSheetName).Range("A8").End(xlDown).row

'Paste to worksheet
Worksheets(strSheetName).Activate
Worksheets(strSheetName).Range(Cells(lgNextRow + 1, 1), Cells(UBound(pb_aryUnitTransaction), 20)) = pb_aryUnitTransaction

'Remove all records
Erase pb_aryUnitTransaction
pb_objUnitTransaction.RemoveAll

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