VBA使用数组中的值创建Excel图表

时间:2017-05-10 23:38:47

标签: arrays excel vba excel-vba charts

我在二维数组中有一些数据,我需要使用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。

2 个答案:

答案 0 :(得分:2)

可以使用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

答案 1 :(得分:1)

您已经忽略了如何填充用户定义的类型数组,但您应该转移到2-D变体数组。

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的数组,所以你没有必要在ubounds上加1。