VBA窗体和控件初接触(1):

前面是自己纯摸索的,这篇跟着书看,我喜欢这种先自学了再看书的感觉

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 控件的公共属性

  • 窗体里的各种控件,有很多共用属性
  • 有很多公共属性
  1. 设置
  2. enabled    可用 
  3. visible     显示
  4. 背景设置
  5. backcolor
  6. backstyle
  7. 提示文本等
  8. controlTipText  鼠标停留时,触发的悬浮窗提示
  9. caption,text,value
  10. 其他呢?
  11. 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 的确定时,会关闭窗体呢?暂时还没查到原因
  • 2
    点赞
  • 43
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值