VBA数组学习笔记
- 格式:docx
- 大小:16.74 KB
- 文档页数:10
给学习ExcelVBA数组的人,一点点自己学习的心得感觉VBA真的是很神奇(然后就开始尝试着使用VBA去做一些很神奇的事,感觉很有满足感。
开始时,主要是操作单元格中的数字,比如从一个区域中筛选大于某个数的数字到另外一个区域和将某一区域的数字按照调教涂色等等。
在操作过程中很有满足感,并且也很享受,当然中间也经历了很多挫折和苦恼,尤其是数据量大的时候,需要经过长时间的等待,有时候甚至等待到死机。
一个偶然的机会,知道了还有一个东东叫数组,据说数组还可以提高运算速度。
以下就是在学习过程中对数组的一点认识(不说理论,只说我所见的用法):1.数组维数(Array dimension)数组可以分为一维数组,二维数组和多维数组。
其中前二者是我们最常见的,经常在EXCEL学习和使用中碰到的,其实我也不知道多维数组的具体形式。
一维数组,比如array(1,2,3),字典的关键字(d.keys)和字典的项(d.items)等。
二维数组,在excel中我感觉最常用的就是单元格区域,比如range(“A2:D3”)等等。
2.数组上限(Ubound)和下限(Ubound)比如在上面的一维数组array(1,2,3)中,其上限为2,下限为0。
Sub test()Dim arr ,i%Arr = array(1,2,3)i = ubound(arr)Msgbox iEnd subSub test1()Dim arr ,j%Arr = array(1,2,3)j = lbound(arr)Msgbox jEnd sub在一维数组中,其下限(lbound)始终为0,上限并不是等于数组中元素的个数,我在使用过程中一般是将数组上限(ubound)视为元素个数-1(比如元素个数为n,则ubound=n-1).二维数组。
如二维数组range(“A2:D3”),其第一维对应单元格区域的行,第二维对应单元格区域的列。
第一维的上限为行数,其值=2,对应的下限为1,因为单元格行数的最小值=1;对应的,其第一维的上限为列数,其值=4,对应的下限为1,因为单元格列数的最小值=1;在实际运用中一般都是使用他们的上限,即单元格的行数和列数。
Excel中VBA编程学习笔记(一)1、注释及编码规则注释:1.单引号:可以位于句子结尾或者单独一行;2.Rem:单独一行编码规则:1.如果VB中的关键字是由多个英文字母组成,则系统自动将每个单词的首字母转换成大写字母,其余字母一律转换成小写字母。
2.对于用户自定义的变量名、过程名、函数名,VB以第一次定义的为准,以后输入的自动转换成首次的形式。
3.如果在同一行写多条语句,语句间要用冒号“:”隔开。
例如:Form1.Width = 300 : Form1.Caption = “VB!”1.如果一条语句在一行写不下,可以分多行写,续航符为:一个空格后面跟一个下划线“_”。
例如:Address = “天津市河北工业大学” + _“现代化教学中心” + _“计算机技术基础教研室”2、类模块在Excel VBA中类模块就相当于一个类,类模块的名字就是类名。
下面为定义的一个类Class1,并且有些基本属性及一个初始化函数【例】下面定义一个类Class1,Private name, sex As StringPrivate age As IntegerPublic rng As RangeSub class_initialize() '初始化sex = "男"age = 20End SubPublic Property Get GetName() As VariantGetName = nameEnd PropertyPublic Property Get GetSex() As VariantGetSex = sexEnd PropertyPublic Property Get GetAge() As IntegerGetAge = ageEnd PropertyPublic Property Let SetName(newName As String)name = newNameEnd PropertyPublic Property Let SetSex(newSex As String)sex = newSexEnd PropertyPublic Property Let SetAge(newAge As Integer)age = newAgeEnd PropertyPublic Function GetInfo() As StringGetInfo = "姓名:" & name & ";性别:" & sex & ";年龄:" & ageEnd FunctionPublic Property Get maxNumer(num As Integer) As Integer maxNumber = Application.WorksheetFunction.Max(num, age)End PropertyPublic Property Set SetBckColor(myRng As Range)myRng.Interior.ColorIndex = 3End Property新建一个过程Sub test()Set tmp = New Class1Debug.Print tmp.GetAge() '20tmp.SetName = "张三"tmp.SetAge = 23Debug.Print tmp.GetInfo() '姓名:张三;性别:男;年龄:23Set tmp.SetBckColor = Sheet3.Rows(1) ‘将Sheet3的第一行背景色设置为红色End Sub3、新建对象及常用对象新建一个模块。
VBA基础-数组知识数组很多初学者都要问,为什么要学数组?➊数组很重要的一个特点就是读写速度快(因为数组的数据是存储在电脑内存中的)。
因此数组可以提速。
➋另一个就是可以将单元格区域赋值给数组,这一点可以极大的简化VBA代码。
下面我们做个小测试:我们把表格中A1:G10区域的数据复制到A12:G21区域,我们分别用copy方法和数组写入的方法来测试运行时间。
以下是运行代码及运行耗费时间对比。
copy方法写入数组写入我们明显可以看到用数组方法将数据写入单元格要比直接从单元格复制到另外一个单元格节省一半时间。
➜那么什么是VBA数组呢?VBA数组就是储存一组数据的数据空间。
数据类型可以数字,可以是文本,可以是对象,也可以是VBA数组.➜VBA数组的形式VBA数组是以变量形式存放的一个空间,它也有行有列,也可以是三维空间。
数组中的元素按次序存储在数组中,通过索引号进行区分。
➜数组分类数组按类型可以分为三种a.一般分为:常量数组,静态数组,动态数组b.如按维度为:1维,2维,3维......60 维➊常量数组array(4,6),这里array是个函数,功能是返回一个包含数组array(array(34,3,4),array("q","r"))➋静态数组x(10) 有10个位置,编号从0~10,这种情况,默认从0开始编号arr(1 to 10) ,有10个位置,编号1~10arr(1 to 10,1 to 2) 10行2列的空间(可比喻成单元格区域来理解),总共20个位置,这是二维数组arr(1 to 10,1 to 2,1 to 3) 三维数组,总10*2*3=60个位置。
这是三维数组➌动态数组arr() 不知道有多少行多少列►请认真看:①arr只是一个数组变量的代称,不要跟array函数混淆。
你当然可以用brr、crr、acc、a等等作为数组变量。
②静态数组在执行期间不可改变其最大上界限,而动态数组可以。
1、常量2、定义变量Dim 变量名称[as 数据类型或者对象类型]3、数据类型VBA 的数据类型有数值型、字符型、日期型、布尔型、对象型、变体型等,每种类型对应一种应用。
4、数组例子:Dim score(1 To 50) As IntegerDim i As IntegerFor i=0 To 50score(i) = InputBox("请输入第" + i + "个学生的成绩")Next i“Dim score(1 To 50) As Integer”,这个语句声明了一个一维数组,score 是数组名,1 到50 为下标的范围,这个数组共有50 个元素,每个元素的类型为整型(Integer)。
表示数组中各个元素的方法是score(1),score(2),score(3)…score(50)。
5、静态数组在声明数组的同时,确定了数组的元素的个数,这样的数组为静态数组。
声明数组的形式如下。
其中下标的个数决定了数组的维数,在VB 中最多允许60 维的数组。
Dim 数组名(下标1[,下标2…])[As 类型]一维数组的形式如下。
其中下标的形式为:[下界To]上界,下标下界最小可为-32768,最大上界为32767。
如果下界省略,则其默认值为0。
一维数组的大小为:上界-下界+1。
Dim 数组名(下标) [As 类型]例如:Dim a(5) As Integer 这条语句声明了一个含有6 个整型元素的数组,这六个元素分别用a(0)~a(5)来表示。
注意:数组的下标在声明时不可以是变量,如:n=10,然后定义Dim a(n) As Integer 这样定义是非法的。
多维数组域一维数组是类似的。
例如:Dim a(2,3) As Integer这条语句声明了一个二维数组,这个二维数组的排列如下:a(0,0) a(0,1) a(0,2) a(0,3)a(1,0) a(1,1) a(1,2) a(1,3)a(2,0) a(2,1) a(2,2) a(2,3)这个二维数组的第一维的范围是0~2,第二维的范围是0~3。
VBA入门笔记Dim ARR2X = Worksheets.Count '工作表数目m = 0For I = 2 To X '遍历工作表,第一张工作表除外。
y = Sheets(I).Range('A65536').End(xlUp).Row '定位工作表中有数据的行ARR1 = Sheets(I).Range('A4:IV' & y) '将子表中A4到有数据行的区域赋值给ARR1数组If m > 0 ThenReDim Preserve ARR2(1 To 256, 1 T o m + y - 3) '定义增大一个二维数组。
Preserve 为ReDim语法的可选的关键字,当改变原有数组最末维的大小时,使用此关键字可以保持数组中原来的数据。
ElseReDim ARR2(1 To 256, 1 To m + y - 3) '定义二维数组,此数组为一个二维数组,256为行号,y-3为列号。
第一次使用。
End IfFor p = 1 To 256For q = 1 To y - 3ARR2(p, q + m) = ARR1(q, p) '将子表中A4到有数据行的区域赋值给ARR2Next qNext pm = UBound(ARR2, 2) '返回ARR2数组的最大下标。
Next ISheets('汇总').Range('a4:IV' & UBound(ARR2, 2) + 3) = Application.Transpose(ARR2)End Sub53.'高亮显示所选单元格Private Sub Worksheet_SelectionChange(ByVal Target As Range)Cells.Interior.ColorIndex = 0Target.Interior.ColorIndex = 45End Sub54.'高亮显示所选单元格所在行Private Sub Worksheet_SelectionChange(ByVal Target As Range)Cells.Interior.ColorIndex = xlNoneWith Selection 'Selection=所选单元格 ActiveCell=活动单元格.EntireRow.Interior.ColorIndex = 44' .EntireColumn.Interior.ColorIndex = 44End WithEnd Sub55.分页符:55.1ActiveWindow.SelectedSheets.HPageBreaks.Add Before:=ActiveCell '插入行分页符55.2ActiveWindow.SelectedSheets.VPageBreaks.Add Before:=ActiveCell '插入列分页符55.3ActiveSheet.ResetAllPageBreaks '删除全部分页符56.设置打印机56.1Application.ActivePrinter = '\\10.202.41.60\HP LaserJet M1005 在 Ne01:' '激光打印机56.2Application.ActivePrinter = '\\10.202.41.34\OKI MICROLINE 6100F 在 Ne00:' '针式打印机56.3Application.ActivePrinter = 'pdfFactory Pro 在 FPP3:' '虚拟打印机57.改变下图J1单元格内容,自动填写表格。
【原创】VBA学习笔记(12)VBA的数组array一数组 array1.1 什么是数组?具体的例子•以这个语句为例子•arr1=array(1, 2, 3)•左边:变量名=数组名•右边:数组,集合,多个元素集合,多个数据集合,•右边的单个内容,1,2,3 是数组的元素/下标变量•每个元素存储时,会标记1个(看不见的)index 索引下标1.2 什么是数组,抽象的定义:数组也是变量,是一种可存储多个数据的特殊变量•VBA或其他语言里,变量是用来存储数据的。
•而一般来说,1个变量只能用来存储1个数据•现在来了1个特例,有高手发明了数组的概念:数组是一个特殊的变量,可以用来存储多个数据!(甚至是多维的多个数据!)•数组就是多个单位/元素(element)有序的,连续存储在一起作为一个整体,统一叫1个名字(数组名)1.3 数组的特点,index有序不重复,但数组的元素却可以重复•什么叫有序?•就是数组的内容存储是有序的•index 是有序(一般是从小到大)•index也应该是连续的,暂时没见过 index不连续的情况•index也不能重复•但是数组存储的内容,是可以重复的1.数组的index下标默认是从0开始的,比如split生成的,还有未指定index下标的,如 dim arr1(5)2.但是数组的index下标也有从1开始的情况,比如range 赋值的变量,默认下标从1开始,如 arr2=range("b1:d5")3.数组的index下标受控制的情况模块最前面 option base -14.数组index下标最好自己定义好,如 dim arr3(1 to 5)•Dim arr1(3) '其实是0-3,有4个元素•Dim arr1( 1 to 3) '其实是1-3,有3个元素•Option base 11.Sub test_array1()2.3.Dim arr1()4.Dim arr2()5.6.arr1() = Range("c1:c13")7.arr2() = Range("c1:o1")8.9.For i = 1 To 1310.Debug.Print arr1(i, 1)11.Next i12.13.14.For i = 1 To 1315.Debug.Print arr2(1, i)16.Next i17.18.End Sub1.4 数组的核心内容:就4个: 维数,每个维度大小,数据类型,数据举例:dim arr1(5) as integerdim arr2(2 to 6) as stringdim arr3(3,5) as integer1.数组的维数 : 数组可以是1维,2维等等,但数组的维数和嵌套不同!2.每个维数大小:每个维数的lbound() to ubound()3.数组存储数据的类型:可以是单一的,也可以是variant 变化的4.数组存储的内容:每个值的具体内容2 数组的分类•这些概念拿到前面说,是因为自己作为新手,发现很容易弄混概念,分不清什么静态数组,什么是界定清晰的数组?•数组定义和静态动态是相关的,•数组赋值也是和这些概念相关的,比如,静态数组不能被整体赋值,动态数组赋值前,要先界定清晰维数和大小等。
[VBA基础]数组常用知识点VBA中最常用的就是数组和字典,其中数组是必须也是常用的,关于数组的基本概念就不多说了,大家手里资料基本都有,今日我们说说数组的常用知识点:UBount和LBound函数那么,对于一个已经定义了的数组,我们想知道它的最大索引号(上界)和最小索引号(下界)是多少,怎么办呢?用UBound和LBound两个函数就可以了。
如,要想知道数组arr的上界是多少,则:UBound(arr)要想知道数组arr的下界是多少,则:LBound(arr)想知道数组有多少个元素,则:UBound(arr)- LBound(arr)+1Sub Savetime2020()Dim arr(10 To 50)MsgBox '数组的上标是:'& UBound(arr) & Chr(13) &'数组的下标是:' & LBound(arr) & Chr(13) &'数组的元素个数是:' & UBound(arr) - LBound(arr) + 1End Sub如果是一个二维数组,想知道它的上界是多少,就得指定维数Sub Savetime2020()Dim arr(1 To 10, 1 To 100)MsgBox '第一维的上界是:'& UBound(arr, 1) & Chr(13) & '第二维的上界是:'& UBound(arr, 2)End Sub使用Split创建数组arr= Split('A,B,C,CCC ',',')用Split把文本转换成数组,索引号总是从0开始。
通过Range创建数组比如想把A1:A100单元格的值给数组arr,代码还可以简单写为:arr= [a1:a100]Join函数Join的作用和Split的作用相反。
学习VBA,报表做到飞第二章数组2.1数组的声明、赋值及读取第二章数组2.1 数组的声明、赋值及读取数组,就是多个数据或变量的集合。
数组分为一维数组、二维数组、三维数组......等等。
通常我们使用的是一维数组和二维数组。
数组是先声明,后使用。
1、声明数组数组分为静态数组和动态数组(1)静态数组静态数组,就是它的长度是固定不变的。
它的声明格式是这样的:Dim 数组名(a to b) As 数据类型其中a、b都是数字,表示数组从a开始,到b结束。
如果只写一个数字,则默认数组从0开始,数字表示它的长度。
通常我们声明数组的时候,都不声明它的数据类型,这个数组就可以接受任何类型的数据。
例句:Dim arr1(6) '声明一个长度为6的一维数组,这个数组从0开始,它的实际长度是7。
如下图所示:Dim arr2(3) As Integer '声明一个长度为3的整型一维数组,这个数组从0开始,它的实际长度是4。
Dim arr3(1 T o 6) '声明一个长度为6的一维数组,这个数组从1开始,它的实际长度也是6。
如下图所示:Dim arr4(1 To 5, 1 To 4) '声明一个5行4列的二维数组,这个数组的行和列都是从1开始。
如下图所示:通过以上案例我们可以发现,如果这个数组从0开始,那么它的实际长度要比声明的长度多1。
如果这个数组从1开始,它的实际长度与声明长度一致。
(2)动态数组如果定义时不知道数组的长度是多少,可以定义它为动态数组:Dim arr()像这样,不给出数组的长度,它就是一个动态数组。
等确定了数组的长度之后,再重新定义该数组:ReDim arr(1 to 5)需要注意的是,在重新定义数组之前,如果这个数组已经有了数据,会把已有的数据全部清除掉。
要想保留已有的数据,需要在数组前加上Preserve:ReDim Preserve arr(1 to 5)2、数组赋值arr(3) = 100对数组里的一个位置直接赋值。
VBA数组学习笔记一、数组的分类按元素数目分:元素数目大小固定的数组和元素数目大小不固定的动态数组。
按维数分:一维数组、多维数组。
Arr(1 to 12)、Arr1(0 to 24)----一维固定数组;Arr2(1 to 5,1 to 8)---- 二维固定数组;Arr3(5 to 10,6 to 12,1 to 100) ---- 三维固定数组。
动态数组Dim Arr2(),r%r=r+1ReDim Preserve Arr2(1 To r) ―――动态数组;可以重新声明(只有最后一维的数目才能重新声明);用了关键字 Preserve 可确保原来包含数据的数组中的任何数据都不会丢失二、数组的赋值2.1,单元格区域保存到数组arr = [e22:i24]arr=Range(“e22:i24”)2.2,Array函数myArray = Array("AAA", "BBB", 200, 500, "2006-7-12")如果代码头没有 Option Base 1 的语句,则数组myArray的上限为4,下限为0。
即下限LBound(myArr)=0 ,上限 UBound(myArr)=4二维数组的第一维的上限:UBound(Arr,1)二维数组的第二维的上限:UBound(Arr,2)多维数组上限的求法一样。
2.3,把单元格区域公式赋给数组如果a5=B4+1arr = [a4:c8].Formula '将单元格绝对引用公式保存到数组[e4:g8]=arr 此时e5中的公式也=B4+1;如果将单元格相对引用公式保存到数组arr = [a4:c8].FormulaR1C1如果a5=B4+1[e4:g8]=arr 此时e5中的公式就=E4+1;三、数组的处理3.1,数组里的最大值和最小值最大值aa = Application.WorksheetFunction.Max(Arr) aa= rge(Arr,1)最小值aa = Application.WorksheetFunction.Min(Arr) aa= Application.WorksheetFunction.Small(Arr,1)。
Excel中VBA编程学习笔记(五)28、程序运行时间统计Sub test()begin_time = TimerFor i = 1 To 1000For j = 1 To 10000x = x + 1 * 2NextNextend_time = TimerMsgBox "运行用时" & Format(end_time - begin_time, "0.00") End Sub29、split函数及join函数split函数用于分割字符串并返回一个下标从0开始的数组,它包含指定的自字符串数目Dim direcSet direc = CreateObject("Scripting.Dictionary")contents = Split(Content, ",") ‘分割符为逗号For k = LBound(contents) To UBound(contents)direc(contents(k)) = direc(contents(k)) + 1NextKey = direc.KeysValue = direc.items[B1].Resize(direc.Count, 1) = Application.Transpose(Key)[C1].Resize(direc.Count, 1) = Application.Transpose(Value)jion函数返回一个字符串,该字符串通过连接某个一维数组的多个自字符串而创建的arr = [{"武汉","广州","深圳"}]res = Join(arr, ";") '得到武汉;广州;深圳30、filter函数filter函数返回一个下标从零开始的数组,该数组包含基于指定筛选条件的一个字符串数组的子集。
[分享]VBA数组学习笔记VBA数组学习笔记常常在论坛看到很多VBA高手运用数组解决各种问题,速度快,代码简洁,很是羡慕,所以逐渐收集了一些资料,与大家分享,也请多多指教。
在此,也向高手们致以谢意。
一、数组的分类按元素数目分:元素数目大小固定的数组和元素数目大小不固定的动态数组。
按维数分:一维数组、多维数组。
Arr(1 to 12)、Arr1(0 to 24)----一维固定数组;Arr2(1 to 5,1 to 8)---- 二维固定数组;Arr3(5 to 10,6 to 12,1 to 100) ---- 三维固定数组。
动态数组Dim Arr2(),r%r=r+1ReDim Preserve Arr2(1 To r) ―――动态数组;可以重新声明(只有最后一维的数目才能重新声明);用了关键字Preserve 可确保原来包含数据的数组中的任何数据都不会丢失二、数组的赋值2.1,单元格区域保存到数组arr = [e22:i24]arr=Range(“e22:i24”)2.2,Array函数myArray = Array("AAA", "BBB", 200, 500, "2006-7-12")如果代码头没有Option Base 1 的语句,则数组myArray的上限为4,下限为0。
即下限LBound(myArr)=0 ,上限UBound(myArr)=4二维数组的第一维的上限:UBound(Arr,1)二维数组的第二维的上限:UBound(Arr,2)多维数组上限的求法一样。
2.3,把单元格区域公式赋给数组如果a5=B4+1arr = [a4:c8].Formula '将单元格绝对引用公式保存到数组[e4:g8]=arr 此时e5中的公式也=B4+1;如果将单元格相对引用公式保存到数组arr = [a4:c8].FormulaR1C1如果a5=B4+1[e4:g8]=arr 此时e5中的公式就=E4+1;三、数组的处理3.1,数组里的最大值和最小值最大值aa = Application.WorksheetFunction.Max(Arr)aa= rge(Arr,1)最小值aa = Application.WorksheetFunction.Min(Arr)aa= Application.WorksheetFunction.Small(Arr,1)3.2,数组里搜索Temp = Filter(Arr, xm(i)) '搜索数组Sub yy()Dim Arr(), aa$, x%aa = "asssfffssssaaasss": bb = "s"For x = 1 To Len(aa)ReDim Preserve Arr(1 To x)Arr(x) = Mid(aa, x, 1)Next xtemp = Filter(Arr, bb)cc = UBound(temp) + 1 ‘cc=”s”的个数End Sub用于对字符串数组进行搜索,得到一个新的数组temp,缺点:只告诉你某元素是否存在于数组中,而不知道其具体位置;数组精确搜索:Sub FilterExactMatch()' 该函数在一个字符串数组中搜索那些' 与搜索字符串完全匹配的元素。
Dim astrFilter() As StringDim astrTemp() As StringDim lngUpper As LongDim lngLower As LongDim lngIndex As LongDim lngCount As LongastrItems = Array("a", "sas", "s", "Sas", "s", "f", "f", "f", "f", "sas", "s", "sas", "a", "a", "Sas", "s", "s")strSearch = "Sas"' 为搜索字符串而过滤数组。
astrFilter = Filter(astrItems, strSearch)' 存储结果数组的上限和下限。
lngUpper = UBound(astrFilter)lngLower = LBound(astrFilter)' 将临时数组调整到相同大小。
ReDim astrTemp(lngLower To lngUpper)' 在经过滤的数组的每个元素中循环。
For lngIndex = lngLower To lngUpper' 检查该元素是否与搜索字符串完全匹配。
If astrFilter(lngIndex) = strSearch Then' 在另一个数组中存储完全匹配的元素。
astrTemp(lngCount) = strSearchlngCount = lngCount + 1End IfNext lngIndex' 重新调整包含完全匹配的元素的数组的大小。
ReDim Preserve astrTemp(lngLower To lngCount - 1)' 返回包含完全匹配的元素的数组。
[a5].Resize(1, UBound(astrTemp) + 1) = Application.Transpose(astrTemp)End Sub3.3,转置取工作表区域的转置到数组:arr=Application.Transpose([a1:c5]) ‘此时arr是转置成3行5列的数组,arr(1 to 3,1 to 5)[e1:i3]=arr ‘此时3行5列。
数组间也可以转置:arr1=Application.Transpose(arr)取数组arr的第n列赋值到某列区域:[e1:e5]=Application.Index(arr, 0, n)也可写成[e1:e5]=Application.Index(arr, , n)赋值产生一个新数组:arr1=Application.Index(arr,0 , n)取数组arr的第n行赋值到某行区域:[a6:c6]=Application.Index(arr,n ,0 )也可写成[a6:c6]=Application.Index(arr,n ) 省略0,也省略了“,“赋值产生一个新数组:arr1=Application.Index(arr, n )3.4,数组的比较(字典法)题目:将A列中的数据与C列相比较,输出C列中没有的数据到D列:Sub cc()‘by:ccwanDim arr, brr, i&, x&, d As Objectarr = Range("a1:a" & [a65536].End(xlUp).Row)brr = Range("c1:c" & [c65536].End(xlUp).Row)Set d = CreateObject("scripting.dictionary")For i = 1 To UBound(arr)d(arr(i, 1)) = ""NextFor x = 1 To UBound(brr)If d.exists(brr(x, 1)) Thend.Remove brr(x, 1)End IfNext[d1].Resize(d.Count, 1) = Application.Transpose(d.keys)End Sub3.5,数组的排序字符串数组不能用Large(Arr,i) 或者Small(Arr,i) 来排序;但数值数组可以;一个很好的字典+数组排序的实例:Sub yy1()‘by:oobirdDim i%, c As Range, x, d As ObjectSet d = CreateObject("Scripting.Dictionary")For Each c In edRangeIf c.Value <> "" ThenIf Not d.exists(c.Value) Thend.Add c.Value, 1Elsed(c.Value) = d(c.Value) + 1End IfEnd IfNextk = d.keys: t = d.items 'k是各个不重复值,t是各个不重复值的个数ReDim x(1 To 2, 1 To d.Count)For i = 1 To d.Countx(2, i) = rge(k, i) ‘从大到小排序x(1, i) = d(x(2, i))Next iWith Sheet1.[b2].Resize(2, i - 1) = xReDim x(1 To 2, 1 To d.Count)For i = 1 To d.Countx(1, i) = Application.Max(t) ‘从大到小排序w = Application.Match(x(1, i), t, 0) –1 ‘查找此值在不重复值系列中的排位,因为w是从0开始的,所以-1x(2, i) = k(w) ‘求得对应的不重复值t(w) = "" ‘使前面的最大值为空,继续循环Next i.[b5].Resize(2, i - 1) = x ‘两行一起赋值给B5开始的单元格End WithEnd Sub字符串数组的排序,可以使用辅助列,把数组各元素依次赋给单元格,然后对这些单元格运用Excel自有的数据排序功能进行排序,再把单元格排过序的值重新赋给数组。
3.6,数组赋给单元格区域r=Ubound(Arr) r为一维数组的上限;Range("a2").Resize(1, r) = Arr '填充到工作表的一行之中(Arr为一维数组)或者写成Range("a2").Resize(1, Ubound(Arr)) = Arr二维数组Arr(100,5)Range(“a1”).Resize(100,5)=Arr[a1:e100]=Arr或者写成Range("a1").Resize(Ubound(Arr,1), Ubound(Arr,2)) = Arr赋值方面的补充:Sub y()Dim arrarr = [mmult(row(1:100),column(a:f))][a1].Resize(100, 6) = arrEnd SubSub yy()Dim arrarr = [column(a:z)^3]MsgBox Join(arr, ",")arr = [transpose(row(1:222))]MsgBox Join(arr, ",")End SubSub yyy()Dim arrarr = Split("a b c d e f g") MsgBox Join(arr, ",") End Sub。