ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

搜索
EH技术汇-专业的职场技能充电站 妙哉!函数段子手趣味讲函数 Excel服务器-会Excel,做管理系统 效率神器,一键搞定繁琐工作
HR薪酬管理数字化实战 Excel 2021函数公式学习大典 Excel数据透视表实战秘技 打造核心竞争力的职场宝典
让更多数据处理,一键完成 数据工作者的案头书 免费直播课集锦 ExcelHome出品 - VBA代码宝免费下载
用ChatGPT与VBA一键搞定Excel WPS表格从入门到精通 Excel VBA经典代码实践指南
楼主: 佛山小老鼠

[原创] Vba新手入门的实例课程十五讲

  [复制链接]

TA的精华主题

TA的得分主题

发表于 2011-3-14 16:28 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
正需要,跟楼主学习了。

TA的精华主题

TA的得分主题

发表于 2011-3-14 16:47 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
非常好的入门级教材,谢谢楼主分享!

TA的精华主题

TA的得分主题

 楼主| 发表于 2011-3-15 00:19 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
第三讲 VBA的语法基础

在VBA编程过程中,最基本问题就是处理数据,凡是有数据的都会涉及到数据类型。呵呵,可能在处理单个小程序的时,你没有感受到程序运行慢,我以前也是这样的,有一个网友刚学VBA,问了一个这样的问题---------下面这个程序Application.ScreenUpdating = False,Application.ScreenUpdating = True 有什么作用,
  1. Sub test()
  2.      Application.ScreenUpdating = False
  3.      For i = 1 To 100
  4.           s = s + i
  5.      Next i
  6.      MsgBox s
  7.      Application.ScreenUpdating = True
  8. End Sub
复制代码
我说这是关闭屏刷新,加速程序运行。
这个网友回复我说,这个作用没有发现啊,没有感觉到?好像用不用都是一样的。后来我回复他,你运行一下个看看
  1. Sub Macro4()
  2. Range("D2").Select
  3. Dim I As Integer
  4. For I = 1 To 500
  5.     ActiveCell.Offset(-1, -2).Range("A1").Select
  6.     Selection.Copy
  7.     ActiveCell.Offset(1, 2).Range("A1").Select
  8.     ActiveSheet.Paste
  9.     ActiveCell.Offset(0, -2).Range("A1").Select
  10.     Application.CutCopyMode = False
  11.     Selection.Copy
  12.     ActiveCell.Offset(0, 3).Range("A1").Select
  13.     ActiveSheet.Paste
  14.     ActiveCell.Offset(1, -3).Range("A1").Select
  15.     Application.CutCopyMode = False
  16.     Selection.Copy
  17.     ActiveCell.Offset(-1, 4).Range("A1").Select
  18.     ActiveSheet.Paste
  19.     ActiveCell.Offset(3, -2).Range("A1").Select
  20.     Next I
  21.     Range("D2").Select
  22. End Sub
