论坛首页    职业区    学术与写作    工程技术区    软件区    资料区    商务合作区    社区办公室
 您好! 欢迎 登录注册 最新帖子 邀请注册 活动聚焦 统计排行 社区服务 帮助
 
  • 帖子
  • 日志
  • 用户
  • 版块
  • 群组
帖子
  • 13665阅读
  • 43回复

[资料转载]VBA入门学习 [复制链接]

上一主题 下一主题
离线yang6815475
 

发帖
1958
土币
11927
威望
7118
原创币
0
只看楼主 倒序阅读 使用道具 楼主  发表于: 2012-03-11


这里介绍青城山苦丁茶的新东东,通过具体事例讲解很新鲜,介绍给搞工程地貭的朋友门学习VBA,你认为好,多顶一下!?


许多例子经本人用Escel作成,可参看。

VBA入门学习(201152日更新结束)





   在大家的鼓励与支持下终于断断续续地于2011年5月2日更新结束,后面还有内容只好在有空时再另发新贴了。
    欢迎大家发新贴或跟贴交流讨论!
    谢谢大家!
------------------------------------分-------界-------线------------------------------------
    写在前面的废话:

    VBA,他有什么能耐?我们为什么要学习他?是不是真的“除了不会生孩子外,什么都会”?
    不是的,什么都不会是万能的,“寸有所长,尺有所短”。个人常讲的:从A处到B处,步行、乘汽车、乘火车、乘飞机一个比一个先进、一个比一个优越,当A是成都B是北京时肯定如此,然而A和B是一个家属院的两幢楼时大约就不是这样了吧?哪么我们在什么时候使用他?个人认为有以下情况时我们可以考虑看能否用VBA解决:
当我们仅仅在电脑上从事机械的、重复的简单的体力劳动的时候;
当我们在表格中写入的函数太多而致使改动一个数据,去泡了一杯茶过来电脑都还没有运算完的时候;
当我们需要在不同的文件间进行数据交换的时候;
当我们需要进行实时监控的时候
……
    总之就是我们用电脑解决一些有规律的,我们用函数、技巧解决起来却很麻烦,或很耗时,或不太好解决甚至不能解决的问题,就可以考虑用VBA能否方便快捷地完成。
   那么VBA难吗?看到的VBA代码都是些鸟文,俺不懂鸟文,能学会吗?
    VBA难,担不会比E中的函数难,能学会E中的函数的人都应该能学会V,并且绝对比用E中的数组公式简单。懂不懂鸟文与学得会学不会V关系不大,不会有多少人E中的每个函数都能默写出来吧?对E中的函数我是仅仅记住了常用的那几个,其余的要用到时再到帮助中去找。V同样如此,有时整段整段的代码都来自帮助,稍改下就成了自己的了
    在进入下面的学习以前,请暂时忘掉你原有的excel函数、技巧等等吧。此贴是为完全不懂VBA、完全不懂程序设计的人而写的,否则还是请绕道,他会浪费你很多时间和精力。学VBA的要点是动手动脑,然后是再动手动脑,最后还是动手动脑。这里的动手,是指录入代码(哪怕是照抄别人的,都得自己手录入,而绝不能复制粘贴)、改代码(阅读理解别人代码的基础上进行功能改、扩等的改写)、写代码;动脑除了常规意义上的思考等以外,此处还包括阅读理解程序,阅读的时候大脑模拟电脑执行过程,要知道每到一处的时候各变量、参数的值是什么、处于何种状态。




附件设置隐藏,需要回复后才能看到!
离线yang6815475

发帖
1958
土币
11927
威望
7118
原创币
0
只看该作者 1楼 发表于: 2012-03-11
VBA入门学习(2011年5月2日更新结束)将陆续发布,不以附件上传!

发帖
467
土币
633
威望
592
原创币
0
只看该作者 2楼 发表于: 2012-03-11
看一看,回复一下
离线yanturen01

发帖
5096
土币
79
威望
15153
原创币
0
只看该作者 3楼 发表于: 2012-03-12
看一看,回复一下
离线yang6815475

发帖
1958
土币
11927
威望
7118
原创币
0
只看该作者 4楼 发表于: 2012-03-12
续上页:
解二元一次方程.Excel用法,打开文件→工具→宏→确定→显示对话框输入数据即可计算。


VBA程序设计程序设计的基础知识:
一、计算机解决问题的步骤
计算机解决问题的步骤:一般来说,在运用计算机程序解决一个具体的实际问题时,大致经过以下几个步骤:
首先建模:分析问题,从具体问题中找出一个适当的数学模型
其次确定算法:然后设计一个解决数学模型的算法,
最后编制程序并进行测试调整,直到得出最终答案。
由于每一步不见得都能得到正确的方向,所以在每一步都可能返回到前一步甚至前几步。图形如下:

可见建立的模型不同(整得这么神秘,什么建模了、算法了,其实就我们对问题的想法,完成问题的具体步骤),最终编制出来的程序也就不同。
我们先来看一个经典的问(鸡兔同笼问题):有若干只鸡兔同在一个笼子里,从上面数,有35个头;从下面数,有94只脚。问笼中各有几只鸡和兔?
分析一:设兔子的数量为X,则鸡的数量为35-X,那么脚的数目就为4X+2(35-X)。我们就可以让X从0开始逐步增加,只要使4X+2(35-X)=94,就得到了兔子和鸡的数目。这就是所谓的建模。
确定算法:
①输入头的数目a,脚的数目b
②x= 0
③如果4X+2(a-X)不等于b,则x增加1,重复③;否则进入④
④输出兔子的数量X,则鸡的数量35-X
⑤结束


Sub jttl()
Dim a As Integer, b As Integer
Dim x As Integer
a =InputBox("a=", "请输入头的数目")
b = InputBox("b=","请输入脚的数目")
x = 0
Do Until 4 *x + 2 * (a - x) = b
    x = x + 1
Loop
MsgBox "有兔" & x & "只,有鸡" & 35 - x & "只"
End Sub

分析二(换一个思路,另建个模):设兔子的数量为X,鸡的数量为Y,头的数目为a,脚的数目为b,则有X+Y=a,4X+2Y=b,解方程组可得X=b/2-a,Y=2a-b/2
确定算法:
①输入a和b的值
②计算x= b/2-a
③计算y=2a-b/2
④输出x、y的值
⑤结束

