ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

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

VBA常用技巧代码解析

    [复制链接]

TA的精华主题

TA的得分主题

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

第8部分 控件与用户窗体

本帖已被收录到知识树中,索引项:开发帮助和教程
技巧115         二级组合框
       在使用多个组合框输入数据时,往往希望后一个组合框中的条目能根据前一个组合框的内容有所不同,如示例中第二个选择城市的组合框根据第一个选择省份的组合框所选择的不同省份加载不同的县市名称,示例代码如下:
  1. #001  Private Sub UserForm_Initialize()
  2. #002      Dim col As New Collection
  3. #003      Dim arr As Variant
  4. #004      Dim rng As Range
  5. #005      Dim i As Integer
  6. #006      On Error Resume Next
  7. #007      For Each rng In Range("A2:A" & Sheet1.Range("A65536").End(xlUp).Row)
  8. #008          If rng <> "" Then col.Add rng, CStr(rng)
  9. #009      Next
  10. #010      ReDim arr(1 To col.Count)
  11. #011      For i = 1 To col.Count
  12. #012          arr(i) = col(i)
  13. #013      Next
  14. #014      ComboBox1.List = arr
  15. #015      ComboBox1.ListIndex = 0
  16. #016      CommandButton1.Accelerator = "D"
  17. #017  End Sub
  18. #018  Private Sub ComboBox1_Change()
  19. #019      Dim myAddress As String
  20. #020      Dim rng As Range
  21. #021      Dim mymsg As Integer
  22. #022      ComboBox2.Clear
  23. #023      With Sheet1.Range("A:A")
  24. #024          Set rng = .Find(What:=ComboBox1.Text)
  25. #025              If Not rng Is Nothing Then
  26. #026                  myAddress = rng.Address
  27. #027                  Do
  28. #028                      ComboBox2.AddItem rng.Offset(, 1)
  29. #029                      Set rng = .FindNext(rng)
  30. #030                  Loop While Not rng Is Nothing And rng.Address <> myAddress
  31. #031              End If
  32. #032          End With
  33. #033          ComboBox2.ListIndex = 0
  34. #034  End Sub
复制代码
代码解析:
       第1行到第17行代码窗体的Initialize事件过程,在窗体显示时将工作表A列中的省份名称去除重复后加载到组合框中。
       其中第7行到第13行代码把工作表A列中的省份名称使用Add方法去除重复后加载到组合框中,应用于Collection 对象的Add方法添加一个成员对象,请参阅技巧110 。
      第15行代码设置组合框的ListIndex属性为0,选中组合框的第一行条目。ListIndex属性指定当前选中的列表框或组合框条目,语法如下:
object.ListIndex [= Variant]
       参数Variant是可选的,控件中当前被选的条目。
       ListIndex 属性包含列表中被选行的索引,取值范围为 -1 到列表总行数减 1(即ListCount - 1)之间的数值。当用户没有选中行时,ListIndex 返回 -1。列表中第一行的 ListIndex值是0,第二行的ListIndex 值是1,依此类推。
       第16行代码设置窗体中按钮的Accelerator属性值。Accelerator属性设置或检索控件的加速键,语法如下:
object.Accelerator [= String]
       参数String是可选的,用作加速键的字符。
      先按住 Alt 再紧接着按加速键,会将焦点定位到该对象上,并初始化与该对象关联的一个或多个事件,也就是说窗体显示后按Alt+D组合键将会执行“关闭”按钮中的代码关闭窗体。
       第18行到第34行代码ComboBox1的Change事件过程,使用Find方法将所有属于ComboBox1所选择的省份的县市加载到ComboBox2中。关于Find方法请参阅技巧5-1。
       窗体运行后效果如图所示。
Snap3.jpg

技巧115 二级组合框.rar

37 KB, 下载次数: 1596

TA的精华主题

TA的得分主题

发表于 2009-4-8 18:17 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
哈哈,谢谢你的正需要这方面的东西的

TA的精华主题

TA的得分主题

发表于 2009-4-8 20:39 | 显示全部楼层

TA的精华主题

TA的得分主题

发表于 2009-4-8 23:10 | 显示全部楼层

