我试图创建一个数组函数,为一个(垂直或水平)或二维数组计算x ^ 2 + 1 / 3x + 5,并返回一个与参数相同的数组。结果应该在各自的细胞中。但是当我在Excel中使用它时,它会交换行和列,它只适用于方形矩阵。你可以帮助我,代码应该如何,这样它可以用于非方形矩阵和一维数组吗?
这是我的代码
didInsertElement: function() {
modelStatus = this.get('controller').get('model.editedStatus');
this.get('controller').set('selectedStatus', modelStatus);
}
答案 0 :(得分:1)
Public Function Polyn(Rin As Range) As Double
Dim v As Variant
v = Rin.Value
Polyn = v ^ 2 + v / 3 + 5
End Function
只需将其复制到您需要的地方。
因此我们将公式放在单元格 E7 中,然后将 E7 复制到 E7 到 G11 的范围。如您所见,这通常是输入而不是输入数组
答案 1 :(得分:0)
是否始终将数据作为Excel范围的.Value
属性接收?
这意味着您的输入将始终是一个二维数组,其维度为(1 to Row.Count, 1 to Columns.Count)
...
...除非是单个单元格,否则范围的值是标量变量,而不是数组,并且所有仔细输入的代码都会引发类型错误。这是你如何处理:
Dim vArray As Variant...并在Variant vArrayIf TypeName(rng) = "Range" Then
If rng.Cells.Count = 1 Then Redim vArray(1 To 1, 1 To 1) vArray(1,1) = Array(rng.Value2) Else vArray = varArray.Value2 End If
End If
上运行您的代码
请注意我是如何确定的:(1 to Row.Count, 1 to Columns.Count)
- 几乎从VBA数组中放置返回结果的每个错误都可以追溯到基于零的数组与基于1的.Value
属性之间的混淆。 Excel范围。
下一步:对每个单元格的内容运行复杂的函数。如果你想要一个通用的函数,比如一个正确的'功能'语言的Lambda演算,我很想知道你会是一个dithappointed。但是,您可以按名称传递函数并使用VBA.Interaction.CallByName()
没有什么可以阻止你编写你的功能:
Public Function ParabolicPlotter(x As Double, a As double, b as Double, c As Double) As Double
...在工作簿模块中。这意味着ParabolicPlotter是工作簿对象的一种方法,可以通过名称调用:
y = CallByName(ThisWorkbook, ParabolicPlotter, VbLet, x, a, b, c)
或者你可以在代码中将常量a,b和c硬编码为1.0,1 / 3和5,只传递参数'x'。
最后,最糟糕的情况是,您不得不接受任何变量数组,并且您不知道它是否是一个二维数组。
请注意,Excel电子表格中的单列范围(以及单行范围)仍将其值表示为二维数组:(1 to rng.Rows.Count, 1 To 1)
或(1 To 1, 1 to rng.Columns.count)
- 但是真正的“向量”数组尺寸标注(1到n):没有第二个维度,并且没有“强制转换”到vArray(1到n,0到0),它允许您读取具有与用于真实2的相同代码的向量D阵列。唯一的通用接口是For... Each
迭代。
'Any Variant'可能包含嵌套数组,你会从第三方实时市场数据提供商那里得到“更糟糕的情况”。所以这是一个简单的单用途函数,它处理任何和所有传入的变体:
' Enhancement: insert Err.Raise for this specific case
' Or code up an array equivalence test, if you have too much spare time
IsMemberOf = False
Exit Function
您将能够调整它以与CallByName()一起使用,除非您只打算这样做一次。
还有一个案例可供您考虑:不连续的范围。那需要通过' VBA.Empty isn't a member of the empty set, nor is VBA.Empty() - the
' empty set has no members. Not even an 'empty' variant, value, or set.
IsMemberOf = False
Exit Function
进行迭代 - 我建议你等一会儿才能解决这些问题。