编制程序:
Sub jttl ()
Dim a As Integer, b As Integer
dim x As Integer, y As Integer
a =InputBox("a=", "请输入头的数目")
b =InputBox("b=", "请输入脚的数目")
x = b / 2 - a
y = 2 * a - b/ 2
MsgBox "有兔" & x & "只,有鸡" & y & "只"
End Sub
以上的程序可以暂时不必搞清楚(后面我们还要讲此例),只是体现出看待问题的角度不同就有不同的算法,相应的程序也是不同的。同时也反应出程序实际就是一组机器操作的指令或语句的序列,是对算法(解决问题的步骤)的一种描述而已。因此编程就是将算法(解决问题的步骤)翻译成对应的代码,只是注意算法的每一个步骤对应着一个或多个语句,每个语句对应着一个或多个操作。
离线yang6815475

发帖
1958
土币
11927
威望
7118
原创币
0
只看该作者 5楼 发表于: 2012-03-12
工作忙,每天一段!认为讲解有新意,就支持一下哈!附件打开方法同上,并不收土币!
离线g999999

发帖
416
土币
8611
威望
1351
原创币
0
只看该作者 6楼 发表于: 2012-03-12
讲的不错嘛
离线yang6815475

发帖
1958
土币
11927
威望
7118
原创币
0
只看该作者 7楼 发表于: 2012-03-12
一口气登完,慢慢品尝!!


二、VBA语言及开发环境
(一)vba语言概述
由前示例可看出,VBA程序由一条条的语句构成,这些语句大体上可以分为(如下图):




