形状的这个Excel VBA代码的C#等价物是什么?

时间:2010-05-18 19:52:23

标签: vsto excel-vba c# vba excel

这是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#合作的人都愿意对我的问题和评论做出评论。问题!

2 个答案:

答案 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>