Excel-VBA入门(1): 基础 / 变量 /for / if/ 调试
(一) 启动VBA
打开excel ,选项-自定义功能区-开发工具, 在界面的开发工具下选择 宏安全: 勾选 启用所有
excel保存xlsm后缀的格式才可以用宏!
若启动VBA编辑器(以下简称VBE)出现内存溢出, 自行百度, 更改一个programs 下的一个文件即可.
点击上述第一个 visual basic 打开编辑器界面如下, 或者Alt+F11快捷键.
这个是工程资源管理器, 不同类型的代码要写在不同的地方,
microsoft excel对象存放事件编程代码; 窗体存放程序代码; 模块存放标准代码; 类模块存放类代码.
一开始在界面中并没有看到模块, 窗体? 右击sheet1, 插入模块; 右击模块 ,可插入模块2...
(二)VBA 基础知识
(1)单击 宏 可以查看当下所有的宏代码, 并进行编辑

(2)VBE 中可以调出一个立即窗口, 输入命令后 按enter即可运行 (视图--立即窗口)

(3)在excel 世界里, 数据只有5种类型: 文本 数值 日期 逻辑值 错误值 (事实上,日期型也是数值)
VBA 的数据分类更细, 有 布尔型 字节型 integer long(长整数) single(单精度浮点) double currency decimal(小数) date string(定长/变长) 对象object
(4)声明变量的语法
dim 变量名 as 数据类型
dim i as integer
还可以用指定的符号表示数据类型: integer-->%, long-->& , single-->!, double-->#, currency--> @, string-->$
dim s$ 等价于 dim s as string
也可以不指定变量类型, 直接 dim s, 还有三种类型:
private i as string , public i as integer
static i as string 静态变量 保持原值不动
dim , static 声明的都是本地变量,作用于就是本过程,
如何定义可以在多个过程中都使用的变量? 此时变量定义需要放在sub (过程)之前..
Option Explicit
Dim a
Dim b
Sub demo1()
a =
MsgBox a
End Sub
Sub demo2()
b =
MsgBox b
End Sub
上述 a b被定义为模块级变量, 在这个模块中的任意过程都可以使用它们, 什么变量在不同模块也可以用呢? 公共变量 public s as string
(5)变量赋值
一般变量就直接 i=100, 对象变量需要用到 set
dim w as worksheet 先声明
set w=activesheet 再赋值, 赋值为当前活动sheet
(6) 排版问题
如果一行代码太长了 需要换行, 用空格+下划线 _ 再 enter 换行即可
多行代码显示为一行, 特别是在dim 声明中可以直接赋值了, % 表示integer
dim a %,b%:a=1:b=2
事实上, VBA看到冒号 : 认为这是两行代码分开的地方
如何注释块?

