我有一个 VBA 代码,它从结构化表的一列获取数据并将其放入另一个结构化表的一列中,如下所示:
Dim TopNTickers As Variant
Dim NoOfTickers As Integer
Dim OutputTickers As Range
TopNTickers = Application.Transpose(Range("PortfolioTbl[Ticker]"))
NoOfTickers = UBound(TopNTickers)
With Range("TopNTickersTbl").ListObject.ListColumns("Ticker").Range
Set OutputTickers = .Parent.Range(.Cells(2, 1), .Cells(NoOfTickers + 1, 1))
End With
OutputTickers = Application.Tranpose(TopNTickers)
第一个 Transpose 工作正常。它将 PortfolioTbl 表的 Ticker 列中的数据复制到 1D TopNTickers 数组中。
下一部分选择 TopNTickersTbl 表的 Ticker 列的子集。它似乎工作正常。
最后一部分给了我错误:
对象不支持属性或方法
我也尝试用 OutputTickers.Value 替换 OutputTickers,但出现同样的错误。
笔记:
上面的代码已经简化。在实际版本中,我增加了几行代码,删除了 TopNTickersTbl 的内容,然后向其中添加了与 TopNTickers 数组大小相等的行数,为数据写出阶段做准备。两个版本都发生了相同的错误,我很确定额外的代码与此错误无关。
答案1
这确实很奇怪。
我能够复制您的错误。看来我们无法将数组放入行数少于数组的表中。
我们可以先将空行添加到表,或者逐个添加数组项,让表在添加每个项时调整其大小。
我选择了后者,而且有效。
Public Sub Test1()
Dim TopNTickers As Variant
Dim NoOfTickers As Integer
Dim OutputTickers As Range
TopNTickers = Application.Transpose(Range("PortfolioTbl[Ticker]"))
NoOfTickers = UBound(TopNTickers)
With Range("TopNTickersTbl").ListObject.ListColumns("Ticker").Range
Set OutputTickers = Range("TopNTickersTbl").ListObject.ListColumns("Ticker").Range.Parent.Range(.Cells(2, 1), .Cells(NoOfTickers + 1, 1))
End With
Dim i As Integer
For i = 1 To NoOfTickers
OutputTickers.Cells(i, 1) = TopNTickers(i)
Next i
End Sub
编辑:我不清楚您的具体使用情况,但您可能会发现使用 PowerQuery 获取 TopN 项目更为简单。或者甚至只是一个数据透视表。