What is the C# equivalent of this Excel VBA code for Shapes?
This is the VBA code for an Excel template, which I'm trying to convert to C# in a VSTO project I'm working on. By the way, it's a VSTO add-in:
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
At this point, I'm stumped by the addedShapes()
, not sure what this is all about.
Update: Matti mentioned that addedShapes()
represents a variant array in VBA. So now I'm wondering what the contents of addedShapes()
should be. Would this be the correct way to call the Shapes.Range() call in C#?
List<string> addedShapes = new List<string&g开发者_如何学Got;();
...
Shape tmpShape = worksheet.Shapes.get_Range
(addedShapes.Cast<object>().ToArray()).Group();
I'd appreciate anyone who's worked with VBA and C# willing to make a comment on my question & problem!
I'm not sure what your actual question is supposed to be, but addedShapes
is an array. In VB and its variants, arrays are declared and accessed using ()
instead of []
.
Also, your code looks like it's just a really long-winded way of doing:
object[] addedShapes = new object[] { aBracket.Name, "unique2" };
Shape tmpShape = worksheet.Shapes.get_Range(addedShapes).Group();
The last part might alternatively be
Shape tmpShape = worksheet.Shapes[addedShapes].Group();
See which ever works. I can't really figure out which one MSDN suggests.
Excuse the c style comments, the vb style doesnt syntax hilight nicely.
//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
in VB, Variant
is just a lazy struct that can hold any datatype, int, floats, objects, etc. so in .Net the most direct comparison would be some collection/array of objects. However if you know what is going in there then it's far better to limit the collection to that. So rather than List<object>
you'd use List<Class>
or List<BaseClass>
or List<ISomeInterface>
精彩评论