我正在努力摆脱对SCRRUN的依赖。DLL。它目前被用来做的事情之一是它的Dictionary类。Dictionary类有一个Keys函数,该函数应该返回字典中的键数组。我做了一些实验,看看如果字典里没有密钥会发生什么:
Dim D As Dictionary
Set D = New Dictionary
Dim K() As Variant
K = D.Keys
MsgBox LBound(K) & ", " & UBound(K)
我本以为"下标超出范围"或类似的东西,但我却被告知LBound是0,UBound是-1。
那么,如何创建一个具有LBound0和UBound-1的Variant数组呢?
我试过只使用一个未初始化的变量数组:
Dim K() as Variant
MsgBox LBound(K) & ", " & UBound(K)
当然,正如我所料,这会导致"下标超出范围"。擦除未初始化的数组也是如此:
Dim K() as Variant
Erase K
MsgBox LBound(K) & ", " & UBound(K)
就像擦除初始化的数组一样:
Dim K() As Variant
ReDim K(0 To 0)
Erase K
MsgBox LBound(K) & ", " & UBound(K)
我还试着重新拨号到0和-1,尽管这看起来很奇怪:
Dim K() As Variant
ReDim K(0 To -1)
MsgBox LBound(K) & ", " & UBound(K)
但这也给出了"下标超出范围"。
在网上闲逛了一段时间,我发现了以下技巧:
Dim K() As String
K = Split(vbNullString)
MsgBox LBound(K) & ", " & UBound(K)
这实际上给出了一个LBound为0和UBound为1的数组!不幸的是,它是一个String数组,而我需要一个Variant数组。我不能很好地将字符串从一个数组单独复制到另一个数组中的Variants,因为0到-1等等。
有人知道如何在不使用SCRRUN的情况下,用LBound 0和UBound-1生成这样一个数组Variant()吗。DLL?最好也只使用内置的VB6东西,但如果你能做到,如果你被允许使用一些外部的东西(除了SCRRUN.DLL),我会洗耳恭听。谢谢
您可以使用Array
函数:
Dim K()
K = Array()
MsgBox UBound(K)
好的,回答我自己的问题(但使用OLEAUT32.DLL;我仍然对任何纯内置VB6的解决方案感兴趣):
Private Declare Function SafeArrayCreateVector Lib "OLEAUT32.DLL" ( _
ByVal vt As VbVarType, ByVal lLbound As Long, ByVal cElements As Long) _
As Variant()
Private Const VT_VARIANT As Long = 12
(…)
Dim K() As Variant
K = SafeArrayCreateVector(VT_VARIANT, 0, 0)
MsgBox LBound(K) & ", " & UBound(K)