跟着王老师学Excel VBA #13 | 窗体与控件
概要
- 使用窗体 UserForm
- 文字框 TextBox
- 复选按钮 CheckBox
- 复合框 ComboBox
- 列表框 ListBox
演示案例
- 会员信息查询系统 ⭐联想输入功能 TextBox & ListBox 制作查询功能
- 优化制作密码验证
代码
From DEMO-1 窗体 UserForm
在哪里:右键 - 插入 - 用户窗体
视图 - 工具箱
哪里写代码:双击需写代码的窗体or双击需写代码的控件
常用属性
Enable | Caption | Visible
ShowModal 显示模式(True 独占)
常用方法
Show 显示
Hide 隐藏
Private Sub CommandButton1_Click()
UserForm2. Show
End Sub
常用事件
'激活窗体时,隐藏Excel主程序
Private Sub UserForm_Active()
Application. Visible = False
End Sub
'退出窗体时,同时关闭Excel主程序
Private Sub UserForm_QueryClose(Cancel As Integer, CloseMode As Integer)
Application. Quit 'quit 彻底关闭excel的方式
End Sub
---#ThisWorkbook#---
Private Sub Workbook_Open()
UserForm1.Show
End Sub
#文件另存为.xlsm
From DEMO-2 复选框控件 CheckBox
常用属性
Enable | Value | Visible
From DEMO-3 文字框控件(文本框) TextBox
通常给用户输入内容
常用属性
Enable | Value | Visible
PasswordChar 密码字符(将输入的字符以某种特定的符号显示)
TabIndex 按下Tab键时的切换顺序 0,1,2 …
'优化制作密码验证 07
---#UserForm1#---
'制作登录窗体
Private Sub CommandButton1_Click()
If Me.TextBox1. Value = "张三" And Me. TextBox2. Value = "123" Then 'Me指代的是写这段代码的对象
Sheet2. Visible = xlSheetVisible
Sheet2. Unprotect "Test" '引号内填入原先设置的密码
ElseIf Me.TextBox1. Value = "李四" And Me. TextBox2. Value = "0000" Then 'Me指代的是写这段代码的对象
Sheet3. Visible = xlSheetVisible
Sheet3. Unprotect "test" '引号内填入原先设置的密码
End If
End Sub
---#ThisWorkbook#---
'关闭前隐藏并保护相关表
Private Sub Workbook_BeforeClose(Cancel As Boolean)
Sheet2. Visible = xlSheetHidden
Sheet3. Visible = xlSheetHidden
Sheet2. Protect "test"
Sheet3. Protect "test"
End Sub
'打开时激活登录窗体
Private Sub Workbook_Open
UserForm1. Show
End Sub
#TextBox2
设置PasswordChar为*
From DEMO-4 复合框控件(组合框)ComboBox
常用属性
Enable | Value | Visible
List 数据源列表
常用方法
AddItem 增加一个下拉项目
RemoveItem 移除一个项目
Clear 全部清除
'初始化
Sub csh()
For i = 2 To 7
UserForm1. ComboBox1. AddItem Sheet1. Range("A" & i)
Next
End Sub
---#UserForm1#---
Private Sub UserForm_Activate()
Call csh
'删除ComboBox中的第二项
Me. ComboBox1. RemoveItem (1)
End Sub
'将复合框中当前选定的值返回到单元格
---#UserForm1#---
Private Sub CommandButton1_Click()
Sheet1. Range("B1") = Me. ComboBox1. Value
End Sub
'将复合框中的某一项的值返回到单元格
---#UserForm1#---
Private Sub CommandButton1_Click()
Sheet1. Range("B1") = Me. ComboBox1. List(1) '结合数组,返回list中的第二个
End Sub
From DEMO-5 列表框控件 ListBox
类似复合框 — 对比学习
常用属性
Enable | Value | Visible
ColumnCount 列
List 数据源列表
常用方法
AddItem 增加一个下拉项目
RemoveItem 移除一个项目
Clear 全部清除
'初始化
Sub csh()
For i = 2 To 7
UserForm1. ComboBox1. AddItem Sheet1. Range("A" & i)
Next
End Sub
---#UserForm1#---
Private Sub UserForm_Activate()
Call csh
End Sub
From DEMO-6 作业:会员信息查询
⭐案例:会员信息查询系统
---#UserForm1#---
''制作联想输入功能
'输入字符大于4位时,自动搜索符合条件的数据,并以ListBox呈现
Private Sub TextBox1_Change()
Dim arr()
If Len(Me. TextBox1. Value) >=4 Then
Me. ListBox1. Clear
arr = Sheet1.Range("i2:i" & Sheet1.Range("a65536").End(xlUp).Row)
For i = LBound(arr) To UBound(arr)
If InStr(arr(i, 1), Me. TextBox1. Value) >0 Then
Me. ListBox1. AddItem arr(i, 1)
End If
Next
If Me. ListBox1. ListCount > 0 Then
Me. ListBox1. Visible = True
Else
Me. ListBox1. Visible = False
End If
Else
Me.ListBox1.Clear
Me. ListBox1. Visible = False
End If
End Sub
'将ListBox中被选择的值返回到TextBox
Private Sub ListBox_Click()
Me. TextBox1. Value = Me. ListBox1. Value
Me. ListBox1. Visible = False
End Sub
'制作查询功能
Private Sub CommandButton1_Click()
Dim rng As Range
Set rng = Sheet1.Range("I1:I1000"). Find(Me. TextBox1. Value) '用find方法做
If rng Is Nothing Then
MsgBox "无该用户"
Else
Me.Label3.Caption = rng. Offset(0, -6)
Me.Label4.Caption = rng. Offset(0, -5)
Me.Label6.Caption = rng. Offset(0, -4)
Me.Label8.Caption = rng
Me.Label10.Caption = rng. Offset(0, -3)
Me.Label12.Caption = rng. Offset(0, -2)
Me.Label13.Caption = rng. Offset(0, -1)
End If
End Sub