ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

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

VBA常用技巧代码解析

    [复制链接]

TA的精华主题

TA的得分主题

 楼主| 发表于 2009-5-4 20:11 | 显示全部楼层

第8部分 控件与用户窗体

本帖已被收录到知识树中,索引项:开发帮助和教程
技巧132         调用非模式窗体
       在VBA中显示用户窗体需要使用Show方法,Show方法显示窗体对象,语法如下:
[object.]Show modal
       参数object是可选的,对象表达式。如果省略掉object,则将与活动的窗体模块相关联的窗体当作object。
       参数modal是可选的,决定窗体是模态的还是非模式的。Modal参数的设置值如表格所示。
    Snap2.jpg
       当窗体显示时是模态时,用户在使用应用程序的其它部分之前,必须先对其作出响应。在隐藏或卸载窗体之前,后续代码不会被执行。
       比如下面的代码,希望在显示窗体的同时给单元格赋值,但因为窗体显示为模态的,在窗体没有关闭之前,给单元格赋值的代码是不会执行的,所以达不到显示窗体的同时给单元格赋值的目的。
  1. #001  Private Sub CommandButton1_Click()
  2. #002      Dim i As Integer
  3. #003      Columns(1).ClearContents
  4. #004      UserForm1.Show 0
  5. #005      For i = 1 To 1000
  6. #006          Cells(i, 1) = i
  7. #007      Next
  8. #008  End Sub
复制代码
只有在窗体显示为非模式时,后续代码才一出现即被执行。模态下是无法操作工作表的,所以应将第4行代码改成如下的代码,才能在显示窗体的同时给单元格赋值,如图所示。
UserForm1.Show 0
    Snap3.jpg

技巧132 调用非模式窗体.rar

13.43 KB, 下载次数: 913

TA的精华主题

TA的得分主题

 楼主| 发表于 2009-5-4 20:17 | 显示全部楼层

第8部分 控件与用户窗体

技巧133         进度条的制作
       如果程序执行时间较长,使用进度条能让用户知道程序执行到何种程度,大约需等待多长时间,可以使界面显得友好。
133-1        使用进度条控件
       使用窗体加进度条控件(ProgressBar)制作进度条是最常用的方法。
       在VBE窗口中单击菜单“插入”→“用户窗体”,在窗体上添加一个进度条控件,调整为合适的大小,如图所示。
   Snap1.jpg
       在工作表中添加一个命令按钮,双击后写入下面的代码。
  1. #001  Private Sub CommandButton1_Click()
  2. #002      Dim i As Integer
  3. #003      UserForm1.Show 0
  4. #004      With UserForm1.ProgressBar1
  5. #005          .Min = 1
  6. #006          .Max = 10000
  7. #007          .Scrolling = 0
  8. #008          For i = 1 To 10000
  9. #009              Cells(i, 1) = i
  10. #010              .Value = i
  11. #011              UserForm1.Caption = "正在运行,已完成" & i / 100 & "%,请稍候!"
  12. #012          Next
  13. #013      End With
  14. #014      Unload UserForm1
  15. #015      Columns(1).ClearContents
  16. #016  End Sub
复制代码
代码解析:
       工作表中命令按钮的单击事件,在给工作表A1到A10000单元格赋值的同时使用进度条显示其运行速度。
       第3行代码,使用Show方法显示进度条控件所在的窗体,并且设置为无模式显示,请参阅技巧132 。
       第5、6行代码,设置进度条控件的最小值和最大值,应与第8行代码中的循环计数器的start参数和End参数相一致。
       第7行代码,设置进度条控件显示为有间隔的。如果将Scrolling属性设置为1则显示为无间隔的。
       第9行代码,在单元格中进行无意义的填充数据以演示进度条。在实际应用中可以将进度条嵌入到程序的循环中。
       第11行代码,在窗体的标题栏中显示已完成的百分比。
       第14行代码,使用Unload 语句卸载窗体。
       Unload 语句从内存中删除一个对象,语法如下:
       Unload object
       参数object参数是必需的,一个有效的对象。
       第19行代码,清空A列填充的数据。
       单击工作表中的命令按钮,填充单元格并显示进度条,如图所示。
       Snap4.jpg

