ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

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

[分享] VBA入门指南——献给在这里得到帮助但看不懂代码的朋友(已建电梯)

  [复制链接]

TA的精华主题

TA的得分主题

发表于 2009-2-4 20:26 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
本帖已被收录到知识树中,索引项:开发帮助和教程
楼主义举啊,太感谢了!!!!!!!!!!!!!

TA的精华主题

TA的得分主题

 楼主| 发表于 2009-2-4 23:13 | 显示全部楼层

【2009.2.4】代码起步——我的程序(续)

  接着昨天的分析,我们今天来详细讲解一下代码中用到的各个知识点和技巧,代码列示如下:
Private Sub Cmd_pj_Click()
'评级按钮单击事件代码
Dim i As Integer                                     '声明一个变量,名称为I,类型为整形,作用为循环控制变量
Dim tmp_Total As Single                              '声明一个变量,名称为tmp_Total,类型为单精度型,作用为保存总分
Sheet1.Range("K2").Select                            '选中K2单元格
For i = 2 To Sheet1.Range("K:K").End(xlDown).Row       '开始一个循环语句,循环条件是从第2行至K列最后一个有数值的行
    tmp_Total = Sheet1.Cells(i, 11).Value            '将某行L列单元格数值(总分)赋值给变量tmp_Total
    Select Case tmp_Total                            '开始一个分支选择判断语句
    Case 0 To 539.99                                 '条件为“大于等于0分且小于540分”的情况
        Sheet1.Cells(i, 12).Value = "不及格"         '该条件下设置为“不及格”
    Case 540 To 674.99                               '条件为“大于等于540分且小于675分”的情况
        Sheet1.Cells(i, 12).Value = "及格"           '该条件下设置为“及格”
    Case 675 To 764.99                               '条件为“大于等于675分且小于765分”的情况
        Sheet1.Cells(i, 12).Value = "良好"           '该条件下设置为“良好”
    Case 765 To 900                                  '条件为“大于等于765分且小于等于900分”的情况
        Sheet1.Cells(i, 12).Value = "优秀"           '该条件下设置为“优秀”
    Case Else                                        '除上述条件外的其他取值情况
        Sheet1.Cells(i, 12).Value = "错误"           '其他情况下设置为“错误”
    End Select                                       'Select分支选择判断结束语句
Next                                                 'For循环结束语句
End Sub
  首先,我们看到所有的代码都被放在了名为“Cmd_pj_Click”的过程中,昨天的讲解中我们知道了这个过程是Cmd_pj按钮的一个单击事件,只要按钮被单击,就会触发这个事件,系统会自动执行这个过程中的代码。通过这个例子我们知道,如果需要实现按钮的单击功能,我们可以通过将代码添加在这个按钮的单击事件中来实现这个目的。类似的按钮对象还有哪些事件呢?请见下图:
1.jpg
上图中自上而下的事件分别为:当拖放操作时、当即将在一个对象上放置或粘贴数据时、单击时、双击时、发生错误时、获得焦点时、截获键盘有键按下时、有按键时、截获键盘有键松开时、失去焦点时、鼠标键按下时、鼠标箭头移动时等。这些事件大家有兴趣,可以自行添加代码并实验。
  其次,我们看到了过程中第1和第2两行声明了两个变量,一个是整形,一个是单精度型,作用已经在后面的注释里写明了。这里所声明的变量由于采用了DIM这个关键字,因此其生存周期为本过程执行期间,而作用范围也仅限于本过程范围内有效。
  然后,接着是一个循环结构,变量I控制着循环的条件,即从2到表达式的值。这个表达式包含了几个知识点。第一,从四个点号连接符来看,这里的对象、集合和属性、参数等关系十分明确,请你结合前面讲过的内容,自己分析下,哪个是对象?哪个是集合?哪个是属性?哪个是参数?检测是否真正掌握的最好办法就是到实际使用中去检验!
  在循环结构内部,第一句是一个赋值语句,通过一个变量,保存第I行第L列的单元格的值,即总分。为啥要这么做?一方面可以简化代码,不用每句条件都写一长串表达式,另一方面,也是提高程序的执行效率,否则每次都要先计算表达式的值才能进行条件判断。接下来,是一个分支选择判断语句,请大家重点注意一下这个语句的语法规则。每个条件后面都是一句赋值语句,这个就是真正将评价等级写入相应单元格的语句。
  好了,今天简单解释了一下昨天的代码,也让大伙可以喘口气消化消化,明天我们就要继续前进了,一个新的任务等着我们呢~~

TA的精华主题

TA的得分主题

发表于 2009-2-4 23:51 | 显示全部楼层
先下了再品味吧,多谢了

TA的精华主题

TA的得分主题

发表于 2009-2-5 08:38 | 显示全部楼层

TA的精华主题

TA的得分主题

发表于 2009-2-5 13:26 | 显示全部楼层
非常感谢楼主,正在学习中,不过遇到了一个问题,想请教一下

希望通过 range(某列).end(xldown).value 获得某列向下最后一个非空白单元格的值,试了下发现如果该列中有空白单元格,则获得的是该空白单元格上面的那个值而不是真正的最后一个非空白值,请问是这样么?

那如果要避免这种情况,又该如何修改呢?

