宏数组参数中的嵌套维度

时间:2018-02-16 02:23:23

标签: vba for-loop indexing ms-word word-vba

我在Word中为宏提供了一个多维数组。每个元素都是一个数组,每个数组元素都有2个值,一个图像的名称和一个简短的描述。宏是:

For i = LBound(figures, 1) To UBound(figures, 1)
    cgmImage = "C:\path\to\images\" & figures(i, 0) & ".jpeg"
    Selection.InlineShapes.AddPicture FileName:=cgmImage, LinkToFile:=False, SaveWithDocument:=True
    Selection.TypeParagraph
    With Selection
        .Font.Size = 14
        .Font.Bold = True
        .Font.Underline = wdUnderlineSingle
        .TypeText Text:=figures(i, 1)
    End With
Next i

示例输入数组将是:

[
    ['123','image 1'],
    ['456','image 2']
]

宏工作,插入每个图像及其描述。但是我现在想要添加第三个元素,这个元素本身就是一个表示表的2D数组。所以输入看起来像这样:

[
    [ '123','image 1', [['val1','val2'],['val3','val4']] ],
    [ '456','image 2', [['val1','val2'],['val3','val4']] ]
]

在宏中,我将使用第3个元素来创建表格。但是,如果我将这样的输入数据输入到我的原始宏中,我现在得到一个超出范围的'下标'这一行出错:

cgmImage = "C:\path\to\images\" & figures(i, 0) & ".jpeg"

我想要迭代的是整个数据结构的第一级(例如,我上面提供的样本数据,2次迭代)。即使我提供“维度”'属性为LBoundUBound我仍然会收到错误,因为顶级数组元素的第一个元素总是只是一个字符串(图像文件名),所以不应该发生错误。我怎样才能做到这一点?并且访问表示该表的第三个元素将是:figures(i,2,X,X)

编辑:

数组创建在Python中,只是标准列表类型。使用mhammond pywin32 module来完成宏的调用,这是该技术的简化版本:

import win32com.client as win32
word = win32.gencache.EnsureDispatch("Word.Application")
template = word.Documents.Open("\path\to\file.docm")
word.Run("macroName",imagesArray)

然后我保存并关闭它

1 个答案:

答案 0 :(得分:0)

如果最内层的数组是一个数组数组,那么像figures(i)(j)(k)(l)这样的东西应该是要走的路

您可以使用UBound(array,index)LBound(array,index)函数来获取其index维度的实际下限和上限数组

例如,根据您显示的数据行,您可以考虑以下代码:

Option Explicit

Sub main()
    Dim figures(1) As Variant

    figures(0) = Array("123", "image 1", Array(Array("val1", "val2"), Array("val3", "val4"))) ' see how the innermost array is an array of arrays, too
    figures(1) = Array("456", "image 2", Array(Array("val5", "val6"), Array("val7", "val8"))) ' see how the innermost array is an array of arrays, too

    Dim i As Long, j As Long, k As Long, l As Long
    For i = LBound(figures) To UBound(figures)
        For j = LBound(figures(i)) To UBound(figures(i))
            If IsArray(figures(i)(j)) Then
                For k = LBound(figures(i)(j)) To UBound(figures(i)(j))
                    For l = LBound(figures(i)(j)(k)) To UBound(figures(i)(j)(k))
                        Debug.Print figures(i)(j)(k)(l)
                    Next
                Next
            Else
                Debug.Print figures(i)(j)
            End If
        Next
    Next
End Sub