133-1 使用进度条控件.rar

10.07 KB, 下载次数: 1143

TA的精华主题

TA的得分主题

 楼主| 发表于 2009-5-4 20:28 | 显示全部楼层

第8部分 控件与用户窗体

技巧133         进度条的制作
133-2        使用标签控件
       在窗体中使用标签可以制作双色的进度条。
       步骤1,在VBE窗口中单击菜单“插入”→“用户窗体”,在窗体上添加一个框架控件,在框架控件中添加两个标签控件。
       步骤2,在控件的属性窗口中将框架的BackColor 属性设为&H000000FF&,使框架的背景色为红色。将标签1的BackColor属性设为&H0000C000&,使标签1的背景色为绿色。将标签2的BackStyle属性设为fmBackStyleTransparent,使标签2的背景为透明,并把它们的Caption属性全部设置为空白。
       步骤3,将窗体和控件调整为合适的大小,如图所示。
Snap1.jpg
       步骤4,在VBE中双击窗体,写入下面的代码。
  1. #001  Private Declare Function DrawMenuBar Lib "user32" (ByVal Hwnd As Long) As Long
  2. #002  Private Declare Function GetWindowLong Lib "user32" Alias "GetWindowLongA" (ByVal Hwnd As Long, ByVal nIndex As Long) As Long
  3. #003  Private Declare Function SetWindowLong Lib "user32" Alias "SetWindowLongA" (ByVal Hwnd As Long, ByVal nIndex As Long, ByVal dwNewLong As Long) As Long
  4. #004  Private Declare Function FindWindow Lib "user32" Alias "FindWindowA" (ByVal lpClassName As String, ByVal lpWindowName As String) As Long
  5. #005  Private Const GWL_STYLE As Long = (-16)
  6. #006  Private Const GWL_EXSTYLE = (-20)
  7. #007  Private Const WS_CAPTION As Long = &HC00000
  8. #008  Private Sub UserForm_Initialize()
  9. #009      Dim IStyle As Long
  10. #010      Dim Hwnd As Long
  11. #011      If Val(Application.Version) < 9 Then
  12. #012          Hwnd = FindWindow("ThunderXFrame", Me.Caption)
  13. #013      Else
  14. #014          Hwnd = FindWindow("ThunderDFrame", Me.Caption)
  15. #015      End If
  16. #016      IStyle = GetWindowLong(Hwnd, GWL_STYLE)
  17. #017      IStyle = IStyle And Not WS_CAPTION
  18. #018      SetWindowLong Hwnd, GWL_STYLE, IStyle
  19. #019      DrawMenuBar Hwnd
  20. #020      UserForm1.Height = 28
  21. #021  End Sub
复制代码
代码解析:
       窗体的初始化事件,在窗体加载时使用API函数去除其标题栏。
       第1行到第7行代码,API函数的声明。
       第11行到第15行代码,获取窗口句柄。
       第16行到第19行代码,去除窗体标题栏。
       第20行代码,设置窗体的高度。
       步骤5,在工作表中添加一个命令按钮,双击后写入下面的代码。
  1. #001  Private Sub CommandButton1_Click()
  2. #002      Dim n As Integer
  3. #003      Dim i As Integer
  4. #004      n = 10000
  5. #005      With UserForm1
  6. #006          .Show 0
  7. #007          For i = 1 To n
  8. #008              Cells(i, 1) = i
  9. #009              .Label1.Width = i / n * .Frame1.Width
  10. #010              .Label2.Caption = "已完成" & Round(i / n * 100, 0) & "%"
  11. #011              .Label2.Left = .Label1.Width - 50
  12. #012              DoEvents
  13. #013          Next
  14. #014      End With
  15. #015      Unload UserForm1
  16. #016      Range("A1:A" & n).ClearContents
  17. #017  End Sub
