打开APP
userphoto
未登录

开通VIP,畅享免费电子书等14项超值服

开通VIP
VBA进阶 | 数组基础10: 数组函数集

 

VBA代码中,使用数组来存储数据或一系列相关数据。

 

本文介绍了可以用于获取数组信息和操控数组的近40个函数。所有内容均整理自cpearson.com可以在这本公众号下方发送消息:数组函数集,下载包含这些函数代码的工作簿。

 

本文使用下列术语:

静态数组是一个数组,在声明数组的Dim语句中定义其大小。

Dim StaticArray(1 To 10) As Long

不能修改静态数组的大小或数据类型。当使用Erase语句清空一个静态数组时,不会释放内存。Erase语句只是简单地设置所有元素为它们的默认值(0vbNullStringEmptyNothing,取决于数组的数据类型)。

 

动态数组是一个数组,没有在Dim语句中定义大小。相反,它使用ReDim语句定义大小,例如:

Dim DynamicArray() As Long

ReDim DynamicArray(1 To 10)

可以修改动态数组的大小,但不是数据类型。当使用Erase语句清空动态数组时,分配给数组的内存将被释放。被清空之后,必须重新使用ReDim语句声明数组才能使用它。

 

如果数组是静态数组,或者是使用ReDim语句调整大小的动态数组,则数组会被分配空间。

静态数组总是会被分配空间且决不为空。

如果是仍没有使用ReDim语句调整大小或者使用Erase语句清除分配空间的动态数组,那么数组为空或者未被分配。

 

元素是一组项目中的一个特定项目。

 

如果你对VBA(或VB)数组不熟悉,但是具有其他编程语言(例如C)的数组方面的经验,就会发现VBA数组的工作原理相同。主要区别在于VBA数组不仅仅是一系列连续的字节,VBA数组实际上是一个称为SAFEARRAY的结构,它包含有关数组的信息,包括每维中的维数和元素数。

该结构包括指向实际数据的指针变量。在VBA代码中的任何数组操作都使用适当的SAFEARRAY API函数。虽然这可能会为处理项目添加一些开销,但它可以阻止标准数组中经常发生的常见错误,例如超出数组上限。尝试访问超出数组上限的元素将导致可捕获的运行时错误“9——下标越界

VB/VBA数组与常规(例如,C)数组之间的另一个显著差异是,可以为数组的下限和上限指定任何值。元素0不必是数组中的第一个元素索引值。例如,下面是完全合法的代码(只要下限小于或者等于上限——如果下限大于上限,将产生编译错误):

Dim N As Long

Dim Arr(-100 To -51) As Long

Debug.Print 'LBound: ' & CStr(LBound(Arr)), _

    'UBound: '& CStr(UBound(Arr)), _

    'NumElements:' & CStr(UBound(Arr) - LBound(Arr) 1)

For N = LBound(Arr) To UBound(Arr)

    Arr(N) = N * 100

Next N

虽然我从来没有发现需要使用01之外的下限,但是在某些情况下,这可能是有用的,VB/VBA数组支持它。

最后的显著区别是,如果没有显示声明数组的下限,则下限将被假定为01,这取决于Option Base语句的值(如果存在)。如果模块不存在Option Base,那么假定为0。例如,代码

Dim Arr(10) As Long

声明一个1011个元素的数组。注意,声明不是指定数组中元素数量,而是指数组的上限。如果模块中没有包含Option Base语句,那么下限假设为0,上面的声明语句与下面的相同:

Dim Arr(0 To 10) As Long

如果有一个Option Base语句指定01,那么数组的下限就会被设置为那个值。因此,代码

Dim Arr(10) As Long

相当于下面两者之一

Dim Arr(0 To 10) As Long

Dim Arr(1 To 10) As Long

这取决于Option Base的值。在我看来,省略下限,只声明上限是非常不好的编程实践。当在模块和工程之间复制/粘贴代码时,忽略下限将导致错误。应该总是在Dim语句或者ReDim语句中显式地指定数组的下限和上限。

