2016-03-04 95 views
3

我有一个函数用于返回从单列数据列表创建的数组。我一直在使用这个函数的返回值,本质上它是一个伪全局变量(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 

我最近无意中发现了其中的一个,你 - 不要看的,它的免耕,你看到的,它的问题,同时使用一个新的项目工作簿,其中如果阵列碰巧只有一个元素,一切都失败了。显然在这种情况下,这将返回一个单一的值,所以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数组?或者其他解决方法?

回答

6

如果将数组创建为单个元素数组并以数组方式填充该数组,则该数组可以具有单个元素。从VBE的Immediate window

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 

结果:

True 
0:0 
+2

Jeeped钉它。您只创建Variant,然后让VBA决定数据类型究竟是什么(因此Variant)。 VBA决定只有一个元素的值不是一个数组,并且可能将其转换为一个String。如果您专门创建了一个数组,那么将该函数的返回值设置为该数组,它将是一个数组,即使它只有一个元素。 – Tim

+0

谢谢,这很好。如果没有循环,这也是不可能的?我宁愿只分配一个全范围来代替,除非速度差异很小。 – teepee

+0

@teepee - 如果存在多个值,则可以将该函数重写为批量装入值,但也必须将该单个元素数组创建为1至1,而不是0至0.从多个装入数组工作表上的单元格总是创建一个二维数组,即使第二个等级只有1到1 var =范围(B2:B5)为1到4,1到1. var =范围(C3:F3)为1到1,1到4.目前正在构建的数组基于零和一个维度。你不必转置它。如果有几千条,这将是值得的,但我不认为这是事实。 – Jeeped

相关问题