VBA WorksheetFunction.Sum不适用于数组,但与范围?

我不是一个VBA新手,但我有一个新手问题。

我正在开发一个项目,并且需要创build一个函数来获取电子表格中的某个单元格,扩大范围,然后对其进行求和。

Function Top_Performers(Sales As Range, DataWindow As Integer) Dim MyArray () As Variant Dim c As Integer, r As Integer r = Sales.Row c = Sales.Column MyArray = Range(Worksheets("Data").Cells(r, c - DataWindow + 1), Worksheets("Data").Cells(r, c)) Top_Performers = Application.WorksheetFunction.Sum(MyArray) 

但是,即使对于非零范围,该函数也会输出零值。 下面的代码,但是,工作。

 Function Top_Performers(Sales As Range, DataWindow As Integer) Dim MyArray As Range Dim c As Integer, r As Integer r = Sales.Row c = Sales.Column Set MyArray = Range(Worksheets("Data").Cells(r, c - DataWindow + 1), Worksheets("Data").Cells(r, c)) Top_Performers = Application.WorksheetFunction.Sum(MyArray) 

唯一的区别是在第二个示例中,我将MyArray声明为范围,然后将其设置为工作表中的范围。

附加信息:参数Sales对应于(例如)工作表中的范围GJ5。 DataWindow是一个整数variables,用于确定要相加的范围的长度。 在这种情况下,它是12.所以范围是通过使用Sales范围的行和列号,然后通过DataWindow + 1减less列索引来创build的。

该函数在电子表格(在本例中为HN列,HN5列)中input为“= Top_Performers(GJ5,Best_Clients_months)”,其中,Best_Clients_months只是在本例中对应于12的命名范围。

表格和列GJ的屏幕截图:

表单和列GJ的屏幕截图

input函数的列HN的屏幕截图:

输入函数的列HN的屏幕截图

我甚至在第一个例子中遍历了代码,本地窗口在数组中显示了正确的值(第一个参数是GJ4,即第四行,98.32,当第一个参数是GJ5,第五行时是119.25和42.42),但是仍然输出0。

总结arrays时,我通常从来没有问题,所以我感到困惑。

Ps工作簿是保密的,所以我只能拿这些截图来显示第二个例子中使用代码的结果,而不是使用第一个例子时可以find的零。

问题在于范围被格式化为货币,所以您的数组包含Variant / Currency值,因为您隐式使用默认的.Value属性,该属性将格式化为货币的单元格转换为VBA货币数据types。
SUM(和其他工作表函数)不理解VBA货币或date数据types,所以你得到零。

如果您将MyArray分配更改为

 MyArray = Range(Worksheets("Data").Cells(r, c - DataWindow + 1), _ Worksheets("Data").Cells(r, c)).Value2 

那么它将工作(.Value2不会转换为货币和dateVBA数据types)。
当你使用一个Rangevariables而不是一个变体数组的时候,转换不会发生,因为你将一个Range对象传递给了SUM。

如果你打开Locals Window ,我想你会发现正在创build的数组是二维的。 你可以使用Transpose把它变成一维数组。 下面的代码应该工作,虽然有时你必须使用Transpose两次。

 Function Top_Performers(Sales As Range, DataWindow As Integer) Dim MyArray () As Variant Dim c As Integer, r As Integer r = Sales.Row c = Sales.Column MyArray = Range(Worksheets("Data").Cells(r, c - DataWindow + 1), Worksheets("Data").Cells(r, c)) MyArray = Application.Transpose(MyArray) Top_Performers = Application.WorksheetFunction.Sum(MyArray)