- 浏览: 204573 次
- 性别:
- 来自: 合肥
文章分类
- 全部博客 (156)
- 职场人生 (6)
- 开发时遇见的问题 (14)
- 技术学习 (13)
- Hibernate开发与实战学习 (10)
- Junit (9)
- 设计模式 (4)
- Lucene (1)
- Log4J (1)
- JBPM (0)
- OA (0)
- Spring (0)
- Struts2 (1)
- Android (2)
- Python (1)
- 生活点点滴滴 (8)
- Java (11)
- JavaScript&Jquery (22)
- Hadoop (1)
- JSP&Servlet (8)
- dom4j (2)
- mysql (2)
- Oracle (7)
- PHP (0)
- Jmeter (1)
- 测试方面的东东 (1)
- 励志文章 (3)
- CSS (4)
- XHTML&HTML (1)
- Linux相关 (7)
- C&C++ (2)
- Unix C (3)
- 开发软件配置及软件应用 (2)
- English Study And Movie Scripts (3)
- My English World (1)
最新评论
-
yingzhixing:
不错不错~~
利用org.springframework.web.util中的HtmlUtils工具类 -
yonguo:
博主能把完整的pom配置贴一下共享吗?
在maven中使用YUI-Compressor -
yan578351314:
我的为什么会出现语法错误呢?一大推错误信息...
在maven中使用YUI-Compressor -
jstenjoy:
什么是JBPM -
疯狂的草儿:
cat_rat 写道我是2010年9月份进入公司的--2010 ...
辞职了,离开了我工作的第一家公司
VBA 数组入门
[size=10.5pt]
一、初识数组
1 、数组就是一个列表或一组数据表。我们学习数组的目的,就是为了加速我们代码的效率。
2 、我们如何运用数组呢?
首先,必须声明数组。
其次,给数组赋值,可以是经过一系列的运算后再赋值给数组。
最后,将数组返回到工作表区域中。最终的目的是在工作表中显示我们想要的结果。
3 、调试数组的手段:本地窗口
我们可以通过设置Stop语句,或F8逐步执行代码,在本地窗口中观测数组的变化。
Sub test()
Dim arrSheetName(5) As String
Stop
End Sub
4 、数组的优势与不足
数组的速度优势是明显的,但不足也很明显,因为,数组处理的都是数据,因此,它不能给EXCEL数据添加颜色,删除行列,插入行列等等动作。
5 、VBA数组没有内存数组和一般数组之分。我们在声明数组时,就已经将数组写入内存里。
[
1 、声明一个数组变量,也是用Dim语句来声明。当声明了一个数组,便决定了这个数组用于存储数据所用的内存空间。
Dim arrCnt(10) As Integer
Dim arrSheetName(5) As String
Dim arr(7) As Variant
1 )、这里我们看到,与一般定义不同的是多了个带括号的数字。这个数字,就是这个数组所能存储的最大元素数。
2 )、数组可以根据我们的需要存储不同类型的数据,这与我们平常变量定义的类型一样,可以是Integer,Long,String,Variant 等等。
[size=10.5pt]2 [size=10.5pt]、注意,上面定义数组的例子是静态数组,所以,我们在声明数组时,就决定了数组用于存储数据所用的内存空间大小。后面我们会讲到动态数组。
1 、VBA中,数组默认的下界是0,也就是Option Base 0
如果,我们习惯了用1作为我们的下界,可以强制声明:Option Base 1
注:Option Base 0(1)必须放在所有模块之前。
2 、当然,我们也可以忽略这个强制声明,那我们就需要在声明数组时,指明数组的上界和下界,如:
Dim arrSheetName(1 to 3) as String
表明这个数组的上下界分别是1和3。
[size=10.5pt]
我们之前所定义的数组,都是静态数组。静态数组的特点是具有大小的数组。当我们事先知道数组的大小,那么,我们可以直接声明为静态数组。
如果我们不知道数组大小,那么我们应定义成动态数组。
1 、动态数组是可以改变大小的数组,通过在数组名称后附带空括号来声明,如:
Dim arrSheetName() as String
2 、在定义动态数组之后,必须使用ReDim来设置动态数组的上界和下界,为数组重新分配存储空间。
3 、我们可以使用ReDim语句反复地改变数组的元素已经维数。
Sub arr1()
Dim arr() As Long
Dim i As Long
ReDim arr(1 To 3)
For i = 1 To 3
arr(i) = i
Next
Sheet1.[a1].Resize(1, 3) = arr
Stop
ReDim arr(1 To 10)
For i = 1 To 10
arr(i) = i
Next
Sheet1.[a1].Resize(1, 10) = arr
End Sub
4 、ReDim Preserve语句
Preserve 英文的意思是保留,保存。顾名思义,就是重新定义数组时,将数组元素保留在数组中。
与ReDim不同的是,使用了ReDim Preserve,只能通过改变上界,即最末维的大小,来改变数组的大小,且不能改变数组维数。如果改变了下界,就会出现错误信息。
[size=10.5pt]例子,见后面的过程Join2。
我们前面所举的例子都是一维数组,数组可以定义多达60维。
但我们很少看到多过2维的代码。这也是因为对于Excel的工作表来说,行和列,就是表示2维,我们处理的数据区域很多都是围绕行和列进行处理。因此,我们只要掌握的二维数组,就掌握了对Excel的数据处理。
下面通过2幅图来理解二维数组:
1 、定义一个二维数组
Dim arrSource(1 to 100, 1 to 10) As Long
2 、定义一个三维数组
Dim arrSource(1 To 10, 1 To 6, -1 To 5) As Long
注:我们可以通过节点的多少来判断数组维数。
1 、Array 函数
返回一个包含数组的 Variant。
Array 函数在运行代码执行期间创建数组,而不必事先知道数组的大小。
Sub Array1()
Dim arr As Variant
arr = Array(1, 2, 3)
MsgBox arr(0)
End Sub
2 、Lbound、Ubound函数
LBound 函数:
返回一个 Long 型数据,其值为指定的数组维可用的最小下标。
UBound 函数:
返回一个 Long 型数据,其值为指定的数组维可用的最大下标。
Sub ULbound1()
Dim arr As Variant
arr = Array(1, 2, 3)
MsgBox UBound(arr)
MsgBox LBound(arr)
End Sub
Sub ULbound2()
Dim arr(1 To 100, 1 To 10, -1 To 3) As Integer
MsgBox UBound(arr, 1)
MsgBox UBound(arr, 2)
MsgBox LBound(arr, 3)
End Sub
返回一个下标从零开始的一维数组,它包含指定数目的子字符串。
语法:Split(expression[, delimiter[, limit[, compare]]])
[size=10.5pt]expression [size=10.5pt] |
[size=10.5pt]必需的。包含子字符串和分隔符的字符串表达式 。如果expression 是一个长度为零的字符串(""),Split 则返回一个空数组,即没有元素和数据的数组。 |
[size=10.5pt]delimiter [size=10.5pt] |
[size=10.5pt]可选的。用于标识子字符串边界的字符串字符。如果忽略,则使用空格字符(" ")作为分隔符。如果delimiter 是一个长度为零的字符串,则返回的数组仅包含一个元素,即完整的 expression 字符串。 |
[size=10.5pt]limit [size=10.5pt] |
[size=10.5pt]可选的。要返回的子字符串数,–1表示返回所有的子字符串。 |
[size=10.5pt]compare [size=10.5pt] |
[size=10.5pt]可选的。数字值,表示判别子字符串时使用的比较方式。关于其值,请参阅“设置值”部分。 |
Sub Split1()
Dim strJoin As String
Dim arrSplit As Variant
strJoin = "a,b,c"
arrSplit = Split(strJoin, ",")
Sheet1.[a1].Resize(1, 3) = arrSplit
End Sub
返回一个字符串,该字符串是通过连接某个数组中的多个子字符串而创建的。
语法:Join(sourcearray[, delimiter])
[size=10.5pt]sourcearray [size=10.5pt] |
[size=10.5pt]必需的。包含被连接子字符串的一维数组。 |
[size=10.5pt]delimiter [size=10.5pt] |
[size=10.5pt]可选的。在返回字符串中用于分隔子字符串的字符。如果忽略该项,则使用空格(" ")来分隔子字符串。如果delimiter 是零长度字符串(""),则列表中的所有项目都连接在一起,中间没有分隔符。 |
Sub Join1()
Dim strJoin As String
strJoin = Join(Array("a", "b", "c"), ",")
MsgBox strJoin
End Sub
返回一个下标从零开始的数组,该数组包含基于指定筛选条件的一个字符串数组的子集。
语法:Filter(sourcesrray, match[, include[, compare]])
[size=10.5pt]sourcearray [size=10.5pt] |
[size=10.5pt]必需的。要执行搜索的一维字符串数组。 |
[size=10.5pt]match [size=10.5pt] |
[size=10.5pt]必需的。要搜索的字符串。 |
[size=10.5pt]include [size=10.5pt] |
[size=10.5pt]可选的。Boolean 值,表示返回子串包含还是不包含match 字符串。如果include 是True ,Filter 返回的是包含match 子字符串的数组子集。如果include 是False ,Filter 返回的是不包含match 子字符串的数组子集。 |
[size=10.5pt]compare [size=10.5pt] |
[size=10.5pt]可选的。数字值,表示所使用的字符串比较类型。有关其设置,请参阅下面的“设置值”部分。 |
‘ 查找2数组的差集
Sub Filter1()
Dim varArr1 As Variant
Dim varArr2
As Variant
Dim i As Integer
varArr2 = Array(1021, 1023, 1025)
varArr1 = Array(1021, 1022, 1023, 1024, 1025, 1026, 1027, 1028)
For i = 0 To UBound(varArr2)
varArr1 = VBA.Filter(varArr1, varArr2(i), False)
Next i
MsgBox Join(varArr1)
End Sub
注意,filter函数在此是模糊查找,下面代码将无法返回我们想要的值
Sub Filter1()
Dim varArr1 As Variant
Dim varArr2
As Variant
Dim i As Integer
varArr2 = Array( 10 , 1023, 1025)
varArr1 = Array(1021, 1022, 1023, 1024, 1025, 1026, 1027, 1028)
For i = 0 To UBound(varArr2)
varArr1 = VBA.Filter(varArr1, varArr2(i), False)
Next i
MsgBox Join(varArr1)
End Sub
在某些情况下,我们根据需要来释放数组来重新定义数组,或避免数据堆栈。
Erase 语句
重新初始化大小固定的数组元素,以及释放动态数组的存储空间。即,Erase可以删除静态数组和动态数组里的数据元素。
Sub Erase1()
Dim arr(1 To 100) As Integer
arr(1) = 1
MsgBox arr(1)
MsgBox UBound(arr)
Erase arr
MsgBox arr(1)
MsgBox UBound(arr)
End Sub
从上面的代码中,我们可以看到,Erase语句用于清除数组元素,对静态数组维数和上标是没有改变的。
而对于动态数组,Erase 语句在释放动态数组所使用的内存后。在下次引用该动态数组之前,程序必须使用 ReDim 语句来重新定义该数组变量的维数。
Sub Erase2()
Dim arr() As Integer
ReDim arr(1 To 100)
arr(1) = 1
MsgBox arr(1)
MsgBox UBound(arr)
Erase arr
'ReDim arr(1 To 10)
MsgBox arr(1)
MsgBox UBound(arr)
End Sub
通过上面的几个概念,我们明白了数组的定义、赋值。我们最终的目的是通过数组来操作工作表区域中的数据,下面我们通过几个例子来进一步理解数组。
1 、将单元格区域赋值给数组
见过程RangeArray1,RangeArray2,RangeArray3
2 、拆分合并特定单元格数据
见过程 Split2,Join2,Split3
3 、维数转置
见过程RangeArray4
九、数组实例
1 、提取不重复数据。见UniqueData过程
2 、转置数据区域。 见TransposeData过程
发表评论
-
使用FileUpload上传文件
2010-12-31 01:49 798Apache 的 Commons FileUplo ... -
支付宝接口(转载)
2010-08-11 13:55 781之前讲过与paypal在线支付的接口通信,paypal接口主要 ... -
(转载)浅谈用户体验
2010-07-20 13:51 711谈到用户体验,不得不 ... -
网站资源
2010-01-23 21:28 638开发人员应该用好的一 ... -
Java 学习网站汇总贴
2010-01-12 12:43 1423今天在http://www.51itdh.com/这个网 ... -
什么是Lucene
2010-01-07 13:08 877Baidu 和 google 的强大的 web 搜索 ... -
什么是android
2010-01-06 10:28 735摘要 :android是基于L ... -
什么是JBPM
2010-01-06 09:14 1546... -
记录一些好的图书
2010-01-05 09:12 804RobertCMartin的<敏捷软件开发-原则模式实践 ... -
使用YUI Compressor压缩CSS/JS
2009-11-20 13:57 1265这几天正在为压缩代码 ... -
Maven命令使用及简介
2009-11-20 13:46 906创建普通应用项目: mvn archetype:create ... -
YUI Compressor Maven Plugin介绍
2009-11-20 13:40 2394目前开发Web应用Javascript发挥的作用越来越大,相关 ...
相关推荐
VBA 大全,非常方便的学习VBA.
"EXCEL_VBA编程快速入门教程" Excel VBA 编程快速入门教程是一个对于 Excel 新手的入门级教程,旨在帮助没有编程基础的用户快速掌握 VBA 编程的基本概念和应用步骤。该教程涵盖了 Excel 97 的基本概念、VBA 的主要...
"EXCELVBA编程从入门到精通.pdf" 本资源主要介绍了EXCEL VBA编程的基础知识和高级技术,旨在帮助读者从入门到...本资源还提供了更多关于EXCEL VBA编程的高级技术和实践经验,旨在帮助读者快速提高EXCEL VBA编程技能。
《Excel.VBA.实战技巧精粹.源码》是一本专注于Excel VBA(Visual Basic for Applications)编程的实践指南,适合那些希望提升Excel自动化能力的学习者。这本书通过丰富的实例,帮助读者掌握VBA在Excel中的各种应用...
- **数据处理**: VBA可以实现快速的数据筛选、排序和计算等功能,极大地提高工作效率。 - **报表自动生成**: 通过编写VBA脚本,可以自动创建复杂的报表格式,减少手动操作的时间。 - **用户界面定制**: VBA支持...
6. **宏录制和编辑**:演示如何使用宏录制功能快速生成VBA代码,然后进行编辑以优化和扩展功能。 进阶阶段,教程可能涉及以下主题: 1. **错误处理**:学习使用On Error语句来捕获和处理运行时错误,提升代码的...
兰色幻想的这套VBA从入门到进阶的80集完整教程,旨在帮助初学者掌握VBA的基础知识,并逐步提升到高级应用水平。 在第一集中,通常会介绍VBA的基础概念,包括: 1. **VBA概述**:解释VBA是什么,它的作用和在Excel...
### Excel VBA基础入门知识点详解 #### 一、VBA语言基础 **1.1 标识符** - **定义**: 标识符是用于命名变量、常量、子程序等的基本元素。 - **规则**: 必须以字母开头;长度最长可达255个字符;不能包含特殊符号...
本压缩包“Word文档VBA入门到精通(200页).zip”包含了200页的PDF教程,旨在帮助初学者快速掌握Word中的VBA编程。 首先,我们需要了解VBA的基础知识。VBA是基于Visual Basic的,因此它的语法和结构与VB6相似。在Word...
### Excel VBA基础入门:揭开自动化办公的神秘面纱 #### 什么是VBA?为什么要学习VBA? VBA,即Visual Basic for Applications,是Microsoft Office套件中的编程语言,特别适用于自动化Excel、Word等应用程序的...
### EXCEL_VBA基础入门详解 #### 一、引言 在日常工作与学习中,Excel作为一款强大的数据处理工具,其高效性和灵活性深受广大用户的喜爱。然而,对于那些需要复杂逻辑处理或者自动化任务的需求,Excel内建的功能...
兰色幻想Excel VBA数组入门教程集合 本资源是一个关于Excel VBA数组的入门教程集合,涵盖了数组的基本概念、数组的维数、声明数组、一维数组、二维数组、把单元格数据搬入内存、动态数组的声明等内容。 一、数组的...
### VBA入门详解 #### 一、什么是VBA?为什么学习VBA? VBA,全称为Visual Basic for Applications,是一种基于Microsoft Office环境的应用程序开发工具。它被广泛应用于Excel、Word等Office组件中,用于扩展这些...
同时,如果出现错误,VBA可以提供友好的错误提示,帮助用户快速定位问题。 VBA还支持子函数和模块的创建,这样可以将代码组织得更加有序。你可以将常用的功能封装成独立的函数,然后在需要的地方调用,使得代码复用...
作者通过自己的实践经历,认识到系统整理和学习的重要性,并决定利用业余时间将这些经验总结出来,形成一系列实用的示例,帮助更多人快速入门Excel VBA编程。 #### 二、主要内容和特点 本书主要通过一系列简短的...
Excel 2007与VBA编程从入门到精通 9/10 完整清晰版 PDF ,有目录。共 200MB,分为 10 个分卷 Excel2007 与VBA编程 从入门到精通 OFFICE2007 原价:43.00元 作者:张强,刘飚 编著 出版社:电子工业出版社 出版...
本压缩包包含的“EXCEL VBA基础入门示例文件”旨在帮助初学者理解并掌握VBA的基础知识。 1. **VBA简介** - VBA是Visual Basic的子集,专为应用程序开发而设计,如Microsoft Office套件。 - 它允许用户通过编写...
Excel VBA 入门教程 Excel VBA 是一种自动化语言,可以使常用的程序自动化,创建自定义的解决方案。VBA 是 Visual Basic For Application 的缩写,微软开发的应用程序共享一种通用的自动化语言。VBA 和 VB 的区别...