Как передать словарь C # .net в VBA - PullRequest
0 голосов
/ 28 сентября 2018

Я пытаюсь передать словарь из c # в vba, но эта ошибка возникает

System.Runtime.InteropServices.COMException: 'Type mismatch. (Exception from HRESULT: 0x80020005 (DISP_E_TYPEMISMATCH))'

Я также пытался преобразовать мой список строк в коллекцию vb, но возникает та же ошибка.вот мои коды

private void btn_macrorunner_Click(object sender, EventArgs e)
{
    Dictionary<string, string> xlist_dictvb = new Dictionary<string, string>();
//xlist_names has been properly initialized and already has some items
    xlist_names.ForEach(x => xlist_dictvb.Add(x, x));

    ExcelFire(xlist_dictvb);
}

private void ExcelFire(Dictionary<string, string> pcoll = null)
{
    //~~> Define your Excel Objects
    Excel.Application xlApp = new Excel.Application();
    Excel.Workbook xlWorkBook;

    //~~> Start Excel and open the workbook.
    xlWorkBook = xlApp.Workbooks.Open(@"C:\Users\Hutanginamo\Documents\xlkalat\0928ExcelFile.xlsm");

    if(pcoll != null)
    {
        //calls Sub ShowDict(pdict1 As Dictionary) 
        xlApp.Run("ShowDict", pcoll); //WHERE ERROR OCCURS
    }

    //~~> Clean-up: Close the workbook
    xlWorkBook.Close(false);

    //~~> Quit the Excel Application
    xlApp.Quit();

    //~~> Clean Up
    ReleaseObject(xlApp);
    ReleaseObject(xlWorkBook);
}

вот мои коды vba

Sub ShowDict(pdict1 As Dictionary)
   Dim x As Variant

   For Each x In pdict1.keys
        MsgBox (pdict1.Item(x))
   Next
End Sub

1 Ответ

0 голосов
/ 28 сентября 2018

Чтобы достичь того, что вы хотите, вы должны передать правильный словарь.C# словарь нельзя использовать в VBA, как это.Самый простой способ достичь желаемого - использовать словарь VBA в C#, а затем передать его.

См. Этот пример.

Код C #

Scripting.Dictionary dict = new Scripting.Dictionary();
dict.Add("Apples", 50);
dict.Add("Oranges", 60);

Excel.Application xlApp = new Excel.Application();
Excel.Workbook xlWorkBook;

// ~~> Opens an existing Workbook. Change path and filename as applicable
xlWorkBook = xlApp.Workbooks.Open("C:\\Sample.xlsm");

// ~~> Display Excel
xlApp.Visible = true;
xlApp.Run("ShowDict", dict);

Код VBA

Sub ShowDict(pdict1 As Dictionary)
   Dim x As Variant

   For Each x In pdict1.keys
        MsgBox (pdict1.Item(x))
   Next
End Sub

Ссылки на C #

enter image description here

Ссылки на VBA

enter image description here

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...