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-4-1 12:59 | 显示全部楼层
本帖已被收录到知识树中,索引项:开发帮助和教程
版主真是好人呀,精神可嘉,为了报答版主的辛苦,我一定认认真真的把这些学玩,

TA的精华主题

TA的得分主题

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

第8部分 控件与用户窗体

技巧112         允许多项选择的列表框
       一般情况下在显示的列表框中用户只能选择一个列表项,而经过简单的设置,列表框条目前可以显示选项按钮,允许进行多项选择,如下面的代码所示。
  1. #001  Private Sub UserForm_Initialize()
  2. #002      Dim arr As Variant
  3. #003      arr = Array("经理室", "办公室", "生技科", "财务科", "营业部", "制水车间", "污水厂", "安装公司", "其他")
  4. #004      With Me.ListBox1
  5. #005          .List = arr
  6. #006          .ListStyle = 1
  7. #007          .MultiSelect = 1
  8. #008      End With
  9. #009  End Sub
复制代码
代码解析:
       窗体的Initialize事件过程,在窗体初始化时对列表框进行设置。
       其中第5行代码使用List属性为列表框添加列表项,请参阅技巧109-2。
       第6行代码将列表框的ListStyle属性设置为1(fmListStyleOption),显示用于多重选择列表的复选框,ListStyle属性规定列表框或组合框中的列表的外观,语法如下:
object.ListStyle [= fmListStyle]
       参数object是必需的,一个有效的对象。
       参数fmListStyle是可选的,列表的可视风格,设置值如表格所示。
Snap10.jpg
       ListStyle 属性可用来改变列表框或组合框的可视外观。通过一种不同于 fmListStylePlain 的设置,可以将任意控件的内容作为一组单独项目演示,每个项目都包含一个可视记号用以表示它是否被选中。
       如果控件支持单一选择(MultiSelect属性被设置为mMultiSelectSingle),则可按下组中的一个按钮。如果控件支持多重选择,则可以按下组中两个或更多的按钮。
       第7行代码将MultiSelect属性设置为1(fmMultiSelectMulti),允许列表框进行多项选择,MultiSelect属性表示对象是否允许多项选择,语法如下:
object.MultiSelect [= fmMultiSelect]
       参数object是必需的,一个有效的对象。
       参数fmMultiSelect是可选的,控件所用的选择方式,设置值如表格所示。
Snap12.jpg
       经过以上设置,列表框显示时可以进行多项选择并且条目前都有一个选项按钮用以表示它是否被选中,如图所示。
Snap5.jpg
       如果将列表框的ListStyle属性设置为0则与常规的列表框相似。
       如果将列表框的MultiSelect属性设置0则列表框只能进行单项选择,如图所示。
Snap4.jpg
       通过列表框的Selected属性值可以判断列表框中条目的选定状态,如下面的代码所示。
  1. #001  Private Sub CommandButton1_Click()
  2. #002      Dim i As Integer
  3. #003      Dim s As String
  4. #004      For i = 0 To ListBox1.ListCount - 1
  5. #005          If ListBox1.Selected(i) = True Then
  6. #006              s = s & ListBox1.List(i) & Chr(13)
  7. #007          End If
  8. #008      Next
  9. #009      If s <> "" Then
  10. #010          MsgBox "你选择了:" & Chr(13) & s
  11. #011      Else
  12. #012          MsgBox "请最少选择一个部门!"
  13. #013      End If
  14. #014  End Sub
复制代码
代码解析:
       按钮的单击过程,将列表框中选中的条目使用消息框显示出来。
       第4行到第8行代码使用For...Next 语句循环遍历列表框所有条目,通过返回的Selected属性值判断列表框中条目的选定状态,如果处于选中状态,第6行代码将列表框选中条目的值赋给字符串变量s。
       Selected属性判断列表框中条目的选定状态,语法如下:
object.Selected( index ) [= Boolean]
       参数object是必需的,一个有效的对象。
       参数index是必需的,整数,取值范围是0到列表中的条目数减1之间的数值。
       参数Boolean是必需的,判断一个条目是否被选中。
       第9行到第13行代码使用消息框显示列表框中选中的条目。
       运行窗体结果如图所示。
