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-3-30 22:31 | 显示全部楼层
本帖已被收录到知识树中,索引项:开发帮助和教程
一本好书 !!!!!
学习中。。。。。。。。。

TA的精华主题

TA的得分主题

 楼主| 发表于 2009-3-31 07:26 | 显示全部楼层

第8部分 控件与用户窗体

技巧108         高亮显示按钮
       为了达到当鼠标掠过按钮时以高亮和凸起显示按钮的效果,可以在窗体和按钮的MouseMove事件中进行模拟,如下面的代码所示。
  1. #001  Private Sub CommandButton1_MouseMove(ByVal Button As Integer, ByVal Shift As Integer, ByVal X As Single, ByVal Y As Single)
  2. #002      With Me.CommandButton1
  3. #003          .BackColor = &HFFFF00
  4. #004          .Width = 62
  5. #005          .Height = 62
  6. #006          .Top = 69
  7. #007          .Left = 31
  8. #008      End With
  9. #009  End Sub
  10. #010  Private Sub UserForm_MouseMove(ByVal Button As Integer, ByVal Shift As Integer, ByVal X As Single, ByVal Y As Single)
  11. #011      With Me.CommandButton1
  12. #012          .BackColor = Me.BackColor
  13. #013          .Width = 60
  14. #014          .Height = 60
  15. #015          .Top = 70
  16. #016          .Left = 32
  17. #017      End With
  18. #018  End Sub
复制代码
代码解析:
     窗体和按钮的MouseMove事件过程,以高亮和凸起显示按钮。
     当用户在窗体中移动鼠标时,分别在窗体和按钮的MouseMove事件设置按钮的BackColor属性值,指定按钮的背景色,当鼠标移动到按钮时以高亮显示,当鼠标移动到窗体时恢复原来的设置。接下来分别设置按钮不同的Width属性、Height属性、Top属性和Left属性值,以模拟按钮凸起的效果。
运行窗体,当鼠标掠过按钮时效果如图所示。
Snap3.jpg

技巧108 高亮显示按钮.rar

7.73 KB, 下载次数: 1106

TA的精华主题

TA的得分主题

发表于 2009-3-31 09:40 | 显示全部楼层

TA的精华主题

TA的得分主题

发表于 2009-3-31 15:22 | 显示全部楼层

TA的精华主题

TA的得分主题

发表于 2009-3-31 15:46 | 显示全部楼层

TA的精华主题

TA的得分主题

 楼主| 发表于 2009-3-31 17:08 | 显示全部楼层

第8部分 控件与用户窗体

技巧109         组合框和列表框添加列表项的方法
       组合框和列表框是Excel中最常用的控件,可以用来显示工作表中的数据。为组合框和列表框添加列表项的方法有多种,下面以列表框为例演示添加列表项的方法。
109-1        使用RowSource属性添加列表项
       使用RowSource属性将列表框直接与工作表上的一个单元格区域相链接,如下面的代码所示。
  1. #001  Private Sub UserForm_Initialize()
  2. #002      Dim iRow As Integer
  3. #003      iRow = Sheet1.Range("A65536").End(xlUp).Row
  4. #004      Me.ListBox1.RowSource = "sheet1!a1:a" & iRow
  5. #005  End Sub
复制代码
代码解析:
      在窗体初始化时使用RowSource属性为列表框添加列表项。
       RowSource属性的语法如下:
object.RowSource [= String]
       参数object是必需的,一个有效的对象。
       参数String是可选的,组合框或列表框列表的来源。
       RowSource属性也可以使用单元格地址,第4行代码可以改成下面的代码:
Me.ListBox1.RowSource = Sheet1.Range("A1:A" & iRow).Address(External:=True)
       需要注意的是,如果RowSource属性指定的工作表区域不是活动工作表的话,Address属性的External参数是不可缺的,设置为True表示是外部引用,如果缺省此参数或为False,将不能为列表框添加列表项。
       RowSource属性还可以使用命名的单元格区域,如果已把工作表区域命名为“城市”,第4行代码可以改成下面的代码:
