【Excel VBA】控件应用(1) |
您所在的位置:网站首页 › vb如何在列表框输入 › 【Excel VBA】控件应用(1) |
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属性返回当前文本框中的字符串。
但是以上代码无法禁止中文字符的输入和粘贴。利用文本框的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进行换行。 运行结果如下。 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)MouseDown 和 MouseUp 事件的语法包含以下成分: 成分说明object必需。一个有效的对象。index必需。发生特定事件的多页和 TabStrip 中的页索引或标签索引。Button必需。标识引起该事件的鼠标按键的整数值。Shift必需。规定 Shift、Ctrl 和 Alt 的状态。X, Y必需。窗体、框架或页的位置的横坐标与纵坐标,以磅为单位,分别从左边和顶边开始测量。参数Button是必需的,标识引起该事件的鼠标按键值,如下表所示。 Button 的设置如下: 常量值说明fmButtonLeft1按下左键。fmButtonRight2按下右键。fmButtonMiddle4按下中键。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事件过程,在文本框实际接收焦点前自动选中文本框中的内容。 |
今日新闻 |
推荐新闻 |
CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3 |