- свойство COM Visible, GUID и т. д.
Установить информацию о сборке, информацию о сборке, чтобы зарегистрировать ее в COM< /li>
Я создал список объектов для этого класса в консоли приложение, преобразовал его в 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