Me.ListBox1.RowSource = "城市"
       对于工作表中的列表框控件或使用窗体添加的列表框控件不能使用RowSource属性,需要使用ListFillRange属性指定填充列表框的工作表区域,如下面的代码所示。
  1. #001  Sub ListFillRange()
  2. #002      Dim iRow As Integer
  3. #003      iRow = Sheet1.Range("A65536").End(xlUp).Row
  4. #004      Sheet2.ListBox1.ListFillRange = "Sheet1!a1:a" & iRow
  5. #005      Sheet2.Shapes("列表框").ControlFormat.ListFillRange = "Sheet1!a1:a" & iRow
  6. #006  End Sub
复制代码
代码解析:
       ListFillRange过程为工作表中的列表框的填充区域,ListFillRange属性用于指定填充列表框的工作表区域。
       对于使用窗体添加的列表框控件需要使用ControlFormat属性来返回窗体控件以后才能设置其ListFillRange属性。

109-1 使用RowSource属性添加列表项.rar

16.09 KB, 下载次数: 1443

TA的精华主题

TA的得分主题

 楼主| 发表于 2009-3-31 17:37 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册

第8部分 控件与用户窗体

技巧109         组合框和列表框添加列表项的方法
109-2        使用List属性添加列表项
       使用List属性为列表框添加列表项,如下面的代码所示。
  1. #001  Private Sub UserForm_Initialize()
  2. #002      Dim Arr As Variant
  3. #003      Dim iRow As Integer
  4. #004      iRow = Sheet1.Range("A65536").End(xlUp).Row
  5. #005      Arr = Sheet1.Range("A1:A" & iRow)
  6. #006      Me.ListBox1.List = Arr
  7. #007  End Sub
复制代码
代码解析:
       在窗体初始化时使用List属性为列表框添加列表项。
       List属性的语法如下:
object.List( row, column ) [= Variant]
       参数object是必需的,一个有效对象。
       参数row是必需的,取值范围为 0 到列表条目数减 1 之间的数值。
       参数column是必需的,取值范围为 0 到总列数减 1 之间的数值。
       参数Variant是可选的,列表框中指定条目的内容。
       第6行代码,使用List属性把数组复制到列表框控件上。
       除了使用数组外,List属性还可以使用命名的单元格区域,如果已把工作表区域命名为“城市”,可以改成下面的代码:
  1. #001  Private Sub UserForm_Initialize()
  2. #002      Me.ComboBox1.List = Range("城市").Value
  3. #003  End Sub
复制代码
对于工作表中使用窗体添加的列表框控件使用List属性添加列表项,如下面的代码所示。
  1. #001  Sub List()
  2. #002      Dim Arr As Variant
  3. #003      Dim iRow As Integer
  4. #004      Dim myObj As Object
  5. #005      iRow = Sheet1.Range("A65536").End(xlUp).Row
  6. #006      Arr = Sheet1.Range("A1:A" & iRow)
  7. #007      Set myObj = Sheet2.Shapes("列表框 10").ControlFormat
  8. #008      myObj.List = Arr
  9. #009  End Sub
复制代码
代码解析:
       List过程设置列表框的List性,用于指定填充列表框的工作表区域。

[ 本帖最后由 yuanzhuping 于 2009-3-31 17:43 编辑 ]

109-2 使用List属性添加列表项.rar

10.32 KB, 下载次数: 1260

TA的精华主题

TA的得分主题

 楼主| 发表于 2009-3-31 17:51 | 显示全部楼层

第8部分 控件与用户窗体

技巧109         组合框和列表框添加列表项的方法
109-3        使用AddItem方法添加列表项
       使用AddItem方法添加列表项,对于单列的列表框,在列表中添加一项。对于多列的列表框,在列表中添加一行,如下面的代码所示。
  1. #001  Private Sub UserForm_Initialize()
  2. #002      Dim iRow As Integer
  3. #003      Dim i As Integer
  4. #004      iRow = Sheet1.Range("A65536").End(xlUp).Row
  5. #005      For i = 1 To iRow
  6. #006          Me.ListBox1.AddItem (Sheet1.Cells(i, 1))
  7. #007      Next
  8. #008  End Sub
复制代码
代码解析:
       在窗体初始化时使用AddItem方法为列表框添加列表项。
       AddItem方法的语法如下:
object.AddItem [ item [, varIndex]]
       参数object是必需的,一个有效的对象。
       参数item是可选的,指定要添加的项或行。第一个项或行的编号为 0;第二个项或行的编号为 1,依此类推。
       参数varIndex是可选的,指定新的项或行在对象中的位置。
       如果提供一个有效的varIndex的值,AddItem方法就把项或行放在列表中的那个位置。如果忽略 varIndex,此方法就把项或行添加在列表的末尾。对于多列列表框或者组合框,AddItem 方法插入一个完整的行,为控件的每一列都插入一项。为了给第一列后面的项赋值,可用List或Column属性来规定项的行和列。
       对于工作表中使用窗体添加的列表框控件使用AddItem方法添加列表项,如下面的代码所示。
  1. #001  Sub AddItem()
  2. #002      Dim iRow As Integer
  3. #003      Dim i As Integer
  4. #004      iRow = Sheet1.Range("A65536").End(xlUp).Row
  5. #005      With Sheet2.Shapes("列表框").ControlFormat
  6. #006          .RemoveAllItems
  7. #007          For i = 1 To iRow
  8. #008              .AddItem Sheet1.Cells(i, 1)
  9. #009          Next
  10. #010      End With
  11. #011  End Sub
复制代码
代码解析:
       AddItem过程设置使用AddItem方法添加为工作表中使用窗体控件添加的列表框添加列表项。
       其中第5行代码使用ControlFormat属性来返回窗体控件,第6行代码使用RemoveAllItems方法删除窗体控件中的列表框的所有数据项,如果控件是ActiveX 列表框则需要使用Clear方法。

109-3 使用AddItem方法添加列表项.rar

12.39 KB, 下载次数: 1216

TA的精华主题

TA的得分主题

发表于 2009-3-31 20:35 | 显示全部楼层

TA的精华主题

TA的得分主题

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

第8部分 控件与用户窗体

技巧110         去除列表框数据源的重复值和空格
       列表框的数据源引用工作表的数据时,如果工作表数据有重复值和空格,列表框也会出现重复值和空格,如图所示。
Snap1.jpg
       为了在窗体显示时去除列表框的重复值和空格,可以使用Add方法,如下面的代码所示。
  1. #001  Private Sub UserForm_Initialize()
  2. #002      On Error Resume Next
  3. #003      Dim Col As New Collection
  4. #004      Dim rng As Range, arr
  5. #005      Dim i As Integer
  6. #006      For Each rng In Range("A1:A" & [a65536].End(xlUp).Row)
  7. #007          If Trim(rng) <> "" Then
  8. #008              Col.Add rng, key:=CStr(rng)
  9. #009          End If
  10. #010      Next
  11. #011      ReDim arr(1 To Col.Count)
  12. #012      For i = 1 To Col.Count
  13. #013          arr(i) = Col(i)
  14. #014      Next
  15. #015      Me.ListBox1.List = arr
  16. #016  End Sub
复制代码
代码解析:
       窗体的初始化事件,去除列表框引用工作表数据中的重复值和空格。
       第2行代码,错误处理语句,忽略错误。
       第3行到第5行代码,声明变量类型。
       第6行到第9行代码代码,在列表框引用的工作表数据中循环,把工作表数据源中的空格去除后使用Add方法添加到变量Col中。Add方法添加一个成员到Collection 对象,语法如下:
object.Add item, key, before, after
       参数object是必需的,一个有效的对象。
       参数Item是必需的,任意类型的表达式,指定要添加到集合中的成员。
       参数Key是可选的,唯一字符串表达式,指定可以使用的键字符串,代替位置索引来访问集合中的成员。
       如果指定的key和集合中现有成员的key发生重复,则会导致错误发生。所以在第2行代码中使用错误处理语句,忽略错误,继续执行下一句代码,这样就将数据源中的重复值去除。
       参数before是可选的,指定集合中的相对位置。在集合中将添加的成员放置在before参数识别的成员之前。如果参数是数值表达式,则before必须是介于 1 和集合Count属性值之间的值。如果参数是字符串表达式,则当添加一个被引用的成员到集合时,before 必须对应于指定的key值。可以指定before位置或after位置,但不能同时指定这两个位置。
       参数after是可选的,指定集合中的相对位置。在集合中将添加的成员放置在After参数识别的成员之后。如果参数是数值表达式,则after必须是介于 1 和集合Count属性值之间的值;如果参数是字符串表达式,则当添加一个被引用的成员到集合时,after 必须对应于指定的key值。可以指定before位置或after位置,但不能同时指定这两个位置。
       第10行到第14行代码,重新定义数组arr大小,把Col中数据赋给数组。
       第15行代码,把数组arr复制到列表框中。
       运行窗体,窗体中的列表框引用去除重复值和空格后的工作表数据,如图所示。
