有谁知道如何返回在VBA中传递给它的(Variant)变量的维数?
我注意到在使用ParamArray
和传递数组元素时VBA有些奇怪.在某些情况下,它不是数组元素的值到达函数,而是var指针.(Excel 2016,32位).
在经历了一些沉闷之后,我发现函数作为变量数组的定义 - 与参数列表结合使用ParamArray
- 似乎是意外行为的起源,但我看不出任何可行的原因,为什么会这样.
在以下情况下,行为恢复正常:
1)在函数声明中删除变量r
2)b
声明Dim b()
3)函数返回a Variant
,而不是aVariant()
我理解这是一个相当深奥的问题,它似乎可以通过各种方式控制,但是有没有解释这种行为的解释?
Sub Variantarraybug()
Dim b: b = [{1, 2, 3}]
Debug.Print farray1(2, b(1))(0)
Debug.Print Application.WorksheetFunction.Sum(farray1(2, b(1)))
Debug.Print Join(farray1(2, b(1)), " ")
Debug.Print farray2(2, b(1))(0)
Debug.Print Application.WorksheetFunction.Sum(farray2(2, b(1)))
Debug.Print Join(farray2(2, b(1)), " ")
Debug.Print VarPtr(b(1)), VarPtr(b(2))
End Sub
Function farray1(r, ParamArray plop()) As Variant
farray1 = Array(plop(0), 3)
End Function
Function farray2(r, ParamArray plop()) As Variant()
farray2 = Array(plop(0), 5) …
Run Code Online (Sandbox Code Playgroud) 我该如何实现这个功能?
Public Function ArraySlice(arr As Variant, dimension as Long, index as Long) As Variant
'Implementation here
End Function
Run Code Online (Sandbox Code Playgroud)
假设我想要一个数组切片.我在该维度上指定了一个数组,一个维度和一个索引,我想要切片.
举一个具体的例子,假设我有以下5x4 2D数组
0 1 2 3 4
______________
0| 1 1 2 3 1
1| 3 4 2 1 5
2| 4 5 3 2 6
3| 3 5 2 1 3
Run Code Online (Sandbox Code Playgroud)
如果水平尺寸为1且垂直尺寸为2,则返回值ArraySlice(array, 1, 3)
将为1x4 2D阵列.选定的维度2被展平,唯一剩下的值是最初在维度2的索引3处的值:
0
____
0| 3
1| 1
2| 2
3| 1
Run Code Online (Sandbox Code Playgroud)
你会如何在VBA中实现这一点?我能想到的唯一实现将涉及CopyMemory,除非我限制了允许的维度数量并对每种情况进行硬编码.
注意:这是我如何获得数组的尺寸
UPDATE
以下是一些操作示例
对于2D阵列
0 1 2 3 4
______________
0| …
Run Code Online (Sandbox Code Playgroud) 跨夫妇的那一个想要通过场景来operators
作为parameter
一个函数或方法.根据这篇文章,Java没有那种能力,因此需要创建一个Enum
主要的解决方法.
例如
Function doCalcs(ByRef AND as LogicalOperator, ByRef greater ArithmeticOperator)
Run Code Online (Sandbox Code Playgroud)
尽管与.Net,Java相比,VBA库的数量要少得多,但创建Enum
得到了很好的支持.也许我不知道,所以如果VBA有可能operator types
或我们可以通过的任何其他变通方法an operator
,那就射入.(除了if else
/ case
检查包含运算符参数的字符串.. =))我要的是不同于这里提到的.
例如,如果你看CountIFS
,它有能力接受operators
.即使有人可以解释此功能中可能的后端工作,
operator
?Enum
结构还是比那更有效或更低效的结构?这些问题的答案仍然可以接受.