Snap3.jpg

[ 本帖最后由 yuanzhuping 于 2009-4-1 16:45 编辑 ]

技巧112 许多项选择的列表框.rar

8.97 KB, 下载次数: 1329

TA的精华主题

TA的得分主题

发表于 2009-4-1 17:08 | 显示全部楼层

TA的精华主题

TA的得分主题

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

第8部分 控件与用户窗体

技巧113         多列组合框和列表框的设置
113-1        多列组合框和列表框添加列表项
       如果组合框和列表框是多列的话,除了使用技巧109 的方法外,还需要设置控件的其他属性,如下面的代码所示。
  1. #001  Private Sub UserForm_Initialize()
  2. #002      Dim iRow As Integer
  3. #003      Dim Arr As Variant
  4. #004      iRow = Sheet1.Range("A65536").End(xlUp).Row
  5. #005      Arr = Sheet1.Range("A1:G" & iRow)
  6. #006      With Me.ListBox1
  7. #007          .ColumnCount = 7
  8. #008          .ColumnWidths = "45,45,45,45,45,30,45"
  9. #009          .BoundColumn = 1
  10. #010          .Column = Application.WorksheetFunction.Transpose(Arr)
  11. #011      End With
  12. #012  End Sub
复制代码
代码解析:
       在窗体初始化时为多列列表框添加列表项。
       第4行代码,设置列表框显示的列数。ColumnCount 属性指定列表框或组合框的显示列数,语法如下:
object.ColumnCount [= Long]
       参数object是必需的,一个有效的对象。
       参数Long是可选的,指定需显示的列数。
       如果将ColumnCount设为 -1,将显示所有列。
       第8行代码,设置列表框各列的宽度。ColumnWidths 属性指定多列的组合框或列表框中的各列的宽度,语法如下:
object.ColumnWidths [= String]
       参数object是必需的,一个有效的对象。
       参数String是可选的,以磅为单位设置列的宽度。
       如将ColumnWidths 属性设为 -1 或空,则将控件宽度等分,给予列表中的各列。设为 0 则隐藏该列,大于 0 的数值则是该列的精确宽度值。若要指定另一种不同的度量单位,设置时必须包括该度量单位。
       第9行代码,设置多列列表框中的第一列为数据的来源。BoundColumn 属性标识多列组合框或列表框中的数据的来源,语法如下:
object.BoundColumn [= Variant]
       参数object是必需的,一个有效的对象。
       参数Variant是可选的,标识选择 BoundColumn 属性值的方法,设置值如表格所示:
Snap11.jpg
       当选择了多列列表框的一行时,BoundColumn 属性标识出将该行的哪一条目作为控件的值存储。BoundColumn属性设为 0,将所选行的行号赋予控件,作为控件的值。如果BoundColumn属性设为1 或者大于 1,则将指定列中的值赋予控件。
       第10行代码,设置多列列表框中列表的来源。在设置列表来源时除了可以使用技巧109 所介绍的方法外,还可以使用Column属性指定列表框中的一个或多个条目,Column属性语法如下:
object.Column( column, row ) [= Variant]
       参数object是必需的,一个有效对象。
       参数column是可选的,取值范围为0到总列数减1之间的数值。
       参数row是可选的,取值范围为0到总行数减1之间的数值。
       参数Variant是可选的,指定欲加载到列表框的一个值、一列值或一个二维数组。
注意   当从一个二维数组中复制数据时,使用Column属性将转置控件中数组的内容,所以在加载时需使用Transpose函数对数组进行转置。
       多列列表框设置完成后效果如图所示。
Snap1.jpg

113-1 多列组合框和列表框添加列表项.rar

10.91 KB, 下载次数: 1441

TA的精华主题

TA的得分主题

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

第8部分 控件与用户窗体

