2016-06-24 2 views
0

Я пытаюсь вызвать макрос моего рабочего листа Excel (2003) из моего приложения C# с помощью C# Interop.Не удается передать массив C# int в макрос VBA Excel

Он работал отлично с параметрами Integer. Но теперь мне нужно передать массив целых чисел, и я продолжаю получать исключение типа несоответствия.

COMException: Type mismatch. (Exception from HRESULT: 0x80020005 (DISP_E_TYPEMISMATCH)) 

C# код выглядит следующим образом:

object m = Type.Missing;  
xlApp.Run("MergeColumnsKeepValues", lastGroupRowExcel, firstGroupRowExcel, mergeColumns, rightFormatMergeColumn, 
         multiRowColumn, m, m, m, m, m, m, m, m, m, m, m, m, m, m, m, m, m, m, m, m, m, m, m, m, m); 

, где все параметры типа Int32, за исключением mergeColumns, который является Int32[9]

Макрос VBA в моем шаблоне Excel выглядит следующим образом :

Sub MergeColumnsKeepValues(lastGroupRow As Integer, firstGroupRow As Integer, mergeColumns() As Variant, helpColumnMerge As Integer, multiRowColumn As Integer) 
    ... <- no use of array, just declaring variables and stuff 
    Dim i As Integer 
    For i = LBound(mergeColums) To UBound(mergeColumns) 
     Set targetMergeCells = Range(Cells(firstGroupRow, mergeColumns(i)), Cells(lastGroupRow, mergeColumns(i))) 
     Call targetMergeCells.PasteSpecial(xlPasteFormats, xlPasteSpecialOperationNone, False) 
    Next 
End Sub 

Я попытался объявить массив ByRef в VBA, и я попробовал объявить его как Variant, но ничего не изменилось. Я попытался поместить MsgBox в начале, чтобы увидеть, происходит ли несоответствие в цикле или на уровне параметра, и он не показывает MsgBox. Кто-нибудь знает, как исправить это или в чем причина?

+0

lastGroupRowExcel, firstGroupRowExcel, mergeColumns, rightFormatMergeColumn, multiRowColumn, – jackjop

+0

которых один является массив? – jackjop

+0

Что касается этого вопроса, я хотел бы сослаться на предложение ниже кода C#: «где все параметры имеют тип Int32, кроме mergeColumns, который является Int32 [9]» –

ответ

1

Я просто попытался это

static void Main(string[] args) 
     { 

      XL.Application xlapp = new XL.Application(); 
      xlapp.Visible = true; 
      xlapp.Workbooks.Open("c:/test/test_c.xlsm"); 
      int[] x = new int[] { 1, 2, 3, 4 }; 
      xlapp.Run("MergeColumnsKeepValues", x, 2, 3, 4,5); 

     } 

вызова VBA следующим

Public Sub MergeColumnsKeepValues(ByRef lastGroupRow As Variant, _ 
            firstGroupRow As Integer, _ 
            mergeColumns As Integer, _ 
            helpColumnMerge As Integer, _ 
            multiRowColumn As Integer) 
    MsgBox "Hello" 
End Sub 
+0

Итак, как мне получить целочисленный массив из варианта? –

+0

'Для i = 0 To UBound (lastGroupRow) Debug.Print i Next I' –

+0

Я попытался передать массив как' Long', оставив его как 'int []' в C#, и он сработал. Поэтому я буду использовать решение 'Long' array, но я уверен, что это решение будет работать. Поскольку вы также были направлены на решение массива 'Long', я соглашусь принять этот ответ, оставив намек на то, что он работает с передачей массива как' Long() ' –

Смежные вопросы