复制代码
代码解析:
       工作表中命令按钮的单击事件,在给工作表A1到A10000单元格赋值的同时使用进度条显示其运行速度。
       第4行代码,设置循环最大值,可根据实际需要设置。
       第6行代码,使用Show方法显示窗体,并且设置为无模式的。
       第8行代码,在单元格中进行无意义的填充数据以演示进度条。
       第9行代码,根据程序运行程度动态设置标签1的宽度,使之达到进度条的效果。
       第10行代码,标签2显示已完成百分比。
       第11行代码,根据标签1的宽度动态设置标签2的Left属性,使已完成百分比跟随标签1移动。
       第12行代码,使用DoEvents函数转让控制权。DoEvents函数将控制权传给操作系统。当操作系统处理完队列中的事件,并且在 SendKeys队列中的所有键也都已送出之后,返回控制权。如果不使用DoEvents函数转让控制权,进度条不能正常显示。
       第15行代码,使用Unload 语句卸载窗体。
       单击工作表中的命令按钮,填充单元格并显示进度条,如图所示。
       Snap5.jpg

[ 本帖最后由 yuanzhuping 于 2009-5-4 20:34 编辑 ]

133-2 使用标签控件.rar

12.3 KB, 下载次数: 1049

TA的精华主题

TA的得分主题

发表于 2009-5-4 20:49 | 显示全部楼层
一直关注!
不知道最后出版齐全,yuanzhuping 君有没有具体时间表。

TA的精华主题

TA的得分主题

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

顶,并有提问

请教老师:
     1 、 "将ListView控件的View属性设置为lvwReport,以报表视图模式显示"中,想点图标后整行选中,代码怎么写?
     2、我把老师例中的代码和控件复到我的工作簿上怎么运行时,提示“变量未定义”见我上传的文件,请老师指教?
谢谢!

[ 本帖最后由 ayu330602 于 2009-5-5 00:20 编辑 ]

新建 Microsoft Excel 工作表.rar

16.39 KB, 下载次数: 214

TA的精华主题

TA的得分主题

发表于 2009-5-5 09:57 | 显示全部楼层

TA的精华主题

TA的得分主题

 楼主| 发表于 2009-5-5 10:40 | 显示全部楼层

第8部分 控件与用户窗体

技巧134         使用TreeView控件显示层次
       TreeView控件是一个树形结构的控件,该控件用于显示分层数据,如目录或文件目录,使程序的表现更为灵活,用户的操作更加方便,示例代码如下:
  1. #001  Private Sub UserForm_Initialize()
  2. #002      Dim c As Integer
  3. #003      Dim r As Integer
  4. #004      Dim rng As Variant
  5. #005      rng = Sheet1.UsedRange
  6. #006      With Me.TreeView1
  7. #007          .Style = tvwTreelinesPlusMinusPictureText
  8. #008          .LineStyle = tvwRootLines
  9. #009          .CheckBoxes = False
  10. #010          With .Nodes
  11. #011              .Clear
  12. #012              .Add Key:="科目", Text:="科目名称"
  13. #013              For c = 1 To Sheet1.UsedRange.Columns.Count
  14. #014                  For r = 2 To Sheet1.UsedRange.Rows.Count
  15. #015                      If Not IsEmpty(rng(r, c)) Then
  16. #016                          If c = 1 Then
  17. #017                              .Add relative:="科目", relationship:=tvwChild, Key:=rng(r, c), Text:=rng(r, c)
  18. #018                          ElseIf Not IsEmpty(rng(r, c - 1)) Then
  19. #019                              .Add relative:=rng(r, c - 1), relationship:=tvwChild, Key:=rng(r, c), Text:=rng(r, c)
  20. #020                          Else
  21. #021                              .Add relative:=CStr(Sheet1.Cells(r, c - 1).End(xlUp)), relationship:=tvwChild, Key:=rng(r, c), Text:=rng(r, c)
  22. #022                          End If
  23. #023                      End If
  24. #024                  Next
  25. #025              Next
  26. #026          End With
  27. #027      End With
  28. #028  End Sub
