通过完整类型的变量,我指的是您在即时窗口中获得的信息类型:
我想使用VBA动态确定类型信息.该函数TypeName()不能做我想要的,因为它返回变量的子类型,并且不区分例如保持范围的变量变量,保持范围的对象变量和保持范围的范围变量.
作为初步步骤,我编写了一个函数,用于检测变量是否传递给它.它的工作原理是利用传递引用语义.代码使用其参数执行的操作只能通过变量完成,因此如果传递的变量实际上不是变量,则会触发错误:
Function IsVariant(var As Variant) As Boolean
Dim temp As Variant
Dim isVar As Boolean
If IsObject(var) Then
Set temp = var
Else
temp = var
End If
On Error Resume Next
Set var = New Collection
var = "test"
If Err.Number > 0 Then
isVar = False
Else
isVar = True
End If
On Error GoTo 0
If IsObject(temp) Then
Set var = temp
Else
var = temp
End If
IsVariant …Run Code Online (Sandbox Code Playgroud) 将未扩展的数组传递给VB6的Ubound函数将导致错误,因此我想在检查其上限之前检查它是否已被标注尺寸.我该怎么做呢?
我有一个数组(来自SQL),可能有一行或多行.
我希望能够弄清楚数组是否只有一行.
UBound似乎没有帮助.对于二维数组UBound(A,1)并分别UBound(A,2)返回行数和列数,但是当数组只有一行时,UBound(A,1)返回列数并UBound(A,2)返回一个<Subscript out of range>.
我还看到了这个Microsoft帮助页面,用于确定数组中的维数.这是一个非常可怕的解决方案,涉及使用错误处理程序.
如何确定数组是否只有一行(希望不使用错误处理程序)?
对于变量数组,其中每个元素都是一个双数组,我可以执行以下操作:
Public Declare PtrSafe Sub CopyMemoryArray Lib "kernel32" Alias "RtlMoveMemory" (ByRef Destination() As Any, ByRef Source As Any, ByVal Length As Long)
Sub test()
Dim vntArr() as Variant
Dim A() as Double
Dim B() as Double
Redim vntArr(1 to 10)
Redim A(1 to 100, 1 to 200)
vntArr(1) = A
CopyMemoryArray B, ByVal VarPtr(vntArr(1)) + 8, PTR_LENGTH '4 or 8
'Do something
ZeroMemoryArray B, PTR_LENGTH
End Sub
Run Code Online (Sandbox Code Playgroud)
然后A和B将指向内存中的相同块.(设置W = vntArr(1)会创建一个副本.对于非常大的数组,我想避免这种情况.)
我正在尝试做同样的事情,但是有了收藏:
Sub test()
Dim col as Collection
Dim A() as …Run Code Online (Sandbox Code Playgroud) 我的问题很简单:像在C++中一样,是否有可能通过引用在VBA中检索数组的两个部分?我用C++编写代码已经有一段时间了,所以我不记得我现在是怎么做的.也许如果我记得,我会有一个例子.
我想要做的是通过单个Double-type属性对对象数组进行排序.我之前在C++中做过,只是没有源代码了.
我怀疑有一个预定义的功能可用于此,但如果有人知道更好的解决方案,它将受到极大的欢迎.;)
这基本上就是我想要的:
source array(0, 1, 2, 3, 4, 5)
split source array in two
array a(0, 1, 2)
array b(3, 4, 5)
set array a(0) = 4
array a(4, 1, 2)
array b(3, 4, 5)
source array(4, 1, 2, 3, 4, 5)
Run Code Online (Sandbox Code Playgroud)
当然这只是一个抽象的描述.
如果已经有一个问题处理这件事我很抱歉,我当时还没有找到它.