第8部分控件的应用
▲099 文本框添加右键快捷菜单
VBA中的控件没有提供右键快捷菜单,用户可以使用Excel 中的命令栏自已添加右键快捷菜单。
步骤1:按<Alt+F11>组合键进入VBE窗口,单击菜单“插入”→“模块”,在其代码窗口输入以下代码:
Private ActiveTB As MSForms.TextBox
Public Sub CreateShortCutMenu()
DimShortCutMenu As CommandBar
DimShortCutMenuItem As CommandBarButton
DimsCaption As Variant
DimiFaceId As Variant
DimsAction As Variant
Dimi As Integer
sCaption= Array('剪切(&C)','复制(&T)','贴粘(&P)','删除(&D)')
iFaceId= Array(21,19,22,1786)
sAction= Array('Action_Cut','Action_Copy','Action_Paste','Action_Delete')
On ErrorResume Next
Application.CommandBars('ShortCut').Delete
SetShortCutMenu = Application.CommandBars.Add('ShortCut',msoBarPopup)
WithShortCutMenu
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
EndWith
End Sub
代码解析:
第1行代码,在模块级别中声明变量ActiveTB是用来对应窗体中的文本框所触发的所有事件的变量。CreateShortCutMenu过程用来创建标题为“ShortCut”的右键快捷菜单,并添加4个菜单项。
Public Sub ShowPopupMenu(txtCtr As MSForms.TextBox)
DimAction As Variant
SetActiveTB = txtCtr
WithApplication.CommandBars('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
EndWith
End Sub
代码解析:
ShowPopupMenu过程根据文本框中字符的选中状态设置右键快捷菜单菜单项的Enabled属性后使用ShowPopup方法显示右键快捷菜单。
第5行代码,如果当前文本框中已有选中的字符则“剪切”按钮有效。
第6行代码,如果当前文本框中已有选中的字符则“复制”按钮有效。
第7行代码,如果剪贴板中包含对象支持的数据。则“贴粘”按钮有效。
第8行代码,如果当前文本框中已有选中的字符则“删除”按钮有效。
第9行代码,显示快捷菜单。
Public Sub Action_Cut()
ActiveTB.Cut
End Sub
Public Sub Action_Copy()
ActiveTB.Copy
End Sub
Public Sub Action_Paste()
ActiveTB.Paste
End Sub
Public Sub Action_Delete()
Dims As String
WithActiveTB
s = .SelText
.Value = Replace(.Value,s,““)
EndWith
End Sub
代码解析:
Action_Cut过程是快捷菜单中单击“剪切”菜单项所运行的过程。使用Cut 方法将当前选中的文本框中的文本删除并移至剪贴板。
Action_Copy过程是快捷菜单中单击“复制”菜单项所运行的过程。使用Copy方法将文本框选中的文本复制到剪贴板上。
Action_Paste过程是快捷菜单中单击“贴粘”菜单项所运行的过程。使用Paste方法把剪贴板上的内容传送到一个文本框中。
Action_Delete过程是快捷菜单中单击“贴粘”菜单项所运行的过程。使用Replace函数将文本框中选中的文本的文本替换成空字符。
Public Sub DeleteShortCutMenu()
On ErrorResume Next
Application.CommandBars('ShortCut').Delete
End Sub
代码解析:
DeleteShortCutMenu过程删除创建的右键快捷菜单。
步骤2:在VBE窗口中,单击菜单“插入”→“用户窗体”,在窗体上添加两个文本框控件。双击窗体,在其代码窗口中输入下面的代码。
Private Sub UserForm_Initialize()
CallCreateShortCutMenu
End Sub
Private Sub TextBox1_MouseUp(ByVal Button As Integer,ByVal Shift As Integer,ByVal X As Single,ByVal Y As Single)
If Button= 2 Then ShowPopupMenu ActiveControl
End Sub
Private Sub TextBox2_MouseUp(ByVal Button As Integer,ByVal Shift As Integer,ByVal X As Single,ByVal Y As Single)
If Button= 2 Then ShowPopupMenu ActiveControl
End Sub
Private Sub UserForm_QueryClose(Cancel As Integer,CloseMode As Integer)
CallDeleteShortCutMenu
End Sub
代码解析:
第1行到第3行代码,窗体的Initialize事件,在窗体初始化时运行CreateShortCutMenu过程创建右键快捷菜单。
第4行到第9行代码,文本框的MouseUp事件,当用户右健单击文本框时运行ShowPopupMenu过程在选中的菜单项上显示右键快捷菜单。
第10行到第12行代码,窗体的QueryClose事件,在关闭窗体时运行DeleteShortCutMenu过程删除右键快捷菜单。
窗体运行后,右键单击文本框显示右键快捷菜单。
▲100 文本框回车自动输入
在使用文本框向工作表输入数据时,为了加快输入速度,可以利用文本框的KeyDown事件,回车后自动输入并清空文本框,如下面的代码所示。
Private Sub TextBox1_KeyDown(ByVal KeyCode AsMSForms.ReturnInteger,ByVal Shift As Integer)
WithTextBox1
If Len(Trim(.Value)) > 0 Then
If KeyCode = vbKeyReturn Then
Sheet1.Range('A65536').End(xlUp).Offset(1,0) = .Value
.Text = ““
End If
End If
EndWith
End Sub
代码解析:
文本框的KeyDown事件,在输入数据并按<Enter>键后自动将数据录入到工作表A列最后一个非空单元格的下一个单元格中。
KeyDown事件在按下键盘按键时发生,语法如下:
Private Sub object_KeyDown(ByVal KeyCode As MSForms.ReturnInteger,ByVal ShiftAs fmShiftState)
参数object是必需的,一个有效的对象。
参数KeyCode是必需的,代表被按下的键的键代码。
参数Shift是可选的,Shift、Ctrl 和Alt的状态。
第3行代码,为了防止误输入空白数据,使用Len 函数和Trim 函数检查文本框内是否为有效数据。
第4行代码,根据KeyCode参数值判断是否按下了回车键。如果用户按下了回车键,KeyCode参数返回常数vbKeyReturn。
第5、6行代码,将文本框数据输入到工作表A列的最后一个单元格内,同时清空文本框内容准备下一次输入。
▲101 自动选择文本框内容
如果希望光标进入文本框时能自动选择文本框内容,可以在文本框的MouseUp事件中来完成,如下面的代码所示。
Private Sub TextBox1_MouseUp(ByVal Button As Integer,ByVal Shift As Integer,ByVal X As Single,ByVal Y As Single)
WithTextBox1
If Button = 2 Then
.SelStart = 0
.SelLength = Len(.Text)
End If
EndWith
End Sub
代码解析:
文本框的MouseUp事件,在光标进入文本框释放鼠标右键时自动选择文本框内容。
MouseUp事件在用户释放鼠标按键时发生,语法如下:
Private Sub object_MouseUp(ByVal Button As fmButton,ByVal Shift As fmShiftState,ByVal X As Single,ByVal Y As Single)
参数object是必需的,一个有效的对象。
参数Button是可选的,设置引起该事件的鼠标按键的整数值,如表格所示。
参数Shift是可选的,Shift、Ctrl 和Alt的状态。
参数X和参数Y是可选的,窗体、框架或页的位置的横坐标与纵坐标。
第3行到第6行代码,如果用户进入文本框释放鼠标右键,设置文本框的SelStart 属性为0,SelLength属性为文本框的全部字符数。
SelStart 属性指定选中文本的起点,语法如下:
object.SelStart [=Long]
参数object是必需的,一个有效的对象。
参数Long是可选的,指定选中文本的起点。
SelLength 属性指定文本框或组合框的文本部分中选中的字符数,语法如下:
object.SelLength [=Long]
参数object是必需的,一个有效的对象。
参数Long是可选的,指定选中的字符数。
运行窗体,当光标进入文本框释放鼠标右键时自动选择文本框内容。
联系客服