我在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次迭代)。即使我提供“维度”'属性为LBound
和UBound
我仍然会收到错误,因为顶级数组元素的第一个元素总是只是一个字符串(图像文件名),所以不应该发生错误。我怎样才能做到这一点?并且访问表示该表的第三个元素将是: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)
然后我保存并关闭它
答案 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