【Excel VBA】控件应用(1)-文本框

时间:2024-04-14 08:22:14

12.1 限制文本框的输入

用户在使用文本框输入数据时,往往希望可以限制输入数据的类型,例如,只允许输入数字,但是文本框的现有属性无法直接实现这样的要求。此时可以在文本框的KeyPress事件过程和Change事件过程中编写代码来判断输入的字符类型。只允许输入数字字符和一个"-"号、一个"."号,示例代码如下。

 Private Sub txtDemo_KeyPress(ByVal KeyANSI As MSForms.ReturnInteger)
     Select Case KeyANSI'判断参数的值
         Case Asc("0") To Asc("9")
         Case Asc("-")
             If InStr(1, Me.txtDemo.Text, "-") > 0 Or _
                 Me.txtDemo.SelStart > 0 Then
                 KeyANSI = 0
             End If
         Case Asc(".")
             If InStr(1, Me.txtDemo.Text, ".") > 0 Then
                 KeyANSI = 0
             End If
         Case Else
             KeyANSI = 0
     End Select
 End Sub

当用户按下一个ANSI键时触发KeyPress事件。

KeyPress事件的语法格式如下。

 Private Sub object_KeyPress( ByVal KeyANSI As MSForms.ReturnInteger)

其中,Object是必需的,代表一个有效的对象。

参数KeyANSI是可选的,其值为整数型,代表标准的ANSI键代码。

第3行代码利用Asc函数将字符串转换为字符代码。

第4~8行用来判断字符"-",只能在文本框第1位输入单个"-"。如果键盘输入的是"-",先使用InStr函数判断文本框中是否存在"-",如果InStr函数的返回值大于0,说明文本框已存在"-"。接下来使用文本框的SelStart属性来检测插入点,如果文本框SelStart的属性值大于0,说明插入点不是第1个。

将KeyANSI参数值设置为0,取消键盘输入。

第5行代码中的Me表示当前窗体,txtDemo是窗体中文本框的名称,如下图所示。文本框的Text属性返回当前文本框中的字符串。

【Excel VBA】控件应用(1)-文本框

 

但是以上代码无法禁止中文字符的输入和粘贴。利用文本框的Change事件可以解决此问题,示例代码如下。

 Private Sub txtDemo_Change()
     Dim i As Integer
     Dim strEntry As String
     With txtDemo
         For i = 1 To Len(.Text)'逐个提起文本框中的字符进行判断
             strEntry = Mid(.Text, i, 1)
             Select Case strEntry
                 Case ".", "-", "0" To "9"
                 Case Else
                     .Text = Replace(.Text, strEntry, "")
             End Select
         Next i
     End With
 End Sub

第10行代码使用Replace函数将非法输入字符替换成空字符串。当替换文本框的字符时,会触发Change事件。

增加Change事件过程后,在文本框中只能输入数字和一个"."以及在第一位输入一个"-"。

12.2 自动换行的文本框

当使用文本框显示一段很长的文本时,需要将文本框设置成多行显示,否则文本内容只能在一行中显示,此时应设置文本框的WordWrap属性和MultiLine属性,示例代码如下。

 Private Sub UserForm_Initialize()
     With Me.txtDemo
         .WordWrap = True
         .MultiLine = True
         .Text = "文本框是一个灵活的控件,受下列属性的影响:Text、" _
             & "MultiLine、WordWrap和AutoSize。" & vbCrLf _
             & "Text 包含显示在文本框中的文本。" & Chr(10) _
             & "MultiLine 控制文本框是单行还是多行显示文本。" _
             & "换行字符用于标识在何处结束一行并开始新的一行。" _
             & "如果 MultiLine 的值为False,则文本将被截断," _
             & "而不会换行。如果文本的长度大于文本框的宽度," _
             & "WordWrap允许文本框根据其宽度自动换行。" & Chr(10) _
             & "如果不使用 WordWrap,当文本框在文本中遇到换行字符时," _
             & "开始一个新行。如果关闭WordWrap,TextBox中可以有不能" _
             & "完全适合其宽度的文本行。文本框根据该宽度,显示宽度以" _
             & "内的文本部分,截断宽度以外的那部分文本。只有当" _
             & "MultiLine为True时,WordWrap才起作用。" & Chr(10) _
             & "AutoSize 控制是否调节文本框的大小,以便显示所有文本。" _
             & "当文本框使用AutoSize 时,文本框的宽度按照文本框中的" _
             & "文字量以及显示该文本的字体大小收缩或扩大。"
     End With
 End Sub

