EXCEL VBA常用技巧 第8章 控件与用户窗体.docx
- 文档编号:6525734
- 上传时间:2023-01-07
- 格式:DOCX
- 页数:162
- 大小:2.38MB
EXCEL VBA常用技巧 第8章 控件与用户窗体.docx
《EXCEL VBA常用技巧 第8章 控件与用户窗体.docx》由会员分享,可在线阅读,更多相关《EXCEL VBA常用技巧 第8章 控件与用户窗体.docx(162页珍藏版)》请在冰豆网上搜索。
EXCELVBA常用技巧第8章控件与用户窗体
第8章控件与用户窗体
2018年10月11日,星期四
11:
30
技巧98限制文本框的输入
2018年10月11日,星期四
10:
15
用户在使用文本框输入数据时,往往希望能限制输入数据的类型,比如只能输入数字。
但是没有内置的属性能限制在文本框中只能输入数字,只能在文本框的事件过程中使用代码来测试输入的是哪类字符,然后只允许输入数字字符和一个“-”号、一个“.”号,如下面的代码所示。
#001 PrivateSubTextBox1_KeyPress(ByValKeyANSIAsMSForms.ReturnInteger)
#002 SelectCaseKeyANSI
#003 CaseAsc("0")ToAsc("9")
#004 CaseAsc("-")
#005 IfInStr(1,Me.TextBox1.Text,"-")>0Or_
#006 Me.TextBox1.SelStart>0Then
#007 KeyANSI=0
#008 EndIf
#009 CaseAsc(".")
#010 IfInStr(1,Me.TextBox1.Text,".")>0Then
#011 KeyANSI=0
#012 EndIf
#013 CaseElse
#014 KeyANSI=0
#015 EndSelect
#016 EndSub
代码解析:
文本框的KeyPress事件过程,测试键盘输入的是哪类字符,只允许输入数字字符和一个“-”号、一个“.”号。
KeyPress事件的语法如下:
PrivateSubobject_KeyPress(ByValKeyANSIAsMSForms.ReturnInteger)
参数Object是必需的,一个有效的对象。
参数KeyANSI是可选的,整数值,代表标准的数字ANSI 键代码。
第2行代码使用CaseElse语句测试文本框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 PrivateSubTextBox1_Change()
#002 DimiAsInteger
#003 DimsAsString
#004 WithTextBox1
#005 Fori=1ToLen(.Text)
#006 s=Mid(.Text,i,1)
#007 SelectCases
#008 Case".","-","0"To"9"
#009 CaseElse
#010 .Text=Replace(.Text,s,"")
#011 EndSelect
#012 Next
#013 EndWith
#014 EndSub
代码解析:
文本框的Change事件,判断输入的字符是否为数字字符和“-”号、“.”号,如果不是则使用Replace函数将文本框中输入的其他字符替换成空白。
第5、6行代码在文本框输入的所有字符中循环。
第8行代码列出允许输入的字符。
如果想在文本框中允许其它字符输入,在此句代码中列出即可。
第9、10行代码,如果不是允许输入的字符,使用Replace函数替换成空白。
经过以上的设置,文本框中只能在第一位输入一个“-”号、一个“.”号和“0”到“9”的数字。
技巧99文本框添加右键快捷菜单
2018年10月11日,星期四
10:
22
VBA中的控件没有提供右键快捷菜单,用户可以使用Excel 中的命令栏自已添加右键快捷菜单。
步骤1:
按
#001 PrivateActiveTBAsMSForms.TextBox
#002 PublicSubCreateShortCutMenu()
#003 DimShortCutMenuAsCommandBar
#004 DimShortCutMenuItemAsCommandBarButton
#005 DimsCaptionAsVariant
#006 DimiFaceIdAsVariant
#007 DimsActionAsVariant
#008 DimiAsInteger
#009 sCaption=Array("剪切(&C)","复制(&T)","贴粘(&P)","删除(&D)")
#010 iFaceId=Array(21,19,22,1786)
#011 sAction=Array("Action_Cut","Action_Copy","Action_Paste","Action_Delete")
#012 OnErrorResumeNext
#013 Application.CommandBars("ShortCut").Delete
#014 SetShortCutMenu=Application.CommandBars.Add("ShortCut",msoBarPopup)
#015 WithShortCutMenu
#016 Fori=0To3
#017 SetShortCutMenuItem=.Controls.Add(msoControlButton)
#018 WithShortCutMenuItem
#019 .Caption=sCaption(i)
#020 .faceID=Val(iFaceId(i))
#021 .OnAction=sAction(i)
#022 EndWith
#023 Next
#024 EndWith
#025 EndSub
代码解析:
第1行代码,在模块级别中声明变量ActiveTB是用来对应窗体中的文本框所触发的所有事件的变量。
CreateShortCutMenu过程用来创建标题为“ShortCut”的右键快捷菜单,并添加4个菜单项。
关于自定义右键快捷菜单请参阅技巧86 。
#001 PublicSubShowPopupMenu(txtCtrAsMSForms.TextBox)
#002 DimActionAsVariant
#003 SetActiveTB=txtCtr
#004 WithApplication.CommandBars("ShortCut")
#005 .Controls
(1).Enabled=txtCtr.SelLength>0
#006 .Controls
(2).Enabled=.Controls
(1).Enabled
#007 .Controls(3).Enabled=txtCtr.CanPaste
#008 .Controls(4).Enabled=.Controls
(1).Enabled
#009 .ShowPopup
#010 EndWith
#011 EndSub
代码解析:
ShowPopupMenu过程根据文本框中字符的选中状态设置右键快捷菜单菜单项的Enabled属性后使用ShowPopup方法显示右键快捷菜单。
第5行代码,如果当前文本框中已有选中的字符则“剪切”按钮有效。
第6行代码,如果当前文本框中已有选中的字符则“复制”按钮有效。
第7行代码,如果剪贴板中包含对象支持的数据。
则“贴粘”按钮有效。
第8行代码,如果当前文本框中已有选中的字符则“删除”按钮有效。
第9行代码,显示快捷菜单。
#001 PublicSubAction_Cut()
#002 ActiveTB.Cut
#003 EndSub
#004 PublicSubAction_Copy()
#005 ActiveTB.Copy
#006 EndSub
#007 PublicSubAction_Paste()
#008 ActiveTB.Paste
#009 EndSub
#010 PublicSubAction_Delete()
#011 DimsAsString
#012 WithActiveTB
#013 s=.SelText
#014 .Value=Replace(.Value,s,"")
#015 EndWith
#016 EndSub
代码解析:
Action_Cut过程是快捷菜单中单击“剪切”菜单项所运行的过程。
使用Cut 方法将当前选中的文本框中的文本删除并移至剪贴板。
Action_Copy过程是快捷菜单中单击“复制”菜单项所运行的过程。
使用Copy方法将文本框选中的文本复制到剪贴板上。
Action_Paste过程是快捷菜单中单击“贴粘”菜单项所运行的过程。
使用Paste方法把剪贴板上的内容传送到一个文本框中。
Action_Delete过程是快捷菜单中单击“贴粘”菜单项所运行的过程。
使用Replace函数将文本框中选中的文本的文本替换成空字符。
#001 PublicSubDeleteShortCutMenu()
#002 OnErrorResumeNext
#003 Application.CommandBars("ShortCut").Delete
#004 EndSub
代码解析:
DeleteShortCutMenu过程删除创建的右键快捷菜单。
步骤2:
在VBE窗口中,单击菜单“插入”→“用户窗体”,在窗体上添加两个文本框控件。
双击窗体,在其代码窗口中输入下面的代码。
#001 PrivateSubUserForm_Initialize()
#002 CallCreateShortCutMenu
#003 EndSub
#004 PrivateSubTextBox1_MouseUp(ByValButtonAsInteger,ByValShiftAsInteger,ByValXAsSingle,ByValYAsSingle)
#005 IfButton=2ThenShowPopupMenuActiveControl
#006 EndSub
#007 PrivateSubTextBox2_MouseUp(ByValButtonAsInteger,ByValShiftAsInteger,ByValXAsSingle,ByValYAsSingle)
#008 IfButton=2ThenShowPopupMenuActiveControl
#009 EndSub
#010 PrivateSubUserForm_QueryClose(CancelAsInteger,CloseModeAsInteger)
#011 CallDeleteShortCutMenu
#012 EndSub
代码解析:
第1行到第3行代码,窗体的Initialize事件,在窗体初始化时运行CreateShortCutMenu过程创建右键快捷菜单。
第4行到第9行代码,文本框的MouseUp事件,当用户右健单击文本框时运行ShowPopupMenu过程在选中的菜单项上显示右键快捷菜单。
第10行到第12行代码,窗体的QueryClose事件,在关闭窗体时运行DeleteShortCutMenu过程删除右键快捷菜单。
窗体运行后,右键单击文本框显示右键快捷菜单,如图 991所示。
图 991 文本框快捷菜单
技巧100文本框回车自动输入
2018年10月11日,星期四
10:
22
在使用文本框向工作表输入数据时,为了加快输入速度,可以利用文本框的KeyDown事件,回车后自动输入并清空文本框,如下面的代码所示。
#001 PrivateSubTextBox1_KeyDown(ByValKeyCodeAsMSForms.ReturnInteger,ByValShiftAsInteger)
#002 WithTextBox1
#003 IfLen(Trim(.Value))>0Then
#004 IfKeyCode=vbKeyReturnThen
#005 Sheet1.Range("A65536").End(xlUp).Offset(1,0)=.Value
#006 .Text=""
#007 EndIf
#008 EndIf
#009 EndWith
#010 EndSub
代码解析:
文本框的KeyDown事件,在输入数据并按
KeyDown事件在按下键盘按键时发生,语法如下:
PrivateSubobject_KeyDown(ByValKeyCodeAsMSForms.ReturnInteger,ByValShiftAsfmShiftState)
参数object是必需的,一个有效的对象。
参数KeyCode是必需的,代表被按下的键的键代码。
参数Shift是可选的,Shift、Ctrl 和Alt的状态。
第3行代码,为了防止误输入空白数据,使用Len 函数和Trim 函数检查文本框内是否为有效数据。
第4行代码,根据KeyCode参数值判断是否按下了回车键。
如果用户按下了回车键,KeyCode参数返回常数vbKeyReturn。
第5、6行代码,将文本框数据输入到工作表A列的最后一个单元格内,同时清空文本框内容准备下一次输入。
技巧101自动选择文本框内容
2018年10月11日,星期四
10:
22
如果希望光标进入文本框时能自动选择文本框内容,可以在文本框的MouseUp事件中来完成,如下面的代码所示。
#001 PrivateSubTextBox1_MouseUp(ByValButtonAsInteger,ByValShiftAsInteger,ByValXAsSingle,ByValYAsSingle)
#002 WithTextBox1
#003 IfButton=2Then
#004 .SelStart=0
#005 .SelLength=Len(.Text)
#006 EndIf
#007 EndWith
#008 EndSub
代码解析:
文本框的MouseUp事件,在光标进入文本框释放鼠标右键时自动选择文本框内容。
MouseUp事件在用户释放鼠标按键时发生,语法如下:
PrivateSubobject_MouseUp(ByValButtonAsfmButton,ByValShiftAsfmShiftState,ByValXAsSingle,ByValYAsSingle)
参数object是必需的,一个有效的对象。
参数Button是可选的,设置引起该事件的鼠标按键的整数值,如表格 1011所示。
常数
值
说明
fmButtonLeft
1
按下左键。
fmButtonRight
2
按下右键。
fmButtonMiddle
3
按下中键。
表格 1011 Button参数值
参数Shift是可选的,Shift、Ctrl 和Alt的状态。
参数X和参数Y是可选的,窗体、框架或页的位置的横坐标与纵坐标。
第3行到第6行代码,如果用户进入文本框释放鼠标右键,设置文本框的SelStart 属性为0,SelLength属性为文本框的全部字符数。
SelStart 属性指定选中文本的起点,语法如下:
object.SelStart[=Long]
参数object是必需的,一个有效的对象。
参数Long是可选的,指定选中文本的起点。
SelLength 属性指定文本框或组合框的文本部分中选中的字符数,语法如下:
object.SelLength[=Long]
参数object是必需的,一个有效的对象。
参数Long是可选的,指定选中的字符数。
运行窗体,当光标进入文本框释放鼠标右键时自动选择文本框内容,如图 1011所示。
图 1011 自动选择文本框内容
技巧102设置文本框数据格式
2018年10月11日,星期四
10:
22
文本框在用来输入数据时,除了限制输入的数据类型外,还可以设置文本框的数据格式,如下面的代码所示。
#001 PrivateSubTextBox1_Exit(ByValCancelAsMSForms.ReturnBoolean)
#002 TextBox1=Format(TextBox1,"0.00")
#003 EndSub
#004 PrivateSubTextBox2_Exit(ByValCancelAsMSForms.ReturnBoolean)
#005 TextBox2=Format(TextBox2,"0.00")
#006 EndSub
代码解析:
文本框的Exit事件过程,在文本框输入数据时使用Format函数格式化为两位小数格式。
控件的Exit事件在同一窗体中的一个控件即将把焦点转移到另一个控件之前发生,语法如下:
PrivateSubobject_Exit(ByValCancelAsMSForms.ReturnBoolean)
参数Object是必需的,一个有效的对象。
参数Cancel是必需的,事件状态。
如果设置为False表示由该控件处理这个事件(默认方式)。
设置为True表示由应用程序处理这个事件,并且焦点留在当前控件上。
当文本框在输入完数据失去焦点时使用Format函数格式化自定义数值格式。
Format函数语法如下:
Format(expression[,format[,firstdayofweek[,firstweekofyear]]])
参数expression是必需的,任何有效的表达式。
参数format是可选的,有效的命名表达式或用户自定义格式表达式。
参数firstdayofweek是可选的,常数,表示一星期的第一天。
参数firstweekofyear是可选的,常数,表示一年的第一周。
在本例中,将文本框的数据格式化成自定义的两位小数的数值格式,关于Format函数格式化日期和时间等其他数据请参阅VBA中Format函数的帮助。
#001 PrivateSubTextBox1_Change()
#002 TextBox3=Format(Val(TextBox1)*Val(TextBox2),"0.00")
#003 EndSub
#004 PrivateSubTextBox2_Change()
#005 TextBox3=Format(Val(TextBox1)*Val(TextBox2),"0.00")
#006 EndSub
代码解析:
文本框的Change事件过程,在两个文本框输入完数据后,使用文本框的Change事件使TextBox3显示其相乘的金额并格式化为两位小数的数据格式。
Change事件在控件的 Value 属性改变时发生,语法如下:
PrivateSubobject_Change()
参数object是必需的,一个有效的对象。
Change事件过程可以使显示在控件上的数据同步或一致。
在本例中,当TextBox1或TextBox2的数据发生改变时,两者相乘的金额的金额也随之改变并在TextBox3中显示。
因为文本框的数据类型是文本字符串,不能直接进行计算的,所以计算前先使用Val函数转换为数字,才能进行计算。
运行窗体,输入数据后格式化为两位小数的数据格式,如图 1021所示。
图 1021 设置文本框的数据格式
技巧103限制文本框的输入长度
2018年10月11日,星期四
10:
22
在使用文本框输入数据时,可能希望限制能输入的字符长度,即只能输入一定长度的字符,
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- EXCEL VBA常用技巧 第8章 控件与用户窗体 VBA 常用 技巧 控件 用户 窗体