Передача массива объектов из C# в VBA ExcelC#

Место общения программистов C#
Ответить Пред. темаСлед. тема
Anonymous
 Передача массива объектов из C# в VBA Excel

Сообщение Anonymous »

У меня есть консольное приложение C# и Dll. Я зарегистрировал dll как COM через взаимодействие. Я использовал
  • свойство COM Visible, GUID и т. д.
    Установить информацию о сборке, информацию о сборке, чтобы зарегистрировать ее в COM< /li>
Я сослался на эту dll в коде VBA.
Я создал список объектов для этого класса в консоли приложение, преобразовал его в Array, а затем использовал Excel.Run для отправки массива пользовательских объектов в код VBA.
Я могу получить доступ к свойствам массива в VBA, например LBound и UBound. Но я не могу получить доступ к каждому отдельному объекту в массиве.
Код C# выглядит следующим образом:
using System;
using System.Runtime.InteropServices;

namespace Save_as_excel_classes
{
[Guid("0BA8F8DE-8F0A-4D7E-9DDB-8AED42943BDA")]
[ComVisible(true)]
[ClassInterface(ClassInterfaceType.AutoDual)]
public class CollClass
{
[ComVisible(true)]
public string NameValue { get; set; }
}
}

Консольное приложение выглядит следующим образом:
using Microsoft.Office.Interop.Excel;
using Save_as_excel_classes;
using System;
using System.Collections;
using System.Collections.Generic;
using _Excel = Microsoft.Office.Interop.Excel;

namespace ConsoleApp1
{
internal class Program
{
static void Main(string[] args)
{
Application excel = new _Excel.Application();
try
{
string fileName = "D:\\Book2.xlsm";
Workbook wb;
Worksheet ws;
int sheetNumber = 1;
excel.Visible = true;
wb = excel.Workbooks.Open(fileName);
ws = wb.Worksheets[sheetNumber];
ws = wb.Worksheets[sheetNumber];

var collVals = new List();

collVals.Add(new CollClass() { NameValue = "ABC" });
collVals.Add(new CollClass() { NameValue = "DEF" });
collVals.Add(new CollClass() { NameValue = "GHI" });
collVals.Add(new CollClass() { NameValue = "KLM" });
CollClass[] arr = collVals.ToArray();
excel.Run("ThisWorkbook.GetListofObjects1", arr);
}
catch (Exception ex)
{

}
finally
{
excel.Quit();
System.Runtime.InteropServices.Marshal.ReleaseComObject(excel);
System.Runtime.InteropServices.Marshal.FinalReleaseComObject(excel);
}
}
}
}

Со стороны VBA выглядит так: я просто пытаюсь установить NameValue в ячейку.
Public Function GetListofObjects1(ByRef objColl() As collClass)
MsgBox "Inside GetListofObjects function" + " Hurray!"
Range("C3").Value = LBound(objColl)
Range("C4").Value = UBound(objColl)
Range("C5").Value = objColl(0).NameValue
End Function

Я искал различные вопросы в StackOverflow и на форумах, но не знаю, что делаю неправильно. Каждый раз, когда я запускаю консольное приложение, Excel открывается, появляется окно сообщения, а затем происходит сбой и перезапуск. Я также получаю исключение в консольном приложении С# следующим образом после выполнения строк LBound и UBound. Это происходит только для Range("C5").Value = objColl(0).NameValue
"System.Runtime.InteropServices.COMException: 'Произошло исключение . (Исключение из HRESULT: 0x80020009 (DISP_E_EXCEPTION))'"
Я получаю правильное значение NameValue, когда отправляю один объект вместо массива. Кажется, все проблемы возникают именно с массивом.
Вероятно, это очень простое решение, но я занимаюсь этим уже больше полутора дней и могу' Кажется, я этого не понимаю.
Изменить:
Я добавил еще один класс CollClassArray в dll он будет содержать только один массив CollClass. Когда я передаю объект CollClassArray через команду «Выполнить» и пытаюсь получить доступ к массиву внутри него, я получаю сообщение об ошибке: Неверное количество аргументов или недопустимое использование свойства рядом с CollArray(0).
Public Function GetListOfObjects1(array as CollClassArray)
Dim objColl as CollClass
Set objColl = array.CollArray(0).NameValue
End Function


Подробнее здесь: https://stackoverflow.com/questions/787 ... -vba-excel
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение
  • Передача массива объектов из C# в VBA Excel
    Anonymous » » в форуме C#
    0 Ответы
    78 Просмотры
    Последнее сообщение Anonymous
  • Как разблокировать проект vba через пароль, используя код vba
    Гость » » в форуме Python
    0 Ответы
    587 Просмотры
    Последнее сообщение Гость
  • Передача аргумента HashTable в функцию Excel VBA с параметром Collection
    Anonymous » » в форуме C#
    0 Ответы
    117 Просмотры
    Последнее сообщение Anonymous
  • Как удалить дублирующиеся записи из массива объектов, которые находятся внутри массива объектов
    Anonymous » » в форуме Javascript
    0 Ответы
    30 Просмотры
    Последнее сообщение Anonymous
  • Экспорт комментариев из Word в Excel с помощью макроса VBA [закрыто]
    Гость » » в форуме Excel
    0 Ответы
    1531 Просмотры
    Последнее сообщение Гость

Вернуться в «C#»