ExcelHome技术论坛

标题: 菜鸟谈VBA最最基础入门《原创》 [打印本页]

作者: ggsmart    时间: 2009-8-12 21:16
标题: 菜鸟谈VBA最最基础入门《原创》
特别感谢moon2778的友情支持  
                                                    为了不影响帖子里的链接,便于大家阅读,请大家不要随意删除自己的跟帖,谢谢合作!

感谢813楼chenyao868朋友的热心整理,需要者可以下载.
如果你喜欢纸质书,请围观《别怕,Excel VBA其实很简单》



     
如果你喜欢看视频,可以参加培训课程《别怕,Excel其实很简单》,
请用微信扫码试看
(, 下载次数: 343)

    如果你是学习Excel的朋友,对VBA这个概念不陌生吧?
    VBA的功能实在太强大,可初学的我们,面对那一串串尤如外星文的代码,你是不是看得头昏脑胀?想学,是不是却茫然得找不到入口?
    在这里,我把我自己的学习心得和笔记放出来,和大家一起分享交流,一起学习,共同进步。对了,还要告诉大家,我也是初学者,不是高手,如果有什么说得不对的,希望大家及时指出。我的目的不是教学,而是期望创造一个有你,有我,有他的学习氛围! 开始吧,记住一个共同的目标——掀开那层神秘的面纱,看看VBA的真实面目。