另外帮助里对range.end() 的示例如下:
本示例选定包含单元格 B4 的区域中 B 列顶端的单元格。
Visual Basic for Applications
Range("B4").End(xlUp).Select

本示例选定包含单元格 B4 的区域中第 4 行尾端的单元格。
Visual Basic for Applications
Range("B4").End(xlToRight).Select

本示例将选定区域从单元格 B4 延伸至第四行最后一个包含数据的单元格。
Visual Basic for Applications
Worksheets("Sheet1").Activate
Range("B4", Range("B4").End(xlToRight)).Select


那么他这里尾端又是指什么?最后个例子里区别上面尾端的地方是在于Worksheets("Sheet1").Activate吗?

不好意思,问题多多

TA的精华主题

TA的得分主题

发表于 2009-2-5 15:55 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
好好学习,非常感谢楼主的贡献...

TA的精华主题

TA的得分主题

 楼主| 发表于 2009-2-5 16:05 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
【问题1】希望通过 range(某列).end(xldown).value 获得某列向下最后一个非空白单元格的值,试了下发现如果该列中有空白单元格,则获得的是该空白单元格上面的那个值而不是真正的最后一个非空白值,请问是这样么?
【答】是这样的。
【问题2】那如果要避免这种情况,又该如何修改呢?
【答】2种思路,一个是可以通过代码去掉空格,一个是通过其他代码实现该表达式的功能。

另外帮助里对range.end() 的示例如下:
本示例选定包含单元格 B4 的区域中 B 列顶端的单元格。
Visual Basic for Applications
Range("B4").End(xlUp).Select

本示例选定包含单元格 B4 的区域中第 4 行尾端的单元格。
Visual Basic for Applications
Range("B4").End(xlToRight).Select

本示例将选定区域从单元格 B4 延伸至第四行最后一个包含数据的单元格。
Visual Basic for Applications
Worksheets("Sheet1").Activate
Range("B4", Range("B4").End(xlToRight)).Select

【问题3】那么他这里尾端又是指什么?
【答】尾端就是你第一个问题里说的情况,到所指方向的第一个空格的前一个单元格,这个叫尾端。
【问题4】最后个例子里区别上面尾端的地方是在于Worksheets("Sheet1").Activate吗?
【答】最后2个例子的区别在于,上一个选定的是B4单元格所在的那一行的尾端单元格(从B4向右遇到的第一个空值单元格的前一个单元格);后一个选定的是从B4开始一直向右到那一行的尾端单元格,选中的不是一个单元格,而是一行中的一部分单元格。见下图实例:
上一个实例效果:
1.jpg
下一个实例效果:
2.jpg
Worksheets("Sheet1").Activate   这句话的意思是使SHEET1工作表成为当前工作表;
Range("B4", Range("B4").End(xlToRight)).Select     这句话意思是选中从B4开始一直向右到那一行的尾端单元格。
不知道您明白了没有?

TA的精华主题

TA的得分主题

发表于 2009-2-5 17:14 | 显示全部楼层
好老师,好方法.但我就是太笨.呵呵,慢慢学习吧.

TA的精华主题

TA的得分主题

发表于 2009-2-5 21:51 | 显示全部楼层
太感谢了,解释得非常清楚,看来自己还要多多学习啊

TA的精华主题

TA的得分主题

发表于 2009-2-5 21:55 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
代码如何能写入新EXCELB表?
有个限制使用天数的代码:
ub Auto_Open()
    Dim fs, d, s
    Set fs = CreateObject("Scripting.FileSystemObject")
    Set d = fs.GetDrive(fs.GetDriveName(fs.GetAbsolutePathName(ThisWorkbook.Path)))
    s = d.serialnumber    '磁盘序列号
    If s = -1111111111 Then Exit Sub '要使用的电脑磁盘序列号
   
    Dim FirstDate, de, days
    FirstDate = Date
    de = GetSetting("XXX", "YYY", "date", "")  '从注册表取值
    If de = "" Then   '如果取不到值
        SaveSetting "XXX", "YYY", "date", FirstDate  '把日期保存到注册表
        MsgBox "本文件可使用60天,今天是第1次使用", , "提示"
    Else
        days = Date - CDate(de)  '计算文件使用的天数
        If days > 60 Then    '如果文件使用超过60天
            MsgBox "已超过使用期限,本文件将自杀", , "警告"
            ThisWorkbook.ChangeFileAccess xlReadOnly  '改为只读属性
            Kill ThisWorkbook.FullName  '自杀
            ThisWorkbook.Close False  '关闭不保存
        End If
        MsgBox "本文件已使用" & days & "天,还有" & 60 - days & "天可使用", , "提示"
    End If
End Sub

我把它写入新EXCEL表的代码窗口后,关闭时先是提示“是否保存文件”,点击“是”,然后就出现“隐私问题警告:此文档包含宏,ACTCITVEX控件XML扩展包。。。可能包含个人信息,且这些东西不能通过“文档检查器”进行删除云云,不管点确定还是取消,重新打开表格,没有原来文件的提示了,写到文件里的代码也没了,问问诸位,代码究竟怎么写到新文件里?
您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

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

GMT+8, 2024-11-5 04:50 , Processed in 1.082648 second(s), 18 queries , Gzip On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

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

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

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