复制代码
代码解析:
       在窗体初始化时将工作表中的科目名称填充TreeView控件。
       第7行代码,设置TreeView控件每个列表的组成方式。Style属性设置值如表格所示。
       Snap3.jpg
       第8行代码,设置TreeView控件显示根节点连线。TreeView控件的LineStyle属性设置为tvwRootLines显示根节点连线,设置为tvwTreeLines则隐藏根节点连线。
       第9行代码,设置TreeView控件不显示复选框。
       第10行代码使用Nodes属性返回对TreeView控件的Node对象的集合的引用。
       第11行代码,清除TreeView控件所有的节点。
       第12行代码,使用Add方法在Treeview控件的Nodes集合中添加一个Node对象。,Add方法语法如下:
       object.Add(relative, relationship, key, text, image, selectedimage)
       参数Object是必需的,一个有效的对象。
       参数Relative是可选的,代表已存在的Node对象的索引号或键值。
       参数relationship是可选的,代表新节点与已存在的节点间的关系,指定的Node对象的相对位置。relationship的设置值如表格所示。
       Snap4.jpg
       参数key是可选的,唯一的字符串,可用于用Item方法检索Node。
       参数text 是必需的,在Node中出现的字符串。
       参数image是可选的,代表一个图像或在ImageList控件中图象的索引。
       参数selectedimage是可选的,代表一个图像或在ImageList控件中图象的索引,在 Node被选中时显示。
       第13行到第25行代码代,在根节点下添加子节点。添加子节点仍然使用Add方法,需要一个唯一的Key值,必须提供根节点的Key值(参数relative)和参数relationship值(tvwChild)。要将子节点链接到根节点的下面,参数relative必须与根节点的Key值一致,参数relationship必须设置为tvwchild。要使子节点有效,子节点必须也有自已唯一的Key值。
       获得双击TreeView控件后的返回值的代码如下:
  1. #001  Private Sub TreeView1_DblClick()
  2. #002      If TreeView1.SelectedItem.Children = 0 Then
  3. #003          Sheet1.Range("A65536").End(xlUp).Offset(1) = TreeView1.SelectedItem.Text
  4. #004      Else
  5. #005          MsgBox "所选择的不是末级科目,请重新选择科目!"
  6. #006      End If
  7. #007  End Sub
复制代码
TreeView1_ DblClick过程是TreeView控件的双击事件,将所选的科目名称写入到工作表中。
       第2行代码判断所选节点是否是末级科目。TreeView控件的SelectedItem属性返回当前所选择的节点,而Children属性检查所选节点是否还有子节点,如没有子节点则返回0。
       运行窗体效果如图所示。
       Snap2.jpg

技巧134 使用TreeView控件显示层次.rar

20.89 KB, 下载次数: 1254

评分

1

查看全部评分

TA的精华主题

TA的得分主题

 楼主| 发表于 2009-5-5 10:55 | 显示全部楼层
原帖由 ayu330602 于 2009-5-4 23:50 发表
请教老师:
     1 、 "将ListView控件的View属性设置为lvwReport,以报表视图模式显示"中,想点图标后整行选中,代码怎么写?
     2、我把老师例中的代码和控件复到我的工作簿上怎么运行时,提示“变量未定义”见我上传的文件,请老师指教?

1、设置Listview控件的FullRowSelect属性为True,可以选择整行。
2、VBE中工具---引用。
Snap1.jpg

TA的精华主题

TA的得分主题

 楼主| 发表于 2009-5-5 10:58 | 显示全部楼层
原帖由 入孝出悌 于 2009-5-4 20:49 发表
一直关注!
不知道最后出版齐全,yuanzhuping 君有没有具体时间表。

还没有具体的时间安排,尽量抓紧吧,争取早日完成。

TA的精华主题

TA的得分主题

发表于 2009-5-5 12:42 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
原帖由 yuanzhuping 于 2009-5-5 10:58 发表

还没有具体的时间安排,尽量抓紧吧,争取早日完成。

大致还有15天?1月?或者3月到半年?

真的很佩服你,抛开学术,就你的意志就令人敬佩。

[ 本帖最后由 入孝出悌 于 2009-5-5 12:44 编辑 ]
您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

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

GMT+8, 2024-3-29 15:13 , Processed in 0.050334 second(s), 6 queries , Gzip On, Redis On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

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

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

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