Как связать диапазон EXCEL в макросе VBA из библиотеки C #, которая возвращает объект [,] - PullRequest
0 голосов
/ 21 июля 2011

У меня есть библиотека C #, которая имеет 2 метода. Один возвращает целое число, а другой возвращает объект [,]

public int ReturnInt()
{
    //Something that return INT
}
public object[,] Return2DArray()
{
    //returns twoDimensionalArrayResponse;
}

Теперь я очень новичок в VBA, и по некоторым унаследованным причинам мне нужно написать макрос VBA, а не VSTO excel Addin, чтобы вызвать эту библиотеку.

Получить результат с первого выхода было легко. Я сделал ассемблер видимым и зарегистрировал его для Com Interop, а затем добавил его в качестве ссылки в свой проект VBA и вызвал его с помощью кода ниже

Sub GXSData()
    Dim InteropClass As New ExcelInterOpWrapper
    Dim result As Integer
    result = InteropClass.ReturnInt()
    MsgBox "Rows Returned =" & CStr(result)
End Sub

Пока все хорошо. Теперь я хочу вызвать второй метод, получить данные и связать их, чтобы преуспеть.

Звучит просто, но -> Какой тип я должен использовать для хранения этих данных. Я пробовал динамический массив, и он не работал -> Как мне связать это с динамическим диапазоном. Допустим, массив 2d имеет размер 100 * 10. Я хочу связать его с диапазоном, например Range.value = Array. Я знаю, как это сделать в приложении Excel для надстройки в C #, но VBA доставляет мне реальные проблемы

Любая помощь по этому вопросу будет отличной

1 Ответ

0 голосов
/ 25 июля 2011

Я нашел способ сделать это.Это не идеальный подход, но у меня пока работает.Из-за моих навыков в C # я написал функцию, которая будет писать в Excel на C #, и просто вызывал ее в макросе VBA.Я уверен, что есть чистые макро способы сделать это, что я хотел бы.Это потому, что я пишу это как API, а клиенты MACRO будут вызывать мой API.Поэтому я хотел бы иметь слой представления в макросе.Но в любом случае C # здесь, в случае, если он кому-то полезен. Метод C #

public static void BindDataToExcel( Excel.Range range,  object[,] response)
          {
              int rows = response.GetLength(0);
              int cols = response.GetLength(1);
              int n = 0;
              Excel.Range newRange = range.get_Offset(n, 0).get_Resize(rows - n, cols);
              newRange.Value = response;
          }

Мой макрос

Sub GxsData()
    Dim InteropClass As New ExcelInterOpWrapper 
    Dim o As Object
    Set o = InteropClass.BindDataToExcel(ActiveCell)
End Sub
...