最后,因为动态数组的下限和上限可以使用ReDim语句在运行时修改,所以当遍历数组时,应该总是使用LBoundUBound。不要硬编码数组界限。例如:

Dim N As Long

Dim Arr(-100 To -51) As Long

For N = LBound(Arr) To UBound(Arr)

    ' do something withArr(N)

Next N

在尝试遍历动态声明的数组之前,应该测试确保数组实际上已被分配空间。可以使用下面介绍的IsArrayAllocated函数测试这个条件:

Dim Arr() As Long

If IsArrayAllocated(Arr:=Arr) = True Then

    ' loop through thearray

Else

    ' code for unallocatedarray

End If

 

本文后面的内容简要介绍下列子过程:

AreDataTypesCompatible

ChangeBoundsOfArray

CombineTwoDArrays

CompareArrays

ConcatenateArrays

CopyArray

CopyArraySubSetToArray

CopyNonNothingObjectsToArray

DataTypeOfArray

DeleteArrayElement

ExpandArray

FirstNonEmptyStringIndexInArray

GetColumn

GetRow

InsertElementIntoArray

IsArrayAllDefault

IsArrayAllNumeric

IsArrayAllocated

IsArrayDynamic

IsArrayEmpty

IsArrayObjects

IsArraySorted

IsNumericDataType

IsVariantArrayConsistent

IsVariantArrayNumeric

MoveEmptyStringsToEndOfArray

NumberOfArrayDimensions

NumElements

ResetVariantArrayToDefaults

ReverseArrayInPlace

ReverseArrayOfObjectsInPlace

SetObjectArrayToNothing

SetVariableToDefault

SwapArrayRows

SwapArrayColumns

TransposeArray

VectorsToArray

 

函数说明

(1)AreDataTypesCompatible

PublicFunction AreDataTypesCompatible(DestVar As Variant, SourceVar As Variant) AsBoolean

 

这个函数检查两个变量:DestVarSourceVar,并且确定是否它们是兼容的。如果两个变量具有相同的数据类型,那么这些变量是兼容的,或者,如果在SourceVar中的值能够被存储在DestVar中,而不会丢失精度或者遇到溢出错误。例如,Source IntegerDest Long兼容,因为Integer可以存储在Long变量中,而不会损失精度或者溢出。Source DoubleDest Long不兼容,因为Double会丢失精度(数字的小数部分会丢失),并且其转换可能会导致溢出错误。

 

(2)ChangeBoundsOfArray

PublicFunction ChangeBoundsOfArray(InputArr As Variant, _

    NewLowerBound As Long, NewUpperBound) AsBoolean