第3行代码设置文本框的WordWrap属性为True。

WordWrap属性指定控件的内容在行末是否自动换行。设置为True,文本将自动换行;设置为False,文本不换行。

第4行代码设置文本框的MultiLine属性为True。

MultiLine属性指定控件能否接受和显示多行文本。设置为True,支持多行显示文本。

如果将文本框的MultiLine属性设置为False,则文本框的所有字符都合并为一行,包括非打印字符(如回车符和换行符)。

注:对于同时支持这两个属性的控件,当MultiLine属性设置为False时,WordWrap属性将被忽略。

当需要强制换行时,可以在文本中插入vbCrLf进行换行。

运行结果如下。

【Excel VBA】控件应用(1)-文本框

 

12.3 自动选择文本框内容

如果希望文本框获得焦点时能自动选中其内容,可以在MouseUp事件和Enter事件中设置文本框的SelLength属性,示例代码如下。

 Private Sub txtDemo_MouseUp(ByVal Button As Integer, ByVal Shift As Integer, ByVal X As Single, ByVal Y As Single)
     If Button = 2 Then'被释放的是否为鼠标右键
         With txtDemo
             .SelStart = 0
             .SelLength = Len(.Text)
         End With
     End If
 End Sub
 Private Sub txtDemo_Enter()
     txtDemo.SelStart = 0
     txtDemo.SelLength = Len(txtDemo.Text)
 End Sub

第1~8行代码为文本框的MouseUp事件过程,在文本框中右击时自动选中文本框中的内容。

按下鼠标右键时触发控件的MouseDown事件,释放鼠标时触发控件的MouseUp事件,其语法格式如下。

 Private Sub object_MouseUp( ByVal Button As fmButton, ByVal Shift As fmShiftState, ByVal X As Single, ByVal Y As Single)

MouseDownMouseUp 事件的语法包含以下成分:

成分 说明
object 必需。一个有效的对象。
index 必需。发生特定事件的多页和 TabStrip 中的页索引或标签索引。
Button 必需。标识引起该事件的鼠标按键的整数值。
Shift 必需。规定 Shift、Ctrl 和 Alt 的状态。
X, Y 必需。窗体、框架或页的位置的横坐标与纵坐标,以磅为单位,分别从左边和顶边开始测量。

参数Button是必需的,标识引起该事件的鼠标按键值,如下表所示。

Button 的设置如下:

常量 说明
fmButtonLeft 1 按下左键。
fmButtonRight 2 按下右键。
fmButtonMiddle 4 按下中键。

Shift 的设置如下:

说明
1 按下 Shift。
2 按下 Ctrl。
3 同时按下 Shift 和 Ctrl。
4 按下 Alt。
5 同时按下 Alt 和 Shift。
6 同时按下 Alt 和 Ctrl。
7 同时按下 Alt 、Shift 和 Ctrl。

第3~6行代码设置文本框的SelStart属性为0,SelLength属性为文本框中字符串的长度。

SelStart属性指定选中文本的起点,如果没有选中的文本,则指定插入点。

SelLength属性指定文本框或组合框中的文本被选中的字符数。

对于SelLength和SelStart,其默认值均为0,设置值的有效范围是从0到组合框或文本框编辑区中的全部字符的长度。

第9~12行代码为文本框的Enter事件过程,在文本框实际接收焦点前自动选中文本框中的内容。

相关文章