复制代码
他告诉我这个看见屏幕在闪了,我就对他说,你这个程序前面和后面加上这两句看Application.ScreenUpdating = False,Application.ScreenUpdating = True
他过了一会说,明白了,明白了,屏幕不闪了
一说一说,又离题了,但我们不会写代码时,我不会关注我们的代码运行的速度,我们只要结果,就像小时候学的一篇课文,“我要的是葫芦”,不管叶子有没虫子,但当你写的代码长长时,代码复杂时,运时时间很长时,这时你就会想到了优化代码,来提高自己程序运行速度了。因此我们就要理解,明白数据的类型,什么是数据类型呢?数据类型是指程序如何将数据存储在内存中,那一种类型我们就要定义那一种最合适的数据类型,打个浅显的比方-----你老婆叫你去买一斤油,你是不是抬一个大水缸去,还是拿一个麻袋去,还是拿一个一斤装的大小的瓶子去?你马上会回答我,拿一个一斤装的大小的瓶子去,对了,数据类型也是同样的道理,呵呵,不吹牛了,大家看看下面这一些吧
1.数据类型:
学生的姓名,学生的年龄,学生的出生日期(常用数据类型有:Byte(字节型); Integer (整型); Long(长整型); Single(单精度浮点型,7位有效数字); Double (双精度浮点型,有效数字15位); String(字符串型);对象型(例如单元格区域和工作表); Variant(变体型,也叫万能的类型)
2.变量:变量可以使程序变得更加富有活力
(1).变量名称要注意几点:
A.不能把关键字做变量名
B.部分符号不能在变量中出现,如(#*%!)
C.不区分大小写,但我们一般大小写混写,第一个字母大写,其它的小写。
D.也可以使用中文名称,但是尽量不用中文名称,如果在英文版会报错。
(2)变量声明(电脑里划出一个储存区域来储存变量的值,变量的声明就决定了变量的大小,而大小就是我们前面讲的数据类型决定的)
(3)变量的声明方式
A.语法格式:  Dim  变量 as 数据类型.如Dim i as Integer
B.也可以一行定义多个变量,之间用逗号分开
如 Dim i As Integer, F As String, D As Long
(4).强制声明:变量使用前声明是一个好习惯,由于VBA里可以不声明变量,因此用户会忘记这一点,所以我们要求变量进行强制声明(工具菜单==选项==编辑器==要求声明变量)
(5)变量的作用域:
        A.过程级变量
        B.模块级变量
        c.全局级变量
3.运算符和表达式:
(1).算术运算符:有+,-,*,/,&
(2).比较运算符:=,<>,>=,<=,Like
(3).逻辑运算符:And,Or,Not
(4)表达式:右边的值赋给运算符左边的

附件里的代码一解析
  1. Sub aa()
  2.      Dim i As Byte     '定义变量I为字节型
  3.      For i = 1 To 300  '给变量I赋值,范围是1到300
  4.           c = c + i  '累加把值赋给C
  5.      Next i     '下一个I 和上面那个FOR组成一个循环语句,FOR NEXT
  6.      MsgBox c  'MsgBox是输出函数,把1加300的和显示出来
  7. End Sub
复制代码
'这个代码错在那里呢 , 错在我们定义数据变量这里, 因为Byte的范围0到255
改正后的
  1. Sub test()
  2.      Dim i As Integer      '定义变量I为整型
  3.      For i = 1 To 300  '给变量I赋值,范围是1到300
  4.           c = c + i  '累加把值赋给C
  5.      Next i     '下一个I 和上面那个FOR组成一个循环语句,FOR NEXT
  6.      MsgBox c  'MsgBox是输出函数,把1加300的和显示出来
  7. End Sub
复制代码
附件里的代码二解析:
  1. Dim C As Integer     '定义变量C为整型
  2. Dim I As Integer     '定义变量I为整型
  3. Sub AA()
  4.      For I = 1 To 100     '给变量I赋值,范围是1到100
  5.           C = C + I     '累加把值赋给C
  6.      Next I     '下一个I 和上面那个FOR组成一个循环语句,FOR NEXT
  7.      MsgBox C 'MsgBox是输出函数,把1加100的和显示出来
  8. End Sub
  9. Sub BB()
  10.      For I = 1 To 100 '给变量I赋值,范围是1到100
  11.           C = C + I '累加把值赋给C
  12.      Next I '下一个I 和上面那个FOR组成一个循环语句,FOR NEXT
  13.      MsgBox C 'MsgBox是输出函数,把1加100的和显示出来
  14. End Sub
复制代码
为什么求1到100的和,点击第一次是对的,点击第二次就不对了?呵呵,我们错在那里啊?我们错在我们定义变量时,是定义模块级变量, 所以我们这个变量值还没有销毁,上次还存在,而不是定义过程级变量
改正后的代码

  1. Sub AA()
  2.      Dim C As Integer
  3.      Dim I As Integer
  4.      For I = 1 To 100
  5.           C = C + I
  6.      Next I
  7.      MsgBox C
  8. End Sub
  9. Sub BB()
  10.      Dim C As Integer
  11.      Dim I As Integer
  12.      For I = 1 To 100
  13.           C = C + I
  14.      Next I
  15.      MsgBox C
  16. End Sub
复制代码
附件里的代码三解析:
  1. Sub aa()
  2.    Dim F As Long '定义变量F为长整型
  3.    F = InputBox("请输入你的姓名", "姓名输入") '用输入函数把姓名输进来,再把值赋给F
  4.    If F = "" Then '如果F等于空 那么
  5.      Exit Sub '退出程序
  6.    Else '否则
  7.        MsgBox (F & "你好!!1") '用输出函数显示"某某你好!!!"
  8.    End If '一对判断语句IF THEN END IF
  9. End Sub
复制代码
为什么此程序我输数字放在姓名框也报错呢???
因为空字符串也是文本型String

改正后的代码
  1.    Dim F As String '定义变量F为字符串型   F = InputBox("请输入你的姓名", "姓名输入") '用输入函数把姓名输进来,再把值赋给F
  2.    If F = "" Then '如果F等于空 那么
  3.      Exit Sub '退出程序
  4.    Else '否则
  5.        MsgBox (F & "你好!!1") '用输出函数显示"某某你好!!!"
  6.    End If '一对判断语句IF THEN END IF
  7. End Sub
复制代码
第四讲 Range对象  113楼 http://club.excelhome.net/thread-691838-12-1.html

[ 本帖最后由 佛山小老鼠 于 2011-3-15 22:09 编辑 ]

查错1.rar

6.17 KB, 下载次数: 380

查错2.rar

6.07 KB, 下载次数: 214

查错3.rar

6.45 KB, 下载次数: 214

评分

1

查看全部评分

TA的精华主题

TA的得分主题

 楼主| 发表于 2011-3-15 11:39 | 显示全部楼层

TA的精华主题

TA的得分主题

发表于 2011-3-15 16:14 | 显示全部楼层

TA的精华主题

TA的得分主题

发表于 2011-3-15 16:17 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
非常感谢,收下了

TA的精华主题

TA的得分主题

发表于 2011-3-15 16:44 | 显示全部楼层

TA的精华主题

TA的得分主题

 楼主| 发表于 2011-3-15 21:36 | 显示全部楼层
第四讲 Range对象
Range对象是Excel应用程序中最常用的对象,一个Range对象代表一个单元格、一行、一列、包含一个或者更多单元格区域(可以是连续的单元格,也可以是不连续的单元格)中选定的单元格,在操作Excel 内的任何区域之前都需要将其表示为一个Range对象,然后使用该Range对象的方法和属性。

1.单元格的引用方法及应用
在VBA中经常需要引用单元格或单元格区域,主要有以下几种方法。
1)        使用Range属性
       VBA中可以使用Range属性返回单元格或单元格区域,如下面的代码所示。
  1. 1#  Sub 选择1()
  2. 2#       Sheet1.Range("A1:D9, D1:D9").Select
  3. 3#  End Sub
复制代码
代码解析:第二行单元格A1:D9和单元格D1:D9同时选中
“选择1”过程使用Select方法选中A1:A9,D1:D9单元格区域。
       Range属性返回一个Range对象,该对象代表一个单元格或单元格区域,语法如下:
Range(Cell1, Cell2)
      参数Cell1是必需的,必须为 A1 样式引用的宏语言,可包括区域操作符(冒号)、相交区域操作符(空格)或合并区域操作符(逗号)。也可包括美元符号(即绝对地址,如“$A$1”)。

2)        使用Cells属性
      使用Cells属性返回一个Range对象,如下面的代码所示
  1. Sub 输数字1()
  2. Dim I As Integer
  3. For I = 1 To 10
  4. Sheet1.Cells(I, 1) = I
  5. Next I
  6. End Sub