选择多行之后 会自动弹出一个编辑栏. 有注释块 选项, 如果没有自动出现, 则在视图-->工具栏-->编辑 即可调出来!!
(三)设计一个口算器-简答加法( 按钮 ,写在标准代码中)
在不同单元格 输入式子, 插入(第一个图案就是按钮)-- 用鼠标拖一个按钮出来
接着, 在 指定宏 窗口 修改宏名(改为做加法)--> 新建
在模块1中输入: (cells(m,n)表示单元格, m,n 分别表示行 列, 跟矩阵一样)
Sub 做加法()
Cells(, ) = Cells(, ) + Cells(, )
End Sub
关闭编辑器后,就实现了!
按钮太丑了? -->右击按钮, 可以编辑文字, 调节大小..
进一步, 增加减法, 现在换一种方法制作一个按钮: 插入一个按钮, 拖出按钮方块后,不新建 , 而是取消.
右击原来的按钮1, 指定宏-->编辑. 输入下面的代码,VBE其实自动会帮你写 很多东西..你写完sub 自动会增加end
保存关闭后, 点击按钮3 没反应?why? 因为还没有关联一个宏, 右击该按钮--指定宏-- 选择做减法就行了!!
但是有个小问题, 做减法的时候符号未变, 还是原来的+ , 怎么处理? 设置如下
注意, 要用双引号,不能用单引号!
进一步, 现在有很多行计算题, 输入所在行的行号, 显示答案
引入一个变量x 表示行号
Sub 做加法()
x = Cells(, )
Cells(x, ) = "+"
Cells(x, ) = Cells(x, ) + Cells(x, )
End Sub
输入不同的行号, 点击查看按钮, 即可看到该行的答案!
(四) 变量的应用-圆的计算
变量可以用英文 中文, 数字 下划线, 虽然VBA可以用中文做变量名,但是不建议采用!变量开头不能以数字开头, 也不能和系统的保留字一样, 对大小写不敏感(你敲小写的会自动给你改成大写开头的! ), xx =XX
Sub 圆的计算()
x = Cells(, ) y = 3.14 * x * x Z = / * 3.14 * x * x * x Cells(, ) = y Cells(, ) = Z End Sub
如果上述出错了, 某个变量不小心写成了x1, 结果如何??
Sub 圆的计算() x = Cells(, ) y = 3.14 * x * x Z = / * 3.14 * x * x * x1 Cells(, ) = y Cells(, ) = Z End Sub
可以看到体积=0 , 但是没有报错, 计算机自动认为这个x1=0;
因为对于一个新来的变量,VBA 会自动创建这一变量, 并且赋默认初值=0;
可是如何让程序报错呢?? 在sub外面增加Option Explicit
sub里面Dim x, y, z 声明本宏需要用到的变量..
此时再运行就会报错!!
Option Explicit 叫做强制声明, 这个非常重要!!
补充: 定义一个常量, 它不能被修改 , 声明赋值方法 Const pi = 3.1416 即可
(五)for循环
实现美元人民币的转换, 做两个按钮, 一个显示美元的收入, 另一个显示人民币的收入
上述代码如下:
Sub 美元价格()
Dim rate, i
, )
Cells(i, ) = Cells(i, ) / rate
Next i
Cells(, ) = "USD"
End Sub
Sub 按钮6_Click()
Dim rate, i
, )
Cells(i, ) = Cells(i, ) * rate
Next i
Cells(, ) = "CHN"
End Sub
注意: 其中next i 的 i 可以省略, step 1 是默认的也可以省略
但是step 2, step -1... 等不可以省略
(六)if 使用
实现成绩判定
Sub 成绩评定()
Dim avg
avg = (Cells(, ) + Cells(, ) + Cells(, )) /
Cells(, ) = avg
Then
Cells(, ) = "fail"
Else
Cells(, ) = "pass"
End If
End Sub
若成绩分为ABCDF 五个等级, 则要运用 elseif,
Sub 成绩评定()
Dim avg
avg = (Cells(, ) + Cells(, ) + Cells(, )) /
Cells(, ) = avg
Then
Cells(, ) = "A"
Then
Cells(, ) = "B"
Then
Cells(, ) = "C"
Then
Cells(, ) = "D"
Else
Cells(, ) = "F"
End If
End Sub
注意: then 不要漏写
如果if 的条件太多了,为了减少程序判断次数, 用 select case... end select 更好
Sub test()
Select Case Range("A1").Value
Range("A2").Value = "A"
Range("A2").Value = "B"
Range("A2").Value = "C"
Range("A2").Value = "D"
Case Else
Range("A2").Value = "F"
End Select
End Sub
(七) 程序调试
程序有三种模式: 设计 中断 运行

程序如下, 但是上述有点问题, 如何调试呢?
设置断点, 变为红色, 点击按钮, 程序运行
断点就像是高速公路的检查站, 到了必须停下来检查, 程序会在断点处进行检查, 进入程序的中断模式.
除了设置断点, 也可以写 stop 语句的形式中断代码
在立即窗口中查看变量x: debug.print x
但是到了断点行变为黄色, 程序停止, 这时需要逐步运行 F8
想要知道某个变量的值, 鼠标移动过去, 自动会显示的

当然一直用鼠标点也不好用, 可以增加监视变量: 调试--添加监视, 输入变量名即可!! ,那么在下部会出现这些变量的值

也可以选中某个变量, 快速监视

想要停止程序 则单击以下工具:

注意: 上述在调试的过程中, sheet 中的结果也在变化了, 已经在运行了!!
出现错误是, 可能用得到的语句
1. on error goto a
a: msgbox " 出错了"
养成好习惯, 提高代码运行效率
1. 声明变量为合适的数据类型
2. 少用variant 类型的变量, 它的存储空间较大
3. 不要让变量一直呆在内存中, 少用public !
如果一个变量不用了, 记得释放他们
Sub test()
Dim r As Range
Set r = Range("A1:B3")
r =
Set r = Nothing ' 释放变量
End Sub
4. 不要让代码执行多余的操作, 很多录制宏得到的代码非常冗余 , 需要删减下
5.合理使用数组
例: 将1-1000写入到工作表的A1 列
可以借助循环语句
Sub test1()
Dim t0 As Double
t0 = Timer
Dim i As Long
Cells(i, "A").Value = i
Next i
MsgBox "运行时间是" & Format(Timer - t0, "0.00") & "秒"
End Sub

