在北京朝阳区望京soho,苹果6进水了,要怎么办,北京苹果手机维修地址?

Excel VBA教程:Caption属性
Excel VBA教程:Caption属性
- Caption属性
Excel VBA教程:Caption属性
应用于 Application对象的 Caption属性。
显示在 Microsoft Excel 主窗口标题栏中的名称。如果未设置该名称,或将其设置为 Empty,
则本属性返回“Microsoft Excel”。String 类型,可读写。
expression.Caption
expression&& 必需。该表达式返回上面的对象之一。&
AxisTitle对象的 Caption属性。
坐标轴标题文本。String 类型,可读写。
expression.Caption
expression&& 必需。该表达式返回上面的对象之一。&
Characters对象的 Caption属性。
该字符范围内的文本。String 类型,只读。
expression.Caption
expression&& 必需。该表达式返回上面的对象之一。&
ChartTitle对象的 Caption属性。
图表标题文本。String 类型,只读。
expression.Caption
expression&& 必需。该表达式返回上面的对象之一。&
DataLabel对象的 Caption属性。
数据标签文本。String 类型,只读。
expression.Caption
expression&& 必需。该表达式返回上面的对象之一。&
DisplayUnitLabel对象的 Caption属性。
显示单位标志文本。String 类型,只读。
expression.Caption
expression&& 必需。该表达式返回上面的对象之一。&
PivotField对象的 Caption属性。
数据透视表字段的标志文本。String 类型,只读。
expression.Caption
expression&& 必需。该表达式返回上面的对象之一。&
PivotItem对象的 Caption属性。
数据透视表数据项的标志文本。String 类型,只读。
expression.Caption
expression&& 必需。该表达式返回上面的对象之一。&
应用于 CubeField对象的 Caption属性。
多维数据集字段的标志文本。String 类型,只读。
expression.Caption
expression&& 必需。该表达式返回上面的对象之一。&
应用于 Window对象的 Caption属性。
显示在文档窗口标题栏中的名称。如果设置了该名称,就可用该名称作为 Windows属性的索引(参见第二个示例)。Variant 类型,可读写。
expression.Caption
expression&& 必需。该表达式返回上面的对象之一。&
下表显示 Caption属性及其相关属性的示例值,假设存在一个具有唯一名称为“[Europe].[France].[Paris]”的OLAP 数据源,并且存在一个包含名为“Paris”项的非 OLAP 数据源。
值(OLAP 数据源)
值(非 OLAP 数据源)
[Europe].[France].[Paris](只读)
SourceName
[Europe].[France].[Paris] (只读)
(与 SQL属性值相同;只读)
[Europe].[France].[Paris] (只读)
当在集合中指定一个索引值时,可使用下表所示的语法。
语法(OLAP 数据源)
语法(非 OLAP 数据源)
expression.PivotItems("[Europe].[France].[Paris]")
expression.PivotItems("Paris")
在使用属性引用集合中的特定成员时,可以使用下表所示的文字索引名称。
名称(OLAP 数据源)
名称(非 OLAP 数据源)
[Europe].[France].[Paris]
Excel VBA教程:Caption属性·示例
本示例将出现在 Microsoft Excel 主窗口标题栏中的名称设置为自定义的名称。
Application.Caption = "Blue Sky Airlines Reservation System"
本示例将活动工作簿中第一个窗口的名称设置为“Consolidated Balance Sheet”。然后该名称被用作 Windows属性的索引。
ActiveWorkbook.Windows(1).Caption = "Consolidated Balance Sheet"
ActiveWorkbook.Windows("Consolidated Balance Sheet") _
.ActiveSheet.Calculate
上页: 下页:
Excel VBA教程:Caption属性
- Caption属性
版权所有 &  证书:粤ICP备号VBA基础入门
VBA最最基础入门用户窗体-----------------------用户窗体(UseFom对象)是VBA的另一类对象。它表现出来是一个窗口或对话框,如前面我们说的MsgBox与InputBox语句弹出来的都属于窗体。使用窗体可以提供一个形象的用户界面。同我们可以在工作表(WokSheet)上在添加不同的控件一样,在这个界面上,我们可以添加命令按钮、标签、图像、列表框等控件,用户可以通过修改控件的属性、编写不同的事件过程在程序运行过程中与程序进行交互。1、添加窗体如果你还没有忘记怎么插入模块?那请用同样的方法插入一个用户窗体。Alt+F11快捷键打开VBE编辑窗口,在工程资源管理器窗口中单击右键,选择“插入——用户窗体”命令。Excel为用户窗体取名,同为工作表、按钮等取名一样,采用“老大,老二,老三,,,,”的取名方式。所以新插入的用户窗体默认名称为“UseFom1”,如果再继续插入窗体,就是“UseFom2”,接着是“UseFom3”,,,,当然,你可以为它重新取一个你喜欢的名字,新名字叫大花二花,或者是大狗二狗,随你了,为了方便学习,这里我们统一为其更名为“我的窗体”,方法为:在工程资源管理器中双击窗体对象,在属性窗口中重新修改“(名称)”(对象的name属性)为“我的窗体”即可。修改完成后,可以在工程资源管理器窗口中看到相应的名称已经改变了。这时,窗体的“名称”已经修改好了,再看看窗体,左上角还显示着“UseFom1”,这就相当于贴在一个按钮表面的标签,想要修改它,只需要修改对象的“Caption”属性即可。用改“名称”的方法,我们把这个窗体的“Caption”属性修改为“我的第一个VBA窗体”。就像你家里贴的地板一样,新建的窗体的大小样子都一样。但是我们根据自己的需要对其进行美化或修改。如大小,背景颜色,背景图片等等,我们可以手动在属性窗口里对其进行修改,也可以程序中用代码进行修改。如修改该窗体的宽度,代码设置为:1.我的窗体.Width=500'500是你需要修改后的宽度,以磅(Point)为单位2.复制代码动手试一试,在属性窗口里设置“我的窗体”宽300Point(Width属性),高200Point(Height属性)。
& 果果文库所有资源均来源于互联网,仅供网友学习交流,若侵犯了您的权益,请联系我们予以删除。
15287&&人浏览
10713&&人浏览
6094&&人浏览
9616&&人浏览
540&&人浏览
9177&&人浏览
18455&&人浏览
10822&&人浏览
8673&&人浏览
7012&&人浏览
17018&&人浏览
11044&&人浏览
9373&&人浏览
13241&&人浏览
19445&&人浏览
本文标题:VBA基础入门 链接地址:
copyright@ 2013- Inc. All Rights Reserved 果果文库 版权所有 联系站长: ; 经营许可证编号:浙ICP备号您的访问出错了(404错误)
很抱歉,您要访问的页面不存在。
1、请检查您输入的地址是否正确。
进行查找。
3、感谢您使用本站,3秒后自动跳转至网站首页当前位置: >>
Excel VBA常用技巧 第08章 控件与用户窗体
VBA 常用技巧代码解析VBA 常用技巧 目录VBA 常用技巧 ................................................................................................................................... 1 第8章 控件与
用户窗体 ................................................................................................... 4 技巧 1 限制文本框的输入 ........................................................................................... 4 技巧 2 文本框添加右键快捷菜单 ............................................................................... 6 技巧 3 文本框回车自动输入 ..................................................................................... 10 技巧 4 自动选择文本框内容 ..................................................................................... 11 技巧 5 设置文本框数据格式 ..................................................................................... 12 技巧 6 限制文本框的输入长度 ................................................................................. 14 技巧 7 将光标返回文本框中 ..................................................................................... 15 技巧 8 文本框的自动换行 ......................................................................................... 17 技巧 9 多个文本框数据相加 ..................................................................................... 19 技巧 10 控件跟随活动单元格 ................................................................................... 20 技巧 11 高亮显示按钮 ............................................................................................... 21 技巧 12 组合框和列表框添加列表项的方法 ........................................................... 23 12-1 使用 RowSource 属性添加列表项 ............................................................ 23 12-2 使用 List 属性添加列表项 ........................................................................ 24 12-3 使用 AddItem 方法添加列表项 ................................................................ 25 技巧 13 去除列表框数据源的重复值和空格 ........................................................... 27 技巧 14 移动列表框条目 ........................................................................................... 29 技巧 15 允许多项选择的列表框 ............................................................................... 32 技巧 16 多列组合框和列表框的设置 ....................................................................... 35 16-1 多列组合框和列表框添加列表项............................................................. 35 16-2 多列列表框写入工作表............................................................................. 37 技巧 17 输入时逐步提示信息 ................................................................................... 39 技巧 18 二级组合框 ................................................................................................... 46 技巧 19 使用 DTP 控件输入日期 ............................................................................. 48 技巧 20 使用 RefEdit 控件选择区域 ........................................................................ 51 技巧 21 如何注册控件 ............................................................................................... 52 技巧 22 遍历控件的方法 ........................................................................................... 55 22-1 使用名称中的变量遍历控件..................................................................... 55 22-2 使用对象类型遍历控件............................................................................. 57 22-3 使用程序标识符遍历控件......................................................................... 58 22-4 使用名称中的变量遍历图形..................................................................... 59 22-5 使用 FormControlType 属性遍历图形 ...................................................... 60 技巧 23 使微调框最小变动量小于 1 ........................................................................ 61 技巧 24 不打印工作表中的控件 ............................................................................... 63 24-1 设置控件格式 ............................................................................................ 63 24-2 设置控件的 printobjcet 属性 ..................................................................... 651 VBA 常用技巧代码解析技巧 25 技巧 26 技巧 27 技巧 28 技巧 29 技巧 30 技巧 31 31-1 31-2 技巧 32 32-1 32-2 技巧 33 技巧 34 34-1 34-2 34-3 34-4 34-5 技巧 35 技巧 36 36-1 36-2 技巧 37 技巧 38 技巧 39 技巧 40 技巧 41 技巧 42 技巧 43 技巧 44 技巧 45 技巧 46 技巧 47 技巧 48 技巧 49 49-1 49-2 技巧 50 技巧 51 技巧 52 技巧 53 技巧 54 54-1在框架中使用滚动条 ................................................................................... 65 使用多页控件 ............................................................................................... 67 标签文字垂直居中对齐 ............................................................................... 69 使用 TabStrip 控件 ....................................................................................... 71 显示 GIF 动画图片 ...................................................................................... 73 播放 Flash 文件 ............................................................................................ 76 在工作表中添加窗体控件 ........................................................................... 78 使用 AddFormControl 方法 ....................................................................... 79 使用 Add 方法............................................................................................ 81 在工作表中添加 ActiveX 控件 ................................................................... 83 使用 Add 方法............................................................................................ 84 使用 AddOLEObject 方法 ......................................................................... 86 使用 spreadsheet 控件 .................................................................................. 87 使用 Listview 控件 ....................................................................................... 90 使用 Listview 控件显示数据列表............................................................. 90 在 Listview 控件中使用复选框................................................................. 93 调整 Listview 控件的行距......................................................................... 95 在 Listview 控件中排序............................................................................. 98 Listview 控件的图标设置........................................................................... 99 调用非模式窗体 ......................................................................................... 102 进度条的制作 ............................................................................................. 104 使用进度条控件 ...................................................................................... 104 使用标签控件 .......................................................................................... 106 使用 TreeView 控件显示层次 ................................................................... 109 用户窗体添加图标 ..................................................................................... 113 用户窗体添加最大最小化按纽 ................................................................. 115 禁用窗体标题栏的关闭按钮 ..................................................................... 116 屏蔽窗体标题栏的关闭按钮 ..................................................................... 117 无标题栏和边框的窗体 ............................................................................. 119 制作年月选择窗体 ..................................................................................... 120 自定义窗体中的鼠标指针类型 ................................................................. 123 调整窗体的显示位置 ................................................................................. 124 由鼠标确定窗体显示位置 ......................................................................... 126 用户窗体的打印 ......................................................................................... 127 使用自定义颜色设置窗体颜色 ................................................................. 129 在窗体中显示图表 ..................................................................................... 130 使用 Export 方法...................................................................................... 130 使用 API 函数 .......................................................................................... 132 窗体运行时调整控件大小 ......................................................................... 133 在用户窗体上添加菜单 ............................................................................. 136 在用户窗体上添加工具栏 ......................................................................... 140 使用代码添加窗体及控件 ......................................................................... 145 用户窗体的全屏显示 ................................................................................. 151 设置用户窗体为应用程序的大小........................................................... 1512 VBA 常用技巧代码解析54-2 根据屏幕分辨率进行设置....................................................................... 152 技巧 55 在用户窗体上添加状态栏 ......................................................................... 1533 VBA 常用技巧代码解析第8章控件与用户窗体技巧1限制文本框的输入用户在使用文本框输入数据时,往往希望能限制输入数据的类型,比如只能输入数字。 但是没有内置的属性能限制在文本框中只能输入数字, 只能在文本框的事件过程中使用代码 来测试输入的是哪类字符,然后只允许输入数字字符和一个“-”号、一个“.”号,如下面 的代码所示。#001 Private Sub TextBox1_KeyPress(ByVal KeyANSI As MSForms.ReturnInteger) #002 #003 #004 #005 #006 #007 #008 #009 #010 #011 #012 #013 #014 #015 Select Case KeyANSI Case Asc(&0&) To Asc(&9&) Case Asc(&-&) If InStr(1, Me.TextBox1.Text, &-&) & 0 Or _ Me.TextBox1.SelStart & 0 Then KeyANSI = 0 End If Case Asc(&.&) If InStr(1, Me.TextBox1.Text, &.&) & 0 Then KeyANSI = 0 End If Case Else KeyANSI = 0 End Select#016 End Sub代码解析: 文本框的 KeyPress 事件过程,测试键盘输入的是哪类字符,只允许输入数字字符和一 个“-”号、一个“.”号。4 VBA 常用技巧代码解析KeyPress 事件的语法如下:Private Sub object_KeyPress( ByVal KeyANSI As MSForms.ReturnInteger)参数 Object 是必需的,一个有效的对象。 参数 KeyANSI 是可选的,整数值,代表标准的数字 ANSI 键代码。 第 2 行代码使用 Case Else 语句测试文本框 KeyPress 事件的 KeyANSI 参数值。 第 3 行代码,如果键盘输入的是 0 到 9 之间的数字字符,则允许输入。如果想在文本 框中允许其它类型的字符输入,在此句代码中列出允许输入的字符即可。 第 4 行到第 8 行代码,如果键盘输入的是“-”号,先使用 InStr 函数测试文本框中是否 已有“-”号,如果 InStr 函数返回值大于 0,说明文本框中已有“-”号。接下来使用文本 框的 SelStart 属性来测试插入点,如果文本框的 SelStart 属性值大于 0,说明“-”号的插 入点不是第一个。如果以上两个条件中有任何一个成立,将 KeyAscii 参数值设置为 0,使 文本框只能在第一位输入一个“-”号。 第 9 行到第 12 行代码,如果键盘输入的是“.”号的话,使用 InStr 函数测试文本框中 是否已有“.”号,如果已有“.”号,将 KeyAscii 参数值设置为 0,使文本框只能输入一个 “.”号。 第 13、14 行代码,如果键盘输入的是其他字符则将 KeyAscii 参数值设置为 0,使文本 框不能输入其他字符。 经过以上设置文本框只允许输入数字字符和一个“-”号、一个“.”号,但是能输入中 文字符。如果希望限制中文字符的输入,可以在文本框的 Change 事件中进行设置,如下面 的代码所示。#001 Private Sub TextBox1_Change() #002 #003 #004 #005 #006 #007 #008 #009 #010 #011 #012 #013 Dim i As Integer Dim s As String With TextBox1 For i = 1 To Len(.Text) s = Mid(.Text, i, 1) Select Case s Case &.&, &-&, &0& To &9& Case Else .Text = Replace(.Text, s, &&) End Select Next End With5 VBA 常用技巧代码解析 #014 End Sub代码解析: 文本框的 Change 事件,判断输入的字符是否为数字字符和“-”号、 “.”号,如果不 是则使用 Replace 函数将文本框中输入的其他字符替换成空白。 第 5、6 行代码在文本框输入的所有字符中循环。 第 8 行代码列出允许输入的字符。 如果想在文本框中允许其它字符输入, 在此句代码中 列出即可。 第 9、10 行代码,如果不是允许输入的字符,使用 Replace 函数替换成空白。 经过以上的设置,文本框中只能在第一位输入一个“-”号、一个“.”号和“0”到“9” 的数字。技巧2文本框添加右键快捷菜单VBA 中的控件没有提供右键快捷菜单,用户可以使用 Excel 中的命令栏自已添加右键 快捷菜单。 步骤 1:按&Alt+F11&组合键进入 VBE 窗口,单击菜单“插入”→“模块” ,在其代码 窗口输入以下代码:#001 Private ActiveTB As MSForms.TextBox #002 Public Sub CreateShortCutMenu() #003 #004 #005 #006 #007 #008 #009 #010 #011 Dim ShortCutMenu As CommandBar Dim ShortCutMenuItem As CommandBarButton Dim sCaption As Variant Dim iFaceId As Variant Dim sAction As Variant Dim i As Integer sCaption = Array(&剪切(&C)&, &复制(&T)&, &贴粘(&P)&, &删除(&D)&) iFaceId = Array(21, 19, 22, 1786) sAction = Array(&Action_Cut&, &Action_Copy&, &Action_Paste&,&Action_Delete&)6 VBA 常用技巧代码解析 #012 #013 #014 msoBarPopup) #015 #016 #017 #018 #019 #020 #021 #022 #023 #024 With ShortCutMenu For i = 0 To 3 Set ShortCutMenuItem = .Controls.Add(msoControlButton) With ShortCutMenuItem .Caption = sCaption(i) .faceID = Val(iFaceId(i)) .OnAction = sAction(i) End With Next End With On Error Resume mandBars(&ShortCut&).Delete Set ShortCutMenu = mandBars.Add(&ShortCut&,#025 End Sub代码解析: 第 1 行代码,在模块级别中声明变量 ActiveTB 是用来对应窗体中的文本框所触发的所 有事件的变量。 CreateShortCutMenu 过程用来创建标题为“ShortCut”的右键快捷菜单,并添加 4 个 菜单项。关于自定义右键快捷菜单请参阅错误!未找到引用源。 。#001 Public Sub ShowPopupMenu(txtCtr As MSForms.TextBox) #002 #003 #004 #005 #006 #007 #008 #009 #010 Dim Action As Variant Set ActiveTB = txtCtr mandBars(&ShortCut&) .Controls(1).Enabled = txtCtr.SelLength & 0 .Controls(2).Enabled = .Controls(1).Enabled .Controls(3).Enabled = txtCtr.CanPaste .Controls(4).Enabled = .Controls(1).Enabled .ShowPopup End With#011 End Sub代码解析:7 VBA 常用技巧代码解析ShowPopupMenu 过程根据文本框中字符的选中状态设置右键快捷菜单菜单项的 Enabled 属性后使用 ShowPopup 方法显示右键快捷菜单。 第 5 行代码,如果当前文本框中已有选中的字符则“剪切”按钮有效。 第 6 行代码,如果当前文本框中已有选中的字符则“复制”按钮有效。 第 7 行代码,如果剪贴板中包含对象支持的数据。则“贴粘”按钮有效。 第 8 行代码,如果当前文本框中已有选中的字符则“删除”按钮有效。 第 9 行代码,显示快捷菜单。#001 Public Sub Action_Cut() #002 ActiveTB.Cut#003 End Sub #004 Public Sub Action_Copy() #005 ActiveTB.Copy#006 End Sub #007 Public Sub Action_Paste() #008 ActiveTB.Paste#009 End Sub #010 Public Sub Action_Delete() #011 #012 #013 #014 #015 Dim s As String With ActiveTB s = .SelText .Value = Replace(.Value, s, &&) End With#016 End Sub代码解析: Action_Cut 过程是快捷菜单中单击“剪切”菜单项所运行的过程。使用 Cut 方法将当 前选中的文本框中的文本删除并移至剪贴板。 Action_Copy 过程是快捷菜单中单击“复制”菜单项所运行的过程。使用 Copy 方法将 文本框选中的文本复制到剪贴板上。 Action_Paste 过程是快捷菜单中单击“贴粘”菜单项所运行的过程。使用 Paste 方法 把剪贴板上的内容传送到一个文本框中。 Action_Delete 过程是快捷菜单中单击“贴粘”菜单项所运行的过程。使用 Replace 函 数将文本框中选中的文本的文本替换成空字符。#001 Public Sub DeleteShortCutMenu() 8 VBA 常用技巧代码解析 #002 #003 On Error Resume mandBars(&ShortCut&).Delete#004 End Sub代码解析: DeleteShortCutMenu 过程删除创建的右键快捷菜单。 步骤 2:在 VBE 窗口中,单击菜单“插入”→“用户窗体” ,在窗体上添加两个文本框 控件。双击窗体,在其代码窗口中输入下面的代码。#001 Private Sub UserForm_Initialize() #002 Call CreateShortCutMenu#003 End Sub #004 Private Sub TextBox1_MouseUp(ByVal Button As Integer, ByVal Shift As Integer, ByVal X As Single, ByVal Y As Single) #005 If Button = 2 Then ShowPopupMenu ActiveControl#006 End Sub #007 Private Sub TextBox2_MouseUp(ByVal Button As Integer, ByVal Shift As Integer, ByVal X As Single, ByVal Y As Single) #008 If Button = 2 Then ShowPopupMenu ActiveControl#009 End Sub #010 Private Sub UserForm_QueryClose(Cancel As Integer, CloseMode As Integer) #011 Call DeleteShortCutMenu#012 End Sub代码解析: 第 1 行到第 3 行代码, 窗体的 Initialize 事件, 在窗体初始化时运行 CreateShortCutMenu 过程创建右键快捷菜单。 第 4 行到第 9 行代码,文本框的 MouseUp 事件,当用户右健单击文本框时运行 ShowPopupMenu 过程在选中的菜单项上显示右键快捷菜单。 第 10 行 到 第 12 行 代 码 , 窗 体 的 QueryClose 事 件 , 在 关 闭 窗 体 时 运 行 DeleteShortCutMenu 过程删除右键快捷菜单。 窗体运行后,右键单击文本框显示右键快捷菜单,如图 2-1 所示。9 VBA 常用技巧代码解析图 2-1文本框快捷菜单技巧3文本框回车自动输入在使用文本框向工作表输入数据时,为了加快输入速度,可以利用文本框的 KeyDown 事件,回车后自动输入并清空文本框,如下面的代码所示。#001 Private Sub TextBox1_KeyDown(ByVal KeyCode As MSForms.ReturnInteger, ByVal Shift As Integer) #002 #003 #004 #005 #006 #007 #008 #009 With TextBox1 If Len(Trim(.Value)) & 0 Then If KeyCode = vbKeyReturn Then Sheet1.Range(&A65536&).End(xlUp).Offset(1, 0) = .Value .Text = && End If End If End With#010 End Sub代码解析: 文本框的 KeyDown 事件,在输入数据并按&Enter&键后自动将数据录入到工作表 A 列 最后一个非空单元格的下一个单元格中。 KeyDown 事件在按下键盘按键时发生,语法如下:Private Sub object_KeyDown( ByVal KeyCode As MSForms.ReturnInteger, ByVal10 VBA 常用技巧代码解析 Shift As fmShiftState)参数 object 是必需的,一个有效的对象。 参数 KeyCode 是必需的,代表被按下的键的键代码。 参数 Shift 是可选的,Shift、Ctrl 和 Alt 的状态。 第 3 行代码,为了防止误输入空白数据,使用 Len 函数和 Trim 函数检查文本框内是 否为有效数据。 第 4 行代码,根据 KeyCode 参数值判断是否按下了回车键。如果用户按下了回车键, KeyCode 参数返回常数 vbKeyReturn。 第 5、6 行代码,将文本框数据输入到工作表 A 列的最后一个单元格内,同时清空文本 框内容准备下一次输入。技巧4自动选择文本框内容如果希望光标进入文本框时能自动选择文本框内容,可以在文本框的 MouseUp 事件中 来完成,如下面的代码所示。#001 Private Sub TextBox1_MouseUp(ByVal Button As Integer, ByVal Shift As Integer, ByVal X As Single, ByVal Y As Single) #002 #003 #004 #005 #006 #007 With TextBox1 If Button = 2 Then .SelStart = 0 .SelLength = Len(.Text) End If End With#008 End Sub代码解析: 文本框的 MouseUp 事件,在光标进入文本框释放鼠标右键时自动选择文本框内容。 MouseUp 事件在用户释放鼠标按键时发生,语法如下:Private Sub object_MouseUp( ByVal Button As fmButton, ByVal Shift As fmShiftState, ByVal X As Single, ByVal Y As Single)11 VBA 常用技巧代码解析参数 object 是必需的,一个有效的对象。 参数 Button 是可选的,设置引起该事件的鼠标按键的整数值,如表格 4-1 所示。常数 fmButtonLeft fmButtonRight fmButtonMiddle 值 1 2 3 说明 按下左键。 按下右键。 按下中键。表格 4-1 Button 参数值参数 Shift 是可选的,Shift、Ctrl 和 Alt 的状态。 参数 X 和参数 Y 是可选的,窗体、框架或页的位置的横坐标与纵坐标。 第 3 行到第 6 行代码,如果用户进入文本框释放鼠标右键,设置文本框的 SelStart 属 性为 0,SelLength 属性为文本框的全部字符数。 SelStart 属性指定选中文本的起点,语法如下:object.SelStart [= Long]参数 object 是必需的,一个有效的对象。 参数 Long 是可选的,指定选中文本的起点。 SelLength 属性指定文本框或组合框的文本部分中选中的字符数,语法如下:object.SelLength [= Long]参数 object 是必需的,一个有效的对象。 参数 Long 是可选的,指定选中的字符数。 运行窗体,当光标进入文本框释放鼠标右键时自动选择文本框内容,如图 4-1 所示。图 4-1自动选择文本框内容技巧5设置文本框数据格式12 VBA 常用技巧代码解析文本框在用来输入数据时, 除了限制输入的数据类型外, 还可以设置文本框的数据格式, 如下面的代码所示。#001 Private Sub TextBox1_Exit(ByVal Cancel As MSForms.ReturnBoolean) #002 TextBox1 = Format(TextBox1, &0.00&)#003 End Sub #004 Private Sub TextBox2_Exit(ByVal Cancel As MSForms.ReturnBoolean) #005 TextBox2 = Format(TextBox2, &0.00&)#006 End Sub代码解析: 文本框的 Exit 事件过程, 在文本框输入数据时使用 Format 函数格式化为两位小数格式。 控件的 Exit 事件在同一窗体中的一个控件即将把焦点转移到另一个控件之前发生,语 法如下:Private Sub object_Exit( ByVal Cancel As MSForms.ReturnBoolean)参数 Object 是必需的,一个有效的对象。 参数 Cancel 是必需的,事件状态。如果设置为 False 表示由该控件处理这个事件(默 认方式) 。设置为 True 表示由应用程序处理这个事件,并且焦点留在当前控件上。 当文本框在输入完数据失去焦点时使用 Format 函数格式化自定义数值格式。Format 函数语法如下:Format(expression[, format[, firstdayofweek[, firstweekofyear]]])参数 expression 是必需的,任何有效的表达式。 参数 format 是可选的,有效的命名表达式或用户自定义格式表达式。 参数 firstdayofweek 是可选的,常数,表示一星期的第一天。 参数 firstweekofyear 是可选的,常数,表示一年的第一周。 在本例中,将文本框的数据格式化成自定义的两位小数的数值格式,关于 Format 函数 格式化日期和时间等其他数据请参阅 VBA 中 Format 函数的帮助。#001 Private Sub TextBox1_Change() #002 TextBox3 = Format(Val(TextBox1) * Val(TextBox2), &0.00&)#003 End Sub #004 Private Sub TextBox2_Change() #005 TextBox3 = Format(Val(TextBox1) * Val(TextBox2), &0.00&)#006 End Sub代码解析: 文本框的 Change 事件过程, 在两个文本框输入完数据后, 使用文本框的 Change 事件13 VBA 常用技巧代码解析使 TextBox3 显示其相乘的金额并格式化为两位小数的数据格式。 Change 事件在控件的 Value 属性改变时发生,语法如下:Private Sub object_Change( )参数 object 是必需的,一个有效的对象。 Change 事件过程可以使显示在控件上的数据同步或一致。在本例中,当 TextBox1 或 TextBox2 的数据发生改变时,两者相乘的金额的金额也随之改变并在 TextBox3 中显示。 因为文本框的数据类型是文本字符串,不能直接进行计算的,所以计算前先使用 Val 函数转换为数字,才能进行计算。 运行窗体,输入数据后格式化为两位小数的数据格式,如图 5-1 所示。图 5-1设置文本框的数据格式技巧6 限制文本框的输入长度在使用文本框输入数据时, 可能希望限制能输入的字符长度, 即只能输入一定长度的字 符,超过设置数值就不能输入,这时可以通过设置文本框的 MaxLength 属性来实现,如下 面的代码所示。#001 Private Sub Worksheet_Activate() #002 Me.TextBox1.MaxLength = 6#003 End Sub代码解析: 工作表的激活事件过程,将文本框的 MaxLength 属性设置为 6,使文本框只能输入 6 个字符,超过 6 个字符即不能输入。 应用于文本框控件的 MaxLength 属性规定用户可以在文本框中输入的最多字符数,语14 VBA 常用技巧代码解析法如下:object.MaxLength [= Long]参数 object 是必需的,一个有效的对象。 参数 Long 是可选的,整数,表示所允许的字符数。 如果将 MaxLength 属性设置为 0,表示只要内存允许则没有限制。技巧7将光标返回文本框中在用文本框往工作表录入数据时,一般会在录入到工作表前验证输入的数据是否正确, 如果错误,则清空文本框内容,提示用户重新输入。但此时光标已经不在文本框中,需要重 新选择文本框才能输入。 可以在 Exit 事件中可以设置 Cancel 参数值使光标停留在当前文本框中,如下面的代码 所示。#001 Private Sub TextBox1_Exit(ByVal Cancel As MSForms.ReturnBoolean) #002 #003 && 18 Then #004 #005 #006 #007 #008 .Text = && MsgBox &身份证号码录入错误!& Cancel = True End If End With With TextBox1 If .Text && && And Len(Trim(.Text)) && 15 And Len(Trim(.Text))#009 End Sub代码解析: 文本框的 Exit 事件,在输入身份证号码后即将把焦点转移到录入按钮控件之前检查输 入的身份证号码是否正确。 Exit 事件在一个控件从同一窗体的另一个控件实际接收到焦点之前发生,语法如下:Private Sub object_Exit( ByVal Cancel As MSForms.ReturnBoolean)Cancel 参数为事件状态。False 表示由该控件处理这个事件(这是默认方式) 。True 表15 VBA 常用技巧代码解析示由应用程序处理这个事件,并且焦点应当留在当前控件上。 第 3 行代码,使用 Len 函数和 Trim 函数检查输入的身份证号码是否为 15 位或 18 位。 第 4 行到第 6 行代码,如果输入的身份证号码不正确,清空文本框以便重新输入并提 示用户,设置 Cancel 参数为 True 使光标停留在文本框中。 在 Exit 事件中之所以把文本框为空也做为通过验证的条件之一,因为如果不加上 “TextBox1.Text && &&”这一条件,那么在窗体显示后,如果用户取消输入或关闭输入窗体, 也会提示输入错误。所以在录入到工作表之前再验证文本框是否为空,如下面的代码所示。#001 Private Sub CommandButton1_Click() #002 #003 #004 #005 #006 #007 #008 #009 #010 With TextBox1 If .Text && && Then Sheet1.Range(&a65536&).End(xlUp).Offset(1, 0) = .Text .Text = && Else MsgBox &请输入身份证号码!& End If .SetFocus End With#011 End Sub代码解析: 输入按钮的 Click 事件, 把文本框数据录入到工作表 A 列最后一个单元格中并重新选择 文本框准备下一次输入。 第 3 行代码,在输入到工作表前检查文本框是否为空。 第 4、5 行代码,如果文本框不为空,录入数据到工作表并清空文本框内容。 第 7 行代码,如果文本框为空,提示用户输入数据。 第 8 行代码,使用 SetFocus 方法将光标返回到文本框中以便重新输入。 SetFocus 方法将焦点移动到对象的实例中,语法如下 :object.SetFocus参数 object.是必需的,一个有效的对象。 运行窗体,在输入框中输入身份证号码后自动验证输入的数据,如果输入数据错误,清 空文本框并提示用户重新输入,如图 7-1 所示。16 VBA 常用技巧代码解析图 7-1提示用户重新输入技巧8 文本框的自动换行在使用使用文本框显示或录入一段很长的文本时, 需要将文本框设置成多行显示, 否则 文本内容只能在一行中显示,示例代码如下:#001 Private Sub UserForm_Initialize() #002 #003 #004 #005 #006 #007 #008 #009 #010 #011 #012 #013 #014 #015 #016 With TextBox1 .WordWrap = True .MultiLine = True .Text = Space(4) & &VBA(Visual Basic for Application)是& _ & &微软公司为了加强 Office 软件的二次开发能力而附加& _ & &于其中的编程语言。VBA 的确非常强大,其与 VB 完全一& _ & &致的语法结构,高效控制 Office 对象模型的能力,令无& _ & &数人为之折腰。利用 VBA,几乎可以在 Office 里面做任何& _ & &其他程序能做的事情。但是,应该清楚的认识到 VBA 是依& _ & &托其宿主─―Excel(或其他 Office 组件)而存在的,对& _ & &于 Excel 用户来讲,VBA 只不过是锦上添花的东西,切不可& _ & &本末倒置,捡了芝麻丢了西瓜,把明明能够利用 Excel 内置& _ & &功能完成的任务,硬是搬到 VBA 里面去做,以为用代码实现& _ & &就是高人一头的表现。其实,真正的高手,会尽量发挥& _ & &Excel 自身的威力,不到万不得已的时候是不会去&Alt+F11&的。& 17 VBA 常用技巧代码解析 #017 End With#018 End Sub代码解析: 窗体的 Initialize 事件过程,在窗体显示时将文本框设置成多行显示文本。 第 3 行代码设置文本框的 WordWrap 属性。WordWrap 属性指定一个控件的内容在行 末是否自动换行,语法如下:object.WordWrap [= Boolean]参数 object 是必需的,一个有效的对象。 参数 Boolean 是可选的,控件是否扩展以适应文本的大小,设置为 True,文本换行, 设置为 False,文本不换行。 第 4 行代码设置文本框的 MultiLine 属性。 MultiLine 属性规定控件能否接受和显示多行 文本,语法如下:object.MultiLine [= Boolean]参数 object 是必需的,一个有效的对象。 参数 Boolean 是可选的,控件是否支持多行文本,设置为 True,以多行显示文本,设 置为 False,不多行显示文本。如果将多行文本框的 MultiLine 属性设置为 False,则文本框 的所有字符都将合并为一行,包括非打印字符(如,回车和换行) 。 对于既支持 WordWrap 属性又支持 MultiLine 属性的控件,当 MultiLine 属性为 False 时,WordWrap 属性被忽略。 运行窗体,文本框显示如图 8-1 所示。图 8-1文本框自动换行18 VBA 常用技巧代码解析技巧9 多个文本框数据相加在技巧 5 中,我们在 TextBox1、TextBox2 中输入完数据后,利用文本框的 Change 事件使 TextBox3 显示其两者相乘的金额,但是如果窗体中有多个文本框,需要在每一个文 本框的 Change 事件中写上相同的重复代码,因此使用类模块可以简化代码。 在附件的窗体有七个文本框, 其中六个用来输入数据, 一个用来显示其他六个文本框相 加后的合计数,首先打开 VBE,插入一个类模块建立一个类,类模块的名字就是类的名字 修改为“cmds” ,在类模块中输入下面的代码:Public WithEvents cmd As MSForms.TextBox代码解析: 使用 Public 语句声明变量 cmd 是用来响应由 TextBox 对象触发的事件的对象变量。 在窗体的 Initialize 事件中写入下面的代码:#001 Dim col As New Collection #002 Private Sub UserForm_Initialize() #003 #004 #005 #006 #007 #008 #009 #010 Dim i As Integer Dim myc As cmds For i = 1 To 6 Set myc = New cmds Set myc.cmd = Me.Controls(&TextBox& & i) col.Add myc Next Set myc = Nothing#011 End Sub代码解析: 第 1 行代码在模块顶部声明变量 col 的类型为集合。 第 5 行到第 9 行代码,将窗体中的六个文本框赋给 col 集合。 (关于类模块请参阅论坛中有关的资料。 ) 在类模块中写入下面的代码:#001 Private Sub cmd_Change() #002 #003 #004 Dim i As Integer Dim Dval As Double For i = 1 To 619 VBA 常用技巧代码解析 #005 #006 #007 Dval = Dval + Val(UserForm1.Controls(&TextBox& & i)) UserForm1.TextBox7.Value = Dval Next#008 End Sub代码解析: 窗体中的六个文本框统一的 Change 事件, 当任何一个文本框中的数据发生变化时, 所 有文本框相加的合计数显示在最后一个文本框中。 运行窗体在文本框中输入数据结果如图 9-1 所示。图 9-1多个文本框数据相加技巧10控件跟随活动单元格在工作表中使用控件时一般都把控件放在工作表的上部, 如果工作表中数据较多, 当页20 VBA 常用技巧代码解析面滚动到工作表下面的区域时,控件会离开当前可视区域,这时操作起来很不方便。解决方 法除了冻结工作表的第一行放置控件的外, 还可以使控件出现在选定的单元格位置, 如下面 的代码所示。#001 Private Sub Worksheet_SelectionChange(ByVal Target As Range) #002 #003 #004 #005 mandButton1 .Top = Target.Top .Left = Target.Left + Target.Width End With#006 End Sub代码解析: 工作表的 SelectionChange 事件,使工作表中的按钮控件出现在选定单元格的右边。 第 3 行代码,设置按钮的 Top 属性等于选定单元格的 Top 属性。Top 属性设置对象顶 端到第一行顶端的距离。 第 4 行代码, 设置按钮的 Left 属性等于选定单元格的 Left 属性加上选定单元格的宽度, 即按钮出现在选定单元格的右边。Left 属性设置对象左边界至 A 列左边界的距离。 当单击工作表区域的任一单元格,按钮出现在单元格的右边,如图 10-1 所示。图 10-1 控件跟随活动单元格技巧11高亮显示按钮21 VBA 常用技巧代码解析为了达到当鼠标掠过按钮时以高亮和凸起显示按钮的效果,可以在窗体和按钮的 MouseMove 事件中进行模拟,如下面的代码所示。#001 Private Sub CommandButton1_MouseMove(ByVal Button As Integer, ByValShift As Integer, ByVal X As Single, ByVal Y As Single) #002 #003 #004 #005 #006 #007 #008 mandButton1 .BackColor = &HFFFF00 .Width = 62 .Height = 62 .Top = 69 .Left = 31 End With#009 End Sub #010 Private Sub UserForm_MouseMove(ByVal Button As Integer, ByVal Shift As Integer, ByVal X As Single, ByVal Y As Single) #011 #012 #013 #014 #015 #016 #017 mandButton1 .BackColor = Me.BackColor .Width = 60 .Height = 60 .Top = 70 .Left = 32 End With#018 End Sub代码解析: 窗体和按钮的 MouseMove 事件过程,以高亮和凸起显示按钮。 当用户在窗体中移动鼠标时,分别在窗体和按钮的 MouseMove 事件设置按钮的 BackColor 属性值,指定按钮的背景色,当鼠标移动到按钮时以高亮显示,当鼠标移动到窗 体时恢复原来的设置。接下来分别设置按钮不同的 Width 属性、Height 属性、Top 属性和 Left 属性值,以模拟按钮凸起的效果。 运行窗体,当鼠标掠过按钮时效果如图 11-1 所示。22 VBA 常用技巧代码解析图 11-1 高亮和凸起显示按钮技巧12组合框和列表框添加列表项的方法组合框和列表框是 Excel 中最常用的控件,可以用来显示工作表中的数据。为组合框和 列表框添加列表项的方法有多种,下面以列表框为例演示添加列表项的方法。 12-1 使用 RowSource 属性添加列表项使用 RowSource 属性将列表框直接与工作表上的一个单元格区域相链接,如下面的代 码所示。#001 Private Sub UserForm_Initialize() #002 #003 #004 Dim iRow As Integer iRow = Sheet1.Range(&A65536&).End(xlUp).Row Me.ListBox1.RowSource = &sheet1!a1:a& & iRow#005 End Sub代码解析: 在窗体初始化时使用 RowSource 属性为列表框添加列表项。 RowSource 属性的语法如下:object.RowSource [= String]23 VBA 常用技巧代码解析参数 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 属性指定填充列表框的工作表区域,如下面的代码所示。#001 Sub ListFillRange() #002 #003 #004 #005 Dim iRow As Integer iRow = Sheet1.Range(&A65536&).End(xlUp).Row Sheet2.ListBox1.ListFillRange = &Sheet1!a1:a& & iRow Sheet2.Shapes(& 列 表 框 &).ControlFormat.ListFillRange =&Sheet1!a1:a& & iRow #006 End Sub代码解析: ListFillRange 过程为工作表中的列表框的填充区域, ListFillRange 属性用于指定填充列 表框的工作表区域。 第 4 行代码对于使用窗体添加的列表框控件需要使用 ControlFormat 属性来返回窗体控 件以后才能设置其 ListFillRange 属性。 12-2 使用 List 属性添加列表项使用 List 属性为列表框添加列表项,如下面的代码所示。#001 Private Sub UserForm_Initialize() #002 #003 #004 #005 #006 Dim Arr As Variant Dim iRow As Integer iRow = Sheet1.Range(&A65536&).End(xlUp).Row Arr = Sheet1.Range(&A1:A& & iRow) Me.ListBox1.List = Arr 24 VBA 常用技巧代码解析 #007 End Sub代码解析: 在窗体初始化时使用 List 属性为列表框添加列表项。 List 属性的语法如下:object.List( row, column ) [= Variant]参数 object 是必需的,一个有效对象。 参数 row 是必需的,取值范围为 0 到列表条目数减 1 之间的数值。 参数 column 是必需的,取值范围为 0 到总列数减 1 之间的数值。 参数 Variant 是可选的,列表框中指定条目的内容。 第 6 行代码,使用 List 属性把数组复制到列表框控件上。 除了使用数组外,List 属性还可以使用命名的单元格区域,如果已把工作表区域命名为 “城市” ,可以改成下面的代码:#001 Private Sub UserForm_Initialize() #boBox1.List = Range(&城市&).Value#003 End Sub对于工作表中使用窗体添加的列表框控件使用 List 属性添加列表项,如下面的代码所 示。#001 Sub List() #002 #003 #004 #005 #006 #007 #008 Dim Arr As Variant Dim iRow As Integer Dim myObj As Object iRow = Sheet1.Range(&A65536&).End(xlUp).Row Arr = Sheet1.Range(&A1:A& & iRow) Set myObj = Sheet2.Shapes(&列表框&).ControlFormat myObj.List = Arr#009 End Sub代码解析: List 过程设置列表框的 List 性,用于指定填充列表框的工作表区域。 12-3 使用 AddItem 方法添加列表项使用 AddItem 方法添加列表项,对于单列的列表框,在列表中添加一项。对于多列的 列表框,在列表中添加一行,如下面的代码所示。25 VBA 常用技巧代码解析 #001 Private Sub UserForm_Initialize() #002 #003 #004 #005 #006 #007 Dim iRow As Integer Dim i As Integer iRow = Sheet1.Range(&A65536&).End(xlUp).Row For i = 1 To iRow Me.ListBox1.AddItem (Sheet1.Cells(i, 1)) Next#008 End Sub代码解析: 在窗体初始化时使用 AddItem 方法为列表框添加列表项。 AddItem 方法的语法如下:object.AddItem [ item [, varIndex]]参数 object 是必需的,一个有效的对象。 参数 item 是可选的,指定要添加的项或行。第一个项或行的编号为 0;第二个项或行 的编号为 1,依此类推。 参数 varIndex 是可选的,指定新的项或行在对象中的位置。 如果提供一个有效的 varIndex 的值, AddItem 方法就把项或行放在列表中的那个位置。 如果忽略 varIndex,此方法就把项或行添加在列表的末尾。对于多列列表框或者组合框, AddItem 方法插入一个完整的行,为控件的每一列都插入一项。为了给第一列后面的项赋 值,可用 List 或 Column 属性来规定项的行和列。 对于工作表中使用窗体添加的列表框控件使用 AddItem 方法添加列表项,如下面的代 码所示。#001 Sub AddItem() #002 #003 #004 #005 #006 #007 #008 #009 #010 Dim iRow As Integer Dim i As Integer iRow = Sheet1.Range(&A65536&).End(xlUp).Row With Sheet2.Shapes(&列表框&).ControlFormat .RemoveAllItems For i = 1 To iRow .AddItem Sheet1.Cells(i, 1) Next End With#011 End Sub 26 VBA 常用技巧代码解析代码解析: AddItem 过程设置使用 AddItem 方法添加为工作表中使用窗体控件添加的列表框添加 列表项。 其 中 第 5 行 代 码 使 用 ControlFormat 属 性 来 返 回 窗 体 控 件 , 第 6 行 代 码 使 用 RemoveAllItems 方法删除窗体控件中的列表框的所有数据项,如果控件是 ActiveX 列表框 则需要使用 Clear 方法。技巧13去除列表框数据源的重复值和空格列表框的数据源引用工作表的数据时, 如果工作表数据有重复值和空格, 列表框也会出 现重复值和空格,如图 13-1 所示。图 13-1 列表框中的重复值和空格为了在窗体显示时去除列表框的重复值和空格,可以使用 Add 方法,如下面的代码所 示。#001 Private Sub UserForm_Initialize() #002 #003 #004 On Error Resume Next Dim Col As New Collection Dim rng As Range, arr 27 VBA 常用技巧代码解析 #005 #006 #007 #008 #009 #010 #011 #012 #013 #014 #015 Dim i As Integer For Each rng In Range(&A1:A& & [a65536].End(xlUp).Row) If Trim(rng) && && Then Col.Add rng, key:=CStr(rng) End If Next ReDim arr(1 To Col.Count) For i = 1 To Col.Count arr(i) = Col(i) Next Me.ListBox1.List = arr#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 属性值28 VBA 常用技巧代码解析之间的值;如果参数是字符串表达式,则当添加一个被引用的成员到集合时,after 必须对 应于指定的 key 值。可以指定 before 位置或 after 位置,但不能同时指定这两个位置。 第 10 行到第 14 行代码,重新定义数组 arr 大小,把 Col 中数据赋给数组。 第 15 行代码,把数组 arr 复制到列表框中。 运行窗体,窗体中的列表框引用去除重复值和空格后的工作表数据,如图 13-2 所示。图 13-2 去除重复值和空格的列表框技巧14移动列表框条目将列表框中的条目进行上下移动,如下面的代码所示。#001 Dim Intlist As Integer #002 Dim Strlist As String #003 Private Sub CommandButton1_Click() #004 #005 #006 #007 #008 With Me.ListBox1 Intlist = .ListIndex Select Case Intlist Case -1 MsgBox &请选择一行后再移动!& 29 VBA 常用技巧代码解析 #009 #010 #011 #012 #013 #014 #015 #016 #017 Case 0 MsgBox &已经是最上一行了!& Case Is & 0 Strlist = .List(Intlist) .List(Intlist) = .List(Intlist - 1) .List(Intlist - 1) = Strlist .ListIndex = Intlist - 1 End Select End With#018 End Sub #019 Private Sub CommandButton2_Click() #020 #021 #022 #023 #024 #025 #026 #027 #028 #029 #030 #031 #032 #033 With ListBox1 Intlist = .ListIndex Select Case Intlist Case -1 MsgBox &请选择一行后再移动!& Case .ListCount - 1 MsgBox &已经是最下一行了!& Case Is & .ListCount - 1 Strlist = .List(Intlist) .List(Intlist) = .List(Intlist + 1) .List(Intlist + 1) = Strlist .ListIndex = Intlist + 1 End Select End With#034 End Sub代码解析: 第 1、 行代码在模块顶部声明两个变量分别用于保存列表框当前选中行的索引和内容。 2 第 3 行到第 18 行代码,将列表框当前选中行的内容上移一行的代码。其中第 5 行代码 使用变量 Intlist 保存列表框当前选中行的索引号,第 6 行代码判断索引号,,第 7、8 行代码 如果变量 Intlist 值为-1 ,说明当前没有选中的行,显示一个消息框进行提示。第 9、10 行 代码变量 Intlist 值为 0 ,说明当前选中的行已是第一行了。30 VBA 常用技巧代码解析列表框的 ListIndex 属性指定当前选中的列表框或组合框条目,语法如下:object.ListIndex [= Variant]参数 object 是必需的,一个有效的对象。 参数 Variant 是可选的,控件中当前被选的条目。 第 11 行到第 15 行代码将当前选中的行向下移动一行,其中第 12 行代码将当前选中的 行的内容赋给变量 Strlist,第 13 行代码将当前选中行的内容更改为下面一行的内容,第 14 行代码将当前选中行的下面一行的内容更改为变量 Strlist 保存的内容,第 15 行代码将选中 行向下移动一行,这样就将当前选中的行向下移动了一行。 第 19 行到第 34 行代码将当前选中的行向上移动一行。 将移动后的列表框条目保存到工作表中的代码如下:#001 Private Sub CommandButton3_Click() #002 #003 #004 #005 Dim i As Integer For i = 1 To ListBox1.ListCount Sheet1.Cells(i + 1, 1) = ListBox1.List(i - 1) Next#006 End Sub代码解析: 窗体中“保存”按钮的单击过程,将移动后的列表框条目保存到工作表。 第 3 行到第 5 行代码使用 For...Next 语句循环遍历列表框所有条目,将 List 属性返回 的列表框的列表条目写入到工作表中。List 属性返回或设置列表框或组合框的列表条目数, 语法请参阅技巧 12-2。 运行窗体效果如所示。图 14-1 移动列表框条目31 VBA 常用技巧代码解析技巧15允许多项选择的列表框一般情况下在显示的列表框中用户只能选择一个列表项, 而经过简单的设置, 列表框条 目前可以显示选项按钮,允许进行多项选择,如下面的代码所示。#001 Private Sub UserForm_Initialize() #002 #003 Dim arr As Variant arr = Array(&经理室&, &办公室&, &生技科&, &财务科&, &营业部&, &制水车间&, &污水厂&, &安装公司&, &其他&) #004 #005 #006 #007 #008 With Me.ListBox1 .List = arr .ListStyle = 1 .MultiSelect = 1 End With#009 End Sub代码解析: 窗体的 Initialize 事件过程,在窗体初始化时对列表框进行设置。 其中第 5 行代码使用 List 属性为列表框添加列表项,请参阅技巧 12-2。 第 6 行代码将列表框的 ListStyle 属性设置为 1(fmListStyleOption) ,显示用于多重选 择列表的复选框,ListStyle 属性规定列表框或组合框中的列表的外观,语法如下:object.ListStyle [= fmListStyle]参数 object 是必需的,一个有效的对象。 参数 fmListStyle 是可选的,列表的可视风格,设置值如表格 15-1 所示。常量 fmListStylePlain fmListStyleOption 值 0 1 说明 外观与常规的列表框相似,条目的背景为高亮 显示选项按钮,或显示用于多重选择列表的复选框(默认)。当用户选 定组中的条目时, 与该条目相关的选项按钮即被选中, 而该组其他条目 的选项按钮则被取消选择表格 15-1fmListStyle 设置值ListStyle 属 性 可 用 来 改 变 列 表 框 或 组 合 框 的 可 视 外 观 。 通 过 一 种 不 同 于 fmListStylePlain 的设置,可以将任意控件的内容作为一组单独项目演示,每个项目都包含 一个可视记号用以表示它是否被选中。 如果控件支持单一选择(MultiSelect 属性被设置为 mMultiSelectSingle) ,则可按下组 中的一个按钮。如果控件支持多重选择,则可以按下组中两个或更多的按钮。32 VBA 常用技巧代码解析第 7 行代码将 MultiSelect 属性设置为 1(fmMultiSelectMulti) ,允许列表框进行多项选 择,MultiSelect 属性表示对象是否允许多项选择,语法如下:object.MultiSelect [= fmMultiSelect]参数 object 是必需的,一个有效的对象。 参数 fmMultiSelect 是可选的,控件所用的选择方式,设置值如表格 15-2 所示。常量 fmMultiSelectSingle fmMultiSelectMulti fmMultiSelectExtended 值 0 1 2 说明 只可选择一个条目(默认) 按空格键或单击鼠标以选定列表中一个条目或取消选定 按 Shift 并单击鼠标, 或按 Shift 的同时按一个方向键, 将所选条目 由前一项扩展到当前项。按 Ctrl 的同时单击鼠标可选定或取消选定表格 15-2fmMultiSelect 设置值经过以上设置, 列表框显示时可以进行多项选择并且条目前都有一个选项按钮用以表示 它是否被选中,如图 15-1 所示。图 15-1 允许多项选择的列表框如果将列表框的 ListStyle 属性设置为 0 则与常规的列表框相似。 如果将列表框的 MultiSelect 属性设置 0 则列表框只能进行单项选择,如图 15-2 所示。33 VBA 常用技巧代码解析图 15-2 允许单项选择的列表框通过列表框的 Selected 属性值可以判断列表框中条目的选定状态, 如下面的代码所示。#001 Private Sub CommandButton1_Click() #002 #003 #004 #005 #006 #007 #008 #009 #010 #011 #012 #013 Dim i As Integer Dim s As String For i = 0 To ListBox1.ListCount - 1 If ListBox1.Selected(i) = True Then s = s & ListBox1.List(i) & Chr(13) End If Next If s && && Then MsgBox &你选择了:& & Chr(13) & s Else MsgBox &请最少选择一个部门!& End If#014 End Sub代码解析: 按钮的单击过程,将列表框中选中的条目使用消息框显示出来。 第 4 行到第 8 行代码使用 For...Next 语句循环遍历列表框所有条目,通过返回的 Selected 属性值判断列表框中条目的选定状态,如果处于选中状态,第 6 行代码将列表框 选中条目的值赋给字符串变量 s。 Selected 属性判断列表框中条目的选定状态,语法如下:object.Selected( index ) [= Boolean]34 VBA 常用技巧代码解析参数 object 是必需的,一个有效的对象。 参数 index 是必需的,整数,取值范围是 0 到列表中的条目数减 1 之间的数值。 参数 Boolean 是必需的,判断一个条目是否被选中。 第 9 行到第 13 行代码使用消息框显示列表框中选中的条目。 运行窗体结果如图 15-3 所示。图 15-3 允许多项选择的列表框技巧16多列组合框和列表框的设置多列组合框和列表框添加列表项16-1如果组合框和列表框是多列的话,除了使用技巧 12 的方法外,还需要设置控件的其他 属性,如下面的代码所示。#001 Private Sub UserForm_Initialize() #002 #003 #004 #005 #006 #007 Dim iRow As Integer Dim Arr As Variant iRow = Sheet1.Range(&A65536&).End(xlUp).Row Arr = Sheet1.Range(&A1:G& & iRow) With Me.ListBox1 .ColumnCount = 735 VBA 常用技巧代码解析 #008 #009 #010 #011 .ColumnWidths = &45,45,45,45,45,30,45& .BoundColumn = 1 .Column = Application.WorksheetFunction.Transpose(Arr) End With#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 属性值的方法,设置值如表格 16-1 所示:值 0 1 或者大于 1 说明 将 ListIndex 属性的值赋予控件。 将指定列中的值赋予控件。当采用此属性时,列从 1 开始计数(默认值)。表格 16-1Variant 的设置值当选择了多列列表框的一行时, BoundColumn 属性标识出将该行的哪一条目作为控件 的值存储。BoundColumn 属性设为 0,将所选行的行号赋予控件,作为控件的值。如果36 VBA 常用技巧代码解析BoundColumn 属性设为 1 或者大于 1,则将指定列中的值赋予控件。 第 10 行代码,设置多列列表框中列表的来源。在设置列表来源时除了可以使用技巧 12 所介绍的方法外,还可以使用 Column 属性指定列表框中的一个或多个条目,Column 属性 语法如下:object.Column( column, row ) [= Variant]参数 object 是必需的,一个有效对象。 参数 column 是可选的,取值范围为 0 到总列数减 1 之间的数值。 参数 row 是可选的,取值范围为 0 到总行数减 1 之间的数值。 参数 Variant 是可选的,指定欲加载到列表框的一个值、一列值或一个二维数组。 注意 当从一个二维数组中复制数据时,使用 Column 属性将转置控件中数组的内容,所以在加载时需使用 Transpose 函数对数组进行转置。 多列列表框设置完成后效果如图 16-1 所示。图 16-1 多列列表框16-2多列列表框写入工作表在把多列列表框的写入工作表中时, 只能把 BoundColumn 属性所指定列中的值写入工 作表中, 不能把选中的整行内容写入到工作表中。 如果需要把多列列表框中选中行的整行内 容写入工作表中,可以使用循环语句将列表框各列的写入工作表,如下面的代码所示。#001 Private Sub UserForm_Initialize() #002 #003 #004 #005 #006 Dim iRow As Integer iRow = Sheet2.Range(&A65536&).End(xlUp).Row With Me.ListBox1 .ColumnCount = 7 .ColumnWidths = &45,45,45,45,45,30,45& 37 VBA 常用技巧代码解析 #007 #008 #009 iRow).Address(External:=True) #010 End With .BoundColumn = 1 .ColumnHeads = True .RowSource = Sheet2.Range(&A2:G& &#011 End Sub #012 Private Sub ListBox1_Click() #013 #014 #015 #016 #017 #018 Dim iRow As Integer Dim i As Byte iRow = Sheet1.Range(&A65536&).End(xlUp).Row + 1 For i = 1 To ListBox1.ColumnCount Sheet1.Cells(iRow, i) = ListBox1.Column(i - 1) Next#019 End Sub代码解析: 第 1 行到第 11 行代码窗体的 Initialize 事件过程,在窗体初始化时为多列列表框添加列 表项,请参阅技巧 16-1。 第 8 行代码, 设置多列列表框中的第一行为列标题行。 ColumnHeads 属性显示列表框、 组合框及接受列题注的对象中的列标题行,语法如下:object.ColumnHeads [= Boolean]参数 object 是必需的,一个有效的对象。 参数 Boolean 是可选的,指定是否显示列标题。 将 ColumnHeads 属性设置为 True,多列列表框的第一行显示为列标题,默认值为 False,不显示列标题。 需要注意的是,当数据项中的第一行作为列标题时,则不可选中该行。 第 9 行代码,使用 RowSource 属性设置多列列表框中列表的来源。关于 RowSource 属性请参阅技巧 12-1。 注意 如果已将多列列表框中列表项来源的第一行设置为列标题,在设置 RowSource 属性时应从列表项来源的第二行开始设置。 第 12 行到第 19 行代码列表框的 Click 事件, 单击多列列表框时把选中行的整行内容写 入工作表中。其中第 17 行代码,使用循环语句将多列列表框选中行的各列的值写入工作表 对应的单元格中。关于 Column 属性请参阅技巧 16-1,在本例中没有指定 row 参数,所以 是把当前选中行的内容写入工作表。38 VBA 常用技巧代码解析运行窗体后,单击列表框将选中的整行内容写入工作表中,如图 16-2 所示。图 16-2 多列列表框选中的整行内容写入工作表技巧17输入时逐步提示信息用户在录入数据时, 比如在工作表中输入产品名称, 除了希望有所有产品名称的下拉列 表供选择外, 更希望能逐步给出提示信息。 比如在输入一两个字符后把符合条件的数据筛选 出来供选择,最好是中英文、拼音首字母、大小写能混合查询,如输入“LJ”或“六角”后 所有以“六角”开头的产品名称都筛选到列表中供选择,这将大大提高录入速度和正确率。 为了达到这一目的,首先在工作簿需要有如图 17-1 所示的基础数据表。39 VBA 常用技巧代码解析图 17-1 基础数据表基础数据表中 A 列保存不重复的产品名称,为了能用中英文、拼音首字母、大小写混 合查询,要把产品名称转换成小写的拼音首字母保存在 B 列。 步骤 1:在 VBE 窗口单击菜单“插入”→“模块” ,在代码窗口写入下面的代码。#001 Public Function LChin(Str As String) As Variant #002 #003 #004 #005 On Error Resume Next Str = StrConv(Str, vbNarrow) If Asc(Str) & 0 Or Err.Number = 1004 Then LChin = && LChin = WorksheetFunction.VLookup(Str, [{& 吖 &,&a&;& 八 &,&b&;& 嚓&,&c&;&&,&d&;&z&,&e&;&发&,&f&;&g&,&g&;&铪&,&h&;&&,&j&;&咔&,&k&;&垃&,&l&;& ` &,&m&;&
&,&n&;& 噢 &,&o&;& r &,&p&;& 七 &,&q&;&
&,&r&;& 仨 &,&s&;& 他 &,&t&;&
&,&w&;&夕&,&x&;&丫&,&y&;&&,&z&}], 2) #006 End Function代码解析: 自定义 LChin 函数,该函数把中文字符转换为拼音首字母。 步骤 2:在 VBE 窗口双击 Sheet2 表,在代码窗口写入下面的代码。40 VBA 常用技巧代码解析 #001 Private Sub Worksheet_Change(ByVal Target As Range) #002 #003 #004 #005 #006 Then #007 #008 #009 #010 #011 #012 & 0 Then #013 #014 #015 #016 #017 #018 #019 #020 myStr = myStr & LChin(Mid$(.Value, i, 1)) Else myStr = myStr & LCase(Mid$(.Value, i, 1)) End If Next .Offset(, 1).Value = myStr End With End Sub .Value = && MsgBox &不能输入重复的产品名称!&, 64 Exit Sub End If For i = 1 To Len(.Value) If Asc(Mid$(.Value, i, 1)) & 255 Or Asc(Mid$(.Value, i, 1)) Dim i As Integer Dim myStr As String With Target If .Column && 1 Or .Count & 1 Then Exit Sub If WorksheetFunction.CountIf(Sheet2.Range(&A:A&), .Value) & 1代码解析: 工作表的 Change 事件, A 列输入不重复的产品名称后, 当 转换成小写的字母保存在 B 列的单元格中,便于以后的查询。 第 11 行代码, 设置事件触发的条件, 只有在 A 列输入产品名称后才触发 Change 事件。 第 12 行到第 16 行代码,使用工作表 CountIf 函数检查输入的产品名称是否重复。 第 17 行到第 23 行代码,字符的转换过程。首先检查是否是中文字符,如果是使用自 定义函数 LChin 转换成小写拼音首字母。如果是大写的英文字母使用 LCase 函数转换成小 写字母。 第 24 行代码,将转换后的字符保存到 B 列。 步骤 3:基础数据表完成后,在工作表“录入表”中添加一个文本框控件和一个列表框 控件。在 VBE 窗口中双击 Sheet1 表,写入下面的代码。41 VBA 常用技巧代码解析 #001 Private Sub Worksheet_SelectionChange(ByVal Target As Range) #002 #003 #004 #005 #006 #007 #008 #009 #010 #011 #012 #013 #014 #015 #016 #017 #018 #019 #020 #021 #022 #023 #024 #025 #026 #027 #028 #029 Dim i As Integer If Target.Count = 1 Then If Target.Column = 1 And Target.Row & 1 Then With Me.TextBox1 .Visible = True .Top = Target.Top .Left = Target.Left .Width = Target.Width .Height = Target.Height .Activate End With With Me.ListBox1 .Visible = True .Top = Target.Top .Left = Target.Left + Target.Width .Width = Target.Width .Height = Target.Height * 5 For i = 2 To Sheet2.Range(&A65536&).End(xlUp).Row .AddItem Sheet2.Cells(i, 1).Value Next End With Else Me.ListBox1.Clear Me.TextBox1 = && Me.ListBox1.Visible = False Me.TextBox1.Visible = False End If End If#030 End Sub代码解析: 工作表的 SelectionChange 事件, 当用户选定工作表 A 列第 2 行以下的单个单元格时,42 VBA 常用技巧代码解析设置文本框和列表框的 Visible 为 True,使它们成为可见的,并设置其外观,同时给列表框 加载列表项。当用户选定其他列的单元格时隐藏文本框和列表框控件。 步骤 4:在设计模式下双击文本框,在代码窗口写入下面的代码。#001 Private Sub TextBox1_KeyUp(ByVal KeyCode As MSForms.ReturnInteger,ByVal Shift As Integer) #002 #003 #004 #005 #006 #007 #008 & 0 Then #009 #010 #011 #012 #013 #014 #015 #016 #017 #018 #019 #020 #021 #022 #023 #024 #025 #026 #027 Language = True myStr = myStr & Mid$(.Value, i, 1) Else myStr = myStr & LCase(Mid$(.Value, i, 1)) End If Next End With With Sheet2 For i = 2 To .Range(&A65536&).End(xlUp).Row If Language = True Then If Left(.Cells(i, 1).Value, Len(myStr)) = myStr Then Me.ListBox1.AddItem .Cells(i, 1).Value End If Else If Left(.Cells(i, 2).Value, Len(myStr)) = myStr Then Me.ListBox1.AddItem .Cells(i, 1).Value End If End If Next Dim i As Integer Dim Language As Boolean Dim myStr As String Me.ListBox1.Clear With Me.TextBox1 For i = 1 To Len(.Value) If Asc(Mid$(.Value, i, 1)) & 255 Or Asc(Mid$(.Value, i, 1))43 VBA 常用技巧代码解析 #028 End With#029 End Sub代码解析: 文本框的 KeyUp 事件,在文本框输入查询条件时筛选符合条件的数据加载到列表框。 第 3 行代码, 声明变量 Language 为 Boolean 数据类型, 在下面的代码中使用 Language 的值判断输入的是否为中文。 第 5 行代码,使用 Clear 方法删除列表框所有的列表项,语法如下:object.Clear参数 object 是必需的,一个有效的对象。 注意 如果列表框绑定了数据,Clear 方法将会失败。 第 6 行到第 15 行代码,判断文本框输入的是否为中文字符。如果是中文字符,将变量 Language 赋值为 True,并把文本框中的字符赋给变量 myStr。如果是英文字符则转换成小 写字母后赋变量 myStr。 第 16 行到第 29 行代码,如果变量 Language 的值为 True,在基础数据表的 A 列中使 用 Left 函数查找与文本框字符相符的单元格并加载到列表框,否则就在 B 列查找。 步骤 5:在设计模式下双击文本框,在代码窗口写入下面的代码。#001 Private Sub TextBox1_KeyDown(ByVal KeyCode As MSForms.ReturnInteger, ByVal Shift As Integer) #002 #003 #004 If KeyCode = vbKeyReturn Then Sheet1.ListBox1.Activate End If#005 End Sub代码解析: 文本框的 KeyDown 事件,当用户在文本框中输入完成,列表框中已显示所需的内容后 按回车键后选择列表框。 步骤 6:在设计模式下双击列表框,在代码窗口写入下面的代码#001 Private Sub ListBox1_GotFocus() #002 #003 On Error Resume Next ListBox1.ListIndex = 0#004 End Sub代码解析: 列表框的 GotFocus 事件,当用户在文本框中输入完成按回车键后,选定列表框中第 1 个条目,方便用户进行下一步操作。44 VBA 常用技巧代码解析 #001 Private Sub ListBox1_KeyDown(ByVal KeyCode As MSForms.ReturnInteger, ByVal Shift As Integer) #002 #003 #004 #005 #006 #007 #008 If KeyCode = vbKeyReturn Then ActiveCell.Value = ListBox1.Value Me.ListBox1.Clear Me.TextBox1 = && Me.ListBox1.Visible = False Me.TextBox1.Visible = False End If#009 End Sub代码解析: 列表框的 KeyDown 事件, 当用户在列表框中按下回车后将列表框选中的条目写入到活 动工作表的单元格中,同时清空文本框和列表框内容后隐藏,准备下一次录入。#001 Private Sub ListBox1_DblClick(ByVal Cancel As MSForms.ReturnBoolean) #002 #003 #004 #005 #006 ActiveCell.Value = ListBox1.Value Me.ListBox1.Clear Me.TextBox1 = && Me.ListBox1.Visible = False Me.TextBox1.Visible = False#007 End Sub代码解析: 列表框的 DblClick 事件,当用户双击列表框的列表项时,把列表框数据赋给活动单元 格,同时清空文本框和列表框内容后隐藏,准备下一次录入。 以上设置完成后,在“录入”工作表的 A 列选定单元格后,显示一个文本框和一个列 表框,在文本框中输入查询条件后列表框显示符合查询条件的所有内容供用户选择,如图 17-2 所示。45 VBA 常用技巧代码解析图 17-2 输入时逐步提示信息技巧18二级组合框在使用多个组合框输入数据时, 往往希望后一个组合框中的条目能根据前一个组合框的 内容有所不同, 如示例中第二个选择城市的组合框根据第一个选择省份的组合框所选择的不 同省份加载不同的县市名称,示例代码如下:#001 Private Sub UserForm_Initialize() #002 #003 #004 #005 #006 #007 #008 #009 #010 Dim col As New Collection Dim arr As Variant Dim rng As Range Dim i As Integer On Error Resume Next For Each rng In Range(&A2:A& & Sheet1.Range(&A65536&).End(xlUp).Row) If rng && && Then col.Add rng, CStr(rng) Next ReDim arr(1 To col.Count)46 VBA 常用技巧代码解析 #011 #012 #013 #014 #015 #016 For i = 1 To col.Count arr(i) = col(i) Next ComboBox1.List = arr ComboBox1.ListIndex = 0 CommandButton1.Accelerator = &D&#017 End Sub #018 Private Sub ComboBox1_Change() #019 #020 #021 #022 #023 #024 #025 #026 #027 #028 #029 #030 #031 #032 #033 Dim myAddress As String Dim rng As Range Dim mymsg As Integer ComboBox2.Clear With Sheet1.Range(&A:A&) Set rng = .Find(What:=ComboBox1.Text) If Not rng Is Nothing Then myAddress = rng.Address Do ComboBox2.AddItem rng.Offset(, 1) Set rng = .FindNext(rng) Loop While Not rng Is Nothing And rng.Address && myAddress End If End With ComboBox2.ListIndex = 0#034 End Sub代码解析: 第 1 行到第 17 行代码窗体的 Initialize 事件过程, 在窗体显示时将工作表 A 列中的省份 名称去除重复后加载到组合框中。 其中第 7 行到第 13 行代码把工作表 A 列中的省份名称使用 Add 方法去除重复后加载 到组合框中,应用于 Collection 对象的 Add 方法添加一个成员对象,请参阅技巧 13 。 第 15 行代码设置组合框的 ListIndex 属性为 0,选中组合框的第一行条目。ListIndex 属性指定当前选中的列表框或组合框条目,语法如下:object.ListIndex [= Variant]47 VBA 常用技巧代码解析参数 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 方法请参阅技巧错误! 未找到引用源。 。 窗体运行后效果如图 18-1 所示。图 18-1 二级组合框技巧19使用 DTP 控件输入日期在工作表中输入日期可以使用日期时间控件(Microsoft Date and Time Picker Control 6.0,简称 DTP 控件) 。 在工作表中单击菜单“视图”→“工具栏”→“控件工具箱” ,选择“其他控件”中的 DTP 控件如图 19-1 所示,在工作表中添加一个 DTP 控件。48 VBA 常用技巧代码解析图 19-1 选择 DTP 控件在设计模式下双击 DTP 控件写入下面的代码:#001 Private Sub Worksheet_SelectionChange(ByVal Target As Range) #002 #003 With Me.DTPicker1 If Target.Count = 1 And Target.Column = 2 And (Not Target.Row =1) Or Target.MergeCells Then #004 #005 #006 #007 #008 #009 #010 #011 #012 #013 #014 #015 #016 #017 .Visible = True .Top = Selection.Top .Left = Selection.Left .Height = Selection.Height .Width = Selection.Width If Target.Cells(1, 1) && && Then .Value = Target.Cells(1, 1).Value Else .Value = Date End If Else .Visible = False End If End With#018 End Sub #019 Private Sub DTPicker1_CloseUp() #020 #021 ActiveCell.Value = Me.DTPicker1.Value Me.DTPicker1.Visible = False#022 End Sub49 VBA 常用技巧代码解析 #023 Private Sub Worksheet_Change(ByVal Target As Range) #024 #025 #026 #027 #028 If Target.Count = 1 And Target.Column = 2 Or Target.MergeCells Then If Target.Cells(1, 1).Value = && Then DTPicker1.Visible = False End If End If#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 列单元格时效果如图 19-2 所示。图 19-2 使用 DTP 控件输入日期50 VBA 常用技巧代码解析技巧20使用 RefEdit 控件选择区域在技巧错误!未找到引用源。中介绍了如何使用 InputBox 方法获得所选单元格区域的 地址,而使用 RefEdit 控件获得单元格区域的地址比使用 InputBox 方法更加方便,可以单 击 RefEdit 控件中的按钮以折叠用户窗体,选定区域后再单击按钮展开用户窗体,示例代码 如下:#001 Private Sub CommandButton1_Click() #002 #003 #004 #005 #006 #007 #008 line: #009 MsgBox &你选择的是非单元格区域!& Dim Rng As Range On Error GoTo line Set Rng = Range(RefEdit1.Value) Rng.Interior.ColorIndex = 15 Unload UserForm1 Exit Sub#010 End Sub代码解析: 用户窗体中按钮的单击事件过程, 改变用户使用 RefEdit 控件所选择的单元格区域内部 的颜色。 第 3 行代码,错误处理语句。因为如果用户输入或选定了错误的单元格区域地址,将显 示一错误信息,如图 20-1 所示,所以必需使用 On Error GoTo 语句来绕过错误。图 20-1 提示运行错误第 4 行代码,使用 Set 语句将用户选择的单元格区域赋给变量 rng。 第 5 行代码,改变用户所选单元格区域内部的颜色。51 VBA 常用技巧代码解析注意 不能在无模式用户窗体中使用 RefEdit 控件。 窗体运行后,当用户在工作表中选择一个单元格区域后改变所选单元格区域内部的颜 色,如图 20-2 所示。图 20-2 使用 RefEdit 控件获得区域地址技巧21如何注册控件Excel 文件中如果有 ActiveX 控件如日期时间控件(Microsoft Da

我要回帖

更多关于 北京朝阳区望京地图 的文章

 

随机推荐