复制代码
代码解析:
     “ 输数字1”过程使用For...Next语句为工作表中的A1:A10单元格区域填入序号1到10。
       Cells属性指定单元格区域中的单元格,语法如下:
Cells(RowIndex, ColumnIndex)
       参数RowIndex是可选的,表示引用区域中的行序号。
       参数ColumnIndex是可选的,表示引用区域中的列序号。
       如果缺省参数,Cells属性返回引用对象的所有单元格。
       Cells属性的参数可以使用变量,因此经常应用于在单元格区域中循环

3)        使用快捷记号

在VBA中可以将A1引用样式或命名区域名称使用方括号括起来,作为Range属性的快捷方式,这样就不必键入单词“Range”或使用引号,如下面的代码所示。
  1. Sub 输字2()
  2. [A1:A10] = "佛山小老鼠"
  3. End Sub
复制代码
代码解析:
     “输字2”过程使用快捷记号为单元格区域赋值。
       第2行代码使用快捷记号将活动工作表中的A1:A10单元格赋值为”佛山小老鼠”

注意 使用快捷记号引用单元格区域时只能使用固定字符串而不能使用变量。

4)        使用Offset属性
       可以使用Range对象的Offset属性返回一个基于引用的Range对象的单元格区域,如下面的代码所示。
  1. Sub 输数字3()
  2. Sheet1.Range("A1:A10").Offset(1, 1) = 2
  3. End Sub
