excel VBA:使用用户定义的函数解决65,536个数组的限制

sirbozc5  于 2023-05-01  发布在  其他
关注(0)|答案(2)|浏览(322)

我在VBA中有一个用户定义的函数,它需要以数组的形式返回超过65,536个结果。但是,如果尝试返回超过65,536个值,则会导致#VALUE:

Function TestSize()

    Dim arr() As String
    ReDim Preserve arr(1 To 200,000)  ' No problem creating and using array with > 65,536 elements  

    ' Populate array....

    TestSize = arr()   ' Fails here, produces #VALUE,  if array > 65,536

  End Function

这是一个长期存在的问题。有人知道附近有工作吗?
还有:如果我用VB写这个函数,我会遇到同样的问题吗?

6l7fqoea

6l7fqoea1#

将结果分解为4个数组并返回一个包含4项的数组。第一段代码是为了说明拆分,第二段代码可能更接近你实际想要的方式(但更复杂):

Dim arr() as string, arrP1(1 to 50000) as string, arrP2(1 to 50000) as string, arrP3(1 to 50000) as string, arrP4(1 to 50000) as string

ReDim Preserve arr(1 To 200,000)

' Populate array....

'Break results into 4 array parts:
for a=1 to 50000
   arrP1(a) = arr(a)
next
for a=1 to 50000
   arrP2(a) = arr(50000+a)
next
for a=1 to 50000
   arrP3(a) = arr(100000+a)
next
for a=1 to 50000
   arrP4(a) = arr(150000+a)
next
'Finally, return a 4-item array containing the parts:
TestSize = Array(arrP1,arrP2,arrP3,arrP4)

如果你的arr()可以是任意大小,那么,你可以用一个聪明的方法来做上面的事情,使用一个多维数组。未测试:

redim preserve arrParts(ubound(arr())\50000, 50000)
for a=1 to ubound(arr()) step 50000
    for aa=1 to 50000
       arrParts(a\50000, a mod 50000) = arr(a)
    next
next
2ic8powd

2ic8powd2#

如果你的数据足够统一,你可以按字母顺序或其他逻辑方式进行排序,比如说字母表中的每个字母指定要搜索的分组。
Dim A_array(50000)、B_array(50000)、C_array(5000)。..等等
如果Left(SearchString,1)= d则
'搜索D_array
如果结束
如果数组记录是用分隔符(如“//”)来构造的,例如A_array(0)=“data 1//data 2//data 3//data 4”中的分隔符来构造的,则可以只搜索D_array,当找到所需的数据时,在分隔符上分割记录,并提取所需的数据。即使使用较小的数组,这种方法实际上也可以加快搜索速度。你可以将数据存储在尽可能多的类别(数组)中,因为你的狡猾的头脑可以创建。据我所知,VBA中数组的数量没有限制。

相关问题