①开始/结束:必须有的,表明程序的开始与结束。Sub是必须的(当然还有function等等,以后遇到再说)。Sub后面是我们给程序的命的名称(此处为jttl,也可以命名为其它,但必须要符合命名规则,命名规则后面讲)。End Sub是自动产生的。
②变量定义:Dim 变量名 as 数据类型,有多个变量要定义时用,分开。一般都具备,但还是要看具体情况而定。
③数据输入/数据输出:输入是给程序某些信息以供运行所需,可以从键盘输入,也可以从文件、扫描仪、鼠标等等一切可以输入数据的途径,它不是必须的,这要看具体情况而定;输出是将程序运行的结果反馈给我们,它是广义的:向显示屏上输出提示信息、向音箱输出信息、向打印机输出信息、向文件输出信息等等,一般来说每个程序都应具备。
④数据处理:我们希望计算机对数据进行的运算、处理等等。
-------------------------------------------------------------------------
1、vba的基本数据类型
描述客观事物的数、字符以及所有能输入到计算机中并被计算机程序加工处理的符号的集合统称为数据。数据既可以是计算机程序处理的对象,也可以是计算机程序处理的结果。为了更好地处理各种数据,vba定义了多种数据类型(书上是这么讲的,大家可以牵强地参照单元格数据类型中的数值、日期、时间、文本等来类似理解),以下介绍几种常用的基本数据类型:
整数:Byte存储为单精度型、无符号整型、8 位(1个字节)的数值形式,范围在 0 至255 之间。Byte 数据类型在存储二进制数据时很有用
integer存储为 16位(2 个字节)的数值形式,其范围为-32768至32767的所有整数,类型声明字符是百分比符号(%)。即dim I as integer 与dimi%等效。下同
long存储为 32 位(4 个字节)有符号的数值形式,其范围从-2,147,483,648 到 2,147,483,647的所有整数。类型声明字符为和号 (&)。
小数:single存储为 IEEE 32 位(4 个字节)浮点数值的形式,它的范围在负数的时候是从 -3.402823E38 到 -1.401298E-45,而在正数的时候是从 1.401298E-45 到 3.402823E38。但它只有七位有效数字。Single 的类型声明字符为感叹号 (!)。
double存储为 IEEE 64 位(8 个字节)浮点数值的形式,它能表示绝对值小于10308的数。有十五位有效数字。Double 的类型声明字符是数字符号 (#)。
字符串:string有两种:变长(最多可包含大约 20 亿 ( 2^31)个字符)与定长(可包含 1 到大约 64K ( 2^16 ) 个字符)。 String 之字符码的范围是 0 到255。字符集的前 128 个字符(0 到 127)对应于标准的 U.S. 键盘上的字符与符号。这前 128 个字符与 ASCII 字符集中所定义的相同。后128 个字符(128 到 255)则代表特殊字符,例如国际字符,重音符号,货币符号及分数。String 的类型声明字符为美元号 ($)。
逻辑型(布尔型)Boolean存储为 16 位(2个字节)的数值形式,但只能是 True 或是 False。Boolean 变量的值显示为 True 或 False(在使用 Print 的时候),或者 #TRUE# 或 #FALSE#(在使用 Write # 的时候)。使用关键字 True 与 False 可将 Boolean 变量赋值为这两个状态中的一个。当转换其他的数值类型为 Boolean 值时,0 会转成False,而其他的值则变成 True。当转换 Boolean值为其他的数据类型时,False 成为 0,而 True 成为 -1。
Variant: 是一种特殊的数据类型,除了定长 String 数据及用户定义类型外,可以包含任何种类的数据(似乎是万能数据类型,从某种程度上可看作类似于单元格格式中的常规)。Variant
也可以包含 Empty、Error、Nothing 及 Null等特殊值。
其它数据类型date、Currency等等可参考帮助文件。
-------------------------------------------------------------------------
2、vba的字符集与关键字
VBA中的字符集是由英语字母、数字和专用字符等组成,几乎包含了ASCII码字符集中的所有字符:二十六个英语字母的大小写、0至9的数字,专用字符是指在VBA中具有特殊含义的字符,如算术运算符(加+、减-、乘*、除/、整除\、乘方^)、关系运算符(>、<、>=、<=、<>、=)及各种标点符号。
关键字是VBA系统规定了一些固定的并且具有特殊含义的字符串。用户不可以改变他们,在命名宏、变量时也不可用这些关键字,如sub、dim、or等等。特征是在VBE窗口中自动将首字母变成大写、其余字母大部份是小写的就是。
-----------------------------------------------
3、常量与变量及其命名规则:
常量:声明定义时确定其值,程序在执行不始终不能更改的量,通常用于保存固定的数据。
声明方式为:c o n s t 常量名=表达式[,常量名=表达式]……
例:co  n st pi=3.14
即声明了一个值为3.14的常量pi
变量:程序在处理数据时,对于输入 数据、参加运算的数据、运算过程中的临时性数据、运行结果等,通常需要把它们暂时存储在计算机的内存单元中,变量就是用于命名这些内存单元的。其声明方式有dim、static、public等,以下介绍dim,其余的可参考帮助。
声明方式:dim 变量名 as 数据类型[,变量名 as 数据类型]……
例:dim i as integer 或dim i%
声明一个取值范围在-32768至32767的整数变量i
dim n as long,s as string 或dim n&,s$
声明一个取值范围在-2,147,483,648到 2,147,483,647的整数变量n和一个字符串变量s
注意:
①当仅用dim 变量名,即省略as 数据类型和类型声明字符时,vba会自动将其默认为Variant。当一个变量的类型为Variant时他可以存放任何类型的数据,并且该变量的实际类型随其存入的值的类型变化而变化。如
Sub test()
Dim v
‘v为Variant型
v = "你好!"
‘v为string型
v = 123
‘v为integer型
v = True
‘v为boolean型
End Sub
输入代码后按f8键来单步执行这个代码,在本地窗口中可看到v的类型变化。
VBA提供了VarType函数来测定变量的实际数据类型,格式VarType(变量名)
②不要试图用dim i1,i2,i3 as integer就将i1、i2、i3都声明为integer型。他的结果是i1、i2为Variant型,只有i3为integer型③
命名规则:
程序名、变量名、常量名都需遵循以下命名规则:
①由字母、数字、下划线组成,不可以包括空格。字母不区分大小写,即i与I是相同的。
②第一个字符必须是字母或下划线
③不能与关键字和保留字相同,但允许加前缀或后缀
④尽量简明清晰,避免使用容易混淆的字母和数字
⑤尽量使用有明确含义的英语单词或汉语拼音
----------------------------------------------------------------
4、运算符、函数与表达式:
算术运算符:
加(+)、减(-)、乘(*)、除(/)、整除(\)、取余(mod)、乘方(^)
说明:整除与取余运算,其操作数都必须是整数,当操作数不是整数时,系统会将其自动四舍五入转化为整数后,再进行运算。即9.8 \ 3.2与10 \ 3等效,结果都为3
比较运算符:
等于(=)、大于(>)、小于(<)、大于或等于(>=)、小于或等于(<=)、不等于(<>)、对象比较(is )、字符串比较(like)
逻辑运算符:
逻辑与(and)、逻辑或(or)、逻辑非(not)、逻辑异或(xor)、逻辑等价(eqr)、逻辑蕴涵(imp)
字符串运算:
& 和 +,都可以将两个字符串连接起来成一个字符串。
函数:
有内部函数和自定义函数两类。
内部函数如trim、mid、left等字符处理函数,date、time、day等日期时间函数,val、cstr等类型转换函数,array、split、join等数组处理函数,sqr、int、sin等数学三角函数,等等,具体可以参考帮助或相关文档。自定义函数是根据需要我们自己编写的函数。调用形式都是:函数名(参数列表),其中参数列表根据不同的函数而不同,有的有多个参数,有的只有一个函数,还有的没有参数。
表达式:
是由运算符、配对的括号将变量、常数、函数等以合理的形式连接起来的式子。其中括号只能是小括号,而不能象数学上用中括号、大括号。如数学上的式子  
                              
在程序中写为(-b+sqr(b^2-4*a*c))/(2*a)。注:sqr是求平方根的内部函数,^表示乘方(指数更恰当点)运算
-----------------------------------------------------------------------
(二)开发环境
这方面的介绍浩如烟海,不再多说,仅仅给出一种启动方法:启动excel后按[alt]+[f11]即可看到vbe界面。
以上内容可以跳过,在后面的学习中有不明白的,可以返回来查看可得到原因。
三、三大基本程序结构
1、顺序结构:
例1(再来看前面的例子):
有若干只鸡兔同在一个笼子里,从上面数,有35个头(数据存放于A1单元格);从下面数,有94只脚(数据存放于A2单元格)。问笼中各有几只鸡和兔(将结果数据存放于B1和B2单元格)?前面已写了平时我们是如何解决这个问题的:
分析:设兔子的数量为X,鸡的数量为Y,头的数目为a,脚的数目为b,则有X+Y=a,4X+2Y=b,通过数学知识很容易解得X=b/2-a,Y=2a-b/2,这样一来,我们只需要完成:
①获取a和b的值
②计算x= b/2-a
③计算y=2a-b/2
④输出x、y的值
⑤结束
就这么简单。这当中①至⑤在专业的书上就称为确定算法。其中①的获取也称输入,④的输出也称返回。为更贴近程序设计,我们再将①至⑤换一种表达方式:

这种图称为流程图,看得懂嘛?下面是流程图中几种图形的意思:
表示算法的开始与结束:  
表示算法中表示输入输出:  
表示算法中运算与赋值:  
表示算法中条件判断:  
流程线:  
大家要学会画流程图。后面的无论例子还是练习,都请大家先画流程图。
不是说讲VBA吗?这都是些啥子哟?不要急,把上面的搞清楚了,我们再来翻译翻译:
启动excel,按[alt]+[f11]进入VBE环境,点菜单中的插入———模块,按流程图中所示一一翻译如下:

Subjttl()  '开始
Dim a As Integer, b As Integer  '定义变量
Dim x As Integer, y As Integer
a = Range("a1")    '获取a的值
b = Range("a2")    '获取a的值
x = b / 2 - a      '计算X的值
y = 2 * a - b / 2  '计算y的值
Range("b1") = "有兔" & x & "只"   '输出X的值
Range("b2") = "有鸡" & y & "只"   '输出y的值
End Sub     '结束
    
光标位于这段代码的任一位置,按f5,看excel表中就有结果了(当然需要先在A1和A2单元格中输入头和脚的数目)。
    就这样就完了?是的,完成了!我们再来解释一下:
    第一句:sub是必需的,我们手工输入就可以了;jttl是给我们的这段代码取的名儿,只要符合命名规则(请参考前面的内容),怎么取都可以;这两个(中间的空格不能少哈)输入好后按回车,代码名称自动被加上了一对括号、下一行自动出现end sub。括号是有作用的,但此处我们可暂时不必管他,等他空起。接下来我们在sub和end sub之间分别输入其他语句。
    第二句和第三句:就是各定义两个整型变量。程序中用到几个就定义几个。但这里的变量名取得不好,虽然不影响运行但不能见名知意。以后的代码我们得改正。
    第四句:为赋值语句,完整的写法是let变量=表达式(对应到这句应该是let a =Range("a1"),其中let可省略,故在通常情况下我们所看到的都只是 变量=表达式 ,而没有了前边的let),其功能就是将表达式的值赋给变量(因此这句就是将单元格A1的值赋给变量a)。这里的=不是等号,是赋值号,他与数学上的=完全不同(数学中的=表示相等),如i=i+1在赋值语句中是常见的(数学上这么写则是错的),他表示将变量i的值增加1后再赋给变量i,即如果运行前i的值为0则运行后i的值变成了1;特别强调赋值语句中不能将=两边的内容互换(即写成形如 b / 2 - a=x,这在数学上可以,但赋值语句中却绝不容许)。另外对这句还要说一点的是VBA对单元格值的引用方法是Range(单元格).value(如要引用单元格A1的值就写成Range("a1").value),由于默认的是取value,所以在通常情况下我们将.value也省了,就成了句子中的a = Range("a1");除了用range来引用外,还有cells(行,列) .value(.value同样可省略),如a1单元格为第一行第一列,要引用a1单元格就写成cells(1,1)或cells(1, "a")都行,f10单元格为第十行第六列就写成cells(10,6)或cells(10, "f")。第三种引用方法是[单元格],如要A1就是[a1],f10就是[f10]。也就是说a =Range("a1")、a = [a1]、a=cells(1,"a")、a = cells(1,1)这几种形式的结果是完全相同的。
    第五句与第四句解释相同。
    第六句第七句也都是赋值语句。其中的表达式应该看得懂吧?
    第八句还是赋值语句,他将表达式的值赋给单元格b1,对此的解释与第四句相同。需要啰嗦一下的可能是表达式:"有兔" & x & "只",这当中x为变量,在前面的计算中他已获得了值,到了这里他就是用&运算符将他们三者按顺序连接起来。
离线yang6815475

发帖
1958
土币
11927
威望
7118
原创币
0
只看该作者 8楼 发表于: 2012-03-12
第九句与第八句相同
    第十句是规定动作。在输入代码的第一句时就自动产生了这一句。
    还有一个没提到:每行后面以’开头的是注释部份,也可以单独放在一行,反正程序是不执行他的。
    怎么样?还是晕晕的?这个例子不太好,从数学角度上难点了,不适合入门,重新来个简单的:

例2:根据我们输入的单元格名称,将当前的日期时间输入到该单元格中。
    分析:VBA为我们提供了inputbox来让用户输入内容、函数now来获取当前日期和时间。需要我们做的是把这些组合起来,获取用户输入的单元格名称、获取当前日期和时间、将日期和时间写入该单元格。
为此就有了以下流程图:

剩下的事情就是将上面的流程图翻译成VBA代码:
Sub srrq()
Dim s_dz As String, d_rq As Date    '定义变量s_dz和d_rq
s_dz = InputBox("请输入单元格名称", , "a1") '输入地址赋给变量s_dz
d_rq = Now    '获取当前的日期时间存入变量d_rq
Range(s_dz) = d_rq   '将d_rq的值赋给s_dz代表的单元格
MsgBox "日期与时间已写入" & s_dz & "单元格中"   '没实际价值,仅给个提示
End Sub
    
什么?还是晕?应该是晕在两处:一是不知道输入可用inputbox、获取日期时间可用now、MsgBox可以给出提示信息,二是这三个究竟怎么个用法?其实这不是重点, VBA内置的函数是死的,常用的就那么些,都可以查阅相关的资料来获得,要不了多久就能掌握,而重点是我们要掌握编程的思想方法。在后面的介绍中我们也会沿着这一思路进行。
    练习1:已知圆柱的体积为底面积乘以高,底面积为底面圆半径的平方乘以3.14。请写一程序用于输入任意圆柱的高和半径(用两句inputbox)并计算出其体积,将半径、高、体积分别存入单元格A1至A3(输入的半径为10、高为5,则A1至A3中依次显示:半径10、高5、圆柱的体积为1570。要求画出流程图、写出代码)。
    练习2:给两个变量分别输入值,然后将这两个变量的值互换后,用msgbox显示出来。同样要求画出流程图、写出代码
    这就是书上讲的程序三大基本结构之一的顺序结构,就是按照我们写的代码的顺序,从上到下依次执行。
我们再看一例
----------------------------------------------------------------------
2、选择结构
例3:输入一个整数,显示出他是偶数还是奇数
    分析:由前面知识可知,输入整数、显示都不成问题了,但问题在于要显示出他是偶数还是奇数,这就需要我们判断一下。如何判断呢?由数学知识知道除以2余数为0的就是偶数,否则为奇数。我们还是先别管程序如何,而是写出我们日常情况下是如何做的:
①输入整数
②判断他除以2的余数,如果是0进入③,不是0则进入④
③输出“你输入的是偶数”,进入⑤
④输出“你输入的是奇数”,进入⑤
⑤结束
    看出与前面的区别了吗?画出流程图再看看:

    这下就非常明显了。与前面不同就是红色部份

我们看看翻译成VBA代码是怎样的:
Sub jopd()
Dim i AsInteger
i =InputBox("请输入一个整数", ,0)
If i Mod 2 = 0 Then
    MsgBox "你输入的是" & i & ",他是一个偶数"
Else
    MsgBox "你输入的是" & i & ",他是一个奇数"
EndIf
End Sub
这段代码中红色的是我们所不熟悉的,其他的前面都见过。红色部份就是我们流程图中的红色部份,这就是选择结构(有选择地执行)。下面我们来详细说说。
If 条件 then
   语句块1
Else
   语句块2
End if
    这就是选择结构的格式之一,意思是如果条件成立(书上讲是条件为真)那么程序就执行语句块1(注意此处说的是语句块,也就是说他可以只有一句也可以有多句),语句块1执行完后进入到end if 的下一行继续执行;如果条件不成立(书上讲是条件为假)那么程序就执行语句块2,语句块2执行完后进入到end if 的下一行继续执行。换句话说,在执行一次这种选择结构时语句块1和语句块2必然执行一个且只执行一个。
    验证下:点VBE菜单栏中的视图---本地窗口来调出本地窗口来。光标位于这段代码的任意位置,按键盘上的f8键。每按一下代码执行一行,这样可以很清楚地看到程序执行的情况。同时从本地窗口中可看到变量的值的情况。特别提醒:这是调试代码常用的方式之一。
    特别地:如本例中,语句块1和语句块2都只有一句,就可以写在一行当中,变成了(有的地方称之为行if语句):
If 条件 Then语句1 Else 语句2
    再说下这里的条件:这里的i Mod2是取变量i除以2的余数,=与前边讲的又不同了(前面讲的=是赋值号,功能是将=右边的值赋给=右边的变量,但在赋值语句中才这样),这是在条件语句中,在此的功能是判断=两边的值是否相等,如果相等,则条件成立(书上讲的是条件为真),否则条件不成立(条件为假)。提醒一句:条件语句,=两边的内容可以互换,互换后的不影响结果。
    补充:条件可以是单一的逻辑值,也可以是一个比较表达式(例3就是),还可以是用逻辑运算符把几个比较表达式、逻辑值连接起来的复杂表达式。如:i_age代表年龄、str_name代表姓名,则表示年龄在20以上或10以下、姓张的条件表达式为: (i_age >= 20 Or i_age<= 10) And (str_name Like "张*")
    巩固一下:写一段代码,输入一个整数,判断他是不是5的倍数。
    这个题条件是用=比较得到,比较运算符除=外,还有>、<、<>、>=、<=,分别是大于、小于、不等于、大于或等于、小于或等于。那么我们再变通出一个题:手工在B2单元格输入一个学生的成绩,写一段代码,要求运行后用msgbox来提示该成绩是及格还是不及格(60分及格)。
    选择语句除了上面提到的以外,还有以下形式(每例一格式哈):
例4:还是例3,但改为输入的是奇数则提示,否则不作任何提示。
这里就只给出核心部分,其它与前面相同:
If i Mod 2 = 1 Then
   MsgBox "你输入的是" & i & ",他是一个奇数"
Endif
也就是说可以不要else 和语句块2,而成为:
If 条件 then
   语句块
End if
与前面还有个相同的是,如果语句块只是一句的话,可写成一行:
离线yang6815475

发帖
1958
土币
11927
威望
7118
原创币
0
只看该作者 9楼 发表于: 2012-03-12
If 条件 then 语句
例5:输入一个整数,显示出他是正整数、负整数还是0.将例3稍改下就可以了,看大家能理解不?
Sub zfpd()
Dim i AsInteger
i =InputBox("请输入一个整数", ,0)
Ifi > 0 Then
   MsgBox "你输入的是" & i & ",他是正整数"
Elseif  i<0 then
   MsgBox "你输入的是" & i & ",他是负整数"
Else
   MsgBox"你输入的是零"
EndIf
End Sub
   这种称为多重选择。这里是两个条件三选择,要是喜欢的话,还可以再整几个条件:
If 条件1 then
   语句块1
ElseIf 条件2 then
   语句块2
ElseIf 条件3 then
   语句块4
……
ElseIf 条件n then
   语句块n
else
   语句块n+1
End if
   大家理解起来应该没问题吧?其中else语句块n+1可以没有。提醒一下:在这种结构中假如有多个条件成立的时候,他只按从上到下的顺序,执行第一个条件为真的那段语句块,后出现的都不执行;在没有else 语句块n+1且有所的条件都不成立时,那么所有的语句块都不执行。
    但是这样一来,感觉上有点不舒服,还好,小比同学为我们提供了另一个选择用于取代if语句的多重选择(帮助中的程序):
Sub test()
Dim Number As Integer
Number =InputBox("请输入一个整数", ,0)   '输入变量初值。
Select Case Number    ' 判断 Number 的值。
   Case 1 To 5       ' Number 的值在 1 到 5 之间,包含1 和 5 。
      MsgBox "在 1 和 5之间"
   Case 6, 7, 8   ' Number 的值是6 、7、8。
      MsgBox "在 6 和 8之间"
   Case Is >= 9   ' Number 的值为>= 9。
      MsgBox "大于 8"
   Case Else   ' 其他数值。
      MsgBox "小于1"
End Select
End Sub
具体格式是:
Select case 测试表达式
   Case 表达式1
      语句块1
   Case 表达式2
     语句块2
   ……
   Case 表达式n
     语句块n
   Case else
      语句块n+1
End select

    与前面的if多重选择一模一样,不解释了嘛。只是上面的例程中给出的表达式古里古怪的,不过还好,他仅为了显示可有这么几种,实际中根据需要写就行,不必整得那么花哨。
   立即模仿练习:输入一个学生的分数,如果是40以下则显示“差生”,40至60则显示“不及格”,60至80显示“中等”,80以上显示“优生”,不在0至100之间则显示“输入成绩超界”。用If和select各写一个吧。
从例4起就没画流程图了,是因为多重选择的流程图画起来不方便。
    还要再次说明的是,凡是提到语句块,就是说可以是一句、也可以是多句。选择语句是可以嵌套的,但必需要注意“配对”:嵌套可以,绝不能交叉,如例5的多重选择我们可以改成以下的if嵌套:

    大家自行理解去吧。
    同时注意:这里该意做成图片并划上了线,目的是为了表明前面提到的必需要注意“配对”:嵌套可以,绝不能交叉。这里的外层if结构的语句块2是另一个if结构。
    还有一点,与例1例2不同的是后面的代码排得非常非常的sexy,大家一定要习惯并且也这么来干,这都是为“配对”的需要:不是程序的要求,而是方便我们写代码、读代码时清楚其层次结构。
3、循环结构
例6:编一段代码实现:当前单元格的A2至A40为某班学生姓名,在这次考试结束后需要将试卷上的成绩输入到B2至B40单元格中(试卷的顺序与A列学生姓名顺序一至)。
       咋重复了呢?这太简单了,前面不是讲了吗?就是这样嘛:
①录入第1个学生的成绩
②录入第2个学生的成绩
③录入第3个学生的成绩
……
       可是,就这样写四十行?这里还仅仅是40个学生,要是有一万个学生呢不是要写上一万行?这样的话电脑未免太弱智了嘛,哈哈。得想法。
       观察上面写的,每一行除了数字不一样外,其余的都一样,同时数字还非常有规律:后一个数比前一个数增加1。为此,我们这样改一改:
①设置一个变量i,让它等于1
②录入第i个学生的成绩
③i增加1
④判断i是否大于40,如果大于则进入下一步⑤,否则回到②
⑤结束
       这样一来就方便了:要是学生数不是40则只需将第④的40改成需要的数字就可以了;要是不是从第一个开始,如从第五个开始,还可以将第①步的1改成5;要是不是一个一个依次录入而是录入第1、3、5、7……(即隔一个录一个)仅仅将第③中的1改成2就可以了;而且都可用变量来控制,而不必改代码。这几点很重要,以后大家慢慢会明白的。
离线yang6815475

发帖
1958
土币
11927
威望
7118
原创币
0
只看该作者 10楼 发表于: 2012-03-12
不啰嗦了,画出流程图吧:

       有点眼熟?与选择语句似是而非的?的确可以用选择语加上转向可以写出代码,但不建议这么干,还是这样来翻译吧:
Sub cjlr()
Dim i%
For i = 1 To 40
      Cells(i+1, 2) = InputBox("输入第" & i & "学生的成绩", , 0)
Next
End Sub
       这就是传说中的for循环(有的地方称之为计数循环)。
       在说for之前先说两处:其一dim i%是什么?查查前面看看,他与dim i as integer功能完全相同;其二是Cells(i, 2) = InputBox("输入第" &i & "学生的成绩", , 0)能明白吧?可是……可是例2中不是写了那么多行吗?那是为了让大家看清楚,实际上例2可写成:
Sub srrq()
Range(InputBox("请输入单元格名称", , "a1"))= Now
MsgBox "日期与时间已写入单元格中"     '没实际价值,仅给个提示
End Sub
       前边的所有例都可以精简,不防去试试。
       还有Cells(i+1, 2),明白吧?还可以写成Cells(i+1, "B")或range("b"& i+1)。这几种表示方法大家要非常非常熟悉他哟。
       回到正题上来吧。For循环的格式为:


   For 循环变量=循环初值to 循环终值 step 步长
           循环体语句块
   Next 循环变量


       怎么对不上号呢?别急,那就先说对不号的地方:例中没有step 步长和最后的循环变量,这是因为当步长为1时,step 步长可省略;next后面的循环变量可省略。也就是说对不上号的地方是都省了,哈哈
       再来详细说for循环:
       当程序执行到for的时候,计算机要进行四个工作:将循环初值自动赋给循环变量(这个我们可通过本地窗口看到),并记下循环终值和步长(步长省略时就默认为1),再判断循环变量是否超过终值(注意此处用的是超过而不大于,这点后面再来解释),没超过则执行循环体语句块(本例中仅有一句,实际中可以有很多句,甚至是另外的一个甚至多个选择结构、循环结构,或他们的组合)和next语句, next语句就是将循环变量加上步长的结果赋给循环变量(同样可通过本地窗口看到),然后再返回到for,但是从next返回到for的时候,for就只做一个活路了:判断循环变量是否超过终值,没超过则执行循环体语句块和next。如此循环往复,直到循环变量超过则循环终值,就不再执行循环体语句块和next而直接执行后面的语句。
       这就是for循环的执行过程。大家同样可以验证下:点VBE菜单栏中的视图---本地窗口来调出本地窗口来。光标位于这段代码的任意位置,一下一下的来按键盘上的f8键,详细观察程序执行的情况、循环变量值的变化情况。
       返过来再谈前面丢下的疑问:为什么用“超过”而不说“大于”?for循环中有循环变量、循环初值、循环终值、步长,在本例中全是正整数。实际上,这些都可以是任意数字(注意仅仅是数字哈),也就是说正整数、负整数、0、正小数、负小数都可以。①当循环初值<循环终值时,如果步长为正数(不管是整数还是小数),则执行到循环变量>循环终值时,结束循环;如果步长为负数(同样不管是整数还是小数),则不执行循环体语句块而直接执行next后面的语句。②当循环初值>循环终值时,则与①刚好相反:如果步长为正数(不管是整数还是小数),则不执行循环体语句块而直接执行next后面的语句;如果步长为负数(同样不管是整数还是小数),则执行到循环变量<循环终值时,结束循环。③当循环初值=循环终值时,不管步长是正数还是为负数,都只执行一次循环体语句块。④不管循环初值与循环终值为何值,只要步长为0,则循环体语句块无限次的运行下去(书上称为死循环)。
       这就是不说“大于”而说“超过”的原因。同时要避免死循环的话就绝不能让步长为0 。
       同时,还有两点补充:不要试图在循环过程中来更改循环终值和步长,这是不可能的,因为在第一次执行for的时候就已经被记录在案,想改也改不了了;虽然在循环体语句块中可以改循环变量的值,但不要轻易动这个念头(当然套路学好了,到可以打迷踪拳的境界时除外),因为稍不留意另一个死循环就产生了。
       终于将for说的差不多了,喝口茶,继续说for。
       什么?还有?是的,还有一点点。
例7:还是例6这个题,编一段代码实现:当前单元格的A2至A40为某班学生姓名,在这次考试结束后需要将语文试卷上的成绩输入到B2至B40单元格中、数学试卷上的成绩输入到C2至C40单元格中……共有九个学科需要录入(所有学科的试卷顺序与A列学生姓名顺序一至)。
       怎么办?不会是把例6代码中的循环复制九次然后一个一个的再改吧?
       有了循环的思想,这里就直接给出代码,大家自己去理解理解:
Sub cjlr2()
Dim i1%,i2%
For i2=1 to 9
       For i1 = 1 To40
              Cells(i1+1,i2+1) = InputBox("输入第" & i1 & "学生的第" &i2 & "科成绩", , 0)
      Next
next
End Sub
       有了选择结构的经验,对这个应该理解吧?对,这就是循环结构的嵌套。同选择结构一样,嵌套时必须注意“配对”哈,绝不能交叉。
       VBA中还提供了一种:for each ……next,此处我们不讲他,以后再说。
       这就是所谓的计数循环(for循环)。
    V   BA中还有一类循环:条件循环
例8:还记得例2吧?输入一个整数,显示出他是偶数还是奇数。现在我们改成:有个数未知的很多个整数需要我们判断他是偶数还是奇数。为此我们约定:输入非0整数时是就显示出他是偶数还是奇数,当输入0时结束程序。
       用for循环可以吗?到打迷踪拳时可以,目前暂时还不行。还是分析下,画出流程图:

       看得明白吧?注意其中的判断奇偶并提示整在了一个框中,要详细将前面的移过来就可以了。也就是说我们画流程图进可“粗”可“细”,只要我们清楚就可以了。下面进行翻译:
Sub jopd2()
Dim i AsInteger
i =InputBox("请输入一个整数", ,0)
DoWhile i <> 0
       If i Mod 2 = 0 Then
                MsgBox "你输入的是" & i & ",他是一个偶数"
       Else
                MsgBox "你输入的是" & i & ",他是一个奇数"
       End If
       i = InputBox("请输入下一个整数", , 0)
Loop
End Sub
   这就是do ……loop语句。他有以下几种格式:
格式一:
Do while 条件
       循环体语句块
Loop
只要条件为真,就执行循环体语句块,否则执行loop后面的语句。如本例
格式二:
Do
      循环体语句块
Loop while 条件
       执行循环体语句块,只要条件为真,否则执行loop后面的语句。如将本例改为以下写法(请自行找出与前一个的区别,不仅仅是while的位置不同哈)
Sub jopd3()
Dim i AsInteger
Do
      i = InputBox("请输入一个整数", , 0)
    If i Mod 2 = 0 Then
             MsgBox "你输入的是" & i & ",他是一个偶数"
      Else
            MsgBox "你输入的是" & i & ",他是一个奇数"
      End If
Loop While i<> 0
End Sub
格式三:
Do until 条件
       循环体语句块
Loop
直到条件为真前执行循环体语句块。如本例可以改为:
Sub jopd4()
Dim i AsInteger
i =InputBox("请输入一个整数", ,0)
Do Until i =0
      If i Mod 2 = 0 Then
            MsgBox "你输入的是" & i & ",他是一个偶数"
      Else
            MsgBox "你输入的是" & i & ",他是一个奇数"
      End If
      i = InputBox("请输入一个整数", , 0)
Loop
End Sub
格式四:
Do
      循环体语句块
Loop until 条件
   执行循环体语句块直到条件为真。如本例可以改为:
Sub jopd5()
Dim i AsInteger
Do
      i = InputBox("请输入一个整数", , 0)
      If i Mod 2 = 0 Then
            MsgBox "你输入的是" & i & ",他是一个偶数"
      Else
            MsgBox "你输入的是" & i & ",他是一个奇数"
      End If
Loop Until i= 0
End Sub
      格式一、三的循环体最少执行次数为0,格式二、四的循环体最少执行次数为1。执行以上代码,每次都输入0,可看到我们的结论。
      特别要注意的是:do循环自身不能象for循环一样自动修改条件,因此最容易形成死循环,为避免形成死循环,需要我们在循环体中添加修改语句。
      For循环都可以改成do循环(反之则不一定),如我们将例6改成do循环:
Sub cjlr3()
Dim i%
i=1
Do whilei<= 40
      Cells(i+1, 2) = InputBox("输入第" & i & "学生的成绩", , 0)
      i=i+1
loop
End Sub



Sub cjlr4()
Dim i%
Do whilei< 40
      i=i+1
      Cells(i+1, 2) = InputBox("输入第" & i & "学生的成绩", , 0)
loop
End Sub
      看明白了吗?可是这两段的区别是什么呢?
      Do循环同样可以嵌套,那么例7就大家自己去改成do循环吧。
      条件循环除了do以外,还有一个很不常见的while …… wend,他与do雷同,这里就不多说他了,可以参考帮助文件。
      至此,程序的基本结构都说完了。个人一直认为,编写VBA代码就象是在堆积木,这三种基本结构就如同堆积木的规则,我们只需要将各种变量、常量、函数等等“积木块”按照这个规则加上我们丰富的想象,就能搭建出丰富多彩的“艺术珍品”。
离线yang6815475

发帖
1958
土币
11927
威望
7118
原创币
0
只看该作者 11楼 发表于: 2012-03-12
四、数组
为什么要学习数组?换句话说,他有什么优势?
那我们先来一个直观的感受:
例9:请向当前表格的a1至j30000单元格区域中填入1至100间的随机整数。
由前面的知识,画出流程图:

VBA提供了Rnd 函数返回小于 1 但大于或等于 0 的随机数,如果要生成某区间的随机整数可用Int((上限 –下限 + 1) * Rnd + 下限),由流程图我们很容易写出以下代码:
Sub test1()               '名称为test1的程序
Dim i1%, i2%, t As Single    ' 定义两个整型变量和一个单精度型变量
t = Timer                 '记下当前的时刻
Cells.Clear               '清空当前表的所有单元格
For i1 = 1 To 10          'i1从1循环到10,步长为1
     For i2 = 1 To 30000  'i2从1循环到30000,步长为1
         Cells(i2, i1) = Int(Rnd * 100 + 1)   '向单元格中填入随机整数数
    Next                  '下一个i2
Next                      '下一个i1
MsgBox Timer - t          '显示当前时刻与t的差
End Sub                   '结束
    代码中我们增加了t = Timer和MsgBox Timer – t两句用于检查此段代码花费了多少时间,应该能明白吧?
    现在我们思路完全不变,改成用数组来做:
Sub test2()
Dim i1%, i2%, t As Single
Dim arr1(1 To 30000, 1 To 10) As Integer    ‘定义数组arr1
t = Timer
Cells.Clear
For i1 = 1 To 10
    For i2 = 1 To 30000
        arr1(i2, i1) = Int(Rnd * 100 + 1)  ‘生成的随机数写入数组arr1
    Next
Next
Range("a1:j30000") = arr1       '将数组arr1的元素值填入单元格a1至j30000区域中
MsgBox Timer - t
End Sub
比较一下两段代码,基本上一样,是吧?可是他们花费的时间呢?
    还有更夸张的:记得以前刚开始用VBA时写一个类似于vlookup功能的代码,运行了一个小时还没完成实在等不下去了只好强行中断了它,后来改成数组大约是3秒左右,最后改成数组+字典,就没超过1秒了。怎么样?激发起数组兴趣没有?
    数组为什么快?究其原因,第一段代码直接向单元格中写入数据,写了10*30000次;第二段代码使用数组进行过渡,他先将数据写入数组,最后通过一句Range("a1:j30000") = arr1一次性将数组中的数据写入到单元格区域,从而达到的提高速度的目的。这就是空间换时间(数组是要占空间的哟)。
    从这个示例我们可以得到以下知识:
    其一,利用数组来减少对单元格的操作,可以大大提高速度,这就是我们为什么要学数组的原因之一。
    其二,又见到了三个函数:取整函数int(返回不大于其参数的最大整数,即int(5.9)返回5,int(-5.1)返回-6)、随机数函数rnd(返回大于等于0且小于1的随机小数)、时间函数timer(返回从午夜开始到现在经过的秒数)。如果要生成某区间的随机整数可用Int((上限 –下限 + 1) * Rnd + 下限)(如要生成10到20的随机整数就用int(11*rnd+10)
    见识了数组的作用,那么什么是数组?如何使用呢?下面我们从头来讲:
---------------------------------------------------------------------------
    前面讲了变量,变量就是用于存放数据的内存单元。一个变量存放一个数据。
    而数组,书上讲是多个类型相同的元素组成的集合,他用一个统一的数组名称和下标来唯一确定数组中的元素。
    太深奥了,不便于老百姓理解!数组数组,就是数据的组合嘛。说简单点:
    1、一维数组:
    公交车在出厂时安放了从1号编到50号的50个座位。王美女上车来司机把她安到了5号座位,这样5号座位就是王美女,下一站王美女下车了,上来了张帅哥、刘大头,司机把张帅哥、刘大头依次安到5号和10号位,这样5号就变成了张帅哥、10号位成了刘大头。这就就是个数组,而且是大小为50个元素的一维数组:安放了从1号编到50号的50个座位就是dim arr1(1 to 50),王美女坐到5号位就是arr1(5)= "王美女",后来张帅哥、刘大头依次坐到5号和10号位就是arr1(5)= "张帅哥"(张帅哥占了5号位王美女就消失了)、arr1(10)= "刘大头"……
这样的例子还有很多很多:银行里面办理业务排的号;足球比赛时运动员背上还是有大大的数字:一个序号……
    象这样,他们就是一维数组:只有一个下标。在VBA中使用
       Dim 数组名(n1 to n2) as 数据类型
    来定义一维数组。其中as 数据类型与前面的讲的变量完全一样,此处不在解释;n1和n2都是整数(即正整数、负整数、0都可以,而不见得如上面的都从1开始),但需要满足n1<=n2,定义出的元素个数为n2-n1+1。要引用其中的元素时,就用数组名(整型数字),这个整型数字的取值范围就从n1到n2的范围内。
    以dim arr1(-10 to 10)为例:数组名为arr1;元素个数为21个(为什么是21而不是20?),依次为arr1(-10)、arr1(-9)、arr1(-8)、……arr1(-1)、arr1(0)、arr1(1)、……arr1(9)、arr1(10),括号中的-10、-9等等数字就叫数组的下标(由于每个数组元素的下标只有一个,叫一维数组;这些下标都是整数,编程中常用整数或整型变量来表示这些下标);且都为Variant型(因为省略了as 类型)。其实质是在内存中开辟了一段连续的21个内存单元,分别用arr1(-10)、arr1(-9)、arr1(-8)、……来指向这些内存单元(相当于定义了21个变量)。
----------------------------------------------------------------------------
    2、二维数组及多维数组
    除了这种只有一个下标的外,还有两个下标的:我们的大会议室中安放了很多排、每排很多个座位,这时我们常常要给他编上号:1排、2排……,每一排又有1号、2号……要指定某个座位时就可用3排5号、10排8号等等这样的两个数字来唯一确定。对应到VBA中这就是一个二维数组:
    Dim 数组名(n1 to n2,n3 to n4) as 数据类型
    含义与一维数组基本雷同。其中n1<=n2,n3<=n4,元素个数为(n2-n1+1) *(n4-n3+1)
  
    前例中的Dim arr1(1 To 30000, 1 To 10) As Integer就定义了一个大小为30000*10的integer类型的数组。对应的元素的引用就是arr1(1,1)、arr1(1,2)、……arr1(2,1)、arr1(2,2)、……arr1(30000,9)、arr1(30000,10)。看到了吧,每个元素都是两个下标,中间用,分开。
-----------------------------------------------------------------------
    多维数组:还是前面的会议室,共有30排每排40个座,这是二维的;可是我们有5个这样完全一样的会议室,分别编号的一会议室、二会议室……如果要指定三会议室12排6号我们就可用会议室(3,12,6),这不就是三维了吗?要是我们有很10层楼,每层楼都是这样5个完全一样的会议室,如果要指定7楼三会议室12排6号我们就可用会议室(7,3,12,6),这又是几维呢?……还有很多很多。不过VBA提供的数组最多可达64维,不能超过64哈,实际编程中用得最多的还是一维和二维。



    在实际编程中,有时我们在设计代码时没法确定数组的大小,而需要在运行过程中根据实际需要才能定,这时我们常常先定义为动态数组(即不确定他的大小)然后再修改他的大小:
Sub test()
Dim arr1()              '定义数组arr1为动态数组
Dim i1%, i2%
i1 = InputBox("输入数组的最小下标", , 0)
i2 = InputBox("输入数组的最大下标", , 100)
ReDim arr1(i1 To i2)    '重新定义数组arr1的大小
End Sub
    对于redim大家可以去认真看看帮助文件,在这里我们暂时不多说他,在后面的实例中我们再讲。
    

    至此,我们将一些堆积木的规则及个别积木块展示出来了,下面,我们将再增加一些积木块,运用前面讲的规则来堆我们希望得到的“珍品”,共同努力吧!
以下我们给先出几个“积木块”然后用他来堆一个“产品”,这当中将着重从思路分析上入手,对实例进行多角度的分析,然后对每一种分析都写出相应的代码。想达到的目的:让大家逐渐掌握如何根据编程的基本思想方法来分析问题、解决问题。同时大家要切记:不要为眩目的代码所迷惑,要明白思路为上、写具体代码为下,也就是说重点是在思想方法上而不是在一行行的代码上。
    一、积木块(说得很简略,具体参考帮助或http://www.excelpx.com/thread-8822-1-1.html):
    Len(字符串|变量名)包含字符串内字符的数目,或是存储一变量所需的字节数。如Len("示例A")返回3;x% = 1615后Len(x)返回2(x为integer,占2 个字节)
    Mid(字符串,起始位置[,字符个数]):从字符串的起始位置开始取指定数量的字符。如mid("asdfghj",3,2)返回"df"
    Val(字符串) 返回去掉字符串内的空白、制表符和换行符之后的数字(位于非数字之后的数据则不能返回)。如Val("1615 .198th 213 N.E.")返回1615.198,213没返回是因为它在非数字th这之后
    Like:用来比较两个字符串。没有比http://www.excelpx.com/thread-8822-1-1.html第七楼写的好的了,仔细去看看吧。对其它的在此贴中都有非常好非常好的解释,字符串处理的必看贴之一。
    InStr([起始位置字串1,字串2) 从起始位置开始在字串1中找字串2最先出现的位置;当起始位置省略时从字串1的第一个字符开始找;没找到时返回0。
    Replace(字串1,字串2,字串3[,开始位置[,替换次数]])把字串1中从开始位置所包含的字串2用字串3来替换,替换次数表示当有很多都符合条件时则只替换替换次数所限定的最早出现的那几个,其余的则不替换。有开始数字时,开始数字前的字符没有了;开始位置默认为1,替换次数默认为所有。
----------------------------------------------------------
快速回复
限100 字节
温馨提示:欢迎交流讨论,请勿纯表情、纯引用!
 
上一个 下一个

      浙公网安备 33010602003799号 浙ICP备14021682号-1

      工业和信息化部备案管理系统网站