复制代码
代码解析:
       “输数字3”过程使用Range对象的Offset属性选中A1:A10单元格偏移一行一列后的区域B2:B11,且在B2:B11输入了数字2
       应用于Range对象的Offset 属性的语法如下:
expression.Offset(RowOffset, ColumnOffset)
       参数expression是必需的,该表达式返回一个Range对象。
       参数RowOffset是可选的,区域偏移的行数(正值、负值或 0(零))。正值表示向下偏移,负值表示向上偏移,默认值为 0。
       参数ColumnOffset是可选的,区域偏移的列数(正值、负值或 0(零))。正值表示向右偏移,负值表示向左偏移,默认值为 0。

5)        使用Resize属性
       使用Range对象的Resize属性调整指定区域的大小,并给单元格区域赋值,如下面的代码所示。
  1. Sub 输数字4()
  2. Sheet1.Range("A1").Resize(3, 3) = “佛山小老鼠”
  3. End Sub
复制代码
6)        使用Union方法
       使用Union方法可以将多个非连续区域连接起来成为一个区域,从而可以实现对多个非连续区域一起进行操作,如下面的代码所示。
  1. Sub 输数5()
  2. Union(Sheet1.Range("A1:A9"), Sheet1.Range("D1:D9,G1:G9")) = "佛山小老鼠"
  3. End Sub
复制代码
也可以用代码
  1. Sub AA()
  2. Range("A1:D9,D1:D9,G1:G9") = "佛山小老鼠"
  3. End Sub,
复制代码
不过要记得中间是用逗号分开,只能是一对双引号

代码解析:
       “输数字4”过程给单元格区域A1:A9和D1:D9,G1:G9所组成的区域赋值为”佛山小老鼠。Union方法返回两个或多个区域的合并区域,语法如下:
expression.Union(Arg1, Arg2, ...)
       其中参数expression是可选的,返回一个Application对象。
       参数Arg1, Arg2, ...是必需的,至少指定两个Range对象。

7)        使用UsedRange属性
       使用UsedRange属性返回指定工作表上已使用单元格组成的区域,如下面的代码所示。
  1. Sub 选择2()
  2. Sheet1.UsedRange.Select
  3. End Sub
复制代码
代码解析:
  “选择2”过程使用UsedRange属性选择工作表上已使用单元格组成的区域,包括空单元格。

8) Cells(数字),一个单元格有一个数字代表,因为一行有256个单元格,257就是第二行的第一个单元格如
  1. Sub AA()
  2. Cells(257) = "小老鼠"
  3. End Sub