换一种方法, 写入数组在将数组一次性写到单元格中
Sub test2()
Dim t0 As Double
t0 = Timer
) As Long
arr(i) = i
Next i
Range("A1:A1000").Value = Application.WorksheetFunction.Transpose(arr)
MsgBox "运行时间是" & Format(Timer - t0, "0.00") & "秒"
End Sub
运行时间只有0.01秒, 注意需要写成range("A1:A1000"), 就要精确写区域的范围, 不能写成range("A").
.
Excel-VBA入门(1): 基础 / 变量 /for / if/ 调试的更多相关文章
- Excel VBA 入门基础
Private Sub RegExp_Replace() Dim RegExp As Object Dim SearchRange As Range, Cell As Range '此处定义正则表达式 ...
- Excel VBA入门(九)操作工作薄
虽然我前面讲过,在VBA中操作工作薄并不是件明智的事,但有些时候,还是避免不了要这么做.绝大多数情况下,我们要做的是获取到某个工作薄对象,并以此来获得其中的工作表对象,然后再对工作表中的数据进行处理. ...
- Excel VBA入门(六)过程和函数
前面讲过,VBA代码有两种组织形式,一种就是过程(前面的示例中都在使用),另一种就是函数.其实过程和函数有很多相同之处,除了使用的关键字不同之外,还有不同的是: 函数有返回值,过程没有 函数可以在Ex ...
- Excel VBA入门(五)Excel对象操作
本章是本系列教程的重点.但我觉得应该不是难点.从第零章开始到学完本章,应该可以把VBA用于实战中了. Excel对象主要有4个: 工作薄 Workbook 工作表 Worksheet 单元格区域 Ra ...
- Excel VBA入门(四)流程控制2-循环控制
所谓循环控制,即在循环执行一段代码,用于完成一些重复性任务. VBA中的循环控制语句主要有3种:for.while.loop.对于大多数人来说,for的使用频率最高,而我个人也觉得for是最为灵活的, ...
- Excel VBA入门(一)数据类型
与其它的编程语言一样,VBA也有它自己的数据类型.讲到数据类型,就离不开"变量"与"常量"这两个概念,变量与常量,都是用于保存数据的.顾名思义,"变量 ...
- Excel VBA入门(二)数组和字典
数组和字典也是VBA的常用到数据类型之一.但是我翻了有四五本VBA教程相关的书,里面都没有介绍到字典,数组到是在介绍数据类型时有介绍,而并没有提到字典. 事实上,字典不是VBA内置的类型,它是Wind ...
- Excel VBA入门(十)用户窗体开发
VBA 中的用户窗体就是指带 UI 的用户界面,在运行的时候会单独弹出一个窗口,类似于在 windows 系统中运行的一个可执行程序一样(这个说法不太严谨,因为可执行程序也可能是只有命令窗口而没有 U ...
- Excel VBA入门(八)单元格边框
本文基于以下文件 http://pan.baidu.com/s/1nvJtsu9 (部分)内容预览: 1. 边框样式 Sub cell_format() Dim sht As Worksheet Di ...
随机推荐
- [转帖]Ansible批量远程管理Windows主机(部署与配置)
2018-09-12 12:04:42 https://blog.51cto.com/7424593/2174156 一.测试环境介绍 Ansible管理主机: 系统: CentOS6.8 IP ...
- CCProxy使用说明
CCProxy:通过手机调试webservice工具 第一步配置,点击设置 弹出如下页面点击E 弹出如下页面 配置端口,点击确定配置完成!! c#项目在路径为DCYS\.vs\config下找到文件a ...
- 雷军微博拧螺丝,CFO为粉丝数发愁
导读 小米集团联合创始人.品牌战略官黎万强4年前写的书<参与感>,估计又要热卖了. 3月24日,小米CFO周受资发微博,“我刚接受了同事的挑战,要在一定时间内在微博上有更多的粉丝”,并向粉 ...
- WebView 安全之 addJavascriptInterface
WebView是Android平台下的一个重要组件,通常用来在Activity中嵌入一个简单的浏览器,实现在线网页浏览的功能.比如下面代码实现访问Google页面: WebView webView = ...
- 如何在源码里修改openwrt root密码
root密码在etc/shadow文件里,但里边的密码是加密过后的.具体的加密方式我不清楚,应该是Linux里的一套加密算法.但要达到修改源码密码的目的,我还是想到了一个间接的办法.首先在源码里改成t ...
- 关于ESB(企业服务总线)的学习笔记
MQ(消息队列 message queues),它是一种应用程序对应用程序的通信方法.排队指的是应用程序通过队列来通信.队列的使用除去了接收和发送应用程序同时执行的要求. Web Sevice 技术, ...
- 清北澡堂 Day 3 上午
1.数论函数的卷积公式 (ƒ*g)(n)=Σd|nƒ(d)×g(n/d) 已知f*[1~n],g[1~n] 怎么求(f*g)[1~n]? 一个个求复杂度O(n根号n) 如何加速? 考虑更换枚举顺序(这 ...
- mongoDB 文档概念
mongoDB 文档概念 什么是文档 文档是 mongodb 基本的数据组织单元,类似于mysql 中的记录 文档由多个键值对组成,每个键值对表达一个数据项 属于 bson 数据 ps: bson ...
- boost库在windows上的安装
下载源码boost_1_70_0.zip 1.cmd进入boost源码包,运行bootstrap.bat生成bjam.exe 2.运行bjam.exe搞定 在visual studio配置 1. 项目 ...
- 通过nginx访问linux目录
http { ...... autoindex on; autoindex_exact_size off; autoindex_localtime on; server { listen 80; .. ...