从类对象的字典输出到工作表范围

时间:2015-09-11 11:11:33

标签: excel vba excel-vba object dictionary

我正在使用多组时间表数据 - 人们记录他们与客户的时间,并提供自由文本叙述来描述他们所做的工作。

当涉及到时间计费时,会生成一个包含多行数据的报告,每行包含小时,员工和他们撰写的叙述等内容。在计费时间时,需要将类似的时间线组合在一起,形成客户理解的标准描述。因此,这项工作的一项关键任务是将行记类别分配给行,以便将行组合在一起,然后报告它们。

我已经构建了一个Excel工具来帮助处理这项工作的各个方面,但我正在进行的一项重要改进是,该工具可以构建一个叙述和计费类别的参考“数据库”。然后,它将使用此引用来预测将来可以分配给新的时间线数据行的计费类别,从而节省执行计费的人很多时间自己分配标准的计费类别。

所以为了做到这一点,我认为最好创建一个名为'Narrative'的类对象,其中包含存储我需要的信息的属性 - 例如Billing Category,匹配频率等。然后,我将读取之前作业的历史数据将类别记录到叙述中并将这些项目存储在字典对象中一起收集的对象中。

我已经决定采用这种方法,因为使用字典很方便,因为能够检查Narrative是否已经存在 - 如果确实如此,那么正在读入的新实例不会被添加到字典中。< / p>

这可行,但我希望能够将词典中保存的叙事对象中存储的项目输出到工作表范围。以下是我用于此的代码:

Sub OutputDict()

Dim counter As Long
counter = 1

Dim strKey

For Each strKey In dict_Narratives.Keys()

Worksheets("Output").Range("A" & counter).Value = dict_Narratives.Item(strKey).Narrative
Worksheets("Output").Range("B" & counter).Value =     dict_Narratives.Item(strKey).BillCat
Worksheets("Output").Range("C" & counter).Value =     dict_Narratives.Item(strKey).DateIndex
Worksheets("Output").Range("D" & counter).Value =     dict_Narratives.Item(strKey).Frequency
counter = counter + 1

Next

End Sub

此代码有效,但遗憾的是输出数据需要花费大量时间!有没有更有效的方法来执行此操作 - 可能将数据字典放入数组对象或其他内容,然后将数组批量转储到定义的范围?也许这可以更快地工作,因为它不像我上面的代码那样逐个单元地迭代?我不知道如何将字典中的对象属性变成数组。任何帮助非常感谢!

编辑 - 这是答案......

我没有太多运气看到链接到显然有问题重复的页面,但阅读时我已经找到了解决方案。我需要遍历我的字典并将项目添加到数组中。然后将它们吐出到工作表上的范围内。这比循环通过单元格进行输出要快得多。我这样做的代码是:

Sub KeysToSpreadSheet()

Dim strKey
Dim vArrNarrative As Variant
Dim vArrBillCat As Variant
Dim vArrDateIndex As Variant
Dim vArrFrequency As Variant


ReDim vArrNarrative(1 To 1) As String
ReDim vArrBillCat(1 To 1) As String
ReDim vArrDateIndex(1 To 1) As String
ReDim vArrFrequency(1 To 1) As String


For Each strKey In dict_Narratives.Keys()

vArrNarrative(UBound(vArrNarrative)) = dict_Narratives(strKey).Narrative
ReDim Preserve vArrNarrative(1 To UBound(vArrNarrative) + 1) As String

vArrBillCat(UBound(vArrBillCat)) = dict_Narratives(strKey).BillCat
ReDim Preserve vArrBillCat(1 To UBound(vArrBillCat) + 1) As String

vArrDateIndex(UBound(vArrDateIndex)) = dict_Narratives(strKey).DateIndex
ReDim Preserve vArrDateIndex(1 To UBound(vArrDateIndex) + 1) As String

vArrFrequency(UBound(vArrFrequency)) = dict_Narratives(strKey).Frequency
ReDim Preserve vArrFrequency(1 To UBound(vArrFrequency) + 1) As String

Next

Sheets("Sheet1").Range("B2:B" & UBound(vArrNarrative) - 1) = Application.Transpose(vArrNarrative)
Sheets("Sheet1").Range("C2:C" & UBound(vArrBillCat) - 1) = Application.Transpose(vArrBillCat)
Sheets("Sheet1").Range("D2:D" & UBound(vArrDateIndex) - 1) =     Application.Transpose(vArrDateIndex)
Sheets("Sheet1").Range("E2:E" & UBound(vArrFrequency) - 1) =     Application.Transpose(vArrFrequency)

End Sub

0 个答案:

没有答案