Snap2.jpg
技巧110 去除列表框数据源的重复值和空格.rar (10.73 KB, 下载次数: 1025)


技巧111         移动列表框条目
       将列表框中的条目进行上下移动,如下面的代码所示。
  1. #001  Dim Intlist As Integer
  2. #002  Dim Strlist As String
  3. #003  Private Sub CommandButton1_Click()
  4. #004      With Me.ListBox1
  5. #005          Intlist = .ListIndex
  6. #006          Select Case Intlist
  7. #007              Case -1
  8. #008                  MsgBox "请选择一行后再移动!"
  9. #009              Case 0
  10. #010                  MsgBox "已经是最上一行了!"
  11. #011              Case Is > 0
  12. #012                  Strlist = .List(Intlist)
  13. #013                  .List(Intlist) = .List(Intlist - 1)
  14. #014                  .List(Intlist - 1) = Strlist
  15. #015                  .ListIndex = Intlist - 1
  16. #016          End Select
  17. #017      End With
  18. #018  End Sub
  19. #019  Private Sub CommandButton2_Click()
  20. #020      With ListBox1
  21. #021          Intlist = .ListIndex
  22. #022          Select Case Intlist
  23. #023              Case -1
  24. #024                  MsgBox "请选择一行后再移动!"
  25. #025              Case .ListCount - 1
  26. #026                  MsgBox "已经是最下一行了!"
  27. #027              Case Is < .ListCount - 1
  28. #028                  Strlist = .List(Intlist)
  29. #029                  .List(Intlist) = .List(Intlist + 1)
  30. #030                  .List(Intlist + 1) = Strlist
  31. #031                  .ListIndex = Intlist + 1
  32. #032          End Select
  33. #033      End With
  34. #034  End Sub
复制代码
代码解析:
       第1、2行代码在模块顶部声明两个变量分别用于保存列表框当前选中行的索引和内容。
       第3行到第18行代码,将列表框当前选中行的内容上移一行的代码。其中第5行代码使用变量Intlist保存列表框当前选中行的索引号,第6行代码判断索引号,,第7、8行代码如果变量Intlist值为-1 ,说明当前没有选中的行,显示一个消息框进行提示。第9、10行代码变量Intlist值为0 ,说明当前选中的行已是第一行了。
       列表框的ListIndex属性指定当前选中的列表框或组合框条目,语法如下:
object.ListIndex [= Variant]
       参数object是必需的,一个有效的对象。
       参数Variant是可选的,控件中当前被选的条目。
       第11行到第15行代码将当前选中的行向下移动一行,其中第12行代码将当前选中的行的内容赋给变量Strlist,第13行代码将当前选中行的内容更改为下面一行的内容,第14行代码将当前选中行的下面一行的内容更改为变量Strlist保存的内容,第15行代码将选中行向下移动一行,这样就将当前选中的行向下移动了一行。
       第19行到第34行代码将当前选中的行向上移动一行。
       将移动后的列表框条目保存到工作表中的代码如下:
  1. #001  Private Sub CommandButton3_Click()
  2. #002      Dim i As Integer
  3. #003      For i = 1 To ListBox1.ListCount
  4. #004          Sheet1.Cells(i + 1, 1) = ListBox1.List(i - 1)
  5. #005      Next
  6. #006  End Sub
复制代码
代码解析:
       窗体中“保存”按钮的单击过程,将移动后的列表框条目保存到工作表。
       第3行到第5行代码使用For...Next 语句循环遍历列表框所有条目,将List属性返回的列表框的列表条目写入到工作表中。List属性返回或设置列表框或组合框的列表条目数,语法请参阅技巧109-2。
       运行窗体效果如所示。
Snap2.jpg

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

技巧111 移动列表框条目.rar

10.01 KB, 下载次数: 1132

评分

1

查看全部评分

您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

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

GMT+8, 2024-5-1 15:29 , Processed in 0.050746 second(s), 11 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

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

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

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