复制代码
附件解释:
  1. Sub 选择1()
  2.      Sheet1.Range("A1:D9, D1:D9").Select '单元格区域A1:D9, D1:D9被选中
  3. End Sub
复制代码
  1. Sub 输字1()
  2. Dim I As Integer '定义变量I为整型
  3. For I = 1 To 10   '给变量I赋值
  4. Sheet1.Cells(I, 1) = I '在工作表1里的从A1单元格起到A10单元格,输入了数值1到10
  5. Next I      '下一个I,和FOR构成循环语句
  6. End Sub
复制代码
  1. Sub 输字2()
  2. [A1:A10] = "佛山小老鼠" '在区域A1:A10输入佛山小老鼠
  3. End Sub
复制代码
  1. Sub 输字3()
  2. Sheet1.Range("A1:A10").Offset(1, 1) = 2 'Offset是偏移的意思,在区域B2:B11输入2
  3. End Sub
复制代码
  1. Sub 输字4()
  2. Sheet1.Range("A1").Resize(3, 3) = "佛山小老鼠" '在A1的基础上向下扩展3行,向右扩展3列,得到一区域A1:C3

  3. End Sub
复制代码
  1. Sub 输字5()
  2. Union(Sheet1.Range("A1:A9"), Sheet1.Range("D1:D9,G1:G9")) = "佛山小老鼠" '在区域A1:A9,D1:D9,G1:G9区域输入佛山小老鼠
  3. End Sub
复制代码
  1. Sub 输字6()
  2. Range("A1:A9,D1:D9,G1:G9") = "佛山小老鼠" '在区域A1:A9,D1:D9,G1:G9区域输入佛山小老鼠
  3. End Sub
复制代码
  1. Sub 选择2()
  2. Sheet1.UsedRange.Select '用过的区域被选中
  3. End Sub
复制代码
  1. Sub 还原()
  2. Cells.Clear '清除工作表的全部,包据数据,格式
  3. End Sub
复制代码
  1. Sub AA()
  2. Cells(257) = "小老鼠" '因为2003版一个工作表里有256列,
  3. '也就是第一行最后一个单元格是Cells(256),所以Cells(257)是表示B1单元格
  4. '也就是在B1单元格赋值为小老鼠
  5. End Sub
复制代码
  1. Sub BB()
  2.    Cells(257) = "" '把B1单元格的的值赋为空
  3. End Sub
复制代码
第五讲 VBA语句(一)  116楼  http://club.excelhome.net/thread-691838-12-1.html

[ 本帖最后由 佛山小老鼠 于 2011-4-25 01:41 编辑 ]

RANGE的表示和应用.rar

8.57 KB, 下载次数: 196

CELLS.rar

6.05 KB, 下载次数: 168

TA的精华主题

TA的得分主题

发表于 2011-3-16 11:12 | 显示全部楼层
看着佛山小老鼠老师编写的教程,开始对VBA感兴趣了,也跟着学了一些。
开始学msgbox时不知道怎么更改它的标题栏提示文字。
刚刚跟小老鼠老师学了怎么改变msgbox输出函数的标题栏,现给大家分享一下:
MsgBox 一共有三个参数,第一个是输出的内容(不同内容可以用+号码连接,提二个是VB信息(可以省略不写,但逗号不能省略),第三个是标题文字内容。
如:MsgBox你好!" + "欢迎光临!",vbinfomation,"提醒"
也可以省略成MsgBox 你好!" + "欢迎光临!",,"提醒"

TA的精华主题

TA的得分主题

发表于 2011-3-16 15:14 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助

支持,好书

收藏了,希望能学会
您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

手机版|关于我们|联系我们|ExcelHome

GMT+8, 2024-12-22 18:52 , Processed in 0.047199 second(s), 12 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

沪公网安备 31011702000001号 沪ICP备11019229号-2

本论坛言论纯属发表者个人意见,任何违反国家相关法律的言论,本站将协助国家相关部门追究发言者责任!     本站特聘法律顾问:李志群律师

快速回复 返回顶部 返回列表