Что такое эквивалент C # этого Excel VBA-кода для фигур? - PullRequest
3 голосов
/ 18 мая 2010

Это код VBA для шаблона Excel, который я пытаюсь преобразовать в C # в проекте VSTO, над которым я работаю. Кстати, это надстройка 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(), не уверен, что это все.

Обновление: Матти упомянул, что addedShapes() представляет вариантный массив в VBA. Поэтому теперь мне интересно, каким должно быть содержимое addedShapes(). Будет ли это правильный способ вызова вызова Shapes.Range () в C #?

List<string> addedShapes = new List<string>();
...
Shape tmpShape = worksheet.Shapes.get_Range
  (addedShapes.Cast<object>().ToArray()).Group();

Буду признателен всем, кто работал с VBA и C #, желающим прокомментировать мой вопрос и проблему!

Ответы [ 2 ]

2 голосов
/ 19 мая 2010

Извините за комментарии в стиле 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>

2 голосов
/ 19 мая 2010

Я не уверен, каким должен быть ваш настоящий вопрос, но addedShapes - это массив. В VB и его вариантах массивы объявляются и доступны с использованием () вместо [].

Кроме того, ваш код выглядит так, как будто это очень скучный способ:

object[] addedShapes = new object[] { aBracket.Name, "unique2" };
Shape tmpShape = worksheet.Shapes.get_Range(addedShapes).Group();

Последняя часть может быть альтернативой

Shape tmpShape = worksheet.Shapes[addedShapes].Group();

Посмотри, что работает. Я не могу понять, какой MSDN предлагает.

...