前面是自己纯摸索的,这篇跟着书看,我喜欢这种先自学了再看书的感觉
form的自学方法
- 属性窗口,按照分类排序
- 按F1 可以查看帮助
1 窗体 form
1.1 创建窗体 form (默认名:userform)
- 在VBE里和插入模块一样,插入用户窗体即可
1.2 如何运行/显示 窗体?
1.2.1 显示窗体的代码方法
- 据说,单写一句 userform1.show 也是可以的,因为VBE会自动先 load 这个窗体
- load form1 '加载窗体,加载到内存,但不显示
- form1.show '显示窗体 (必须得先加载到内存,才可能显示)
- 这里语法都是用的form1 的name属性,也是load name , unload name, name.show
Sub callform1()
Load UserForm1
UserForm1.Show
End Sub
1.2.2 选中form后,点运行也可以
1.2.3 出错处理
- 如果这个窗体不存在,就没法使用对象.show方法,会报错 要求对象
- 如果load form2 ,form2不存在,也是报错 要求对象,load object 的语法
1.3 关闭窗体:其实是卸载 unload,注意模式窗体和无模式窗体
- 只能在窗体运行时,窗体本身的事件去关闭他
- 一般正常代码代码
Private Sub UserForm_DblClick(ByVal Cancel As MSForms.ReturnBoolean)
Unload UserForm1
End Sub
1.3.1 一般创建的窗体,无法再运行时被其他VBA代码等关闭,也不能操作EXCEL
- 下面的代码1毫无意义
- 因为,窗体在运行的过程中,VBE是挂起的,无法调用
- 代码1
Sub unloadform1()
Unload UserForm1 '没办法调用
End Sub
1.3.2 设置模式窗体 和无模式窗体的方法
- 默认或者设置 vbmodal 就是有模式的窗体
- 如果设置 窗体4.Show vbModeless 就是无模式的窗体,并且运行时可以允许其他VBA关闭这个允许的窗体
- 注意vbmodal 不要写成 vbmodel
Sub test10001()
窗体4.Show vbModal '或 窗体4.show 注意不要写成 vbmodel
End Sub
Sub test1002()
窗体4.Show vbModeless
End Sub
Sub test1003() '因为窗体4设置为modelless,这里才能在其运行时关闭他
Unload 窗体4
End Sub
1.4 窗体命名的特殊性
- VBE中可以创建2个窗体,默认自动命名为 userform1 , userform2
- 在不同的窗体下
- 但是事件代码的 窗体名字都叫 userform,并没有被命名为 userform1 , userform2
- 可能是因为不同窗体是独立的,并且每个窗体和控件组,只能有1个form窗体。
- 在同一个窗体下
- 反正只有1个窗体
- 控件如果在一个窗体内窗体创建多个,是会自动+1命名的。
1.5 窗体的基本属性
1.5.1 窗体的名字和标题
- form1.name '窗体名字
- 也是load name , unload name, name.show
- form1.caption '只是标题而已,创建的窗体,默认窗体的name=caption 其实是独立的
Private Sub UserForm_Click()
Debug.Print Me.Caption
Debug.Print Me.Name
End Sub
1.5.2 窗体的一些感觉会有用的属性
- name
- caption
- picture 相关几个 picturesizemode picturealignment
- picturealignment '试了下默认center居中,还有topleft等4个角对齐选择。
- picturesizemode '默认是clip截断(原尺寸),zoom 缩放好像是等比例缩放? stretch拉伸铺满
- pictureTiling '默认是否,置为1后为平铺 (可见平铺是单独的属性)
- font
- height ,width
- top,left
- backcolor, bordercolor, borderstyle
- enabled '是否可用,可以初始化form的
- mouseicon,mousepointer '应该可以设置不同的鼠标外观
- scrollbars '给form加各种scrollbar
- 暂时还不清楚的属性
- righttoleft ?
- cycle
1.6 窗体的一些设定
1.6.1 关于窗体和控件的事件代码中的 me (可以说类 thisform)
- me就是指当前的窗体,比如 窗体.name
- 应该是一定指代parent 窗体,而不是 button这种控件
- me 比 form.name 好的就是,即使name 改名了,me都是指代 thisform 不用修改
Private Sub CommandButton1_Click()
Debug.Print Me.Name
'Debug.Print Me.Caption ' 如果activeX控件在表单里
End Sub
1.6.2 切换表单和代码的地方
1.7 窗体的事件
1.7.1窗体的initialize事件
- 窗体作为他下属控件的 parent ,那么 form1_intialize() 事件可以做很多初始化工作
- 比如,初始化一些 变量值,控件变量的初值
- 比如初始化一些功能,比如 让一些控件初始是不可用的 =enabled
Private Sub UserForm_Initialize()
Me.Caption = ActiveWorkbook.Name & " 的一个窗体"
'设置某控件个初值
'设置一些按钮初始可用还是不可用
End Sub
1.7.2 窗体的关闭前触发时间 queryClose
- 窗体的关闭模式
- 参数1:closemode
- closemode=1, 手动点关闭按钮,或者是caption栏右键的菜单
- closemode=2, VBA代码里用的 unload 语句
- 参数2:cancel
- cancel=0(false) 可以关闭
- cancel=1(true) 取消关闭=不可关
Private Sub UserForm_QueryClose(Cancel As Integer, CloseMode As Integer)
If CloseMode = 0 Then '手动关闭按钮,或者是右键点击caption栏弹出的关闭菜单
Cancel = True
MsgBox "不允许手动关闭,请您双击窗体关闭"
ElseIf CloseMode = 1 Then '代码unload方法
Cancel = 0
Load 窗体2
窗体2.Show
End If
End Sub
Private Sub UserForm_DblClick(ByVal Cancel As MSForms.ReturnBoolean)
Unload 窗体1
Unload Me
End Sub
2 如何在窗体上创建其他控件?
2.1 窗体上的控件工具栏
- VBE不友好的地方
- 和PS喜欢把一些常用工具给叠起来右键才能打开几个一样,对新手不友好
- VBE里如果要往窗体上加控件,平时写代码的时候是灰色的,必须是切到窗体设计模式时才亮起。。。
2.2 可添加更多工具控件
- 还可以添加其他非常见工具控件
2.3 设置TAB键次序
- 表单上点右键可以呼出 设置tab 次序
- 但是好像必须得设置,不能把某些控件给排除掉? ---经测试,TAB键实际响应时会排除label等不影响。
3 窗体控件的公共属性
3.1 控件属性的修改
- 同1个属性,比如 backcolor
- 可以在属性窗口,静态的修改(只能在运行开始设置1次)
- 也可以在VBA代码中修改 (理论上运行过程中随时可以修改)
3.2 控件的公共属性
- 窗体里的各种控件,有很多共用属性
- 有很多公共属性
- 设置
- enabled 可用
- visible 显示
- 背景设置
- backcolor
- backstyle
- 提示文本等
- controlTipText 鼠标停留时,触发的悬浮窗提示
- caption,text,value
- 其他呢?
- controlSource
3.3 展示效果
3.4 对应代码
Private Sub CommandButton1_Click()
If Len(TextBox2.Value) <= 6 And Len(TextBox1.Value) <= 8 Then
MsgBox "输入正确,即将登陆... ..."
Unload 窗体1
Else
MsgBox "用户名和密码输入有误,请重新输入"
End If
End Sub
Private Sub Label1_Click()
End Sub
Private Sub Label3_Click()
End Sub
Private Sub Label4_Click()
End Sub
Private Sub Label5_Click()
End Sub
Private Sub Label6_Click()
End Sub
Private Sub Label7_Click()
End Sub
Private Sub TextBox1_Change()
Debug.Print "TextBox1.Value = " & TextBox1.Value
If TextBox1.Value <> "" And TextBox2.Value <> "" Then
CommandButton1.Enabled = True
CommandButton1.Visible = True
CommandButton1.Visible = True
Label5.Visible = False
Else
CommandButton1.Visible = False
Label5.Visible = True
End If
End Sub
Private Sub TextBox1_Enter()
'类似于activeX控件的textbox1_getfocus吧
TextBox1.ControlTipText = "可以输入数字字母或中文,但必须小于8个字符"
End Sub
Private Sub TextBox1_Exit(ByVal Cancel As MSForms.ReturnBoolean)
'类似于activeX控件的textbox1_lostfocus吧
BackColor = RGB(0, 255, 255)
If Len(TextBox1.Value) > 8 Then
Cancel = True
MsgBox "用户名不能超过8个字符,请重新输入"
TextBox1.SetFocus
Else
TextBox2.SetFocus
End If
End Sub
Private Sub TextBox2_Change()
Debug.Print "TextBox2.Value = " & TextBox2.Value
If TextBox1.Value <> "" And TextBox2.Value <> "" Then
CommandButton1.Enabled = True
CommandButton1.Visible = True
Label5.Visible = False
Else
CommandButton1.Visible = False
Label5.Visible = True
End If
End Sub
Private Sub TextBox2_Enter()
TextBox2.ControlTipText = "请输入6位以内的任意密码"
End Sub
Private Sub TextBox2_Exit(ByVal Cancel As MSForms.ReturnBoolean)
If Len(TextBox2.Value) <= 6 Then
CommandButton1.SetFocus
Else
MsgBox "您输入的密码大于6位,请重新输入"
TextBox2.SetFocus
End If
End Sub
Private Sub UserForm_Click()
End Sub
Private Sub UserForm_DblClick(ByVal Cancel As MSForms.ReturnBoolean)
Unload Me
End Sub
Private Sub UserForm_Initialize()
Me.Caption = ActiveWorkbook.Name & " 的一个窗体"
CommandButton1.Enabled = False
CommandButton1.Visible = False
'设置某控件个初值
'设置一些按钮初始可用还是不可用
End Sub
Private Sub UserForm_QueryClose(Cancel As Integer, CloseMode As Integer)
If CloseMode = 0 Then '手动关闭按钮,或者是右键点击caption栏弹出的关闭菜单
Cancel = True
MsgBox "不允许手动关闭,请您双击窗体关闭"
ElseIf CloseMode = 1 Then '代码unload方法
Cancel = 0
Load 窗体2
窗体2.Show
End If
End Sub
4 控件的公共事件:鼠标事件 mouse 类
4.1 鼠标类属性
- mouseIcon :自定义鼠标icon,需要mousePointer设置为custom 99
- mousePointer : 鼠标外观,有多种内置外观
4.2 鼠标类事件
- mouseMove :
- mouseDown : 持续按下的状态
- mouseUp :
4.3 识别鼠标和shfit等三个按键
- button 是int 识别鼠标的键位
- 其中1是左键,2是右键,4是中键
- shift 是int 识别是否同时按下其他几个键, ctrl shift alt 这几个键
- shift ,ctrl ,alt 分别是 1 2 4 这几个是基础状态
- 多个键的组合状态是求和
- 3=1+2
- 5=1+4
- 6=2+4
- 7=1+2+4
代码注意点
- 注意点
- 命令按钮是 commandbutton2
- 但是mousemove,mouseDown 等参数是button 且是过程级参数
- 实际使用时,判断鼠标的时候有判断 shift ctrl等的吗?
Private Sub CommandButton2_MouseDown(ByVal Button As Integer, ByVal Shift As Integer, ByVal X As Single, ByVal Y As Single)
'button 是int 识别鼠标的键位
'shift 是int 识别是否同时按下其他几个键, ctrl shift alt 这几个键
If Button = 1 Then
If Shift = 1 Then
CommandButton2.ControlTipText = "刚才按下了鼠标左键" & "并且" & "按下了shift"
ElseIf Shift = 2 Then
CommandButton2.ControlTipText = "刚才按下了鼠标左键" & "并且" & "按下了ctrl"
ElseIf Shift = 3 Then
CommandButton2.ControlTipText = "刚才按下了鼠标左键" & "并且" & "按下了shift+ctrl"
ElseIf Shift = 4 Then
CommandButton2.ControlTipText = "刚才按下了鼠标左键" & "并且" & "按下了alt"
ElseIf Shift = 5 Then
CommandButton2.ControlTipText = "刚才按下了鼠标左键" & "并且" & "按下了shift+alt"
ElseIf Shift = 6 Then
CommandButton2.ControlTipText = "刚才按下了鼠标左键" & "并且" & "按下了ctrl+alt"
ElseIf Shift = 7 Then
CommandButton2.ControlTipText = "刚才按下了鼠标左键" & "并且" & "按下了shift+alt+ctrl"
Else
CommandButton2.ControlTipText = "刚才按下了鼠标左键" '总是会记住上次的状态
End If
ElseIf Button = 2 Then
If Shift = 1 Then
CommandButton2.ControlTipText = "刚才按下了鼠标右键" & "并且" & "按下了shift"
ElseIf Shift = 2 Then
CommandButton2.ControlTipText = "刚才按下了鼠标右键" & "并且" & "按下了ctrl"
ElseIf Shift = 3 Then
CommandButton2.ControlTipText = "刚才按下了鼠标右键" & "并且" & "按下了shift+ctrl"
ElseIf Shift = 4 Then
CommandButton2.ControlTipText = "刚才按下了鼠标右键" & "并且" & "按下了alt"
ElseIf Shift = 5 Then
CommandButton2.ControlTipText = "刚才按下了鼠标右键" & "并且" & "按下了shift+alt"
ElseIf Shift = 6 Then
CommandButton2.ControlTipText = "刚才按下了鼠标右键" & "并且" & "按下了ctrl+alt"
ElseIf Shift = 7 Then
CommandButton2.ControlTipText = "刚才按下了鼠标右键" & "并且" & "按下了shift+alt+ctrl"
Else
CommandButton2.ControlTipText = "刚才按下了鼠标右键"
End If
ElseIf Button = 4 Then
If Shift = 1 Then
CommandButton2.ControlTipText = "刚才按下了鼠标中键滚轮" & "并且" & "按下了shift"
ElseIf Shift = 2 Then
CommandButton2.ControlTipText = "刚才按下了鼠标中键滚轮" & "并且" & "按下了ctrl"
ElseIf Shift = 3 Then
CommandButton2.ControlTipText = "刚才按下了鼠标中键滚轮" & "并且" & "按下了shift+ctrl"
ElseIf Shift = 4 Then
CommandButton2.ControlTipText = "刚才按下了鼠标中键滚轮" & "并且" & "按下了alt"
ElseIf Shift = 5 Then
CommandButton2.ControlTipText = "刚才按下了鼠标中键滚轮" & "并且" & "按下了shift+alt"
ElseIf Shift = 6 Then
CommandButton2.ControlTipText = "刚才按下了鼠标中键滚轮" & "并且" & "按下了ctrl+alt"
ElseIf Shift = 7 Then
CommandButton2.ControlTipText = "刚才按下了鼠标中键滚轮" & "并且" & "按下了shift+alt+ctrl"
Else
CommandButton2.ControlTipText = "刚才按下了鼠标中键滚轮"
End If
End If
End Sub
4.4 利用mouseMove,但是需要在form 和 command 的时候分别设置
- mousemove
- mousemove到 commandbutton2 的时候是一个颜色
- 但是没有 mouse--leave 状态可用,所以,当mousemove到表单了就表示 mouse-leave了
Private Sub CommandButton2_MouseMove(ByVal Button As Integer, ByVal Shift As Integer, ByVal X As Single, ByVal Y As Single)
CommandButton2.BackColor = &HC00000
End Sub
Private Sub UserForm_MouseMove(ByVal Button As Integer, ByVal Shift As Integer, ByVal X As Single, ByVal Y As Single)
CommandButton2.BackColor = RGB(0, 255, 0)
End Sub
5 控件的公共事件:键盘事件 key类
5.1 key类的事件
- onkey?
- keydown ' keydown 和keypress有一定重复,但是keydown主要是指KEY一直按下的状态
- keyup
- keypress
5.2 识别key值
- key相关函数可以返回 ByVal KeyCode As MSForms.ReturnInteger
- 这个是 ascii码
- 在VBA中, 用chr() 转下即可得到对应的字母,数字,符号等等。
Private Sub CommandButton3_KeyDown(ByVal KeyCode As MSForms.ReturnInteger, ByVal Shift As Integer)
MsgBox "这次按下的键是" & Chr(KeyCode)
End Sub
Private Sub CommandButton3_KeyPress(ByVal KeyAscii As MSForms.ReturnInteger)
End Sub
Private Sub CommandButton3_KeyUp(ByVal KeyCode As MSForms.ReturnInteger, ByVal Shift As Integer)
End Sub
6 测试发现问题
- 有个比较奇怪的问题
- 1是VBE测试窗体,运行不稳定,有时候弹出msgbox点击确定会关闭窗体,有时候不会关闭整个窗体,并没有改代码
- 为什么点击msgbox 的确定时,会关闭窗体呢?暂时还没查到原因