如何将数组从C#(VSTO)项目传递给VBAmacros

我有我的VSTO解决scheme的性能问题,我相信其原因主要是CellColor的方式逐个设置。

这取决于logging集中的数据,因此每次都是不同的。 (我不能从另一行/列使用copyFormats)

它类似于填充一个范围的值,只为那个有几个方法。

我想在C#中首先创build内存中的所有东西(一个XlColorIndex [,]数组),我通过一个类似于下面的VBA方法:

Sub fillInterior(ByRef rg As Range, a As Variant) //a is a double array that represents the colors for the spreadsheet Dim r As Long, c As Long Dim tmpRg As Range r = 1 c = 1 For Each Row In a For Each colorIdx In Row Set tmpRg = rg(r, c) With tmpRg.Interior .ColorIndex = colorIdx .PatternColorIndex = xlAutomatic .PatternColor = xlSolid End With c = c + 1 Next c = 1 r = r + 1 Next End Sub 

我一直试图以下面的方式调用这个macros,但还没有成功,任何指针非常感谢:

  Excel.Range rg = this.Range[this.Cells[5, 3], this.Cells[6, 4]]; object[,] test2 = new object[2, 2]; test2[0, 0] = 15; test2[0, 1] = 15; test2[1, 0] = 15; test2[1, 1] = 15; this.Application.Run("Sheet1.fillInterior", rg, test2, System.Type.Missing, System.Type.Missing, System.Type.Missing, System.Type.Missing, System.Type.Missing, System.Type.Missing, System.Type.Missing, System.Type.Missing, System.Type.Missing, System.Type.Missing, System.Type.Missing, System.Type.Missing, System.Type.Missing, System.Type.Missing, System.Type.Missing, System.Type.Missing, System.Type.Missing, System.Type.Missing, System.Type.Missing, System.Type.Missing, System.Type.Missing, System.Type.Missing, System.Type.Missing, System.Type.Missing, System.Type.Missing, System.Type.Missing, System.Type.Missing, System.Type.Missing); 

我试过int [,] –

当我尝试使用Nullable int或Double:double?[,](可为Nullable Double数组)时,我得到了一个不同的错误:

 The parameter is incorrect. (Exception from HRESULT: 0x80070057 (E_INVALIDARG)) 

如果我不尝试可为空的types,我得到了以下HRESULT错误(types错配?)

 Exception from HRESULT: 0x800A000D 

好吧,我应该更好地阅读这个 :变体应该避免,所以如果我有select写我的VBA,我最好没有一个变种,但有一个适当的arrays。

其次,我使用VBA数组错误,我应该为multidimensional array( 源 )做以下事情:

我的VBA代码现在看起来像这样:

 Sub fillInteriorMulti(rg As Range, Arr() As Long) Dim N As Long, Ndx1 As Long, Ndx2 As Long Dim icol As Long Dim irow As Long Dim NumDims As Long // Custom Function: Get the number of array dimensions. // NumberOfArrayDimensions will return 0 // if the array is not allocated. NumDims = NumberOfArrayDimensions(Arr:=Arr) Select Case NumDims Case 0 // unallocated array Exit Sub Case 1 // single dimensional array For N = LBound(Arr) To UBound(Arr) With rg(N, 1).Interior .ColorIndex = Arr(N) .PatternColorIndex = xlAutomatic .PatternColor = xlSolid End With Next N Case 2 // 2 dimensional array For Ndx1 = LBound(Arr, 1) To UBound(Arr, 1) For Ndx2 = LBound(Arr, 2) To UBound(Arr, 2) With rg(Ndx1, Ndx2).Interior .ColorIndex = Arr(Ndx1, Ndx2) .PatternColorIndex = xlAutomatic .PatternColor = xlSolid End With Next Ndx2 Next Ndx1 Case Else // Too many dimensions - Do Nothing End Select End Sub Public Function NumberOfArrayDimensions(Arr As Variant) As Integer // NumberOfArrayDimensions // This function returns the number of dimensions of an array. An unallocated dynamic array // has 0 dimensions. This condition can also be tested with IsArrayEmpty. Dim Ndx As Integer Dim Res As Integer On Error Resume Next // Loop, increasing the dimension index Ndx, until an error occurs. // An error will occur when Ndx exceeds the number of dimension // in the array. Return Ndx - 1. Do Ndx = Ndx + 1 Res = UBound(Arr, Ndx) Loop Until Err.Number <> 0 NumberOfArrayDimensions = Ndx - 1 End Function 

最后用C#代码来testing这个:

  int[] test3 = new int[3]; test3[0] = 15; test3[1] = 15; test3[2] = 48; int[,] test4 = new int[2, 2]; test4[0, 0] = 15; test4[0, 1] = 15; test4[1, 0] = 15; test4[1, 1] = 15; this.Application.Run("Sheet1.fillInteriorMulti", rg, test4, missing, missing, missing, missing, missing, missing, missing, missing, missing, missing, missing, missing, missing, missing, missing, missing, missing, missing, missing, missing, missing, missing, missing, missing, missing, missing, missing, missing); 

丑陋的黑客或概念certificate,将双数组转换为string。 传递string。

 Sub fillInteriorString(rg As Range, str As String) Dim i As Long, j As Long i = 1 j = 1 a = Split(str, "@") For Each part In a b = Split(part, ",") For Each colorIdx In b With rg(i, j).Interior .ColorIndex = colorIdx .PatternColorIndex = xlAutomatic .PatternColor = xlSolid End With j = j + 1 Next j = 1 i = i + 1 Next End Sub 

C#代码:

  string testString = "15,15,48@48,48,15"; this.Application.Run("Sheet1.fillInteriorString", rg, testString, System.Type.Missing, System.Type.Missing, System.Type.Missing, System.Type.Missing, System.Type.Missing, System.Type.Missing, System.Type.Missing, System.Type.Missing, System.Type.Missing, System.Type.Missing, System.Type.Missing, System.Type.Missing, System.Type.Missing, System.Type.Missing, System.Type.Missing, System.Type.Missing, System.Type.Missing, System.Type.Missing, System.Type.Missing, System.Type.Missing, System.Type.Missing, System.Type.Missing, System.Type.Missing, System.Type.Missing, System.Type.Missing, System.Type.Missing, System.Type.Missing, System.Type.Missing); 

无论如何,我知道它的作品 – 现在我正在寻找SafeArrays希望我仍然可以通过数组而不是一个string。