技巧113         多列组合框和列表框的设置
113-2        多列列表框写入工作表
       在把多列列表框的写入工作表中时,只能把BoundColumn属性所指定列中的值写入工作表中,不能把选中的整行内容写入到工作表中。如果需要把多列列表框中选中行的整行内容写入工作表中,可以使用循环语句将列表框各列的写入工作表,如下面的代码所示。
  1. #001  Private Sub UserForm_Initialize()
  2. #002      Dim iRow As Integer
  3. #003      iRow = Sheet2.Range("A65536").End(xlUp).Row
  4. #004      With Me.ListBox1
  5. #005          .ColumnCount = 7
  6. #006          .ColumnWidths = "45,45,45,45,45,30,45"
  7. #007          .BoundColumn = 1
  8. #008          .ColumnHeads = True
  9. #009          .RowSource = Sheet2.Range("A2:G" & iRow).Address(External:=True)
  10. #010      End With
  11. #011  End Sub
  12. #012  Private Sub ListBox1_Click()
  13. #013      Dim iRow As Integer
  14. #014      Dim i As Byte
  15. #015      iRow = Sheet1.Range("A65536").End(xlUp).Row + 1
  16. #016      For i = 1 To ListBox1.ColumnCount
  17. #017          Sheet1.Cells(iRow, i) = ListBox1.Column(i - 1)
  18. #018      Next
  19. #019  End Sub
复制代码
代码解析:
       第1行到第11行代码窗体的Initialize事件过程,在窗体初始化时为多列列表框添加列表项,请参阅技巧113-1。
       第8行代码,设置多列列表框中的第一行为列标题行。ColumnHeads 属性显示列表框、组合框及接受列题注的对象中的列标题行,语法如下:
object.ColumnHeads [= Boolean]
       参数object是必需的,一个有效的对象。
       参数Boolean是可选的,指定是否显示列标题。
       将ColumnHeads 属性设置为True,多列列表框的第一行显示为列标题,默认值为False,不显示列标题。
       需要注意的是,当数据项中的第一行作为列标题时,则不可选中该行。
       第9行代码,使用RowSource属性设置多列列表框中列表的来源。关于RowSource属性请参阅技巧109-1。
注意 如果已将多列列表框中列表项来源的第一行设置为列标题,在设置RowSource属性时应从列表项来源的第二行开始设置。
       第12行到第19行代码列表框的Click事件,单击多列列表框时把选中行的整行内容写入工作表中。其中第17行代码,使用循环语句将多列列表框选中行的各列的值写入工作表对应的单元格中。关于Column属性请参阅技巧113-1,在本例中没有指定row参数,所以是把当前选中行的内容写入工作表。
       运行窗体后,单击列表框将选中的整行内容写入工作表中,如图所示。
Snap2.jpg

113-2 多列列表框写入工作表.rar

14.1 KB, 下载次数: 1400

TA的精华主题

TA的得分主题

发表于 2009-4-1 23:54 | 显示全部楼层

TA的精华主题

TA的得分主题

发表于 2009-4-2 12:32 | 显示全部楼层
楼主,你真是太强大了,我好崇拜你,你是真是我的偶像!!!!!

TA的精华主题

TA的得分主题

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

TA的精华主题

TA的得分主题

发表于 2009-4-3 09:25 | 显示全部楼层

求助

我想合并第一行内容相同的单元格,参照LZ在单元格合并里面的介绍些了以小段代码,可是不知道为什么这段代码哪里有问题,请LZ指点
Sub Macro3()
' Macro3 Macro
Sheets("Sheet2").Select
      Dim b As Integer
      Dim i As Integer
      Application.DisplayAlerts = False
      With Sheet2
           b = [1:1].Find("*", , xlValues, , , 2).Column
          For i = b To 2 Step -1
              If .Cells(1, i).Value = .Cells(1, i - 1).Value Then
                 .Range(.Cells(1, i - 1), .Cells(1, i)).Merge
             End If
          Next
      End With
      Application.DisplayAlerts = True
End Sub

TA的精华主题

TA的得分主题

发表于 2009-4-3 11:35 | 显示全部楼层
您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

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

GMT+8, 2024-5-1 13:06 , Processed in 0.056955 second(s), 7 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

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

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

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