这是Excel模板的VBA代码,我正在尝试将其转换为我正在处理的VSTO项目中的C#。顺便说一句,它是一个VSTO加载项:
Dim addedShapes() As Variant
ReDim addedShapes(1)
addedShapes(1) = aBracket.Name
ReDim Preserve addedShapes(UBound(addedShapes) + 1)
addedShapes(UBound(addedShapes)) = "unique2"
Set tmpShape = Me.Shapes.Range(addedShapes).Group
此时,我被addedShapes()
难倒,不知道这是怎么回事。
更新: Matti提到addedShapes()
表示VBA中的变体数组。所以现在我想知道addedShapes()
的内容应该是什么。这是在C#中调用Shapes.Range()调用的正确方法吗?
List<string> addedShapes = new List<string>();
...
Shape tmpShape = worksheet.Shapes.get_Range
(addedShapes.Cast<object>().ToArray()).Group();
我很感激任何与VBA和C#合作的人都愿意对我的问题和评论做出评论。问题!
答案 0 :(得分:2)
我不确定你的实际问题应该是什么,但是addedShapes
是一个数组。在VB及其变体中,使用()
而不是[]
来声明和访问数组。
此外,您的代码看起来只是一种非常冗长的方式:
object[] addedShapes = new object[] { aBracket.Name, "unique2" };
Shape tmpShape = worksheet.Shapes.get_Range(addedShapes).Group();
最后一部分可能是
Shape tmpShape = worksheet.Shapes[addedShapes].Group();
查看哪些有效。我无法弄清楚MSDN建议哪一个。
答案 1 :(得分:2)
请原谅c风格的评论,vb风格不是很好的语法。
//This declares an array of variants but does not initialize it.
Dim addedshapes() As Variant
//Initializes the array with a max index of 1. (insert vb index rant here)
ReDim addedShapes(1)
//assigns the contents of aBracket.Name to element 1 of the array.
addedShapes(1) = aBracket.Name
//increases the size of addedShapes by 1, retaining any values.
ReDim Preserve addedShapes(UBound(addedShapes) + 1)
//sets the last element to the string literal
addedShapes(UBOund(addedShapes)) = "unique2"
//Not sure here because I havent done any VBA in a loooong time,
//but anyway it's passing the array.
set tmpShape = Me.Shapes.Range(addedShapes).Group
在VB中,Variant
只是一个惰性结构,可以包含任何数据类型,int,浮点数,对象等。所以在.Net中,最直接的比较是一些对象的集合/数组。但是,如果您知道那里发生了什么,那么将集合限制为更好。所以而不是List<object>
您使用List<Class>
或List<BaseClass>
或List<ISomeInterface>