Как распечатать одномерный массив типа модуля класса в диапазон в Excel VBA? - PullRequest
0 голосов
/ 18 июня 2020

У меня есть модуль класса LotData, который определяет 12 переменных c publi. Затем я создаю массив Buys () типа LotData и заполняю его элементами numBuys. (От 0 до numBuys -1)

У меня проблемы с выводом Buys () в диапазон. Я видел здесь несколько примеров, которые кажутся простыми, но я продолжаю сталкиваться с ошибками.

Обновление: это вся подпрограмма. Если есть лучший способ сделать это, я весь в ушах. Может быть, после сортировки транзакций, мне нужно просто скопировать строки Buy на лист temp , переставить столбцы, а затем скопировать это в конечный пункт назначения?

Option Private Module

Sub HandlePurchases()

Sheets("master_holdings").Select

Dim lastRowM As Long
lastRowM = Range("A1").End(xlDown).Row
lastRowM = IIf(lastRowM = 1048576, 1, lastRowM)

Sheets("transactions").Select

Dim lastRow As Long
lastRow = Range("A1").End(xlDown).Row
lastRow = IIf(lastRow = 1048576, 1, lastRow)

Range("A1:Z" + CStr(lastRow)).Sort Key1:=Range("A1"), Order1:=xlAscending, Key2:=Range("F1"), Order2:=xlAscending, Key3:=Range("H1"), Order3:=xlAscending, Header:=xlYes

Dim firstBuy As Long
Dim lastBuy As Long
Dim Buys() As LotData
Dim numBuys As Long
Dim i As Integer

firstBuy = Columns("A").Find("Buy", , xlValues, , xlRows, xlNext).Row
lastBuy = Columns("A").Find("Buy", , xlValues, , xlRows, xlPrevious).Row

numBuys = lastBuy - firstBuy + 1

ReDim Preserve Buys(numBuys - 1)

i = 0

For Row = firstBuy To lastBuy
    Set Buys(i) = New LotData
    Buys(i).Ticker = Cells(Row, 5)
    Buys(i).CUSIP = Cells(Row, 14)
    Buys(i).AcctNum = Cells(Row, 3)
    Buys(i).AcctName = Cells(Row, 4)
    Buys(i).Asset = Cells(Row, 6)
    Buys(i).OpenDate = Cells(Row, 2)
    Buys(i).StartDate = Cells(Row, 2)
    Buys(i).StartUnits = Cells(Row, 8)
    Buys(i).StartFMV = Cells(Row, 10)
    Buys(i).StartCB = Cells(Row, 10)
    Buys(i).CurrentFMV = Cells(Row, 10)
    Buys(i).CurrentUnits = Cells(Row, 8)

    i = i + 1
Next

Sheets("test").Activate

Dim myRange As Range
Set myRange = Sheets("test").Range("A1:L" & numBuys)

'Attempt 1
    'myRange = Buys
'Run-time error 1004: Application-defined or object defined error

'Attempt 2
    'Worksheets("test").Range(Range("A1"), Range("A1").Offset(UBound(Buys, 1), UBound(Buys, 2))).Value = Buys
'UBound(Buys, 2) causes causes Run-time error 9: Subscript out of range

'Attempt 3
    'Worksheets("test").Range("A1").Resize(UBound(Buys, 1) + 1, UBound(Buys, 2) + 1).Value = Buys
'Same result as Attempt 2

'Attempt 4
    'myRange.Resize(UBound(Buys, 1), UBound(Buys, 2)).Value = Buys
'Same as Attempts 2 and 3

'Attempt 5
myRange.Resize(Ubound(Buys) + 1, 1).value = WorksheetFunction.Transpose(Buys)
'Methond Transpose of object WorksheetFunction failed

End Sub

1 Ответ

0 голосов
/ 18 июня 2020

Пожалуйста, попробуйте:

Ваш массив выглядит как 1D-тип:

myRange.Resize(Ubound(Buys) + 1, 1).value = WorksheetFunction.Transpose(Buys)

Если по-прежнему возникает ошибка, связанная с WorksheetFunction, попробуйте:

myRange.Resize(Ubound(Buys) + 1, 1).value = Application.Transpose(Buys)

Замените 5 попыток (myRange.Resize(UBound(Buys, 1), 1).Value = WorksheetFunction.Transpose(Buys)) строкой выше!

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