TA的精华主题

TA的得分主题

 楼主| 发表于 2009-4-9 07:51 | 显示全部楼层

第8部分 控件与用户窗体

技巧116         使用DTP控件输入日期
       在工作表中输入日期可以使用日期时间控件(Microsoft Date and Time Picker Control 6.0,简称DTP控件)。
       在工作表中单击菜单“视图”→“工具栏”→“控件工具箱”,选择“其他控件”中的DTP控件如图所示,在工作表中添加一个DTP控件。
Snap2.jpg
       在设计模式下双击DTP控件写入下面的代码:
  1. #001  Private Sub Worksheet_SelectionChange(ByVal Target As Range)
  2. #002      With Me.DTPicker1
  3. #003          If Target.Count = 1 And Target.Column = 2 And (Not Target.Row = 1) Or Target.MergeCells Then
  4. #004              .Visible = True
  5. #005              .Top = Selection.Top
  6. #006              .Left = Selection.Left
  7. #007              .Height = Selection.Height
  8. #008              .Width = Selection.Width
  9. #009              If Target.Cells(1, 1) <> "" Then
  10. #010                  .Value = Target.Cells(1, 1).Value
  11. #011              Else
  12. #012                  .Value = Date
  13. #013              End If
  14. #014          Else
  15. #015              .Visible = False
  16. #016          End If
  17. #017      End With
  18. #018  End Sub
  19. #019  Private Sub DTPicker1_CloseUp()
  20. #020      ActiveCell.Value = Me.DTPicker1.Value
  21. #021      Me.DTPicker1.Visible = False
  22. #022  End Sub
  23. #023  Private Sub Worksheet_Change(ByVal Target As Range)
  24. #024      If Target.Count = 1 And Target.Column = 2 Or Target.MergeCells Then
  25. #025          If Target.Cells(1, 1).Value = "" Then
  26. #026              DTPicker1.Visible = False
  27. #027          End If
  28. #028      End If
  29. #029  End Sub
复制代码
代码解析:
       第1行到第18行代码工作表的SelectionChange事件,当选择工作表的B列第2行以下的单个单元格时显示日期控件供用户选择日期。
       其中第3行代码设置显示日期控件的触发条件。只有当用户选择B列第2行以下单元格且只能选择单个单元格时才显示日期控件,因为本例B列中存在合并单元格,所以需要加上Or Target.MergeCells这个条件,否则单击合并单元格不显示日期控件。
       第4行到第8行代码显示日期控件并设置日期控件的大小等于所选单元格的大小。
       第9行到第13行代码,如果单元格已经输入了日期,将单元格中的日期赋给日期控件,否则将当前日期赋给日期控件。因为本例B列中存在合并单元格,而合并区域的值在该区域左上角的单元格中指定,所以用Target.Cells(1, 1) 指定合并单元格的值,否则代码会出错。
       第15行代码如果选择的是其他列则隐藏日期控件。
       第19行到第22行代码日期控件的CloseUp事件,将日期控件的值赋给活动单元格后隐藏日期控件。
       第23行到第29行代码工作表的Change事件,如果删除了B列单元格的日期则隐藏日期控件。
      当用户选择B列单元格时效果如图所示。
Snap1.jpg

技巧116 使用DTP控件输入日期.rar

9.01 KB, 下载次数: 1493

TA的精华主题

TA的得分主题

发表于 2009-4-9 09:56 | 显示全部楼层

TA的精华主题

TA的得分主题

发表于 2009-4-9 19:30 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
VBA方面的,收藏了,谢谢啊

TA的精华主题

TA的得分主题

发表于 2009-4-9 19:32 | 显示全部楼层
VBA方面的,期待每天更新啊

TA的精华主题

TA的得分主题

发表于 2009-4-9 19:33 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
我学,故我思!学习并快乐着!

TA的精华主题

TA的得分主题

发表于 2009-4-9 23:54 | 显示全部楼层
代码解释很适合我,买了不书,看过不少代码,还是楼主的好!顶!!!!!!
您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

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

GMT+8, 2024-11-25 03:57 , Processed in 0.037147 second(s), 8 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

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

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

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