这个函数修改InputArray的上限和下限。保留InputArr中现有的数据。InputArr必须是一个动态的、已分配空间的单维数组。如果该数组新的大小((NewUpperBound-NewLowerBound 1)大于原数组大小,那么该数组多余的元素被设置为该数组的数据类型的默认值(0, vbNullString, Empty, Nothing)。如果该数组新的大小小于原数组的大小,那么新数组将仅包含原数组开头的值,其余的元素将丢失。该数组的元素可以是简单的类型变量(例如,LongString)、对象或者数组,不允许用户定义类型。如果InputArr不是数组、或是一个静态数组、或者没有被分配空间、或者NewLowerBound大于NewUpperBound、或者不是单维数组,那都将导致错误。如果发生错误,那么该函数返回False;若操作成功,则返回True

 

(3)CombineTwoDArrays

PublicFunction CombineTwoDArrays(Arr1 As Variant, _

    Arr2 As Variant) As Variant

这个函数将两个二维数组合并成一个单独的数组。该函数返回一个Variant,包含Arr1Arr2组合成的数组。如果发生错误,那么结果为NULLArr1Arr2的两维都必须具有相同的LBound,也就是说,所有4个下限都必须相等。结果数组是Arr2添加到Arr1后面。例如,数组{a,b;c,d}{e,f;g,h},合并后创建的数组为{a,b;c,d;d,f;g,h}

可以嵌套调用CombineTwoDArrays来合并多个数组成单独的数组,例如:

V =CombineTwoDArrays(CombineTwoDArrays(CombineTwoDArrays(A, B), C), D)

 

(4)CompareArrays

PublicFunction CompareArrays(Array1 As Variant, Array2 As Variant, _

    ResultArray As Variant, OptionalCompareMode As VbCompareMethod = vbTextCompare) As Boolean

这个函数比较两个数组Array1Array2,使用Array1Array2中相对应的元素比较的结果填充ResultArray。在Array1中的每个元素与Array2中相应的元素比较,如果Array1中的元素小于Array2中的元素,那么ResultArray中相应的元素被设置为-1;如果两个元素相等,则为0;如果Array1中的元素大于Array2中的元素,则为 1Array1Array2具有相同的LBound且有相同数量的元素。ResultArray必须是数字数据类型(通常为VariantLong)的动态数组。如果Array1Array2是数字类型,那么使用“>”和“<”运算符进行比较。如果Array1Array2是字符串数组,那么使用StrComp和由CompareMode参数确定的文本比较模式(区分大小写或不区分大小写)进行比较。

 

(5)ConcatenateArrays

PublicFunction ConcatenateArrays(ResultArray As Variant, ArrayToAppend As Variant, _

        Optional NoCompatabilityCheck AsBoolean = False) As Boolean

这个函数将ArrayToAppend追加到ResultArray的后面。保存其原始值和该数组末尾的ArrayToAppend的值的ResultArray,必须是动态数组。ResultArray将会调整大小以容纳其原始数据加上ArrayToAppend数组中的数据。ArrayToAppend可以是静态的或者动态的数组。ResultArrayArrayToAppend数组的任一个或者两个都可能未分配空间。如果ResultArray未分配空间,ArrayToAppend分配了空间,那么ResultArray被设置成与ArrayToAppend相同的大小,并且ResultArrayLBoundUBoundArrayToAppend相同。如果ArrayToAppend未分配空间,那么ResultArray保持原样,函数终止。如果两个数组都未分配空间,那么不会有任何操作,数组保持不变,程序终止。

默认情况下,ConcatenateArrays确保ResultArrayArrayToAppend数组的数据类型相同或者兼容。如果源元素的值可以存储在目标元素中而不损失精度或溢出,那么目标元素与源元素兼容。例如,目标Long与源Integer兼容,因为在Long中可以存储Integer而不丢失信息或溢出。目标Long与源Double不兼容,因为在Long中不能够存储Double而不丢失信息(小数部分将丢失)或者可能溢出。函数AreDataTypesCompatible用于测试兼容的数据类型。可以通过设置NoCompatibilityCheck参数为True来跳过兼容测试。注意,这可能会导致信息丢失(当复制SingleDoubleIntegerLong时,小数位可能会丢失),或者可能会遇到溢出情况,此时,目标数组的元素会被设置为0。如果发生溢出错误,那么该过程将忽略它,并将目标数组元素设置为0

 

(6)CopyArray

PublicFunction CopyArray(DestinationArray As Variant, SourceArray As Variant, _

        Optional NoCompatabilityCheck AsBoolean = False) As Boolean

这个函数将SourceArray复制到DestinationArray。不巧的是,VBA不允许你使用单个的赋值语句将一个数组复制到另一个数组。必须逐元素复制数组。如果DestinationArray是动态的,它会调整大小以容纳SourceArray中的所有值。DestinationArray具有与SourceArray相同的下限和上限。如果DestinationArray是静态的,并且SourceArrayDestinationArray的元素更多,那么仅SourceArray的开头部分的元素被复制来填充DestinationArray。如果DestinationArray是静态的且SourceArray具有比DestinationArray更少的元素,那么DestinationArray后面的元素将保持原样。DestinationArray不会调整大小来匹配SourceArray。如果SourceArray为空(未分配),那么DestinationArray保持原样。如果SourceArrayDestinationArray都未分配,那么函数退出且不会修改任何数组。

默认情况下,CopyArray确保SourceArrayDestinationArray的数据类型是相同的或者兼容的。如果源元素的值可以存储在目标元素中而不损失精度或溢出,那么目标元素与源元素兼容。例如,目标Long与源Integer兼容,因为在Long中可以存储Integer而不丢失信息或溢出。目标Long与源Double不兼容,因为在Long中不能够存储Double而不丢失信息(小数部分将丢失)或者可能溢出。函数AreDataTypesCompatible用于测试兼容的数据类型。可以通过设置NoCompatibilityCheck参数为True来跳过兼容测试。注意,这可能会导致信息丢失(当复制SingleDoubleIntegerLong时,小数位可能会丢失),或者可能会遇到溢出情况,此时,目标数组的元素会被设置为0。如果发生溢出错误,那么该过程将忽略它,并将目标数组元素设置为0

 

(7)CopyArraySubSetToArray

PublicFunction CopyArraySubSetToArray(InputArray As Variant, ResultArray As Variant,_

    FirstElementToCopy As Long,LastElementToCopy As Long, DestinationElement As Long) As Boolean

这个函数将InputArray的子集复制到ResultArray中的某个位置。InputArrayFirstElementToCopyLastElementToCopy(包括)之间的元素被复制到ResultArray,开始于DestinationElement。在ResultArray中已有的数据被覆盖。如果ResultArray不足以存储新数据,那么如果它是动态数组,则会适当调整大小。如果ResultArray是静态数组并且不够容纳新数据,那么会发生错误且该函数返回FalseInputArrayResultArray可以都是动态数组,但是InputArray必须分配空间,ResultArray可以不分配空间。如果ResultArray未分配,它使用LBound1UBoundDestinationElement NumElementsToCopy – 1调整大小。DestinationElement左侧的元素是数组数据类型的默认值(0vbNullStringEmptyNothing)。当从一个数组复制元素到另一个数组时,不会执行类型检查。如果InputArrayResultArray不兼容,不会触发错误,在ResultArray中的值将是该数组的数据类型的默认值(0vbNullStringEmptyNothing)。

 

(8)CopyNonNothingObjectToArray

PublicFunction CopyNonNothingObjectsToArray(ByRef SourceArray As Variant, _

    ByRef ResultArray As Variant, OptionalNoAlerts As Boolean = False) As Boolean

这个函数将SourceArray中不为Nothing的所有对象复制到新的ResultArray。必须将ResultArray声明为ObjectVariant型的动态数组。SourceArray必须包含所有对象类型变量(虽然对象类型可能会混合——数组可能包含多种类型的对象)或者Nothing对象。如果在SourceArray中找到非对象变量,则会发生错误。

 

(9)DataTypeOfArray

PublicFunction DataTypeOfArray(Arr As Variant) As VbVarType

这个函数返回指定数组的数据类型(vbVarType值)。如果指定的数组是简单数组,单或多维,那么该函数返回其数据类型。指定的数组可以未分配空间。如果传递到DataTypeOfArray的变量不是数组,那么该函数返回-1.如果指定的数组是一组数组,那么结果是vbArray。例如:

Dim V(1to 5) As String

Dim R AsVbVarType

R =DataTypeOfArray(V)  ' returns vbString =8

 

(10)DeleteArrayElement

PublicFunction DeleteArrayElement(InputArray As Variant, ElementNumber As Long, _

    Optional ResizeDynamic As Boolean = False)As Boolean

这个函数从InputArray中删除指定的元素,将删除的元素的右侧的所有元素向左移动一个位置。该数组的最后一个元素被设置成合适的缺省值(0vbNullStringEmptyNothing),这取决于该数组中数据的类型。数据类型由数组中的最后一个元素确定。默认情况下,数组的大小不会改变。如果ResizeDynamic参数是True,且InputArray是动态数组,那么它将缩小一个元素以删除该数组最后一个元素。

 

(11)ExpandArray

FunctionExpandArray(Arr As Variant, WhichDim As Long, AdditionalElements As Long, _

        FillValue As Variant) As Variant

这个函数扩展二维数组的任一维度。它返回一个带有添加了行或列的数组。在数组的底部添加行,在数组的右侧添加列。Arr是原始数组,不能以任何方式修改该数组。WhichDim指明是否添加额外的行(WhichDim=1)或者额外的列(WhichDim=2)。AdditionalElements指示要添加到Arr的额外的行或列的数量。新的数组元素使用FillValue中的值初始化。如果发生错误,那么该函数返回NULL。该函数可以嵌套以添加行和列。下面的代码对数组A添加3行和4列并在C中放置结果数组。

Dim A()

Dim B()

Dim C()

'''''''''''''''''''''''''''''''''''''''''''''''''''''

' RedimA, B, and C, and give them some values here.

'''''''''''''''''''''''''''''''''''''''''''''''''''''

C =ExpandArray(ExpandArray(Arr:=A, WhichDim:=1, AdditionalElements:=3,FillValue:='R'), _

    WhichDim:=2, AdditionalElements:=4,FillValue:='C')

 

(12)FirstNonEmptyStringIndexInArray

PublicFunction FirstNonEmptyStringIndexInArray(InputArray As Variant) As Long

这个函数返回不等于vbNullString的元素的字符串数组中第一个条目的索引号。当处理按升序排列的字符串数组时非常有用,它将vbNullString条目放置在数组的开头。一般来说,InputArray将按升序排列。例如:

Dim A(1To 4) As String

Dim R AsLong

A(1) =vbNullString

A(2) =vbNullString

A(3) ='A'

A(4) ='B'

R =FirstNonEmptyStringIndexInArray(InputArray:=A)

' R = 3,the first element that is not an empty string

Debug.Print'FirstNonEmptyStringIndexInArray', CStr(R)

 

(13)GetColumn

FunctionGetColumn(Arr As Variant, ResultArr As Variant, ColumnNumber As Long) AsBoolean

这个函数使用一维数组填充ResultArr,该数组是通过输入数组ArrColumnNumber指定的列。ResultArr必须是一个动态数组。ResultArr的已有内容会被销毁。

 

(14)GetRow

FunctionGetRow(Arr As Variant, ResultArr As Variant, RowNumber As Long) As Boolean

这个函数使用一维数组填充ResultArr,该数组是通过输入数组ArrRowNumber指定的行。ResultArr必须是一个动态数组。ResultArr的已有内容会被销毁。

 

(15)InsertElementIntoAnArray

PublicFunction InsertElementIntoArray(InputArray As Variant, Index As Long, _

    Value As Variant) As Boolean

这个函数在InputArray中插入值ValueIndex位置。InputArray必须是一个单维动态数组。它将会调整大小以适应新的数据元素。要在数组的结尾插入元素,设置IndexUBound(Array) 1

 

(16)IsArrayAllDefault

PublicFunction IsArrayAllDefault(InputArray As Variant) As Boolean

这个函数返回TRUE或者FALSE来指明数组中所有元素是否具有特定数据类型的默认值。取决于数组的数据类型,默认值可能是vbNullString0EmptyNothing

 

(17)IsArrayAllNumeric

PublicFunction IsArrayAllNumeric(Arr As Variant, _

    Optional AllowNumericStrings As Boolean =False) As Boolean

这个函数返回TRUE或者FALSE来指明是否数组中所有元素是数字。默认情况下,字符串不被视为数字,即便它们包含数字值。要允许数字字符串,设置参数AllowNumericStringsTrue

 

(18)IsArrayAllocated

PublicFunction IsArrayAllocated(Arr As Variant) As Boolean

这个函数返回TRUEFALSE来指明是否指定的数组被分配空间(不为空)。数组是静态数组,或者是使用ReDim语句分配的动态数组,返回TRUE。如果数组是仍没有使用ReDim调整大小或者使用Erase语句清空的动态数组,返回FALSE。这个函数基本上与ArrayIsEmpty相反,例如:

Dim V()As Long

Dim R AsBoolean

R = IsArrayAllocated(V)  ' returns false

ReDim V(1To 10)

R =IsArrayAllocated(V)  ' returns true

 

(19)IsArrayDynamic

PublicFunction IsArrayDynamic(ByRef Arr As Variant) As Boolean

这个函数返回TRUE或者FALSE来指明指定的数组是否是动态数组。如果该数组是动态数组返回TRUE,如果该数组是静态数组则返回FALSE。例如:

Dim DynArray()As Long

DimStatArray(1 To 3) As Long

Dim B AsBoolean

B =IsArrayDynamic(DynArray)   ' returns True

B =IsArrayDynamic(StatArray)  ' returnsFalse

 

 

(20)IsArrayEmpty

PublicFunction IsArrayEmpty(Arr As Variant) As Boolean

这个函数返回TRUE或者FALSE来指明指定的数组是否为空(未分配)。该函数基本上与IsArrayAllocated相反。

DimDynArray() As Long

Dim R AsBoolean

R =IsArrayEmpty(DynArray)  ' returns true

ReDim V(1To 10)

R =IsArrayEmpty(DynArray)  ' returns false

 

(21)IsArrayObjects

PublicFunction IsArrayObjects(InputArray As Variant, _

    Optional AllowNothing As Boolean = True) AsBoolean

这个函数返回TRUEFALSE来指明指定的数组是否包含了所有的对象变量。对象可能是混合类型。默认情况下,函数允许Nothing对象。也就是说,一个为Nothing的对象仍然被考虑是一个对象。要使对象是Nothing时返回False,设置参数AllowNothingFalse

 

(22)IsArraySorted

PublicFunction IsArraySorted(TestArray As Variant, _

    Optional Descending As Boolean = False) AsVariant

这个函数返回TRUEFALSE来指明数组TestArray是否按排序顺序排列(升序或降序,取决于参数Descending的值)。如果发生错误,则返回NULLTestArray必须是单维的已分配的数组。由于排序是一项消耗很大的操作,特别是含有大量StringVariant型的数组,可以调用该函数来确定在调用Sort过程之前数组是否已经排序。如果该函数返回TRUE,那么你不需要重新排序数组。

 

(23)IsNumericDataType

PublicFunction IsNumericDataType(TestVar As Variant) As Boolean

这个函数用来指明变量是否是数字数据类型(LongIntegerDoubleSingleCurrencyDecimal)。如果输入是一个数组,那么该函数测试数组的第一个元素(注意,在一组变体中,后续元素可能不是数字)。对于变体数组,使用IsVariantArrayNumeric

 

(24)IsVariantArrayConsistent

PublicFunction IsVariantArrayConsistent(Arr As Variant) As Boolean

如果在一组Variant中所有数据类型都具有相同的数据类型,那么返回TRUE。否则,返回FALSE。如果数组由对象类型变量组成,那么是Nothing的对象将跳过。如果所有的非对象变量有相同类型,那么该函数返回TRUE

 

(25)IsVariantArrayNumeric

PublicFunction IsVariantArrayNumeric(TestArray As Variant) As Boolean

这个函数返回TRUEFALSE来看Variant数组是否包含所有数字数据类型。数据类型不需要是相同的,可以是IntegerLongSingleDoubleEmpty的混合。只要所有的数据类型是数字的(由IsNumericDataType函数确定),结果将是False。如果数据类型不全为数字或者传入的参数不是数组或者是未分配的数组,则该函数返回FALSE。这个过程处理多维数组。

 

(26)MoveEmptyStringsToEndOfArray

PublicFunction MoveEmptyStringsToEndOfArray(InputArray As Variant) As Boolean

这个函数移除数组开始和结尾的空字符串,数组中的元素向左移。这在处理数组开头放置有空字符串的已排序的文本字符串数组时很有用。例如:

Dim S(1to 4) As String

Dim N AsLong

S(1) =vbNullString

S(2) = vbNullString

S(3) ='abc'

S(4) ='def'

N =MoveEmptyStringsToEndOfArray(S)

'resulting array:

For N =LBound(S) To UBound(S)

    If S(N) = vbNullString Then

        Debug.Print CStr(N),'IsvbNullString'

    Else

        Debug.Print CStr(N), S(N)

    End If

Next N

 

(27)NumberOfDimensions

PublicFunction NumberOfArrayDimensions(Arr As Variant) As Integer

这个函数返回指定数组的维数。如果数组是未分配的动态数组,那么返回0

Dim V(1to 10, 1 to 5) As Long

Dim N AsLong

N =NumberOfDimensions(V)  ' returns 2

 

(28)NumElements

PublicFunction NumElements(Arr As Variant, Optional Dimension = 1) As Long

这个函数返回指定数组的指定维度中元素数。如果存在错误条件,那么返回0(例如,未分配数组)。

Dim V(1to 10) As Long

DimDimension As Long

Dim N AsLong

Dimension= 1

N =NumElements(V, Dimension)  ' returns 10

 

(29)SetVariableToDefault

PublicSub SetVariableToDefault(ByRef Variable As Variant)

这个过程设置参数Variable为其数据类型的合适的默认值,可能是0vbNullStringEmptyNothing。注意,不能重置用户定义类型。可以通过声明该类型的第二个变量来轻松地将用户定义类型设置回其默认状态,例如Dim DefaultType As MyType,并让这些元素取其默认值。然后使用LSetUDT的另一个实例设置为DefaultType

PublicType MyType

    X As Long

    Y As Long

    S As String

End Type

 

DimDefaultType As MyType

Dim DataTAs MyType

DataT.X =1

DataT.Y =2

DataT.S ='Test'

' setvariables of T back to defaults.

LSetDataT  = DefaultType

 

(30)SwapArrayRows (31)SwapArrayColumns

FunctionSwapArrayColumns(Arr As Variant, Col1 As Long, Col2 As Long) As Variant

FunctionSwapArrayRows(Arr As Variant, Row1 As Long, Row2 As Long) As Variant

这些函数接收一个数组Arr,返回该数组的副本,其行或列被交换。

 

(32)ResetVariantArrayToDefaults

PublicFunction ResetVariantArrayToDefaults(InputArray As Variant) As Boolean

这个函数将Variant数组的所有元素重置为合适的默认值(0vbNullStringEmptyNothing)。数组可能由几种不同的数据类型组成(例如,一些是Long型、一些是Object、一些是String,等等),每个元素都将被重置为合适的默认值。

 

(33)ReverseArrayInPlace

PublicFunction ReverseArrayInPlace(InputArray As Variant, _

    Optional NoAlerts As Boolean = False) AsBoolean

这个子函数颠倒数组的顺序。也就是说,调用过程的数组将被反转。输入数组必须是单维数组。如果数组被成功反转,那么该函数返回True;如果发生错误,则为False

Dim V(1to 10) As String

Dim B AsBoolean

' load Vwith some values

B =ReverseArrayInPlace(V)

 

(34)ReverseArrayOfObjectsInPlace

PublicFunction ReverseArrayOfObjectsInPlace(InputArray As Variant, _

    Optional NoAlerts As Boolean = False) AsBoolean

这个子函数颠倒数组的顺序。也就是说,调用过程的数组将被反转。该函数返回TrueFalse来指明数组是否被成功反转。如果数组元素不是对象(允许Nothing对象),那么将发生错误。

Dim V(1to 10) As Object

Dim B AsBoolean

' load Vwith some objects

B =ReverseArrayOfObjectsInPlace(V)

 

(35)SetObjectArrayToNothing

PublicFunction SetObjectArrayToNothing(InputArray As Variant) As Boolean

这个函数设置指定数组的所有元素为NothingInputArray必须被声明为一组对象,或者是指定的对象类型、或者是通用的Object,或者是Variant。如果数组中的元素不是对象或Nothing,那么将发生错误。数组不可调整大小——保持同样的大小。在处理varaint数组时,使用该函数替代Erase,因为Erase将设置数组中每个元素为Empty,而不是Nothing,并且元素将不再被视为Object

 

(36)SetVariableToDefault

PublicSub SetVariableToDefault(ByRef Variable As Variant)

这个过程设置Variable为其数据类型的合适的默认值。默认值将是0vbNullStringEmptyNothing,这取决于Variable的数据类型。

 

(37)TransposeArray

PublicFunction TransposeArray(InputArr As Variant, OutputArr As Variant) As Boolean

这个过程转置二维数组,创建的结果数组的行数等于输入数组的列数,列数等于输入数组的行数。保留LBoundUBoundOutputArr必须是动态数组,会被清空或重新定义,因此将销毁现有的内容。

 

(38)VectorsToArray

PublicFunction VectorsToArray(Arr As Variant, ParamArray Vectors()) As Boolean

这个过程接收任意数量的单维数组,并将它们组合成单个二维数组。输入数组在参数ParamArray Vectors()中,并且它们被放置到的数组由Arr指定。Arr必须是动态数组,其数据类型必须与所有向量中所有元素兼容。Arr被清空,然后被重新定义,因此会销毁其所有现有的内容。在Vectors中的每个数组必须是单维已分配的数组。如果Vector是一个未分配的数组,该函数将退出且结果为False

Vectors中的每个数组是Arr的一行。Arr的行数是传入的Vectors的数量。Arr的每一行是一个向量。列数是Vectors的大小的最大值。由于Arr被清空,在Arr中未使用的元素保持为Arr的数据类型的默认值(缺省值是0vbNullStringEmpty,取决于Arr是如何被分配的)。每个向量的元素都必须是简单的数据类型,不允许对象、数组和用户定义类型。Arr的行和列都是基于0的,而不管Arr最初的设置,每一向量的LBoundOption Base语句。向量可以有不同的大小及不同的LBound


在本公从号回复“数组函数集”,下载代码工作簿。

 

相关链接:

VBA进阶 | 数组基础01: 用最浅显的介绍来帮助你认识数组

VBA进阶 | 数组基础02: 简单的数组操作

VBA进阶 | 数组基础03: 二维数组

VBA进阶 | 数组基础04: 运用数组处理工作表数据

VBA进阶 | 数组基础05: 动态数组

VBA进阶 | 数组基础06: 与数组相关的函数——Array函数与IsArray函数

VBA进阶 | 数组基础07: 与数组相关的函数——Split函数与Join函数

VBA进阶 | 数组基础08: 与数组相关的函数——Filter函数

VBA进阶 | 数组基础09: 使用数组作为过程参数及从函数返回数组



 

本文整理自cpearson.com,转载请注明出处。

欢迎在下面留言,完善本文内容,让更多的人学到更完美的知识。

本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
打开APP,阅读全文并永久保存 查看更多类似文章
猜你喜欢
类似文章
【热】打开小程序,算一算2024你的财运
VBA进阶|利用VBA数组管理数据清单和表格
第3章 Excel VBA基础语法 【上】
VBA笔记:数组
VB 删除数组中的重复元素(转)
VB6中给数组赋值的限制
VB6自定义函数设计数组
更多类似文章 >>
生活服务
热点新闻
分享 收藏 导长图 关注 下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!

联系客服