(一) 启动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/ 调试的更多相关文章

  1. Excel VBA 入门基础

    Private Sub RegExp_Replace() Dim RegExp As Object Dim SearchRange As Range, Cell As Range '此处定义正则表达式 ...

  2. Excel VBA入门(九)操作工作薄

    虽然我前面讲过,在VBA中操作工作薄并不是件明智的事,但有些时候,还是避免不了要这么做.绝大多数情况下,我们要做的是获取到某个工作薄对象,并以此来获得其中的工作表对象,然后再对工作表中的数据进行处理. ...

  3. Excel VBA入门(六)过程和函数

    前面讲过,VBA代码有两种组织形式,一种就是过程(前面的示例中都在使用),另一种就是函数.其实过程和函数有很多相同之处,除了使用的关键字不同之外,还有不同的是: 函数有返回值,过程没有 函数可以在Ex ...

  4. Excel VBA入门(五)Excel对象操作

    本章是本系列教程的重点.但我觉得应该不是难点.从第零章开始到学完本章,应该可以把VBA用于实战中了. Excel对象主要有4个: 工作薄 Workbook 工作表 Worksheet 单元格区域 Ra ...

  5. Excel VBA入门(四)流程控制2-循环控制

    所谓循环控制,即在循环执行一段代码,用于完成一些重复性任务. VBA中的循环控制语句主要有3种:for.while.loop.对于大多数人来说,for的使用频率最高,而我个人也觉得for是最为灵活的, ...

  6. Excel VBA入门(一)数据类型

    与其它的编程语言一样,VBA也有它自己的数据类型.讲到数据类型,就离不开"变量"与"常量"这两个概念,变量与常量,都是用于保存数据的.顾名思义,"变量 ...

  7. Excel VBA入门(二)数组和字典

    数组和字典也是VBA的常用到数据类型之一.但是我翻了有四五本VBA教程相关的书,里面都没有介绍到字典,数组到是在介绍数据类型时有介绍,而并没有提到字典. 事实上,字典不是VBA内置的类型,它是Wind ...

  8. Excel VBA入门(十)用户窗体开发

    VBA 中的用户窗体就是指带 UI 的用户界面,在运行的时候会单独弹出一个窗口,类似于在 windows 系统中运行的一个可执行程序一样(这个说法不太严谨,因为可执行程序也可能是只有命令窗口而没有 U ...

  9. Excel VBA入门(八)单元格边框

    本文基于以下文件 http://pan.baidu.com/s/1nvJtsu9 (部分)内容预览: 1. 边框样式 Sub cell_format() Dim sht As Worksheet Di ...

随机推荐

  1. yum 安装fuser命令

    yum install -y psmisc 转自:https://www.cnblogs.com/saneri/p/5465718.html 有时候我们需要umount某个挂载目录时会遇到如下问题: ...

  2. hdu 3037——Saving Beans

    Saving Beans Time Limit: 6000/3000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Tota ...

  3. CMS Collector and G1 Collector

    Understanding the CMS Collector CMS has three basic operations: CMS collects the young generation (s ...

  4. Django ORM操作补充

    操作补充 only 只取某些去除其他 defer 去除某些取其他 # 需求: 只取某n列 queryset=[ {},{}] models.User.objects.all().values( 'id ...

  5. Linux-Centos破解安装confluene6.3.1

    Centos 安装企业wiki confluence是一个专业的企业知识管理与协同软件,可以用于构建企业wiki.通过它可以实现团队成员之间的协作和知识共享.现在大多数公司都会部署一套confluen ...

  6. 自古枪兵幸运E

    好梗 求方程的解.n个可以奇数可以偶数,m个必须是偶数 两种方法: 都是O(nlogn)logn是LUCAS定理 法一: 有奇数有偶数,如果都是偶数,那么可以直接除以二然后组合数学 所以枚举有几个奇数 ...

  7. EOJ 306 树上问题

    题解: 因为w大于1,所以,题意就是,有多少(x,z),存在x到z的路径上,有一个x<y<z的y w没用的其实. 树上路径问题,有什么方法吗? 1.树链剖分.这个主要方便处理修改操作. 2 ...

  8. css at @ 规则

    css相信我们都不陌生,但是我们真的对它非常了解吗? css主要分为两种规则组成: 一种被称为 at-rule,也就是 at 规则 另一种是 qualified rule,也就是普通规则 今天让我们来 ...

  9. python Django 中间件介绍

    我们一直都在使用中间件,只是没有注意到而已,打开Django项目的Settings.py文件,看到下面的MIDDLEWARE配置项,django默认自带的一些中间件: MIDDLEWARE = [ ' ...

  10. 腾讯云服务器tomcat端口无法访问

    第一种情况: 如题:https://console.cloud.tencent.com/cvm/securitygroup 需要去这个地址设置安全组. 说实话,一句mmp不知当讲不当讲.使用说明这块太 ...