ExcelHome技术论坛

 找回密码
 免费注册
QQ登录 只需一步,快速开始
   
高效办公必会的Office99uu优优 永久免费,网表让Excel秒变数据库 Excel服务器-会Excel,做管理系统 Excel Home精品图文教程库
Excel不给力? 何不试试FoxTable! 国内首部Excel函数公式学习大典 职场充电黑科技, Office微99uu优优 免费下载Excel行业应用视频
300集Office 2010微99uu优优 Tableau-数据可视化工具 突破Excel限制,用活字格提高效率 12门Excel免费公开课任你学
你的Excel 201099uu优优学习锦囊 欲罢不能, 过目难忘的 Office 新界面 免费的Excel考勤计算系统
楼主: ggsmart
打印 上一主题 下一主题

菜鸟谈VBA最最基础入门《原创》

    [复制链接]
TA的精华主题TA的得分主题
11
 楼主| 发表于 2009-8-12 21:35 | 只看该作者 |楼主
本帖已被收录到知识树中,索引项:开发帮助和教程
控制程序的流程,有判断、分支和循环三种语句。
接下来我们将一样一样地进行讲解。
=====================
程序流程控制—>if语句
====================
  1、if—then语句
  这个句式相当于中文里面的“如果.......那么”。
  格式:
    if  逻辑表达式 then
                              语句块
             end if
    解释:如果逻辑表达式的结果为true,则执行语句块里的所有语句,否则执行end if后面的语句。语句块可以是一句指令或多条指令,也可以调用一个或多个过程,当然,也可以为空,就是没有语句。
  如:要判断A1单元格是否已输入内容,设计程序:

  • Sub test1()
  •   If [a1] = "" Then
  •       MsgBox "A1单元格没有输入任何内容!"
  •   End If
  • End Sub
  • 复制代码
     2、 if—then—else语句  
      这个语句相当于中文里面的“如果......那么......否则......”句式。
      格式:

        if  逻辑表达式 then
                                  语句块1
        else
                                  语句块2
                  end if


           解释:如果逻辑表达式的结果为true,则执行语句块1里的所有语句,如果逻辑表达式的结果为Flase则执行语句块2里的所有语句。
      如:要判断A1单元格是否已输入内容,设计程序:

  • Sub test2()
  •   If [a1] = "" Then
  •         MsgBox "A1单元格没有输入任何内容!"
  •   Else
  •         MsgBox "A1单元格已经输入了内容!"
  •   End If
  • End Sub
  • 复制代码
      3、if—then—elseif语句
      这就相当于中文里面的若“如果…那么…否则如果…那么…否则”语句,当然,可以有多句“否则如果.......”
      格式:
        If  逻辑表达式1 Then  
                                  语句块1
                      ElseIf  逻辑表达式2  Then
                                  语句块2
                      ElseIf  逻辑表达式3Then
                                  语句块3
                       …
                     Else
                                 语句块n
                     Eed If
      解释:若逻辑表达式1的结果为True,则执行语句块1,接着继续执行EndIf后面的语句;若逻辑表达式1的结果为False,则检查逻辑表达式2的结果,若为True则执行语句块2,接着继续执行EndIf后面的语句.......一直到所有结果的条件都不满足时,才执行Else后面的语句块n。
      如:要判断A1单元格的数是否能被2、3、5其中之一整除,设计程序:

  • Sub test3()
  •    If [a1] = "" Then
  •        MsgBox "A1单元格没有输入任何内容!"
  •    ElseIf [a1] Mod 2 = 0 Then
  •        MsgBox "A1单元格的数能被2整除!"
  •    ElseIf [a1] Mod 3 = 0 Then
  •        MsgBox "A1单元格的数能被3整除!"
  •    ElseIf [a1] Mod 5 = 0 Then
  •        MsgBox "A1单元格的数能被5整除!"
  •    Else
  •        MsgBox "A1单元格的数不能被2、3、5其中之一整除!"
  •    End If
  • End Sub
  • 复制代码
    IF语句.rar (6.7 KB, 下载次数: 19342)

    [ 本帖最后由 ggsmart 于 2009-8-13 17:53 编辑 ]

    评分

    参与人数 42鲜花 +52 收起 理由
    达州张先生 + 3 值得肯定
    jacking03 + 2 优秀作品
    风中百合liner + 2 优秀作品
    思悦心情 + 1 优秀作品
    双手合十 + 2 优秀作品
    查看全部评分
    TA的精华主题TA的得分主题
    12
     楼主| 发表于 2009-8-12 21:39 | 只看该作者 |楼主
    程序流程控制——Select Case语句
    =============================
      Select Case语句同IF语句一样,也是条件判断的语句。它的功能也可以用IF语句来完成。但是,当程序的条件太多,用IF语句来判断的话就存在一些不足了,比如程序是否美观?是否便于阅读?程序的执行效率等等。Select Case语句在执行的效率上,同IF语句相比,肯定是要快得多。

    [Select Case语句的语法]
      Select Case 测试表达式
            Case 条件表达式1
                  语句块1
            Case 条件表达式2
                  语句块2
           Case 条件表达式3
                  语句块3
           ......
           Case 条件表达式n
                  语句块n
           Case Else
                  语句块Else
         End Select.

    当某个条件表达式与测试表达式相匹配时,则执行其后的语句块,否则执行Case Else后的语句块,然后结束Select Case块的执行。同IF语句一样,可以不要Case Else语句。
    “如对A1单元格的学生成绩进行等级评定,小于等于30分的为差,30分到59分的为不及格,60分到79分的为及格,80分到89分的为良好,90到100分的为优秀。”用Select Case语句来解决就是:

  • Sub test()
  •   If [a1].Value = "" Then
  •       MsgBox "A1单元格没有输入数字。"
  •       Exit Sub '     退出程序
  •   End If
  •   Select Case [a1].Value
  •       Case 0 To 29
  •           MsgBox "差"
  •       Case 30 To 59
  •           MsgBox "不及格"
  •       Case 60 To 79
  •           MsgBox "及格"
  •       Case 80 To 89
  •           MsgBox "良好"
  •       Case Else
  •           MsgBox "优秀"
  •   End Select
  • End Sub
  • 复制代码
    Select Case语句.rar (6.44 KB, 下载次数: 11230)
    需要补充一点的是,无论是IF语句还是Select Case语句,都是可以进行嵌套的!

    [ 本帖最后由 ggsmart 于 2009-8-13 17:54 编辑 ]

    评分

    参与人数 24鲜花 +34 收起 理由
    bdlxzhf + 2 优秀作品
    incrediblesky + 2 优秀作品
    思悦心情 + 1 优秀作品
    夏寂雨透 + 1 优秀作品
    羊刀在手 + 2 优秀作品
    查看全部评分
    TA的精华主题TA的得分主题
    13
     楼主| 发表于 2009-8-12 21:41 | 只看该作者 |楼主
    ggsmart的补充说明:楼上写的代码,我只考虑分数是整数的时候,这里我只是举个例子,目的是让大家认识Select Case语句,因为没有考虑小数和负数的情况.一旦出现29.5之类的,就都全是优秀.所以,程序本身并不全面.为此,38度OFFICE技术论坛的老朽对代码进行了修定,提供了另一段全面的代码,非常感谢!

  •       '修订:38度:老朽
  •       '网址:http://www.38duoffice.cn/bbs
  •       '日期:2009-7-1 上午 11:22:21
  • Sub Test()
  •   If [a1].Value = "" Then
  •       MsgBox "A1单元格没有输入数字。"
  •       Exit Sub '     退出程序
  •   End If
  •   Select Case [a1].Value
  •       Case Is < 30
  •           MsgBox "差"
  •       Case Is < 60
  •           MsgBox "不及格"
  •       Case Is < 80
  •           MsgBox "及格"
  •       Case Is < 90
  •           MsgBox "良好"
  •       Case Else
  •           MsgBox "优秀"
  •   End Select
  • End Sub
  • 复制代码

    [ 本帖最后由 ggsmart 于 2009-8-16 09:24 编辑 ]

    评分

    参与人数 18鲜花 +20 收起 理由
    hope9966 + 2 值得肯定
    chaokiray + 1 感谢帮助
    santonio + 1 值得肯定
    seki_100 + 1
    a6010172kk + 1 感谢帮助
    查看全部评分
    TA的精华主题TA的得分主题
    14
     楼主| 发表于 2009-8-12 21:45 | 只看该作者 |楼主
    程序流程控制——For—Next 循环语句
    =============================
    什么是循环?
    这里我们指的循环是指重复地执行某项动作(语句块)。

    同学们在操场上跑步,两万米长跑,每圈400米。“呯”,枪一响,开始跑,一圈,两圈,三圈......直到跑满50圈才停止。这里,同学们就是在循环地在操场的跑道上执行跑步的动作。

    我们来看一下For—next 的句式:

      For 循环变量=初值 to 终值 step 步长
           循环体1
          [exit for]
          循环体2
      next 循环变量
          

    解释:从开始到结束,反复执行For和Next之间的指令块,除非遇到Exit For语句,将提前跳出循环。其中,步长和Exit For语句以及Next后的循环变量均可省略,步长省略的时候默认为1。Exit for 语句是强制终止循环的语句,执行它后将退出循环,执行next后面的语句。
    循环变量是一个变量,可以在循环体中对其进行修改,但一般就避免在循环体中对其修改。

    对句式进行了初步的认识后,我们用这个句式来叙述上面学生跑步的问题。把它编成程序,20000米,要跑50圈,也就是要50次,同学们要在上面一圈,两圈。。。。直到满50圈才停止循环跑步,当然,如果你要提前退赛,就不用跑满50圈了。有了这个思想,程序可以写成:

    Sub 循环跑步()
        dim 圈数 as byte

        for 圈数=1 to  50 step 1
             If 学生.要求=退赛
                  exit for
             End If
        Next 圈数
    End Sub

    当然,这只是一个实例,帮助你对For—next语句的理解,下面我们来用一个实例来讲解For-next语句!

    问题:求1到1000的自然数的和。程序编为:

  • Sub mysum()
  • Dim Lsum As Long, i As Long
  • For i = 1 To 1000
  •     Lsum = Lsum + i
  • Next
  • MsgBox "1到1000的自然数和为:" & Lsum
  • End Sub
  • 复制代码
    for_next-1到1000自然数的和.rar (6.14 KB, 下载次数: 8940)

    [ 本帖最后由 ggsmart 于 2009-8-16 14:09 编辑 ]

    评分

    参与人数 15鲜花 +15 收起 理由
    丧心病狂问到底 + 1 优秀作品
    seki_100 + 1 值得肯定
    o圆o + 1 优秀作品
    hegs_ebscn + 1
    449372956 + 1 感谢帮助
    查看全部评分
    TA的精华主题TA的得分主题
    15
     楼主| 发表于 2009-8-12 21:46 | 只看该作者 |楼主

    以下代码由老朽提供

    ggsmart说明:以下代码为38度OFFICE技术论坛的老朽版主提供,主要是帮助大家对VBA语句的认识.

  • 撰写:38度:老朽
  •       '日期:2009-7-1 上午 11:40:59
  • Sub 求1到10000之间偶数和()
  •     Dim I&, J&
  •     For I = 0 To 10000 Step 2
  •         J = J + I
  •     Next
  •     MsgBox "1到10000之间偶数和为" & J
  • End Sub
  • 复制代码

  •       '撰写:38度:老朽
  •       '日期:2009-7-1 上午 11:40:59
  • Sub 求1到10000之间偶数和2()
  •     Dim I&, J&
  •     For I = 10000 To 1 Step -2
  •         J = J + I
  •     Next
  •     MsgBox "1到10000之间偶数和为" & J
  • End Sub
  • 复制代码

  •       '撰写:38度:老朽
  •       '日期:2009-7-1 上午 11:40:59
  • Sub 求1到10000之间奇数和()
  •     Dim I&, J&
  •     For I = 1 To 10000 Step 2
  •         J = J + I
  •     Next
  •     MsgBox "1到10000之间奇数和为" & J
  • End Sub
  • 复制代码

  •       '撰写:38度:老朽
  •       '日期:2009-7-1 上午 11:40:59
  • Sub 求1到10000之间奇数和2()
  •     Dim I&, J&
  •     For I = 9999To 1 Step -2'此句于2009年8月18日纠正
  •         J = J + I
  •     Next
  •     MsgBox "1到10000之间奇数和为" & J
  • End Sub
  • 复制代码
    感谢109楼artemis_xu朋友对以上代码的纠正!

  •       '撰写:38度:老朽
  •       '日期:2009-7-1 上午 11:40:59
  • Sub 求1到10000之间能被5整除的数之和()
  •     Dim I&, J&
  •     For I = 0 To 10000 Step 5
  •         J = J + I
  •     Next
  •     MsgBox "1到10000之间能被5整除的数之和为" & J
  • End Sub
  • 复制代码

  •       '撰写:38度:老朽
  •       '日期:2009-7-1 上午 11:40:59
  • Sub 求1到10000之间能被5整除的数之和2()
  •     Dim I&, J&
  •     For I = 10000 To 1 Step -5
  •         J = J + I
  •     Next
  •     MsgBox "1到10000之间能被5整除的数之和为" & J
  • End Sub
  • 复制代码

    [ 本帖最后由 ggsmart 于 2009-8-18 12:36 编辑 ]

    评分

    参与人数 5鲜花 +5 收起 理由
    莫后数据 + 1 太强大了
    大换 + 1 优秀作品
    .丶Forヾ + 1
    phoenixbin + 1 优秀作品
    WALL-E + 1 优秀作品
    查看全部评分
    TA的精华主题TA的得分主题
    16
     楼主| 发表于 2009-8-12 21:47 | 只看该作者 |楼主
    程序流程控制——For—Each 循环语句
    ===============================
    有了前面对循环一词的理解,这里我们不用再多说,如果你知道了For—next语句的工作原理,这里再来学习For—each循环以及下面我们接着要讲的句式,那就相当简单了,同样的工作原理。
    学会了吃苹果,那么离会吃梨的道路还会远吗?
    呵呵,只是开个小小的玩笑,下面我们继续,首先来看看For—Each语句的句式:

    For Eacn 元素变量 In 对象集合或数组名称
          语句块1
          [Exit For]
          语句块2
    next 元素变量


    和上面For—next句式是一样的工作原理。
    这里的“元素变量”是用来遍历集合或数中中元素的变量,它从集合或数组的第一个元素开始,直到最后一个元素,然后退出循环。

    这里我们举个例子,把当前工作薄中工作表的名称写在A列,程序为:

  • Sub shtname()
  • Dim i As Integer, sht As Worksheet
  • i = 1
  • For Each sht In Worksheets
  •     Cells(i, 1) = sht.Name
  •     i = i + 1 '让写入名称的单元格下移一行
  • Next
  • End Sub
  • 复制代码
    for-each返回工作表名称.rar (7.52 KB, 下载次数: 10479)

    [ 本帖最后由 ggsmart 于 2009-8-13 17:57 编辑 ]

    评分

    参与人数 14鲜花 +17 收起 理由
    BRMA + 1 值得肯定
    seki_100 + 1 优秀作品
    endi_chen + 1
    .丶Forヾ + 1
    wggx4 + 1 感谢帮助
    查看全部评分
    TA的精华主题TA的得分主题
    17
     楼主| 发表于 2009-8-12 21:48 | 只看该作者 |楼主
    程序流程控制——Do While语句
    ===========================
    Do While也是循环语句,它分为两种情况,一种是把循环条件放在开头,一种是把循环条件放在结尾。

    1、开头判断循环条件
        语句格式:
           Do Wihle 循环条件
                语句块1
               [Exit Do]
                语句块2
          Loop
        首先判断循环条件,条件为真则执行Do到Loop之间的语句。

    2、结尾判断循环条件
        语句格式:
            Do
                语句块1
               [Exit Do]
                语句块2
           Loop Wihle 循环条件


          先执行一次Do到Loop之间的语句,再判断循环条件,满足条件则进行循环。
    两种格式的区别:因为第二种格式是把循环体放在尾部,得先执行一遍语句再进行循环条件判断,所以,同样的条件,第二种格式的循环会比第一种多执行一次循环部份的语句。
    我们用Do While语句来解决求1——1000的自然数的和的问题:

  • Sub mysum()
  • Dim Lsum As Long, i As Long
  • i = 1
  • Do While i <= 1000
  •    Lsum = Lsum + i
  •    i = i + 1
  • Loop
  • MsgBox "1到1000的自然数和为:" & Lsum
  • End Sub
  • 复制代码
    do while1到1000自然数的和.rar (6.19 KB, 下载次数: 5734)

    [ 本帖最后由 ggsmart 于 2009-8-13 17:58 编辑 ]

    评分

    参与人数 1鲜花 +1 收起 理由
    .丶Forヾ + 1
    查看全部评分
    TA的精华主题TA的得分主题
    18
     楼主| 发表于 2009-8-12 21:48 | 只看该作者 |楼主
    程序流程控制——Do Until 语句

    这个和Do While语句类似,它也有两种形式,学了Do While语句,再看这个,就可以无师自通了。下面就简单介绍下:
    1、开头判断循环条件
      语句格式:
           Do Until 循环条件
                语句块1
               [Exit Do]
                语句块2
          Loop
       
    2、结尾判断循环条件
        语句格式:
            Do
                语句块1
               [Exit Do]
                语句块2
           Loop Until 循环条件

           执行Do 和Loop之间的指令,直到循环条件为真时退出循环。
           直到循环条件为真时退出循环,这是Do Until 与  Do While的区别。而它两种语句格式的区别,也是第二种比第一种多执行一次循环部分的语句。

    还是求1——1000自然数的问题,这次我们换用Do Untile语句:

  • Sub mysum()
  •     Dim Lsum As Long, i As Long
  •     i = 1
  •     Do
  •         Lsum = Lsum + i
  •         i = i + 1
  •     Loop Until i > 1000
  •     MsgBox "1到1000的自然数和为:" & Lsum
  • End Sub
  • 复制代码
    do until1到1000自然数的和.rar (6.19 KB, 下载次数: 4848)
    是的,你看了上面的代码,觉得和楼上我们写的代码变化并不大。这里我用的是第二种格式(结尾判断)的语句,你可以试着用第一种句式写一写,或者改一改其他的问题.这里,我只是举个例子,路还得让你自己走!

    [ 本帖最后由 ggsmart 于 2009-8-13 17:59 编辑 ]

    评分

    参与人数 1鲜花 +1 收起 理由
    °Mo-小短发 + 1 优秀作品
    查看全部评分
    TA的精华主题TA的得分主题
    19
     楼主| 发表于 2009-8-12 21:49 | 只看该作者 |楼主
    程序流程控制——Go to 语句
    ===========================
    Go to 在英语里是什么?相信大家的英语都比我好得太多,不用多说。其实Go to 语句的作用用定两个英语单词就说明问题了,“Go to 地点”就是去到哪儿的意思。
    Go to 语句是将程序转到指定的标签的语句位置,然后继续往下执行。Go to 语句通常用来作错误处理。
    同样的,还是用Go to 语句来做1——1000自然数的和:

  • Sub mysum()
  • Dim Lsum As Long, i As Long
  • i = 1
  • x: '为go to 语句设置的标签,必须以英文状态下的冒号结尾
  •    Lsum = Lsum + i
  •    i = i + 1
  • If i <= 1000 Then GoTo x '如果i<=1000,则程序跳到标签X处
  • MsgBox "1到1000的自然数和为:" & Lsum
  • End Sub
  • 复制代码
    go to 1到1000自然数的和.rar (6.34 KB, 下载次数: 9388)
    注意:为Go to 语句设置的标签必须以英文状态的冒号结尾。
    有人说,为了方便程序的阅读,规范程序,在程序里也避免少用Go to 语句,我很赞同,也希望你们能养成这个习惯。

    [ 本帖最后由 ggsmart 于 2009-8-13 18:00 编辑 ]

    评分

    参与人数 19鲜花 +25 收起 理由
    达州张先生 + 3 值得肯定
    风中百合liner + 2 优秀作品
    jyjxlm531 + 2 感谢帮助
    basypjj + 1 太强大了
    ikosya + 1 感谢帮助
    查看全部评分
    TA的精华主题TA的得分主题
    20
    发表于 2009-8-13 22:39 | 只看该作者
    您需要登录后才可以回帖 登录 | 免费注册
    本版积分规则
    关闭

    最新热点上一条 /1 下一条

    关注官方微信,每天坐享新鲜教程
    手机版|关于我们|联系我们|ExcelHome    GMT+8, 2018-1-18 17:27 , Processed in 1.086619 second(s), 22 queries , Gzip On.
    Powered by Discuz! X3.3 © 2001-2017 Wooffice Inc.
        沪公网安备 31011702000001号 沪ICP备11019229号 本论坛言论纯属发表者个人意见,任何违反国家相关法律的言论,本站将协助国家相关部门追究发言者责任!     本站特聘法律顾问:徐怀玉律师 李志群律师
    快速回复 返回顶部 返回列表
    99uu优优