【问题标题】:Populate an Excel Table with a One Dimensional array using VBA使用 VBA 使用一维数组填充 Excel 表
【发布时间】:2017-12-20 08:03:21
【问题描述】:

我正在尝试在 Excel 中填充一个单列表,我可以使用 vba 和一维数组连接到电源查询。

因此,用户将列表放入文本框中,其中每个项目用分号分隔,然后将其带入数组。到目前为止我有:

Dim arrSIOCodes As Variant

arrSIOCodes = Split(tbSIOCodes, ";")

ThisWorkbook.Sheets("CAEATFA_SIO").Activate

Call ChangeTableToArray(tbl:=ThisWorkbook.Sheets("CAEATFA_SIO").ListObjects("tblSIOCodes"), ar:=arrSIOCodes)

我从另一个堆栈溢出帖子中得到了这个子,但我需要根据我的问题对其进行自定义,我遇到了麻烦

Sub ChangeTableToArray(tbl As ListObject, ar)
  Dim newRows As Long: newRows = 1 + UBound(ar, 1) - LBound(ar, 1)
  If Not tbl.DataBodyRange Is Nothing Then tbl.DataBodyRange.EntireRow.Delete
  If newRows > 1 Then tbl.HeaderRowRange.Resize(newRows - 1).Offset(2).EntireRow.Insert
   tbl.HeaderRowRange.Resize(newRows, 1 + UBound(ar, 1) - LBound(ar, 1)).Offset (1).value = ar
End Sub

这是当前代码正在执行的操作:

但是这是我需要它做的:

【问题讨论】:

  • THINK 你可以用... .value = Application.Transpose(ar) 做到这一点。糟糕 - 不,你不能,你是故意调整列的大小,而不是行。
  • 它的WorksheetFunction.Transpose()
  • @YowE3K 更近了一步,现在每一列都列出了 value1,value2,value3 但它仍然遍历相同数量的列。我不知道如何在不破坏列的情况下减少列。
  • @ja72 通常使用Application.Transpose 比使用WorksheetFunction.Transpose 更好
  • @ja72 我想最值得注意的是它直接使用 VBA 的 Excel 应用程序对象,而不必将请求传递给 Excel 本身进行处理和返回。 Mat's Mug 能够更好地解释这两种方法之间的差异 - 他(我认为杯子是“他”!)深入了解他为 RubberDuck 所做的一些事情的处理方式。

标签: vba excel powerquery


【解决方案1】:

您正在调整目标中列数的大小,但您只有一列(如果您Transpose 数组)要存储。因此,请执行以下操作:

tbl.HeaderRowRange.Resize(newRows, 1).Offset (1).value = Application.Transpose(ar)

【讨论】:

  • 太棒了!我试过这个,但由于我没有将它与添加的 Application.Transpose 结合起来,所以它出错了。但这行得通,谢谢!!
  • @SanomaJean 没有Transpose,它不应该出错,但它会简单地用第一个值填充所有行(这不是很有用)
  • 啊,你是对的,这是我尝试的另一件事是错误的——你说的是这个结果。我尝试了很多东西,我把所有错误的输出都弄混了哈哈。感谢您的帮助!
【解决方案2】:

即将参加一个迟到的会议,所以我很快把它放在一起,它未经测试。但这只是另一种看待它的方式:

Sub ArrayToTable(ByVal ws As Worksheet, ParamArray YourArr() As Variant)

    Dim TmpArr As Variant, i As Long, LineNum As Long

    TmpArr = YourArr(0)

    LineNum = 1 'whatever method you use to find linenumbers

    For i = LBound(TmpArr) To UBound(TmpArr)
        ws.Cells(LineNum, 1).Value = TmpArr(i)
        LineNum = LineNum + 1
    Next

End Sub

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-06-26
    • 1970-01-01
    • 2014-07-15
    • 2023-03-17
    • 1970-01-01
    相关资源
    最近更新 更多