【问题标题】:VBA Creating an excel chart using values in an arrayVBA使用数组中的值创建Excel图表
【发布时间】:2017-05-10 23:38:46
【问题描述】:

我有一些二维数组中的数据,我需要使用 excel 图表创建图表。但是,图表 setsourcedata 似乎只接受范围。这意味着我必须将数组存储在某个电子表格的某个范围内,然后将该范围作为输入传递给图表。所以我创建了一个临时表来将数据存储在特定范围内,然后计划将其传递给创建图表调用。这是我创建的一个类型

Private Type CItem

CName As Variant
CWeek(13) As Variant
CDisabled(13) As Variant
CEmpty(13) As Variant
CEnabled(13) As Variant

End Type

Dim CItemArray(100) As CItem
cnt1 = 0

//.. do something

ActiveWorkbook.Sheets.Add(After:=Sheets("MainSheet")).Name = "WK_Report"

Worksheets("WK_Report").Range("C3:C15").value = CItemArray(cnt1).CWeek()
Worksheets("WK_Report").Range("D3:D15").value = CItemArray(cnt1).CDisabled()
Worksheets("WK_Report").Range("E3:E15").value = CItemArray(cnt1).CEnabled()
Worksheets("WK_Report").Range("F3:F15").value = CItemArray(cnt1).CEmpty()

我的目标是将第一个 CItem 的整个 CWeek 数组分别分配给 C3:C15 的范围。但是,我上面使用的语法将 Cweek、CDisabled、CEnabled、CEmpty 的第一个元素分配给整个范围。我在 CWeek 和其他人之后尝试不带括号,但结果是一样的。

如何将数组值分配给范围?我知道这些值在数组中,因为我在分配验证后做了一个 debug.print。

【问题讨论】:

  • 试试Worksheets("WK_Report").Range("C3:C15").value = Application.Transpose(CItemArray(cnt1).CWeek)
  • 我试过这个.. 这将输出减少到 cweek 的单个项目

标签: arrays vba excel charts


【解决方案1】:

可以使用Application.Transpose:这是一个简化的示例

Option Explicit

Private Type CItem
    CWeek(13) As Variant
End Type

Sub Tester()

    Dim itm As CItem, x As Long

    For x = 1 To 14
        itm.CWeek(x - 1) = x
    Next x

    ActiveSheet.Range("C3:C15").Value = itm.CWeek '>> all "1"

    ActiveSheet.Range("D3:D15").Value = Application.Transpose(itm.CWeek) '>> 1 to 13

End Sub

【讨论】:

  • 谢谢..我试过这个..它没有工作 Worksheets("WK_Report").Range("C3:C15").value = Application.Transpose(CItemArray(cnt1).CWeek)唯一的区别是我试图引用一个特定的 CItemarray
  • '它不起作用'既不是有效的错误代码,也不是对问题的充分描述。
  • @jeeped 不幸的是,输入 = 提交评论,我试图进入新行。我也尝试了 Alt + Enter。它也这样做了。我放弃了。我刚刚编辑了我的评论。我将学习如何在评论中输入新行。酷吗?
  • 对我来说很好,所以你的代码还有其他问题......顺便说一句,你不能在 cmets 中使用换行符。
  • 是的!我运行了你的代码,它可以工作。我可能在这里做错了什么......鉴于我正在尝试访问 citem 数组的特定元素
【解决方案2】:

您已经忽略了如何填充用户定义的类型数组,但您应该移至二维变量数组。

Private Type CItem
    CName As Variant
    CStuff(1 to 13, 1 to 4) As Variant
End Type

Dim CItemArray(100) As CItem, cnt1 as long

//.. populate 100 CItemArray.CStuff with 13 rows by 4 columns each

ActiveWorkbook.Sheets.Add(After:=Sheets("MainSheet")).Name = "WK_Report"

cnt1 = 1
with Worksheets("WK_Report").Range("C3")
    .resize(ubound(CItemArray(cnt1).CStuff, 1), ubound(CItemArray(cnt1).CStuff, 2)) = CItemArray(cnt1).CStuff
end with

从我的角度来看,用户定义的类型只会妨碍您,但是一旦您开始使用它,它就可能是“一劳永逸”的事情。我使用了一个基于 1 的数组,因此您不必将 1 添加到 ubounds。

【讨论】:

  • "从我的角度来看,用户定义的类型只会妨碍你,但一旦你让它工作,它可能是一种“设置并忘记”类型的东西。我使用了基于 1 的类型数组,因此您不必将 1 添加到 ubounds。”你能澄清一下吗?
  • 1.您需要一个二维数组以逐列将值直接传输到工作表。您使用了 4 个一维数组。 2. 填充用户定义的结构可能更容易,但将其返回工作表并不容易,而且您拒绝提供您最初是如何填充它的,所以......我不知道。 3. 如果您有一个从零开始的数组并使用它的 ubound 来调整目标的大小,您必须将 1 添加到 ubound 因为工作表上没有零行乘零列的单元格范围。
  • 超级!感谢您对迁移到二维数组的帮助和建议。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-10-09
  • 1970-01-01
相关资源
最近更新 更多