----------------------------------贴子内容-------------------------
   1、什么是VBA?为什么要学习VBA
   2、VBA与宏
   3、VBE简介
   4、对象、属性、方法、事件
   5、VBA过程
   6、数据类型、变量、数组、常量
   7、(回复)该定义变量为何种数据类型
   8、VBA的函数
   9、程序流程控制:if语句
   10、程序流程控制:Select Case语句
   11.程序流程控制:For—next语句
   12、几个for—next 循环的例子(作者:老朽
   13、程序流程控制:For—Each语句
   14、程序流程控制:Do While语句
   15、程序流程控制:Do Until语句
   16、程序流程控制:Go to 语句
   17、用户窗体
   18、再说Excel的对象模型   
   
19、[小试牛刀]制作一个个性化的欢迎界面
 20、处理单元格数据(复制、剪切、删除
    21、Range对象的End 属性(带作业)
   
22、花名册分类(实例)
   
23、花名册汇总(实例
    24、新建工作表
    25、认识数组(一)
    26、Worksheet的Change事件(带作业)
    27、关于Application.EnableEvents属性(有实例动画)   
              Application.EnableEvents补充说明
    28、关于WorksheetSelectionChange事件(有实例动画)
    29WorksheetSelectionChange事件实例(trustwxq 朋友提供)


[ 本帖最后由 ggsmart 于 2010-6-8 19:57 编辑 ]
作者: ggsmart    时间: 2009-8-12 21:16
本帖最后由 ExcelHome 于 2012-10-6 15:26 编辑


什么是VBA?为什么要学习VBA?      
=========
          VBA是Visual Basic For Application的简称,具体说来,可能让叶枫三天三夜也说不完,叶枫也只知道VBA是建立在Office中的一种应用程序开发工具,其实知道这也就够了。很懒很笨的叶枫只想吃香喷喷的大米饭,可从没想要知道大米饭是怎么来的。

           Excel本身的内置函数其实已经很强大了,甚至有人说,只要学会二三十个函数,就已经可以满足普通用户日常的工作需求。
      
      那我们为什么要学VBA?
      是的,如果只需要满足一些普通的工作需求可能永远也不会用到VBA,但在实际应用的过程中,人们的操作却越来越大,需要也越来越高,这时候就需要用VBA来对Excel进行二次开发了,VBA可以有效地自定义和扩展Excel的功能。

      但有一点叶枫想要告诉大家,VBA功能很强大,但并不是万能的,也并不是所有工作都需要用VBA来解决,也并不是所有工作用VBA来解决都会很简单,这要根据实际情况而定,有些工作你用VBA来解决的话相反会变得很麻烦。

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

作者: ggsmart    时间: 2009-8-12 21:19
VBA与宏
======
  刚开始的内容听起来很枯燥,请大家不要分心,耐着性子看下去,兴趣总是慢慢积累的。
------------------------------------------------------------------------------
       1、亲自动手,录制一段属于自己的宏
  提到VBA,相信很多人想到的就是宏,但是VBA与宏是不是一回事?我觉得它们不是一回事,但这不重要,我们要做的是先来认识一下宏。
  宏是什么?
  我理解的宏是一系列固定动作的集合,这个集合当遇到让他执行的条件后就逐个执行。
  有人把我们录制的宏比喻成一个武术运动员在比赛中练就的一段武术套路动作,这个套路遇到一定的条件(比赛)就执行。
  好了,别闲着,动一动你可爱的右手,点点鼠标,打开一个Excel文件,录制一段宏来来研究研究,步骤如下:
  (1)选中任意一个单元格;
  (2)打开菜单—>工具—>宏—>录制新宏,调出宏录制对话框,输入宏名(mysub),确定;
  (3)设置单元格字体为仿宋体,红色;

  (4)点击停止录宏。
这样,一个简单的设置单元格格式的宏就录好了。
-------------------------------------------------------------------------------------------------------------------
      2、鼠标点一点,宏给单元格换新装
  下面我们来执行这段宏。
  (1)选中需要设置的任意单元格或单元格区域(为了看出效果,单元格最好有字符);
  (2)打开菜单—>工具—>宏—>宏,显示“宏”对话框(快捷键:Alt+F8);
  (3)选择我们刚才录制的宏,单击“执行”。

  这样我们看到已经为刚才选中的单元格的字体已被修改成仿宋体,红色。自己动手试着录制几段宏,再执行一下,加深印象。
  神奇了吧?以后当你再需要一遍又一遍地重复若干相同的操作的时候,会不会想到让宏来替你做这一切?这是一个不错的奴隶,不用花钱,且不用开工资,赚了吧?
  好了,收起你贪婪的笑容,继续往下看。
  宏是什么?现在相信你能想出一千种说法,由你了,又笨又懒的叶枫可没你聪明,也不再多说。
  上面说的执行宏的过程是不是让你感觉很麻烦?希望用快捷键来控制宏?这个我们可以在录制宏之前在录制宏对话框里进行设置。也可以在录制宏后进行设置,按Alt+F8显示宏对话框,单击“选项”,在“宏选项”对话框里进行设置
--------------------------------------------------------------------------------------------------------------
      3、寻根问底,找到宏的老窝
  如果你忘记了,请你再打开宏录制对话框,在宏名的下面,有一个“保存在”的选项,点一点下拉的箭头,我们可以看到,宏可以保存在三种不同的位置,分别是:
  (1)当前工作簿(系统默认):宏保存在当前工作薄的模块里,只有当该工作薄打开时,宏才起作用。
  (2)新工作簿:新建一个工作薄保存。
  (3)个人宏工作簿:这是为宏而设计的一种特殊的具有自动隐藏特性的工作簿,如果你要让某个宏在多个工作簿都能使用,那么就应当创建个人宏工作簿,并将宏保存于其中。

  上面我们录制的宏是保存在当前工作薄里,今天我们在这里也只介绍保存在当前工作表里的宏。
--------------------------------------------------------------------------------------------------------
      4、拨开层层迷雾,查看庐山真面目
  宏靠什么来控制Excel的运行?是不是感觉深在浓浓的迷雾里,感觉一头雾水?让我们鼓一鼓劲,拨开它的衣服,开开那家伙里面到底是什么?
  (1)按Alt+F8快捷键打开“宏”对话框;
  (2)选择我们刚才录制的宏,点“编辑”按钮。

  眼前一亮吧?这是一个新的天地——VBA的编辑器窗口(VBE),这个我们以后再说,先将注意力集中到显示的代码上。代码如下:

  1. Sub mysub()
  2. ' mysub Macro
  3.    ' 宏由ggsmart录制,时间: 2009-2-27'
  4.   With Selection.Font
  5.     .Name = "仿宋_GB2312"
  6.     .Size = 12
  7.     .Strikethrough = False
  8.     .Superscript = False
  9.     .Subscript = False
  10.     .OutlineFont = False
  11.     .Shadow = False
  12.     .Underline = xlUnderlineStyleNone
  13.     .ColorIndex = xlAutomatic
  14.   End With
  15. Selection.Font.ColorIndex = 3
  16. End Sub
复制代码
  现在你可能感觉到上面这些乱七八糟的代码会很陌生,甚至在问自己是不是来到外星人的世界,反正叶枫当初是这样感觉的,但不要为此感到害怕,将来我们会慢慢熟悉他,就像闭上眼睛也能准确地将那个又大又红的苹果送到自己的嘴里。
--------------------------------------------------------------------------------------------------------
      5、再进一步,给宏安上门铃
  一遍一遍地在宏对话框里选择宏名称,按“执行”按钮来运行宏的麻烦是不是让你郁闷得有些想吐血?指定快捷键虽然方便,但别人用自己的工作表时能不能快速上手?就算是自己,如果宏多了,或是放的时间长了,你还记得哪个快捷键控制哪个宏?
  作为excel开发者,一个主要的目标是为自动化提供一个易于操作的界面,“按钮”是最常见的界面组成元素之一,我们可以把宏指定给特定的按钮,通过按钮来执行宏,还是用刚才我们录制的那个宏来举例。通过使用“窗体”工具栏,可以为工作簿中的工作表添加按钮。在创建完一个按钮后,可以为它指定宏,然后你的用户就可以通过单击按钮来执行宏。在本练习中,将创建一个按钮,并为它指定一个宏,然后用该按钮来执行宏。具体步骤如下:
  (1)打开菜单—>视图—>工具栏—>窗体,调出窗体工具栏。
     
(, 下载次数: 7909)

  (2)单击”窗体“工具栏中的“按钮”控件,在工作表中希望放置按钮的位置按下鼠标左键,拖动鼠标画出一个按钮,松开鼠标后,Excel会自动显示“指定宏”对话框。

        
(, 下载次数: 8281)

  (3)从“指定宏”对话框中选择“mysub”,单击“确定”。这样,就把该宏指定给命令按钮。
课间休息,插播一段广告:按钮,工作表等这些对象就像是Excel的众多儿女,儿女太多,怎么称呼这群儿女也是一个问题.为了不出现叫"儿子"就七八个一起跑出来,同许多农村父母给儿女起"老大,老二,老三……"的称呼一样,Excel也用这种顺序的起名方法给这些儿女贴上了标签.比如第一个按钮是"按钮一",再画一个就是"按钮二",然后是"按钮三","铵钮四"等等.这样,以后你要叫第三个儿子的时候直接叫"按钮三"即可.如果你嫌这个名字乡下味太浓,如果你嫌这个名字不能很好地反映点击它后会执行怎样的操作不清楚,你可以通过双击按钮表面激活它,可重新为按钮贴上合适的显示标签.需要提醒你的是,这里的标签只是它显示在你面前的样子,实际上它是什么名字?我们可以点击它,看一下名称框里是什么. 
  
 
(, 下载次数: 7576)
  
       为什么显示出来的是一样,而实际的名字却是另一样呢?也许你现在会感到迷茫,但不用管它,以后当我们学习了属性后,一切就自然明白了.

  下面我们来试一试用按钮操作:
   (1)选择单元格或单元格区域;
   (2)单击按钮。

    
(, 下载次数: 8333)


  按钮就像装在楼下的门铃,美丽的嫦娥仙子家住在502,猪八戒来到楼下,找准号码502,轻轻一按,“叮咚,叮咚……”,嫦娥在楼上就给八戒开门了,八戒不用在楼下大声地喊“嫦娥,开门。”也不用花两毛钱给嫦娥打个电话,当然更不用顺着下水管从墙上爬进嫦娥的窗户,方便而实在吧?
  这种遥控式的命令的确能让繁琐的操作变得简单而方便,让我们获得了一些使用Excel标准命令所不能实现的功能。如果你是八戒,当你熟悉了如何使用这种遥控一样的门铃以后,你可能都会奇怪自己当初在没有门铃的情况下,那段漫长的爬下水管道的日子是怎么熬过来的。
  让嫦娥仙子开门的方法有很多种,同样执行宏也有多种方法可以选择,我们还可以把宏指定给图片,自选图形,这些比较简单,和指定给窗体按钮是一样的,同时我们还可以把宏指定给某个“事件”,比如单击工作表,双击工作表,激活工作表,打开工作簿等等,你要安什么要的门铃,选什么样的音乐,随你了。
  需要强调一点的是,我们刚说的“事件”是一个重要的概念,八戒按门铃,就是一个“事件”,这个“事件”引发了嫦娥的开门,只有门铃响了,嫦娥才会去开门。除此而外“方法”“对象”“属性”都是接下来我们会经常接触到的,慢慢走,留心点,一路上将会精彩不断。
-----------------------------------------------------------------------------------------------------------
    6、小结
  到这里,我们对宏应该有一个简单的了解了吧?宏实际上就是一个简单的VBA的Sub过程,它保存在模块里,以Sub开头,以End Sub结尾,执行时就从第一句逐句执行,直到End Sub结束。就像前面我们说的武术运动员练的那段套路动作,总是抱拳,扎马,出拳然后踢腿,永远不可能没有扎马就出拳,没有出拳就踢腿。我们今天录的这段宏也总是先设字体,再改字体颜色,这种顺序永远不会乱。
  说完这些,你是不是感觉这些操作古板得没有生气?是不是感觉这宏的操作不能满足自己的需求?
  叶枫想告诉你的是,宏代码绝不等于VBA,它只是VBA里最简单的运用,尽管许多Excel过程都可以用录制宏来完成,但是通过宏代码还是无法完成许多的工作,如:
  (1)不可以建立公式,函数;
  (2)没有判断或循环的功能;
  (3)不能进行人机交互;
  (4)无法显示用户窗体;
  (5)无法与其他软件或文件进行互动。
       …….


  所以,你看了上面的内容后千万不要以为宏就是VBA了,更不要以为自己已经会VBA了,事实上是你才刚沾上VBA的边,或者说连边都没沾上,甚至连宏今天我们都只是作了简单的介绍。

  路漫漫其修远兮,还等着我们上下去求索,路在脚下,武林高手总是从练习简单的套路动作开始,不要厌倦扎马的单调,静下心多练练,这会是你以后练习武功招式的一个基础,孔子老人家说了,要温故而知新,记得复习巩固,不要学了后面忘了前面,到下次叶枫再见到你的时候你什么都忘记了,好了,今天就到这里,让我们一起加油~~~~

[ 本帖最后由 ggsmart 于 2009-8-15 23:50 编辑 ]
作者: ggsmart    时间: 2009-8-12 21:23
VBE简介===============================
  什么是VBE?
  相信你还没忘记吧?VBE就是VBA的编辑窗口,所有的VBA操作都在VBE里完成。
  VBE是一个分离出来的应用程序,它可以与Excel无缝结合,但是需要说明的是要运行VBE必须先运行Excel,VBA模块与Excel工作薄文件一起存储,除非激活VBE,否则VBA模块是看不见的。
  1、运行Excel后,怎样切换换到VBE窗口?
  打开大门的钥匙有很多把,千万别猴急地去爬下水管道。
   (1)按ALT+F11快捷键;
   (2)选择“工具”—>“宏” —>“Visual Basic编辑器”命令。
      
(, 下载次数: 7875)

   (3)右击工作表名称标签,点击查看代码。
      
(, 下载次数: 7660)

   (4)单击控件工具箱里的“查看代码”。
      
(, 下载次数: 7770)

  如果你的窗口里找不到控件工具箱,请通过“视图”—>“工具栏” —>“控件工具箱”打开它。
      
(, 下载次数: 7605)

  (5)通过控件工具箱建立一个新的控件,双击控件。   
     
(, 下载次数: 7565)
                       

2、初识VBE窗口
     这个界面相信你不陌生吧?查看宏的时候我们已经见识过它了。
     
(, 下载次数: 8171)

         “工程资源管理器”显示一个树型图示,包含了当前在Excel中打开的所有Excel对象,包含工作表,模块,窗体,加载宏及隐藏的工作薄,每个工作薄被认为是一个工程。
       在工程资源管理器里右击,可以在右键菜单里选择相应的命令插入模块或窗体。如果你想删除它或者保存它,同样也可以在这里进行相应的操作。
   
(, 下载次数: 7572)

    “属性窗口”显示当前你选择的Excel对象的属性。选中某个对象后,可以在属性窗口中修改选中的对象的的各样属性.如颜色,名称等。
(, 下载次数: 7723)

   “立即窗口”,这是一个非常有用的窗口,在其中可以直接执行VBA语句,测试语句和调试代码,就跟我们在DOS下输入DOS命令一样。如果你的立即窗口不可见,按 CRTL+G调出来,可以在里面尝试输入:
   [a1]=”我在学习VBA”
    回车,看一看A1单元格里发生了什么变化?
(, 下载次数: 8023)

     “代码窗口”是干嘛用的?相信你已经很清楚了,当然是用来编辑VBA代码的地方,工程中的每一项都有一个与之相关联的代码窗口,
      如果要查看某对象的代码窗口,或者说如果要查看某对象上面究竟编写了什么VBA代码,在“工程资源管理器”窗口中双击对象即可。
(, 下载次数: 7744)

当然,你打开后的窗口不一定和上面一样,VBE的窗口也不只上面几个,我们可以打开“视图”菜单,在里面进行选择需要显示的窗口。
(, 下载次数: 8061)


[ 本帖最后由 ggsmart 于 2009-8-13 14:54 编辑 ]
作者: ggsmart    时间: 2009-8-12 21:27
对象、属性、方法,事件
==============
     这是很重要的几个概念,是写VBA程序的基础,大家仔细读,一定要弄清楚。
         1、对象及对象层次结构
        对象就是存在的东西,是VBA处理的内容,包括工作薄、工作表、工作表上的单元格区域、图表等等。对象可以相互包含,就像一个文件夹里可以包含多个文件夹一样,而这个文件夹又可以被其他的文件夹包含,一个工作薄对象可以包含多个多个工作表对象,一个工作表对象又可以包含多个单元格(或图表,图形等),这种对象的排列模式称为Excel的对象模型。
----------
    集合这个概念经常遇到,我理解的集合是对相同类型的对象的统称。
    某中学有5000个学生,名字各不相同,我们对他都统称为某中学的学生,而不和一一去叫他们的名字,"某中学的学生"在这里是集合。

    对象的引用,在Excel里,Workbooks集合包含在Application对象里,当我们要引用某工作薄的时候,要遵循从大到小的规则。跟表示硬盘里的某个文件的位置一样,比如我们想引用D盘“我的文档”文件夹下的名为“我的VBA课程.doc”文件时要输入的是:
             D:\我的文档\我的VBA课程.doc
    同样,如果我们要引用名称为“mybook.xls”的工作薄时就是:
            Application.Workbooks(“mybook.xls”)
    和引用文件不同的是,VBA里使用的分隔符是点。
    同理,当我们引用“mybook.xls”里面的工作表“mysheet”时应是:
            Application.Workbooks(“mybook.xls”).Worksheets(“mysheet”)

    可以继续延伸到下一层,引用“mybook.xls”里工作表“mysheet”里面的单元格区域“A1:D10”:
            Application.Workbooks(“mybook.xls”).Worksheets(“mysheet”).Range(“A1:D10”)

    但是并不是每一次引用都必须这么呆板,就像猪八戒不用每一次都去爬下水管道。如果我们引用的是活动对象,也就是被激活的对象,引用就可以进行简化。
    如果是mybook工作薄是激活的,引用可以简化为
       Worksheets(“mysheet”).Range(“A1:D10”)

    如果mysheet当前也是激活的,引用甚至还可以简化为Range(“A1:D10”) ,也可以直接输入[A1:D10] ,如果引用的单元Range是单个的单元格,还可以用Cells(行号,列号)的引用方式。
----------------------------------------------------------------------

  2、属性
      每一个对象都有属性,一个属性就是对一个对象的一个设置。
      猪八戒背着媳妇高秀兰回自己的紫云洞,猪八戒的媳妇就是对象,“高秀兰”就是猪八戒的媳妇的一个属性(name属性),引用对象的属性同样也要用点来分隔。
     猪八戒的媳妇.name=高秀兰

     别闲着,还是动动你的右手,打开一个工作表,Alt+F11(千万别说你不知道这个快捷键是干什么,要不我保证被你气个半死),如果立即窗口没有打开,按Ctrl+G打开,在里面输入:

  1.         Msgbox Worksheets(1).name
复制代码
回车。
(, 下载次数: 8196)


      Worksheets(1)和Worksheets(“sheet1”)有什么区别?
      Worksheets(1)表示Worksheets集合里的第一个工作表。
      Worksheets(“sheet1”)表示Worksheets集合里名为"sheet1"的工作表。

     至于Msgbox是什么,那就自己问Help了,在立即窗口里用鼠标左键把Msgbox抹黑,按F1,就弹出Help里对它的说明了。
    抹黑代码,再按F1即可看到相应的帮助。叶枫说:“这个办法很适用,一般人我不告诉他。”
(, 下载次数: 7544)

      一个对象有哪些属性我们可以在属性窗口里查看,要修改一个对象的某种属性,如名称、显示状态、颜色等等,也可以在属性窗口里进行修改,当然我们还可以利用代码进行修改。改当前工作薄里的第三个工作表的名称为“这个名字是我用VBA改的”,想想怎么写代码?
      把你的代码输在立即窗口里,回车,看看效果,你做到了吗?
-----------------------------------------------------------------------------------
  3、方法
    每一个对象都有方法,方法就是在对象上执行的某个动作。  
    和属性相比,属性表示的是对象某种状态或样子,是静态的,就像是语文里的名词、形容词和副词,而方法则是做某件事的一个动作,就像动词,对象和方法同样用点来分隔。
    例如Range对象有有一个方法是Select,他的作用是选中指定的Range(单元格区域)对象,在立即窗口里输入代码:
    回车,可以看到D1:F10已经被选中了。
(, 下载次数: 8188)

----------------------------------------------------------
  4、事件
      在上一面猪八戒按门铃那里,我们已经接触过什么是事件了。
      简单点说,件就是由用户或者系统触发的,可以在代码中响应的一段代码。比如,当我们移动鼠标,打开工作薄,激活工作表,选中单元格,改变单元格的数值,点击按钮或窗体,敲击键盘等等这些都会产生一系列的事件,通过编写代码响应这些事件,当发生此类事件时,程序代码就会进行相应的操作。
      这样解释你会不会有些晕?感觉又一次进入了外星人的世界?还是举例说明,我们需要当激活某工作表的时候,自动弹出一个对话框,告诉我们激活的工作表的名称。
       (1)打开一个工作表,Alt+F11打开VBE窗口,在“工程对象管理器”窗口里双击你要进行设置的工作表,使其代码窗口显示。               
       (2)左面选择对象Worksheet(工作表对象),右面选择Activate事件,我们可以看到在代码窗口里系统已经为我们自动输入了一段代码。

  1. Private Sub Worksheet_Activate()

  2. End Sub
复制代码

提醒: 初学的我们,不必完全记住对象及事件的名称,也不必手工输入,系统早为你准备好了,你可以在代码窗口里进行选择,左边是对象,右面是事件,如果你想知道某个对象(例如工作薄、工作表、窗体等)有哪些事件,只需要双击这个对象,然后在代友窗口里查看即可。我们需要做的只是:当自己需要它的时候,知道打开哪个箱子把它拿出来即可.


(, 下载次数: 7920)

        废话说完,再回到问题里:
  要达到问题的目的,我们只需要在已给我们列出的两段代码中间加入需要进行操作的代码就可以了,这里我们需要的是一个对话框来提醒,对了,还记得Msgbox吧?
     输入代码:
  1. MsgBox "你现在激活的工作表名称是:" & ActiveSheet.Name
复制代码
上面的代码相信你应该能看懂吧?        
       &和我们工作表里的函数是一样的,连接文本的作用,Activesheet.name是当前活动工作表的名字(用了一个name属性)。

      回到工作表,激活你刚才设置代码的工作表,如果你刚才设置的工作表是激活状态,请选择其他工作表,然后再重新激活它,看看你看到了什么?


(, 下载次数: 7674)

      看一下上面的代码,对象和事件之间用什么来分隔?还是不是点?
      千万别懒,一定要动手,换其他的事件或其他的对象试一试,试着用代码改一下其他对象的属性,在单元格里添加点什么东西,这些随你了,你可千万别说你不知道哪些事件是干嘛用的。
      别忘记,抹黑代码,按F1,再重复一遍,这是一件好武器,一般人我不告诉他.

[ 本帖最后由 ggsmart 于 2009-8-13 18:09 编辑 ]
作者: ggsmart    时间: 2009-8-12 21:28
VBA过程
================
       一个过程就是执行某些动作的代码组合。
   
     VBA过程分Sub过程和Function过程。
          1、Sub过程总是以“sub 过程名()”开头,以“End Sub”结尾,一个过程就是执行某项动作的一套指令,Sub过程不返回运行的结果。
          2、Function总是以“Function 程序名()”开头,以“End Function”结尾,和Sub过程的区别是Function过程返回程序运行的值,值可以是一个值或一个数组,就像我们的工作表函数,Function过程也就是我们说的自定义函数。


         在这里,叶枫主要要给大家讲的是Sub过程,Function过程如果需要的话,在后面我们再讲。
         好了,今天已经讲得够多了,你对VBA应该已有一个简单的认识了吧?
        要设计一个过程,其实很简单,把需要的对象收集起来,看看我们要对他们的属性进行怎样的修改?我们需要做什么?需要用什么样的方法?要用哪些事件?收集起来就是一个完整的过程。
        只要你肯动手,一定会觉得很简单,你不要被那一大堆的对象、属性、方法和事件给吓晕了,完全不必全部记住它们,需要的时候知道在哪里找就行,而代码也不必一个一个的去输入,还记得前面一贴我们说的录制宏吗?当你需要进行某项操作的时候,不妨先录一段宏,但是宏是呆板的,有许多我们不需要的东西,给它修修枝,剪剪叶,整理整理,一个程序就OK了。
        同时,建议你在VBE窗口中,单击“工具——选项”,在弹出的“选项”对话框里勾选“自动列出成员”。
         (, 下载次数: 7568)

       设置好后,试着在代码窗口里输入点代码,看看,有什么?呵呵......,不用我说了,对于初学的我们,很需要它吧?
       (, 下载次数: 7624)
      
       了解了对象,属性,方法及事件后,猪八戒按门铃开门的过程我们都可以把它写成程序:

      Sub 门铃_单击()
           如果 嫦娥.位置=在家 那么 门.开
       End sub


       上面这个并不是真的程序,但都有了程序的思想了,程序里,事件、对象、属性及过程都有了,你能找出来吗?
       多尝试,温故知新,你可以想着用程序去解决一些你在使用Excel过程中遇到的问题,每一个问题的解决,你都会发现自己得到了很大的进步.
        好了,还是那句话,路在脚下,继续走,精彩会慢慢为你上演,让我们一起努力,共同进步。

[ 本帖最后由 ggsmart 于 2009-8-13 18:13 编辑 ]
作者: ggsmart    时间: 2009-8-12 21:31
在上面,我们简单介绍了VBA的开发环境、几个常用的窗口,并对对象、对象的属性、对象的方法、对象的事件等概念作了简单的介绍,贴子大家认真看了吗?有没有一点点的收获?学习成绩如何?
    什么是对象?什么是集合?什么是属性?什么是方法?什么是事件?如何正确地表示它们?
    这些,你都能回答了吗?
    先沉思三秒钟,如果你不能回答,那请赶快回过头去,再看一遍,我们说VBA是采用面向对象的程序设计方式,这些都是很重要的概念,如果不弄清楚,实际应用时,你可能会感到手忙脚乱。
    如果已经掌握了,那让我们一起继续本贴的内容。
    这次,我们将继续单调的基本功练习,讲一些VBA里面的关键字,为程序设计打下基础,还是那句话,希望你不要嫌内容的单调,一口你永远也吞不下一个大胖子,学习是一个循序渐进的过程。
------------------
数据类型、变量、常量、数组
====================
          VBA的主要目的是什么?不用说了你也知道,当然是处理数据。某些数据存在于对象中,如工作表的单元格区域里,某些数据存在于我们自定义的变量中。
--------------------------------------------------------------------------------------
          1、数据类型
          数据类型告诉计算机如何将数据存储在内存中,如以整数、字符串、日期等。
          数据类型是变量的特性,数据类型包括:
数据类型
存储空间大小
范围
Byte1 个字节0 到 255
Boolean2 个字节True 或 False
Integer
2 个字节-32,768 到 32,767
Long(长整型)4 个字节-2,147,483,648 到 2,147,483,647
Single (单精度浮点型)4 个字节负数时从 -3.402823E38 到 -1.401298E-45;正数时从 1.401298E-45 到 3.402823E38
Double (双精度浮点型)8 个字节负数时从 -1.79769313486232E308 到
-4.94065645841247E-324;正数时从4.94065645841247E-324 到 1.79769313486232E308
Currency
8 个字节从 -922,337,203,685,477.5808 到 922,337,203,685,477.5807
(变比整型)
Decimal14 个字节没有小数点时为 +/-79,228,162,514,264,337,593,543,950,335,而小数点右边有 28 位数时为 +/-7.9228162514264337593543950335;最小的非零值为 +/-0.0000000000000000000000000001
Date8 个字节100 年 1 月 1 日 到 9999 年 12 月 31 日
Object4 个字节任何 Object 引用
String
10 字节加字符串长度0 到大约 20 亿
(变长)
String(定长)字符串长度1 到大约 65,400
Variant(数字)16 个字节任何数字值,最大可达 Double 的范围
Variant(字符)22 个字节加字符串长度与变长 String 有相同的范围
用户自定义
所有元素所需数目每个元素的范围与它本身的数据类型的范围相同。
(利用 Type)

--------------------------------------------------------------------------------------
          2、变量
          变量是用于保存在程序运行过程中需要临时保存的值或对象。就相当于我们在操作工作表的时候插入的辅助单元格、辅助列或辅助表一样。
          同工作表的单元格一样,变量可以接纳很多种的数据类型,如其名,程序运行后,变量的值是可以改变的。

          如何定义变量?
          定义变量可以使用Dim语句:
  
                                        Dim 变量名 As 数据类型

          变量名有一定的命名规则,这里我就不详细说明了,需要提醒的是在程序的设计过程中,你可能会定义很多的变量,为了阅读及修改程序的方便,你定义的变量名尽量能让人一看就明白这个变量具体代表的是什么。在Dim语句中,我们可以不必声明变量的数据类型,直接输入“Dim 变量名”此时定义的变量将被指定为Variant类型
          但我们在程序设计的过程中,一般应该明确数据的类型,这是一个好的编程习惯,因为指定数据类型后会提高程序的运行速度。
          我们可以在模块中输入“Option Explict”作为第一句语句来强制声明所有变量。也可以点“工具——选项”,在选项对话框里勾选“要求声明变量”。这样,VBA在遇到没有声明的变量名称,该语句将导致程序停止。
          定义变量除了可以使用Dim语句外,比较常的还有:static语句,Private语句,Public语句。使用不同的语句定义的变量不同的是它们的作用作用域不同,具体为:
          (1)如果在一个过程中包含了一个Dim或Static语句,此时声明的变量作用域为此过程,即本地变量
          (2)如果在一个模块的第一个过程之前包含了Dim或Prvate语句,此时声明的变量作用域为此模块里所有的过程,也就是在此模块里所有的过程都可以使用它,即模块作用域下的变量;         
          (3)如果在一个模块的第一个过程之前包含了Public语名,此时声明的变量作用域为所有模块,即公有变量

          变量的作用域是指变量保留其值的这段时间,也称为变量的生成周期,它决定变量可以用于哪个模块或过程中。

          给变量赋值
          用等号(=)是VBA里的赋值运算符。

          比如我们把"我在学习VBA变量!"这个字符串赋给变量A,则直接输入:

                                        A="我在学习VBA变量!"

          对了,你可以在立即窗口里试一下逐条输入:

                                        A="我在学习VBA变量!"
                                        Mgbox A


          看一下效果。
          注意,在VBA里文本是要用英语引号引起来的,还有日期要用#号,比如将日期2009-3-10赋给变量A,则为:
                                        A=#2009-3-10#

--------------------------------------------------------------------------------------
          3、常量

          执行过程时,变量的值会发生改变,所以我们称它为“变量”,但有时候我们需要引用不会发生变化的数据,这就是常量。常量声明后,不以对它进行再赋值。
          声明常量设定常量的值,需要用Const语句:

                                        Const 常量名 As 数据类型 = 常量的值

--------------------------------------------------------------------------------------
          4、数组
          除了变量和常量以外,数组也是我们常用到的。

          什么是数组?
          数组是具有相同数据类型并且共享一个名字的一组变量的集合。数组也是变量。
          数组中的元素通过索引数字加以区分。

          如何声明数组?
          可以用Dim语句或者Public语句声明数组。
                                        Dim/Public 数组名 (a to b) as 数据类型  

             a 和b 是数组中元素的个数,数组元素素最小值为a,最大值为b,元素个数为(b-a+1)个,当然,你也可以直接输入个数,此时默认最小索引号为0。   
                                   如: Dim myarr(5) As Integer

          这个数组的最小元素索引号为0,元素个数为6。
          上面定义的只是一维数组,你还可以定义二维、三维、四维…….
                                   如: Dim myarr(1 to 5,1 to 10) As Integer
          这就是一个二维数组,元素个数为5*10=50个。

          在程序设计的过程中,定义数组的时候我们可能不能确定数组的元素个数,对数组进行声明后,可以在运行时用ReDim语句重新指定数组的大小。
--------------------------------------------------------------------------------------
          今天的这一部分内容实在很枯燥,连叶枫都有点耐不住了,拉拉杂杂说了这么多,也不知道你看出点门道没?同前一贴讲的内容一样,这些基础都是非常重要的,多读几遍,扎好马才能修练更高深的武功,千万别嫌这个过程的漫长。
          一个让你心仪的女孩子,想牵上她的小手,徜徉在公园里的林荫小道上,先前的送花、打电话等等那一串串巴结的行动你会不会嫌太漫长?
          VBA不像函数那样直面我们,它躲在Excel的背后,像一个“养在深闺未得见”的美丽姑娘,她飘在墙角的那缕模糊却美丽的身影对我们充满了诱惑,现在我们正在想法设法寻找她的联系电话,要想成功俘虏她,这一步能少吗?
          看的没有动的快,动手操作才是学习的正确方法。发现问题,解决问题,这岂不是一个快乐的过程。

[ 本帖最后由 ggsmart 于 2009-8-13 16:37 编辑 ]
作者: ggsmart    时间: 2009-8-12 21:32
有人问:如何知道该定义变量为何种类型?
===========
     这就要根据你的实际需要,再结合各种数据的的范围来看。
      在编写程序的过程中,选择需要存储空间尽量小的数据类型来保存所需要的数据,这是很有必要的,虽然我们可以把变量设为Variant型,但上面我说了,定义变量类型会提升程序的运行速度,这也是VBA提供各种数据类型存储空间的原因。

    该定义变量为哪一种类型?看一看它的长度。
     用生活中的一个实例来说这个问题:
     有一天你上街去买一斤菜油,我们需要选择一个容器来装我们所要买的菜油(相当于声明变量的类型),如果我们没有选择选择容器,上帝可不知道你要买多少斤菜油,他就扔给你一个超级大的水缸,这个水缸无论你要买多少菜油都是可以装得下的。可是携带这样一个水缸上街你会不会觉得太不方便了?用一个水缸来装一斤菜油会不会太浪费了?所以我们得自己选择一个瓶子去装我们的油,一斤油,用一个瓶子刚好合适,当然,如果你只用一个茶杯去装,那也是不行的。
      用数据来打比方,我们需要用变量来保存一个学生某学科考试成绩的分数,那么用Byte数据类型就可以了(它的范围是0——255),如果在这里使用Integer、Long、Single这些数据类型的话,就相当于我们用水桶,水缸去装那一斤菜油,只是对计算机存储空间的浪费,当然,如果你的值的范围超过了Byte的范围,那定义成Byte也是不行的。

      定义变量的类型时,除了考虑长度外,还要考虑变量的值的类型。
      买油的时候不管是用瓶子还是用水缸,反正都能装回来,但是如果你用麻袋能不能装那一斤油回来?
      还是那句话,如果你没有定义变量类型或定义变量类型为Variant,聪明的计算机会先看你打的油是固体还是液体,是液体的话把麻袋扔在一边,给你弄口大缸子。但是如果你自己选择麻袋上街去买油,你还能不能把你的油带回来?
       用数据来打比方,如果你定义了一个变量为Integer型,那你再用把学生姓名的字符串赋给它,行吗?

  1. Sub mysub()
  2.          Dim a As Integer
  3.          a = "我在学习VBA变量"
  4.          MsgBox a
  5. End Sub
复制代码

将这个过程提制到模块里,按F5运行它,看看是什么结果?尝试修改一下定义的数据类型,看看修改后的运行结果!

[ 本帖最后由 ggsmart 于 2009-8-13 16:53 编辑 ]
作者: ggsmart    时间: 2009-8-12 21:33
VBA函数
=========
      用Excel的时间相信你也不短了,什么是函数就不再细说了。
      与其他编程语言一样,VBA含有各种内置的函数。很多的VBA函数都与Excel的工作表函数类似,或者一样。
      使用VBA函数的的方式与使用工作表公式中函数的方式相同,在VBA代码中,我们可以使用很多Excel的工作表函数,例如Sum,Abs等。
      例如:

  1.              Sub myabs()
  2.                   a = InputBox("请输入数值:", "提示")
  3.                   labs = Abs(a)
  4.                   MsgBox "你输入的值的绝对值为:" & labs
  5.              End Sub
复制代码


      这是一个求绝对值的过程,通过InputBox提示用户输入一个数值给变量a,再用Abs函数求出变量的绝对值,最后通过MsgBox返回结果。
       InputBox同MsgBox函数一样,是很常用的函数,关于它的功能及用法,请用绝招:抹黑,按F1,
     
       但并不是所有的工作表函数在VBA里都可以直接调用,但由于WorksheetFunction对象包含在Application对象中,如果我们要在VBA语句里使用某个不能直接调用的工作表函数,只需要在函数名称前加上Application.WorksheetFunction语语即可。
        如:在VBA里使用counta函数则代码为: application.worksheetfunction.counta(range("a1:a10"))

         VBA里面的函数很多,可以简化我们的计算和操作,功能强大啊。但当你面对那一堆英文字母,是否为该怎么记住它们感到晕菜?有人对我说,记住常用的几个,其他的不用记那么清楚,有个模糊的印向,用时再翻Help,知道在哪里找就万事OK了。我觉得这个方法很好,现转送给你!

[ 本帖最后由 ggsmart 于 2009-8-13 16:56 编辑 ]
作者: ggsmart    时间: 2009-8-12 21:35
控制程序的流程,有判断、分支和循环三种语句。
接下来我们将一样一样地进行讲解。
=====================
程序流程控制—>if语句
====================
  1、if—then语句
  这个句式相当于中文里面的“如果.......那么”。
  格式:
    if  逻辑表达式 then
                              语句块
             end if
    解释:如果逻辑表达式的结果为true,则执行语句块里的所有语句,否则执行end if后面的语句。语句块可以是一句指令或多条指令,也可以调用一个或多个过程,当然,也可以为空,就是没有语句。
  如:要判断A1单元格是否已输入内容,设计程序:

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

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


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

  1. Sub test2()
  2.   If [a1] = "" Then
  3.         MsgBox "A1单元格没有输入任何内容!"
  4.   Else
  5.         MsgBox "A1单元格已经输入了内容!"
  6.   End If
  7. 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其中之一整除,设计程序:

  1. Sub test3()
  2.    If [a1] = "" Then
  3.        MsgBox "A1单元格没有输入任何内容!"
  4.    ElseIf [a1] Mod 2 = 0 Then
  5.        MsgBox "A1单元格的数能被2整除!"
  6.    ElseIf [a1] Mod 3 = 0 Then
  7.        MsgBox "A1单元格的数能被3整除!"
  8.    ElseIf [a1] Mod 5 = 0 Then
  9.        MsgBox "A1单元格的数能被5整除!"
  10.    Else
  11.        MsgBox "A1单元格的数不能被2、3、5其中之一整除!"
  12.    End If
  13. End Sub
复制代码
(, 下载次数: 21819)

[ 本帖最后由 ggsmart 于 2009-8-13 17:53 编辑 ]
作者: ggsmart    时间: 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语句来解决就是:

  1. Sub test()
  2.   If [a1].Value = "" Then
  3.       MsgBox "A1单元格没有输入数字。"
  4.       Exit Sub '     退出程序
  5.   End If
  6.   Select Case [a1].Value
  7.       Case 0 To 29
  8.           MsgBox "差"
  9.       Case 30 To 59
  10.           MsgBox "不及格"
  11.       Case 60 To 79
  12.           MsgBox "及格"
  13.       Case 80 To 89
  14.           MsgBox "良好"
  15.       Case Else
  16.           MsgBox "优秀"
  17.   End Select
  18. End Sub
复制代码
(, 下载次数: 12411)
需要补充一点的是,无论是IF语句还是Select Case语句,都是可以进行嵌套的!

[ 本帖最后由 ggsmart 于 2009-8-13 17:54 编辑 ]
作者: ggsmart    时间: 2009-8-12 21:41
ggsmart的补充说明:楼上写的代码,我只考虑分数是整数的时候,这里我只是举个例子,目的是让大家认识Select Case语句,因为没有考虑小数和负数的情况.一旦出现29.5之类的,就都全是优秀.所以,程序本身并不全面.为此,38度OFFICE技术论坛的老朽对代码进行了修定,提供了另一段全面的代码,非常感谢!

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

[ 本帖最后由 ggsmart 于 2009-8-16 09:24 编辑 ]
作者: ggsmart    时间: 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的自然数的和。程序编为:

  1. Sub mysum()
  2. Dim Lsum As Long, i As Long
  3. For i = 1 To 1000
  4.     Lsum = Lsum + i
  5. Next
  6. MsgBox "1到1000的自然数和为:" & Lsum
  7. End Sub
复制代码
(, 下载次数: 9824)

[ 本帖最后由 ggsmart 于 2009-8-16 14:09 编辑 ]
作者: ggsmart    时间: 2009-8-12 21:46
标题: 以下代码由老朽提供
ggsmart说明:以下代码为38度OFFICE技术论坛的老朽版主提供,主要是帮助大家对VBA语句的认识.

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

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

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

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

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

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

[ 本帖最后由 ggsmart 于 2009-8-18 12:36 编辑 ]
作者: ggsmart    时间: 2009-8-12 21:47
本帖最后由 moon2778 于 2021-3-11 13:23 编辑

程序流程控制——For—Each 循环语句
===============================
有了前面对循环一词的理解,这里我们不用再多说,如果你知道了For—next语句的工作原理,这里再来学习For—each循环以及下面我们接着要讲的句式,那就相当简单了,同样的工作原理。
学会了吃苹果,那么离会吃梨的道路还会远吗?
呵呵,只是开个小小的玩笑,下面我们继续,首先来看看For—Each语句的句式:

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


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

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

  1. Sub shtname()
  2. Dim i As Integer, sht As Worksheet
  3. i = 1
  4. For Each sht In Worksheets
  5.     Cells(i, 1) = sht.Name
  6.     i = i + 1 '让写入名称的单元格下移一行
  7. Next
  8. End Sub
复制代码
(, 下载次数: 11509)

[ 本帖最后由 ggsmart 于 2009-8-13 17:57 编辑 ]
作者: ggsmart    时间: 2009-8-12 21:48
本帖最后由 moon2778 于 2021-5-21 21:27 编辑

程序流程控制——Do While语句
===========================
Do While也是循环语句,它分为两种情况,一种是把循环条件放在开头,一种是把循环条件放在结尾。

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

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


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

  1. Sub mysum()
  2. Dim Lsum As Long, i As Long
  3. i = 1
  4. Do While i <= 1000
  5.    Lsum = Lsum + i
  6.    i = i + 1
  7. Loop
  8. MsgBox "1到1000的自然数和为:" & Lsum
  9. End Sub
复制代码
(, 下载次数: 6374)

[ 本帖最后由 ggsmart 于 2009-8-13 17:58 编辑 ]
作者: ggsmart    时间: 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语句:

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

[ 本帖最后由 ggsmart 于 2009-8-13 17:59 编辑 ]
作者: ggsmart    时间: 2009-8-12 21:49
程序流程控制——Go to 语句
===========================
Go to 在英语里是什么?相信大家的英语都比我好得太多,不用多说。其实Go to 语句的作用用定两个英语单词就说明问题了,“Go to 地点”就是去到哪儿的意思。
Go to 语句是将程序转到指定的标签的语句位置,然后继续往下执行。Go to 语句通常用来作错误处理。
同样的,还是用Go to 语句来做1——1000自然数的和:

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

[ 本帖最后由 ggsmart 于 2009-8-13 18:00 编辑 ]
作者: wangrw989    时间: 2009-8-13 22:39
虽然现在还没学会,见到楼主这么有心,一定要顶!!!
作者: taller    时间: 2009-8-14 01:43
不错的教程,希望更多的全员来学习VBA
作者: ruty    时间: 2009-8-14 02:08
标题: 回复 21楼 taller 的帖子
在看过 “菜鸟谈VBA最最基础入门《原创》”,其中给宏安上门铃,(2)单击”窗体“工具栏中的“按钮”控件,在工作表中希望放置按钮的位置按下鼠标左键,拖动鼠标画出一个按钮,松开鼠标后,Excel会自动显示“指定宏”对话框我的电脑没有显示指定宏,还可以从其他路径找到“指定宏”吗?谢谢
作者: lhdcxz    时间: 2009-8-14 09:27
很好的总结和学习心得。
作者: 987654321    时间: 2009-8-14 09:57
叶版一出手就来了个精华
作者: hyz00001    时间: 2009-8-14 11:22
这个有用没有呢?
作者: ggsmart    时间: 2009-8-14 12:32
标题: 回复 22楼 ruty 的帖子
在看过 “菜鸟谈VBA最最基础入门《原创》”,其中给宏安上门铃,(2)单击”窗体“工具栏中的“按钮”控件,在工作表中希望放置按钮的位置按下鼠标左键,拖动鼠标画出一个按钮,松开鼠标后,Excel会自动显示“指定宏”对话框我的电脑没有显示指定宏,还可以从其他路径找到“指定宏”吗?谢谢
ggsmart回复:
1.使用的是"窗体"上的按钮,而不是"控件工具箱"上的按钮.只有"窗体"上的按钮在画完后才会弹出"指定"宏的对话框,如果你的按钮已经画好,你可以右键单击按钮,在弹出的右键菜单中选择"指定宏"命令.
2.判断某个按钮是"窗体"上的按钮还是"控件工具箱"里的按钮,可以右键单击该按钮,如果是"窗体"上的按钮,此时,你可以对该按钮进行编辑.而控件工具箱的按钮是不可以的,你需要进入"设计模式"才能对其进行编辑
.

[ 本帖最后由 ggsmart 于 2009-8-14 12:38 编辑 ]
作者: JLF2003    时间: 2009-8-14 13:28
ggsmart  你好!
          无私奉献精神,值得学习!
          我特把你的讲座,整理成PPT文件,请更多的家人共享!

(, 下载次数: 23328)
(, 下载次数: 18161)
(, 下载次数: 18007)
(, 下载次数: 16142)
作者: moon2778    时间: 2009-8-14 13:49
原帖由 JLF2003 于 2009-8-14 13:28 发表
ggsmart  你好!
          无私奉献精神,值得学习!
          我特把你的讲座,整理成PPT文件,请更多的家人共享!



天嘞,好有心,友情感动!
作者: rongrong    时间: 2009-8-14 14:24
热心人真多,多谢!
作者: ^^天使の涙^^!!    时间: 2009-8-14 14:40
好幽默的老师!!
作者: ojh2008    时间: 2009-8-14 15:28
这个怎么没有加分啊~我觉得写的很好啊~很适合我现在的水平~谢谢啦~
作者: mynetid    时间: 2009-8-14 17:37
谢谢,兴趣并迷茫中!
作者: mynetid    时间: 2009-8-14 17:38
Very 谢谢!!
作者: zhc19620430    时间: 2009-8-14 18:35
讲的太好了,有后续吗,再给点讲座吧,初学者很有用,比书讲的更容易接受。立即窗口的东西是复制到代码里吗?
作者: 东方之珠0    时间: 2009-8-14 19:22
这个贴子比背上背把剑的岳不群岳大侠2008讲得还要精彩,为什么不给精华?有点抱不平......
作者: zhc19620430    时间: 2009-8-14 20:38
标题: 好东西大家学
这东西很好呀,赶快打印学习,哈哈。
作者: 开心萝卜惠州    时间: 2009-8-14 20:55
谢谢分享啊
作者: peter.lam    时间: 2009-8-14 21:03
ddddddddddddddddd
作者: aiqiao    时间: 2009-8-14 21:22
这么好的学习资料,一定要学习学习。谢谢楼主无私奉献。
作者: Fae    时间: 2009-8-14 21:45
谢谢分享,楼主真的很有心,谢谢!
作者: zcyoung    时间: 2009-8-14 21:57
搬个凳子来听课
作者: bibisin    时间: 2009-8-14 22:51
谢谢LZ分享,搬张板凳学习
作者: wshcw    时间: 2009-8-15 00:36
还未入门,只能先收藏了.
作者: aibaobo    时间: 2009-8-15 08:09
谢谢楼主,一定好好学!
作者: dy_ysl    时间: 2009-8-15 09:16
感谢楼主的无私奉献,我等一定好好学习回报你
作者: axcd178    时间: 2009-8-15 09:31
很好的总结和学习心得
作者: huanglicheng    时间: 2009-8-15 09:49
本帖最后由 huanglicheng 于 2011-10-24 22:03 编辑

看了楼主精彩的讲解,受益不浅啊,本人一直在变量与类型处愣是看不清前进的方向.直到现在都没有定义过变量的类型,每次直接就是dim +变量,同事常说我:"你这啥破玩意儿,运行这么慢".经楼主"买油"我才晓得是这么回事.
作者: 宝贝有酒窝    时间: 2009-8-15 10:17
支持一下  ……
作者: chury11    时间: 2009-8-15 11:41
又一部好教程
作者: fenghcl    时间: 2009-8-15 12:39
要我怎么说感谢才好呢?
实在是太谢谢了!
作者: ligift2001    时间: 2009-8-15 13:14
写得太好了,这么晦涩的主题,楼主能写得那么生动有趣!支持一下1
作者: VBA2010    时间: 2009-8-15 14:01
感觉不回贴,就对不住自己的良心啦!
作者: JLF2003    时间: 2009-8-15 14:43
原帖由 ggsmart 于 2009-8-14 15:12 发表



非常感谢JLF2003的支持,呵呵......看得出,你是花了很多精力的.谢谢!

     呵呵!首先感谢你精彩文笔、实用例子、有趣比拟,带我们一齐逛了逛VBA这个大观圆!
作者: seboy8    时间: 2009-8-15 15:01
这帖子我花了好几个小时看了   不过说真的  很感谢楼主的帖子,通俗易懂,让我受益匪浅,只是因为个人理解能力有限,对那循环语句不怎么了解  所以也是云里雾里,实在是愧对楼主
作者: lzqlaj    时间: 2009-8-15 15:31
受益匪浅,学到了许多新东西,谢谢分享。
作者: yj0715    时间: 2009-8-15 16:17
很好,感谢ggsmart老师的无私奉献,好教材,收藏了
作者: chqrmfB    时间: 2009-8-15 16:29
非常感谢!不知道VBA编程是要死记硬背,还是先理解,再靠自已的灵感。
作者: 『懷卍眞』    时间: 2009-8-15 19:41
先留个脚印,慢慢学习
作者: tsxqclx    时间: 2009-8-15 22:16
标题: 谢谢
学习!学习!!在学习!!!
作者: zh1000e    时间: 2009-8-15 22:59
受益匪浅,学到了许多新东西,谢谢分享。
作者: neverever00    时间: 2009-8-15 23:54
很有用!!!!!!!!!
作者: shuts32    时间: 2009-8-16 00:27
利害利害,,
作者: moon2778    时间: 2009-8-16 00:29
根据我肤浅的认识,帖子第5楼的图片4,貌似应该用workbook的sheetactivate事件更加符合题目要求。
作者: sunjing-zxl    时间: 2009-8-16 08:54
一直想学习VBA
现在终于有机会了。
感谢楼主
作者: eucolin    时间: 2009-8-16 09:41
很不错,要多看看
作者: L-Yang136    时间: 2009-8-16 10:15
正用得上,得好好学习!
内容写得生动活泼,很容易看懂,赞一个!
谢谢楼主分享。。。
作者: sillyseeker    时间: 2009-8-16 10:56
再不说声谢谢对不起自己的良心
作者: linch616    时间: 2009-8-16 12:46
非常感谢!
作者: ggsmart    时间: 2009-8-16 14:25
原帖由 moon2778 于 2009-8-16 00:29 发表
根据我肤浅的认识,帖子第5楼的图片4,貌似应该用workbook的sheetactivate事件更加符合题目要求。


肤浅的认识?呵......moon2778好谦虚!严重不习惯!。
非常感谢你提出讨论的问题。
在五楼里我的原话是: “我们需要当激活某工作表的时候,自动弹出一个对话框,告诉我们激活的工作表的名称。”
我的原意是当激活某个工作表的时候,告诉我们激的工作表的名称,而不是激活所有工作表的时候都需要提醒。所以我就用了工作表的active事件。因为我没有叙述清楚的原因,让moon2778把我的目的理解成激活工作薄里的任意一个工作表都会告诉我们它的名称,所以就用workbook的sheetactivete事件。

但是没关系,这里我们只是举个例,让大家熟悉怎样通过响应一个对象的事件来执行某项操作。目的达到就OK。

[ 本帖最后由 ggsmart 于 2009-8-16 14:41 编辑 ]
作者: ggsmart    时间: 2009-8-16 14:40
用户窗体
-----------------------
  用户窗体(UserForm对象)是VBA的另一类对象。它表现出来是一个窗口或对话框,如前面我们说的MsgBox与InputBox语句弹出来的都属于窗体。使用窗体可以提供一个形象的用户界面。同我们可以在工作表(WorkSheet)上在添加不同的控件一样,在这个界面上,我们可以添加命令按钮、标签、图像、列表框等控件,用户可以通过修改控件的属性、编写不同的事件过程在程序运行过程中与程序进行交互。
  
  1、添加窗体
  如果你还没有忘记怎么插入模块?那请用同样的方法插入一个用户窗体。
  Alt+F11快捷键打开VBE编辑窗口,在工程资源管理器窗口中单击右键,选择“插入——用户窗体”命令。

  
(, 下载次数: 450)

  Excel为用户窗体取名,同为工作表、按钮等取名一样,采用“老大,老二,老三……”的取名方式。所以新插入的用户窗体默认名称为“UserForm1”,如果再继续插入窗体,就是“UserForm2”,接着是“UserForm3”……
  当然,你可以为它重新取一个你喜欢的名字,新名字叫大花二花,或者是大狗二狗,随你了,为了方便学习,这里我们统一为其更名为“我的窗体”,方法为:在工程资源管理器中双击窗体对象,在属性窗口中重新修改“(名称)”(对象的name属性)为“我的窗体”即可。修改完成后,可以在工程资源管理器窗口中看到相应的名称已经改变了。
  
(, 下载次数: 486)

  这时,窗体的“名称”已经修改好了,再看看窗体,左上角还显示着“UserForm1”,这就相当于贴在一个按钮表面的标签,想要修改它,只需要修改对象的“Caption”属性即可。用改“名称”的方法,我们把这个窗体的“Caption”属性修改为“我的第一个VBA窗体”。
  就像你家里贴的地板一样,新建的窗体的大小样子都一样。但是我们根据自己的需要对其进行美化或修改。如大小,背景颜色,背景图片等等,我们可以手动在属性窗口里对其进行修改,也可以程序中用代码进行修改。如修改该窗体的宽度,代码设置为:
  

  1.   我的窗体.Width = 500         '500是你需要修改后的宽度,以磅(Point)为单位
  2.   
复制代码
  动手试一试,在属性窗口里设置“我的窗体”宽300 Point(Width属性),高200 Point(Height属性)。
  
  2、为窗体添加界面元素
  窗体就像一个舞台,舞台上得有演员才能和观众进行互动。同样,我们得为窗体这个舞台添加演员,演员可以是命令按钮、标签、文字框等等,你可以根据自己的剧本的需要安排不同的角色。
  向窗体添加控件,同在工作表中添加窗体控件一样。如果你现在的VBE编辑窗口中没有“工具箱”,请通过“视图——>工具箱”菜单命令,或单击“工具栏”上的“工具箱”按钮打开它。
  
(, 下载次数: 417)

  想知道“工具箱”里的控件是哪一种是“命令按钮”,哪一种是“标签”,哪一种是“文字框”,只需要把鼠标指针移到相应的控件上面,即会显示相应的说明。
  在工具箱里用鼠标点选相应的控件,在窗体上按下鼠标左键,拖动即可将控件添加到用户窗体。控件的大小、在窗体上的位置我们可以通过鼠标进行修改,当然,同修改其他属性一样,我们也可以在属性窗口或程序的过程中用代码进行修改。
  别闲着,动手试一试:
  (1)向窗体添加一个命令按钮
  改按钮名称为“确定”。设置显示在按钮上的文字(Caption属性)为“完成”,高25(Height属性),宽60(Width属性),距“我的窗体”左端220(Left属性),距“我的窗体”顶端80(Top属性)。
  
当然,上面只是教你怎样在属性窗口里对控件的属性进行修改。要求不是太完美的时候,我们可以在窗体上用鼠标拖动修改一下就可以了。

  (2)向窗体添加一个标签
  改标签的名称为“说明”。设置字体(Font属性)为“宋体,五号,斜体”,显示的内容(Caption属性)为“请输入内容”(慢速双击激活控件即可输入)。
  (3)向窗体添加一个文字框
  改文字框的名称为“内容”,设置字体(Font属性)为“楷体五号字”,字体颜色(ForeColor属性)为“红色”。
  回到窗体设计模式,按F5键(或者执行“运行——>运行子过程/窗体”菜单命令,或单击工具栏上的“运行子过程/窗体”命令按钮),完整的一个用户窗体就显示在桌面上了。
  
(, 下载次数: 468)

  当然,因为没有添加任何的VBA指令,此时,窗体里的控件是不会工作的。
  
  (4)为命令按钮添加事件过程
  上面的标签,文字框,命令按等控件(ActiveX控件,同我们刚开始说的窗体控件是有区别的)都属于对象,我们可以通过编写相应的代码设置其属性,调用其方法,响应其事件来达到我们需要实现的操作。
  比如在“我的窗体”中,如果需要在点击“完成”按钮(按钮名称为“确定”)后,用一个Msgbox告诉我们,文字框(名称为“内容”)里输入的是什么内容。
  有了这个思想,我们可以模拟把程序写为:
  Sub 确定_单击()
          Msgbox “文字框里输入的内容是:” & 内容.输入的内容
  End Sub

  有了这个模拟的程序,再来写就简单了。
  “单击”是“确定”的一个事件,即Click事件,“内容.输入的内容”是读取“内容”的Value属性。
  这样,我们的程序实际上是:
  

  1.   Sub 确定_Click()
  2.       MsgBox "文字框里输入的内容是:" & 内容.Value
  3.   End Sub
  4.   
复制代码
  回到窗体,双击按钮,切换到代码模式,在左面“对象列表”中选择对象“确定”,右面事件列表中选择事件“Click”,将Sub与End Sub之间输入代码MsgBox "文字框里输入的内容是:" & 内容.Value。回到设计模式下,按F5键,再次运行窗体,在文字框里输入内容,单击“完成”。
  也许你需要在文字框里什么也没有输时,单击按钮后,提示我们“文字框里没有输入任何内容”,并退出程序。可以的,加一个If—Then语句即可。如果需要将文字框里的内容换行显示,那么在提示内容与显示内容之间再连接一个“Chr(13)”,就个的作用相当工作表中的“Char(10)”,这里不再多说。
  我最后写的代码是:
  

  1.   Private Sub 确定_Click()
  2.       If 内容.Value = "" Then
  3.           MsgBox "文本框里没有输入任何内容!"
  4.           Exit Sub      '退出sub过程,不再执行下面的语句
  5.       End If
  6.       MsgBox "文字框里输入的内容是:" & Chr(13) & 内容.Value
  7.   End Sub
  8.   
复制代码
  
  3、显示窗体
  显示窗体就是把窗体显示给用户。
  显示窗体可以调用窗体的Show方法。
  窗体的显示模式有两种:
  (1)模式窗体:窗体显示后将停显示之后的代码直到退出或隐藏此窗体,并且必须退出或隐藏此窗体后,才可以操作非此窗体的其他界面元素。
  也就是说,当你使用模式窗体显示某窗体的时候,当程序执行完“显示窗体”这条命令后,将暂停执行程序里剩余的语句,真正这个窗体被隐藏或退出。关且当窗体显示出来以后,你不能激活该窗体以外的任何区域。
  (2)无模式窗体:窗体显示后会继续执行程序里余下的语句,而其他的窗体或界面也可以进行操作。
  
  显示窗体的语句:
  (1)模式窗体的显示代码:
  窗体名称.Show  vbModal
  也可以写成:窗体名称.Show 1
  (2)无模式窗体的显示代码:
  窗体名称.Show  vbModeless
  也可以写成:窗体名称.Show 0


  
悄悄告诉你:因为对于Show方法,如果不指定模式,则默认为模式窗体,又因为我很懒,所以我的习惯是:当我需要用模式窗体的时候,就直接“窗体.Show”,需要无模式的时候就“窗体.Show 0”,多个0少个0而已,懒得去记那有模式无模式的字母,我英文差,反正看了也不一定认识。

  
  4、关闭窗体
  当不再需要使用某个窗体后,我们需要把它关闭。当然,每一个窗体上都有“关闭”按钮。但这肯定不能满足我们在程序的设计过程中的需求。
  我们可以通过Hide来隐藏窗体。代码为:
  窗体名称.Hide

  也可以通过Unload来卸载窗体。代码为:
  Unload 窗体名称
  二者都可以关闭窗体,但是却是有区别的。Show一个Hide的窗体比Show一个Unload的窗体用的时间要短。所以,当你需要反复使用某个窗体的时候,建议你用Hide而不用Unload。
  
------------------------------------------------------------最后-----------------------------------------  
        上面讲的这些内容,打开VBE窗口,插入窗体,添加控件,修改属性,编写事件过程等等,这些,你都跟着做了吗?如果你已经做了,那最后我再留给你一点事情算是作业吧:
  (1)插入一个模块,编写两个Sub过程,分别以“模式窗口”和“无模式窗口”显示“我的窗体”(可在显示窗体命令的下一行再编写另外一条指令查看两者在程序执行过程中的区别);
  (2)在工作表上插入两个窗体控件的按钮(记住是窗体控件),分别改按钮上显示的字为“模式窗体”和“无模式窗体”,并把刚才编写的两个宏分别指定给它们;
  (3)再次进行入“我的窗体”的设计模式,添加两个按钮,分别改其“Caption”属性为“隐藏窗体”和“卸载窗体”。分别为两个按钮编写响应其相应事件的代码,使得当单击“隐藏窗体”按钮时,隐然“我的窗体”,单击“卸载窗体”时,卸载“我的窗体”。
  弄好后,你可以点击工作表上的铵钮,调出窗体,看看自己的第一件作品了。

       PS:这是我的作业,供参考! (, 下载次数: 11889)
  

[ 本帖最后由 ggsmart 于 2009-8-16 15:05 编辑 ]
作者: moon2778    时间: 2009-8-16 15:33
为避免大家都不习惯,我还是不客气好了。。。。。11楼的代码 为什么前面要if呢?为什么不全部case?
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
Select Case [a1].Value
    Case ""
    MsgBox "未输入任何字符"
    Case Is < 60
    MsgBox "不及格"
    Case Is < 85
    MsgBox "较好"
    Case Is < 100.0001
    MsgBox "优秀"
    Case Else
    MsgBox "不能识别"
End Select
End Sub

[ 本帖最后由 moon2778 于 2009-8-16 15:36 编辑 ]
作者: ggsmart    时间: 2009-8-16 16:39
原帖由 moon2778 于 2009-8-16 15:33 发表
为避免大家都不习惯,我还是不客气好了。。。。。11楼的代码 为什么前面要if呢?为什么不全部case?
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
Select Case [a1].Value
    Case ""
    Ms ...


=====
你的这个更规范了,呵呵。。。。赞一个!
我也不知道当时我为什么不全用Case。。。。汗。。。。
作者: mike_cool    时间: 2009-8-16 16:44
very GOOD不错
作者: zhs770520    时间: 2009-8-16 18:57
不顶能行吗,?


不行!!!!
作者: zk888    时间: 2009-8-16 20:21
太好了,谢谢提供。
作者: SuperBirds    时间: 2009-8-16 21:21
楼主,辛苦了!
希望能不断更新啊。
期待中。。。。。
作者: ljx63426    时间: 2009-8-16 21:52
好好学习!好贴!顶起来!!
作者: 同在星空下    时间: 2009-8-16 22:26
最近参加培训中的刷新数据透视表,之前从未接触过VBA,可能是由于时间原因的关系和大家都没有什么VBA基础,很多人都有点困惑。昨天加上今天都在看楼言主写的教程,我才看到6楼,直觉告诉我这是一篇不容错过的教程,楼主是不是从事教育行业。您的语言,诙谐生动、通俗易懂,听K总讲,学习VBA当中有最最重要的五样东西要理解!当初第一次听什么对象的对象的,有点晕!不过现在稍微好一点。谢谢楼主分享!
作者: moon2778    时间: 2009-8-16 23:10
记号:77楼及之前的教程学习完毕,全部作业都自己做了一遍了,收获很多,谢谢叶枫。疯子,不错哦,加油。
作者: oyxw722    时间: 2009-8-16 23:22
坐下来慢慢学习~~~~~~~~~~~~~`
作者: firemoto    时间: 2009-8-17 00:23
好文章呀!谢谢楼主!
作者: ZDYCTD    时间: 2009-8-17 06:46
好东西,值得好好收藏和学习!
作者: yicj6277275    时间: 2009-8-17 09:46
讲得很精彩,学习!感谢楼主!

[ 本帖最后由 yicj6277275 于 2009-8-17 09:48 编辑 ]
作者: dance_hq    时间: 2009-8-17 09:55
标题: 为什么要有压缩分卷才能打开呀
为什么要有压缩分卷才能打开呀
作者: 渺渺毛    时间: 2009-8-17 10:42
语言生动,学起来不那么枯燥,谢谢
作者: xgy0214dxy    时间: 2009-8-17 12:14
十分感谢,要顶呀,为了学习VBA,买了几本书,现在看来真的不值当,版主这样的通俗易懂不知道比书上好过多少倍,好好学习了!!
作者: hganycall    时间: 2009-8-17 12:56
谢谢楼主分享学习过程,愿我们共同进步!
作者: ^^天使の涙^^!!    时间: 2009-8-17 13:11
先收藏了,等我基础学好了,再学习!!
谢谢疯子,期待新作品!!
作者: zhui_    时间: 2009-8-17 15:08
写得太好了
作者: 口是心非    时间: 2009-8-17 21:25
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

老师,请问上面这段代码中变量Lsum为何未设定起始值?如果不设定起始值,是不是系统默认起始值为0呢?
多谢!
作者: poordog    时间: 2009-8-17 21:47
好文章,值得好好收藏!
作者: formatD    时间: 2009-8-17 22:18
To 102F
VB中值类型在声明之后是会赋给默认值的,正如你所说,Long的默认值为0.
作者: yj0715    时间: 2009-8-17 22:19
请问楼主,有WORD文档吗。虽然也可以自己一点点的复制粘贴,但确实有点麻烦。希望能提供出来,供打印学习。谢谢。
作者: formatD    时间: 2009-8-17 22:25
原帖由 yj0715 于 2009-8-17 22:19 发表
请问楼主,有WORD文档吗。虽然也可以自己一点点的复制粘贴,但确实有点麻烦。希望能提供出来,供打印学习。谢谢。

1F有PPT下载
作者: artemis_xu    时间: 2009-8-17 22:30
楼主是老师吧?写的非常清楚,循循善诱,有教师的风范啊~~非常适合我这样的VBA初学者,弄清了很多在别的书或教程里没点破的事,太感谢了
作者: artemis_xu    时间: 2009-8-18 12:19
请问老师,这一段:
Sub 求1到10000之间奇数和2()
    Dim I&, J&
    For I = 10000 To 1 Step -2
        J = J + I
    Next
    MsgBox "1到10000之间奇数和为" & J
End Sub
是不是应该9999 to 1啊?
搞不清是我不理解还是真的有问题,谢谢解答~
作者: ggsmart    时间: 2009-8-18 12:19
再说Excel的对象模型
---------------------
  在前面的贴子里,我们简单介绍了VBA的开发环境、语法基础及常用的语句。同时对集合、对象、属性、方法和事件等几个重要的概念作了简单的讲解。通过学习,你是否有所收获?我说了,我只是给你指路。就像你说你要到北京天安门看升国旗仪式,我只能告诉你打出租车到机场,花一千块买张机票你就可以去了,我可不能把你背去北京我再要着饭走回来。所以现在,对前面学过的内容,你可以在心里面作一个回顾,问问自己,通过学习,收获了什么?还存在什么不足?接下来该怎么做?
  适时的小结是很有必要的,可以看到存在的不足和努力的方向。
  所以这一贴,没有新内容,再来说一说Excel的对象模型,当作是一种对前面的回顾也罢,当作是和大家的一种闲聊也行。不管了!
  
  VBA是通过对象操作来操作和控制Excel。不管是操作Excel程序(Application对象)、工作薄(Workbook对象)、工作表(Worksheet对象)、单元格(Range对象)还是操作图表(Chart对象)、窗体(Userfrom对象)等等,都是在操作对象。每个对象都是其他对象的一部分,也可以由其他对象组成。这个前面的贴子已经讲过,这里不再多说。
  我要说的是,VBA的语法和Excel的对象模型组成了应用Excel VBA程序设计的基础,从某种意义上来说,理解和熟悉Excel对象模型的过程,也就是使用Excel VBA进行程序设计的过程。所以,熟悉Excel的对象模型,对我们学习VBA的重要性可想而知。

  可是,什么是Excel的对象模型?
  不知道这样讲你是否能理解:家里面有厨房吧?厨房里面有很多的东西,比如碗柜,冰箱等,而碗柜里又有饭碗,盘子等,冰箱里有鸡蛋,黄瓜等。Excel就像一个装了很多东西的大厨房,Workbook对象就像冰箱,Worksheet就像冰箱里的蔬菜啊什么的。当我们给这个大厨房及厨房里的这些对象画一个简单的结构图时,这个结构图我们就称之为对象模型。
  
  下面就是Excel的对象模型结构图:

(, 下载次数: 1231)

  Excel对象模型在Excel的帮助文件里就有了,我们可以通过打开帮助来查看它。如果你找不到,请打开你的OFFICE的安装目录,找到\OFFICE11\2052目录下的VBAXL10.CHM。这个文件就是Excel VBAHelp文件了,双击打开它,你就可以看到我们上面的图了。
  从对象模型,我们可以看到对象之间的包含关系,Excel最顶端的对象为Application对象,即Excel程序本身,其他所有的对象都是在Application对象的下面。用鼠标单击其中的每一个对象,就可以跳转到对象的说明。
  呵呵,知道什么是VBA了吧?就是对以上这些对象的操作。就像在厨房里做饭是对厨房里各种对象进行操作一样,Excel Vba程序设计过程中,我们就是通过读取或设置对象的属性、调用对象的方法、编写事件过程来操作Excel

  对象模型很重要,是的。但是Excel对象模型包括了大量的对象、属性和方法,就像书架上放着的汉语大词典,也许有些内容我们一辈子都不会用到它,所以就像我们不用去记住词典的内容一样,我们不必记住对象模型里的所有内容。我们要做的只是熟悉它的结构和组成,需要用到时,翻开字典,查到它所在的页码,然后快速地去打开它。
  熟悉了对象模型,当你在学习VBA的过程中,如果再有什么问题,有字典可查了吧?千万不要忘记了这个随时跟在我们身边的老师。

  不要嫌查字典的麻烦,二年级时你天天翻字典,到高中到大学了你还天天翻吗?从菜鸟到高手,就是一个从查Help到不需要查Help的过程,刚开始时解决一个问题也许需要几个小时,后来也许会快到只要几分钟。呵呵……这是别人告诉我的,我相信,现在我还在坚持翻字典,但我坚信会有不需要再翻它的那一天!也希望你信!
  
   
  PS:如果你的Excel里没有Help,找不到对象模型的文件,那我给你一个:

         (, 下载次数: 16874)
         (, 下载次数: 13984)
         (, 下载次数: 13121)
         (, 下载次数: 13971)
         (, 下载次数: 13949)

[ 本帖最后由 ggsmart 于 2009-8-18 13:40 编辑 ]
作者: MARS_ANCHOR    时间: 2009-8-18 13:24
感谢楼主无私的奉献的精神,正好要学习,谢谢!顶,好贴!
作者: nameksy    时间: 2009-8-18 15:50
标题: 佩服!!致敬!
怎么说呢!对做出贡献的人。致敬
作者: ggsmart    时间: 2009-8-18 16:19
[小试牛刀]制作个性化的欢迎界面
--------------------------------
  如果你辛辛苦苦设计了一个Excel应用程序,想不想很臭美的显摆一下?那我们就给它设计一下“欢迎界面”吧,让每一次别人用它的时候都给他点信息,告诉他,这是爷我做的,顺便也打打广告什么的。
  什么是“欢迎界面”?经常作用电脑的我们应该不陌生吧?打开ExcelWordPS等等软件时,在加载的那几秒钟里,都显示一个欢迎界面,给我们介绍了一些基本的信息。


  这一贴我们就来给我们的Excel做一个个性化的欢迎界面,需要实现的目的是:
  1)打开Excel文件时,隐藏Excel应用程序的界面,同时弹出一个欢迎界面,界面上有你想向别人显摆的内容,有什么,随你了;
  (2)欢迎界面显示5秒钟后,退出欢迎界面,进入Excel文件;
  (3)界面上要动态显示几秒钟后进入工作薄。
  例子见附件:
   (, 下载次数: 41021)


----------------------------------
  这是我们第一次来做例子,在制作的过程中,也许你需要弄清楚以下一些问题,如果不知道的,去查Help了:
  1、想一想,需要发生什么事件才能实现在打开Excel的时候隐藏程序的界面而显示欢迎界面?
  2、要隐藏或显示一个对象,需要修改它的Visible属性,Excel应用程序是什么对象?还记得吗?
  3、显示一个窗体要用什么方法?关闭一个窗体要用怎么做?
  4、如果我们用一个标签来显示“几秒种后进入文件”,那么每隔一秒种我们需要修改一次该标签的什么属性?
  5、怎样安排一个程序在将来的某个时间运行?这需要用到OnTime方法。
  如果有一个程序名叫“mysub”,我们需要这个程序在5秒钟后运行,则代码为:
  

  1.   Application.OnTime Now + TimeValue("00:00:05"), "mysub"
  2.   
复制代码

  详情可以查对象模型,里面有介绍。
  6、怎么在程序里调用另一个过程?
  语句格式为:Call 程序名
  如要在一个程序里运行名为“mysub”的过程,只需要输入:Call mysub即可。
  其实直接输入程序名也可以,但我不喜欢这样做,总感觉不便于阅读!
  7、怎样禁用户通过关闭窗体右上角的关闭按钮关闭“欢迎界面”?这需要用到窗体(UserFrome对象)的QueryClose事件了。请查看Help
  
  好了,能告诉你的就这么多了,希望你能做出来!我例子的密码会在下一贴的时候公布!为了能好好显摆一下,希望你的欢迎界面不要像我的这样简单,多给它美化美化,不但可以加深自己对窗体的认识,还可以增加显摆的条件。
  希望各位把自己的成果展现出来,供大家学习!
  

[ 本帖最后由 ggsmart 于 2009-8-25 16:53 编辑 ]
作者: wqxlyxll    时间: 2009-8-18 16:23
太棒了,我的处女回复给你了~~~~~~~~~~




欢迎光临 ExcelHome技术论坛 (https://club.excelhome.net/) Powered by Discuz! X3.4