开通VIP,畅享免费电子书等14项超值服
首页
好书
留言交流
下载APP
联系客服
2022.01.03
学习以及运行环境在Office2019Excel中进行。
VBA和VB语法大致相同底层应该是有差异的,学习VBA之后可以一边看着文档一边尝试VB窗体开发或者操作数据库,个人感受VBA入门比较简单,和其他语言一样,入门简单精通难对于我们这个群体而言也没有必要要求自己达到程序员水平;
坊间传言VBA要过时了,未来office中的脚本语言将会被python或者JavaScript替代,可能以后会,但是VBA庞大的用户群体使用习惯不是一朝一夕就能改变的,除过officen内置了VBA还有WPS大名鼎鼎的CAD工控界上位机WINCCFT-View,所以VBA还暂时不会淘汰
不过!
ProtalWinCCUnifled是西门子最新的SCADA软件,其脚本语言已变成了JavaScript,IT&OT的界限将逐渐模糊……
比较常用的数据类型主要有整型和浮点型,字符串
string型是指一切可以打印的字符与字符串一个西文字符占用一个字节,一个中文占用2字节
随着赋值的变化而改变长度的字符串变量
可变(Variant)类型数据能够根据赋值对象的类型变化和转换角色。不建议使用Variant型,容易产生混乱。
类似C语言的结构体(PLC中的UDT),可以自定义数据模板使用案例如下
输出结果如下:
const语句的范围有以下规则:
1Dimx%,y!,z$'%=整形;!=单精度浮点型;#=双精度浮点型;$=字符型1DimxAsinteger,yAsinteger'AS后面指明数据类型,多个变量之间使用','隔离小心:不可以将DimxAsinteger,yAsinteger写成Dimx,yAsinteger这个条语句最终会将变量x视为Variant型数据。
DimArrayName(varNumber)AsDataType
数组另外一种初始化是直接给成员赋值
1DimiAsInteger2Constlenth=1034Dimary(lenth)AsInteger56ary(1)=1117ary(3)=3338ary(5)=5559ary(7)=7771011Fori=1Tolenth12Range('E'&i).Value=ary(i)13Nexti如果用户要自定数组的起始位置和结束位置参考下面的语句
格式:Dimarray(startToEnd)AsDataType
二维数组二维数组的使用通常用行列的概念理解起来会比较容易
1SubAAA()23DimiAsInteger,jAsInteger'定义2个循环变量4Dimitems(1To3,1To3)AsString'定义一个二维数组56Fori=1To37Forj=1To38items(i,j)='我在'&i&'行'&j&'列''数组初始化9Nextj10Nexti11'打印出数组中特定成员中的内容12Debug.Printitems(3,3)13Debug.Printitems(2,2)14Debug.Printitems(1,1)1516EndSub17'18'----------输出结果---------19'我在3行3列20'我在2行2列21'我在1行1列三维数组三维数组用XYZ空间坐标系理解起来比较容易,
第4行代码定义了一个10的3次方个元素第7-14行代码对这个三维数组进行初始化第16-18行代码输出特定元素中的值第19行代码输出这个三层循环嵌套总循环次数
关系运算符包括=,>,<,<>,>=,<=关系运算符的优先级别小于算数运算符注意:在关系运算符两侧的变量数据类型必须一致否则编译报错~
VB中常用的逻辑运算有4种
字符表达式只有一个运算符,即连接运算符'&'该运算符用于多个字符的拼接
1ConstPi=3.1415932Conststr1='hello'3Range('E1').Value=Pi&str1'EXCEL工作表E1单元格中将被写入内容3.141593hello&运算符还能将非字符串转换成字符串之后才进行拼接
VBE会自动将程序代码中的关键字首字母转换成大写
1ConstPi=3.1415932Conststr1='hello'&_3'world'&'OK'4Range('E1').Value=Pi&str1Debug参数输入使用inputBox函数接收来自键盘的数值配合Val函数,Val函数将字符数字转换成数值
调试VBA代码过程中可以使用MsgBox+'string'来判断代码阶段性执行结果
1MsgBox'step='&index另外VB语言中的print方法可以输出窗口,VBA中虽不能弹出窗口但是可以在立即窗口中输出运算结果
Debug.print'xxx';number;'yyyy''多个字段的输出内容使用分号隔开
将右侧的结果赋值给左值
1y=x2a=1024注释语句1Rem在此之后的本本皆为注释语句1x=Pi*D:Rem在此之后皆为注释在语句与Rem之间用':'隔离1Range('E1').Value=Pi&str1'我就是单引号注释With语句一般用于处理对象属性以及结构体成员的初始化
With[…………]endWith
1OptionExplicit2PublicTypemyType3member01AsInteger4member02AsString5member03AsSingle6member04AsBoolean7EndType89SubinitUDT()10DimxAsmyType11Withx12.member01=123413.member02='hello'14.member03=3.1415.member04=False16EndWith1718Debug.Printx.member01;x.member021920EndSub2122'------输出------23'1234hello分支结构-IF语句单一分支
双分支结构
比较C1B1两个单元格的数值大小
1IfRange('B1').Value>Range('C1').ValueThen23Range('D1').Value=Range('B1').Value-Range('C1').Value4Else56Range('D1').Value=Range('C1').Value-Range('B1').Value7EndIf多分支结构
成绩判断VBA代码示例
相比其他语法VB语言的SelectCase语句有两种用法
1DimselecterAsInteger23selecter=24SelectCaseselecter5Case16Range('D1').Value=1007Case28Range('D1').Value=2009Case310Range('D1').Value=30011Case412Range('D1').Value=40013CaseElse14Range('D1').Value=015EndSelect使用条件表达式时需要用到is关键字,is关键字代表了被测试变量本身,来测试与其他表达式之间的关系注意:如果多个分支的条件都满足条件,则只对第一个匹配的Case值关联的代码产生作用。
……
注意IF和ELSE的对应注意SelectCase和EndSelect的配对为了代码的可读性不同的嵌套层次需要使用缩进!
DoLoop循环会根据条件来判断是否要进行循环
当条件为true时执行循环条件为False时终止循环
1'求1~10范围整数之和2OptionExplicit34SubmyCode()5DimincAsInteger'用于增量6DimsumAsInteger'用于存范围数值之和7inc=189DoWhileinc<=1010sum=sum+inc11inc=inc+112Loop1314Debug.Print'sum=';sum15EndSub1617'-------输出-----18'sum=55当条件为true时执行循环直至条件成为false,无论条件真假,至少运行一次
当条件为false时执行循环直至条件成为true,无论条件真假,至少运行一次
1Do2'循环执行的代码3LoopUntil[条件表达式]While/Wend语句While/Wend语句先判断条件,当条件为true时,执行循环体否则跳出循环,循环体中可以通过条件在循环体中可以使用goto+label跳出循环
除过for循环While/Wend应该是用的最为频繁的循环语句
While/Wend跳出循环使用goto示例
1OptionExplicit2SubmyCode()3DimiAsInteger4DimsumAsInteger5i=167Whilei<=108sum=sum+i9i=i+11011Ifi=3Then12GoTolabel113EndIf1415Wend1617label1:Debug.Print'sum=';sum1819EndSub2021'---------输出-----------22'sum=3For循环填充B列的1至10行
带有步长过的for循环示例如果需要处理
1Forindex=1To10Step22Range('B'&index).Value=index+103Range('c'&index).Value=index+1234Range('d'&index).Value=index+2385NextindexForEach读取一系列单元格当读取到数值50时退出循环
ExitDo用于跳出Dowhile/Until循环语句
1SubmyCode()2DimiAsInteger3i=145DoWhilei<1067i=i+189Ifi=5Then10ExitDo'当i=5跳出Do循环11EndIf12Loop1314Debug.Print'i=';i15EndSub1617'--------输出--------18'5ExitFor用于跳出for循环
sub直译过来就是过程,VB语言的过程在其他语言中被称为函数或者子程序用户可以在主过程中调用子过程,例如CallsubA,调用SubA的子过程,当SubA执行完毕控制流会回到调用位置继续向下执行后面的代码
定义Sub过程的语法格式
[Private|Public|Static]SubsubName(par_List)
无参数的子过程示例
1'定义3个符号常量2ConstmsgB='sub01被调用'3ConstmsgC='sub02被调用'4ConstmsgD='sub03被调用'5'---------------主调过程-----------------------6'AAA()是主过程调用了3个子过程7SubAAA()8Callsub019Callsub0210Callsub0311Callsub0112EndSub13'----------------被调过程----------------------14'以下是定义了三个子过程--被调过程15PublicSubsub01()16Debug.PrintmsgB17EndSub18PublicSubsub02()19Debug.PrintmsgC20EndSub21PublicSubsub03()22Debug.PrintmsgD23EndSub2425'------输出--------26'sub01被调用27'sub02被调用28'sub03被调用29'sub01被调用带有参数的sub过程
function过程和sub最大的区别在于它可以给主调程序返回参数,这样它就可以出现在表达式中给变量赋返回值。Function的调用方式有3种最后一种尽量不要用,尽可能显式的调用定义的函数提高代码的可读性
1SubABC()2DimresualtAsInteger34resualt=Max(10,20)'以表达式的方式调用5Debug.Printresualt67CallMax(100,23)'使用call关键字调用8Max123,789'使用函数名直接调用少用!!9'Max后面两次调用有返回值只不过被丢弃了1011EndSub1213'输入两个参数返回最大值ps这个例子有Bug参考即可14PublicFunctionMax(xAsInteger,yAsInteger)AsInteger'返回值为Integer15Ifx>yThen16Max=x'返回值传递语句17Else18Max=y'返回值传递语句19EndIf20EndFunction案例2
VB中参数传递有两种形式
VB中默认的传参方式,即形参与实参使用同一个内存地址,类似C语言指针的意思但更像PLC编程中的inout类型的接口参数大多数的编程语言中函数只能返回一个参数,但通用sub可以通过地址传递的方式实现有多个参数回传至主调过程弥补了函数只能返回一个参数的特性,当然C语言可以将结构体指针传给函数实现同样的目的
下例中变量a,b被作为参数传递进了子过程,由于形参和实参使用了同一段内存,在子过程执行时相当于直接操作了实参变量。
下面例子中在模块2中定义全局变量以及过程,然后在模块1中使用模块2的全局定义跨模块使用变量,过程函数,以及字符常量
模块2中的代码:
模块1中的代码:
1'这里的代码位于模块12OptionExplicit34SubAbc()5Callinit'调用模块2中的init全局过程,给str01初始化6Debug.Printstr01'打印模块2中str01中的内容7Debug.PrintPi'打印模块2中字符常量Pi中的内容8CallF_module2'调用模块2中F_module2全局函数9EndSub1011'-------------输出------------12'我是模块2的全局变量Str0113'3.14159314'我是模块2的函数F_module2递归当过程(函数)直接或间接调用了自己时,则发生了递归。比较经典的例子就是阶乘
①创建一个类模块命名为base1②在创建好的类模块中定义属性和方法(函数)
再一次调用myCode()构造函数在创建对象时调用析构函数在程序结束前调用
如果某个对象执行完毕不再需要可以用下面的语句将其从内存中销毁,释放系统资源。
SetClassName=Nothing
1DimtestAsNewbase1'创建一个类实例test23Settest=Nothing'销毁一个实例练习题1、角度转换成弧度
圆周长=2派r=派d(d直径)圆一周的弧长=2派r(周长=弧长)弧度=弧长÷半径=2Πr÷r=一个整圆弧度:2Π先求出一度对应的弧度然后再乘以x度将计算好的弧度返回
2、计算直角三角形斜边
已知直角三角形的两条直边的长度,求斜边的长度根据勾股定律:C^2=A^2+B^2