VBA入门笔记

开通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

THE END
1.WPS文字自动编号快速上手教程一、”、“1.”等),然后应用相应的自动编号样式即可。四、总结 通过本文的介绍,相信你已经掌握了WPS文字中自动编号的设置方法。自动编号功能不仅提高了文档编辑的效率,还保证了编号的准确性和一致性。无论是撰写报告、论文还是日常办公文档,都能让你事半功倍。快去试试吧,让你的WPS文字处理更加得心应手!https://baijiahao.baidu.com/s?id=1818189536516842735&wfr=spider&for=pc
2.WPS表格:使用技巧wps表格设置对象格式WPS将数据按照符号进行分割整理的方法 6)统计重复、非重复单元格数目 WPS工作表如何统计不重复的总人数? =SUMPRODUCT(1/COUNTIF(B3:B8,B3:B8))求不重复的个数 假设区间中有89、89、89、100这4个数字 countif(v11:v15,v11:15)求各个数值重复的次数,作用结果为1/3、1/3、1/3、1/1 https://blog.csdn.net/qq_35091353/article/details/128778046
3.word办公小技巧:方框打勾上下标横隔线排序想要将内容按照笔划、拼音进行排序,我们选中所有内容,点击【段落】功能栏中的排序功能 如果遇到无法编辑的word文件,可能是因为文件设置了限制编辑,我们可以通过输入密码来取消限制,忘记密码的话,可以使用工具,比如超人WORD解密助手帮助我们在无密码的情况下解除限制。https://zhuanlan.zhihu.com/p/11794156372
4.ExcelWord检测A.WPSB.Windows 7C.Windows XP.高级语言 98. 下列选项中对公式=MAX (A1:A8)的作用描述错误的选项是() A.这8个单元格数据之和B.这8个单元格数据之平均值C.这8个单元格数据最大值D.这8个单元格数据最小值 99. 单元格的引用分为相对引用和绝对引用.以下哪些不是单元格绝对引用符号() A.#B.%C.$Dhttps://www.wjx.cn/xz/215475626.aspx
5.WPS新增支持重磅功能!告诉你XLOOKUP有多强在Excel中,除了纵向搜索的VLOOKUP外,还有一个支持横向搜索的HLOOKUP。这两组函数虽然作用不一,但语法却基本相同。区别是一个在列中查找,一个在行中查找。而我们的XLOOKUP其实也集合了纵向和横向两种查询机制,除了上面讲到的纵向查询外,你还可以通过变换查找区域来实现横向搜索。具体效果,如上图所示。 https://www.51cto.com/article/689966.html
6.excelskill用WPS编辑文件时有一个特点,就是当你下次打开一WPS文件时,光标会自动定位到你上一次存盘时的位置。不过,Word却没有直接提供这个功能,但是,当我们在打开Word文件后,如果按下Shift+F5键您就会发现光标已经快速定位到你上一次编辑的位置了。 小提示:其实Shift+F5的作用是定位到Word最后三次编辑的位置,即Word会记录下https://www.douban.com/note/46113498/
7.在WPS文字中,拼音指南功能的作用是()A给汉字添加汉语拼音B将汉在WPS文字中,拼音指南功能的作用是( ) A、给汉字添加汉语拼音 B、将汉字翻译成中文 C、把中文出现的拼音用汉字显示出来 D、把所有汉字都转换成拼音 点击查看答案 你可能感兴趣的试题 单项选择题 一个正弦交流电压的有效值为220V,则它的最大瞬时值为( )伏?http://www.ppkao.com/wangke/daan/9aad46fd78854c659ddf293a4caa20d8
8.wps中的倒三角有什么作用,怎样设置出来。在WPS中,倒三角形的图标通常用来表示功能区或菜单。通过点击该图标,用户可以展开或折叠功能区,以查看或使用相关功能。要设置倒三角形的图标,请按照以下步骤操作:打开WPS软件,在菜单栏选择“选项”。“选项”窗口中,在左侧导航栏选择“界面设置”,然后在右侧窗口的选择下拉菜单中选择“功能区可见”,勾选该选项。最后https://wap.zol.com.cn/ask/details_20542930_2717076_3.html
9.[开发测试]Jmeter简单数据写入器 将结果记录到文件中,但不能记录到UI中。它旨在通过消除GUI开销来提供记录数据的有效方法 邮件观察仪 可在服务器多次响应失败时,使用该元件发送email BeanShell Listener 允许使用BeanShell处理样本以进行保存等 定时器: 作用域: 1、定时器是在每个sampler(采样器)之前执行的,而不是之后(无论定时器位置http://www.3fwork.com/kaifa212/003894MYM052628/
10.WPS表格看公式的快捷键怎么不起作用?WPS中无法使用ctrl+F等快捷键的原因是加载项冲突导致的,具体解决方法步骤如下:https://www.3d66.com/answers/question_1392653.html
11.风波耦合作用下新型多浮体平台动态响应研究http404错误 没有找到您要访问的页面,请检查您是否输入正确url。 请尝试以下操作: ·如果您已经在地址栏中输入该网页的地址,请确认其拼写正确。 ·打开主页,然后查找指向您感兴趣信息的链接。 ·单击后退链接,尝试其他链接。https://jvs.sjtu.edu.cn/CN/article/downloadArticleFile.do?attachType=PDF&id=10928