学习资源:《Excel VBA从入门到进阶》第56集 by兰色幻想
本节讲文字框控件。
一、显示
讲几个常用的属性:
1. 多行显示
MultiLine 属性值为true时,可以多行显示文本。
2. 文本框对齐
左右对齐可以用TextAlign对齐,但上下对齐则没有相应的属性设置。
3. 密码样式
可以设置passwordChar属性来隐藏输入的内容,在passwordChar输入显示的占位符字符, 就会把文本框中实际输入的字符逐一显示为占位符。默认不设置。
4. 行列超过宽度或高度时添加滚动条
ScrollBars属性可以设置垂直和水平滚动条,有四种常量:
但需注意WordWrap 设置为 True 时,多行控件将不显示水平滚动条,即使设置为显示水平滚动条。
5. 强制换行符号(同时MultiLine 属性也要设置为True,显示多行)
EnterKeyBehavior的属性值为TRUE时,可以强制换行,按回车即可以转到下一行。不设置的话,按回车就会到下一个控件。
如果用代码,可以借用换行符来实现转行。
Private Sub CommandButton1_Click()
TextBox2 = "excelpx" & Chr(10) & ".com" 'Chr(10)换行符
End Sub
二、功能
1. 自动跳到一下个tab顺序的控件
AutoTab属性设置为true,当文字框输入字符数大于设置值MaxLength时,会自动跳转到tab顺序的下一个控件。
例:AutoTab设置为true,MaxLength设置为6,输入超过6个字符,自动跳转到Tab键顺序的下一个控件。
2. 锁定文本和禁用
Locked属性为true时,显示正常,可以选取,可以复制,但不能编辑。
Enable属性为false时,显示灰色,不能选取。(上一课有讲过)
3. 是否允许拖放复制值
DragBehavior 属性值为1时,可以进行拖放。默认不可以,属性值为0。
三、 常用方法和属性(写代码用)
1. lineCount属性:获得文本框的行数。
2. SelLength属性:可以获得当前文本框中选取的文本长度。
3. SelText属性:可以获得当前文本框中选取的文本。
4. SetFocus属性:获得焦点。
5. SelStart属性:可以获得当前文本框中选取文本的插入点。
Private Sub TextBox3_Exit(ByVal Cancel As MSForms.ReturnBoolean)
TextBox2 = TextBox3.SelLength & ":" & TextBox3.SelText & ":" & TextBox3.SelStart
End Sub
四、 事件
1. 当文本框值发生改变量时的事件
Private Sub 用户名_Change() '修改用户名文本框就会弹出提示。
MsgBox "你已修改用户名。"
End Sub
2. 当离开文本框时,如果数据发生了改变,则发生此事件。
Private Sub TextBox1_AfterUpdate() '修改TextBox1文本框并离开就会弹出提示。
MsgBox "已保存修改后的数据。"
End Sub
3. 焦点进入文本框时的事件
Private Sub 用户名_Enter() '点击进入用户名文本框就会弹出提示。
MsgBox "请填写用户名。"
End Sub
4. 离开文本框时的事件
例1:必须输入用户名,否则不准离开。
Private Sub 用户名_Exit(ByVal Cancel As MSForms.ReturnBoolean)
If 用户名.Text = "" Then
Cancel = True
MsgBox "你没有输入用户名,不能跳过" & Chr(10) & "请输入内容"
End If
End Sub
注意:Cancel参数常用于取消该事件的发生,本事件是指取消离开动作,禁止离开。
例2:密码必须输入数字,否则不准离开重新输入。
Private Sub TextBox1_Exit(ByVal Cancel As MSForms.ReturnBoolean)
If Not VBA.IsNumeric(TextBox1.Value) And TextBox1.Value <> "" Then
Cancel = True
MsgBox "密码只能输入数字,请重新输入"
End If
End Sub
五、综合实例
设计一个入库登记窗体,记录入库日期、商品名称、数量、单价和金额。
其中:
- 打开窗体,自动填入当前日期。(窗体初始化事件)
- 输入数量自动计算金额(控件Change事件)
- 按回车或焦点离开后并将这条记录记入数据库。(控件Exit事件)
- 通过商品名称,查找并返回其单价(字典),如输入不存在的商品名称,就返回提示,阻止离开并需重新输入。(控件Exit事件)
Option Explicit
Dim d As Object '定义全局变量d,字典
Private Sub UserForm_Initialize()'窗体初始化事件
Dim arr, x
日期 = Date '自动填入当前日期
'用字典记录商品名称及其单价
Set d = CreateObject("scripting.dictionary")
arr = Sheets("sheet3").Range("G2:H4")
For x = 1 To UBound(arr)
d(arr(x, 1)) = arr(x, 2)
Next x
End Sub
Private Sub 数量_Exit(ByVal Cancel As MSForms.ReturnBoolean) '离开数量后就自动输入到单元格中
Dim myrow As Long, x
If VBA.IsNumeric(数量.Value) Then
With Sheets("sheet3")
myrow = .Range("a65536").End(xlUp).Row + 1
.Cells(myrow, 1) = 日期
.Cells(myrow, 2) = 商品
.Cells(myrow, 3) = 数量.Value
.Cells(myrow, 4) = 单价.Value
.Cells(myrow, 5) = 金额.Value
End With
商品 = ""
Else
MsgBox "数量不能为非数字,请重新输入"
Cancel = True
End If
End Sub
Private Sub 商品_Exit(ByVal Cancel As MSForms.ReturnBoolean) '根据商品查找单价
If d.Exists(商品.Value) Then
单价 = d(商品.Value)
Else
MsgBox "该商品单价不存在,请重新输入"
Cancel = True
End If
End Sub
Private Sub 数量_Change() '输入数量后自动计算金额
If VBA.IsNumeric(数量.Value) Then
金额 = 数量 * 单价
End If
End Sub