我有一个函数旨在返回从单列数据列表创建的数组。实际上,我一直在使用此函数的返回值作为伪全局变量(LINENAMES_ARRAY
),并将其传递给许多函数。那些功能然后检查诸如If Len(Join(LINENAMES_ARRAY)) = 0 Then
带有For Each
声明的项目或通过声明进行检查。这是代码:
Function LINENAMES_ARRAY() As Variant
'returns an array of all items in the main sheet linenames column
LINENAMES_ARRAY = Application.Transpose(MAIN.Range( _
MAIN.Cells(MAIN_HEAD_COUNT + 1, MAIN_LINENAMES_COLUMN), _
MAIN.Cells(LINENAMES_COUNT + 1, MAIN_LINENAMES_COLUMN)))
End Function
我最近偶然发现了一个问题,在使用此工作簿进行新项目时看不到它,直到发现它,如果数组恰好是1个元素,那么一切都会失败。显然,在这种情况下,这将返回单个值,因此Join()
也会失败For Each __ in LINENAMES_ARRAY
。为什么不将其视为1x1数组而不是自由值?我已经开始通过重写调用此函数的功能来减轻该问题,检查它是否为数组,然后执行其他一些步骤。像:
For j = 1 To LINENAMES_COUNT
LINES_BOX.AddItem lineNames(j)
Next j
更改为:
If Not IsArray(LINENAMES_ARRAY) Then
myListBox.AddItem CStr(LINENAMES_ARRAY)
Else
For j = 1 To LINENAMES_COUNT
LINES_BOX.AddItem LINENAMES_ARRAY(j)
Next j
End If
但是,这变得凌乱,并且在我的代码中添加了许多我希望在LINENAMES_ARRAY
函数中处理的额外检查。有没有办法返回1x1数组?或任何其他解决方法?
如果将数组创建为单个元素数组并以数组方式填充它,则该数组可以具有单个元素。
Option Explicit
Dim MAIN_HEAD_COUNT As Long
Dim LINENAMES_COUNT As Long
Dim MAIN_LINENAMES_COLUMN As Long
Dim MAIN As Worksheet
Sub stuff()
Dim arr As Variant
Set MAIN = Worksheets("Sheet1")
MAIN_LINENAMES_COLUMN = 2
MAIN_HEAD_COUNT = 2
LINENAMES_COUNT = 2
arr = LINENAMES_ARRAY()
Debug.Print IsArray(arr)
Debug.Print LBound(arr) & ":" & UBound(arr)
End Sub
Function LINENAMES_ARRAY() As Variant
Dim a As Long, tmp() As Variant
ReDim tmp(0 To LINENAMES_COUNT - MAIN_HEAD_COUNT)
For a = 0 To LINENAMES_COUNT - MAIN_HEAD_COUNT
tmp(a) = MAIN.Range(MAIN.Cells(MAIN_HEAD_COUNT + 1, MAIN_LINENAMES_COLUMN), _
MAIN.Cells(LINENAMES_COUNT + 1, MAIN_LINENAMES_COLUMN)).Cells(a).Value2
Next a
'returns an array of all items in the main sheet linenames column
LINENAMES_ARRAY = tmp
End Function
VBE即时窗口的结果:
True
0:0
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句