VBA的表单控件初接触(2):ActiveX控件的基础功能和基础代码

喜夏-厌秋 提交于 2020-03-08 02:36:24

控件的这几个摸索的学习日志估计有错误,不删了当成历史放在这吧

 

第1类:文本类: label , textbox

  • 我认为label  textbox 都属于文本类控件
  • 其中label,重点是输入, output ,可以说类似于一个常驻的msgbox这种
  • 而textbox,重点是输出,input,重点是接收用户输入

 

1.1 label

  • 感觉好像没啥好设置的,只有一些通用的控件事件
  • label不让用户修改,定位是 展示,相当于output,相当于1个常驻的msgbox
  • label可以读取其他控件,或内容的改变而改变显示
Private Sub Label1_Click()
Label1.BackColor = &O555555
End Sub

 

1.2  textbox

  • textbox比label 多的一个功能是,用户可以直接在文本框内输入内容
  • textbox的定位,是接收输入,input
  • textbox 事件上只有一个特殊的,就是  textbox_change()
Private Sub TextBox1_Change()

Debug.Print TextBox1.Value
Debug.Print TextBox1

TextBox1.BackColor = RGB(0, 255, 0)

End Sub

 

第2类:button 和 togglebutton

2.1 togglebutton  切换按钮/ 互斥按钮

2.1.1 commandbutton 和 togglebutton 的区别

  • 一组togglebutton中会始终有一个是按下去的状态
  • 如果是一组commandbutton一般是独立的,互相不影响

 

2.1.2 基本用法

  • 首先togglebutton应该有多个,并且这多个逻辑上是一组的
  • 基本功能就是,多个togglebutton只会有一个亮起
  • 如果想把几个 togglebutton关联,需要在每个 tongglebutton里,关联其他toggblebutton的值
  • 比如一般是在togglebutton1里,设置togglebutton2.value=false,这样设置互斥

Private Sub ToggleButton1_Click()

ToggleButton1.Caption = "男"
ToggleButton2.Value = False
'ToggleButton1.TripleState = False
'ToggleButton2.TripleState = False

If ToggleButton1.Value = True Then
   Debug.Print "toggle1按下了"
   Range("M39").Value = "toggle1按下了"
Else
   Debug.Print "toggle1弹起了"
   Range("M39").Value = "toggle1弹起了"
End If

Debug.Print "toggle1被click执行1次"
End Sub



Private Sub ToggleButton2_Click()
ToggleButton2.Caption = "女"
ToggleButton1 = False    'ToggleButton1.value = False
'ToggleButton2.TripleState = False
'ToggleButton1.TripleState = False

If ToggleButton2.Value = True Then
   Debug.Print "toggle2按下了"
   Range("M43").Value = "toggle2按下了"
Else
   Debug.Print "toggle2弹起了"
   Range("M43").Value = "toggle2弹起了"
End If

Debug.Print "toggle2被click执行1次"
End Sub

 

2.1.3 执行次数问题?

  • 如果togglebutton2按下了
  • 这时候点击togglebutton1按下的时候,只会把togglebutton2弹起,而tongglebutton1自己并不会按下,而且自己被执行2次。。。
  • 参考网上文章,设置了ToggleButton1.TripleState = False 也不管用
  • http://club.excelhome.net/thread-1211638-1-1.html

 

2.1.4 如果让toggle4来控制togglebutton3

  • togglebutton可以控制 各种内容,其实就当成一个if来看就行
  • 可以用一个 tongglebutton来控制另外一个
Private Sub ToggleButton3_Click()

If ToggleButton3.Value = True Then
   Range("d50").Value = 1
   Worksheets(2).Select
Else
   Range("d50").Value = 0
   Worksheets(3).Select
End If

End Sub

Private Sub ToggleButton4_Click()
ToggleButton3.Value = ToggleButton4.Value
End Sub

 

3  commandButton 和 很多通用事件

  • 因为commandButton用的最多,所以拿这个来试验各种通用事件

3.2.1 按钮的各种触发事件总结

  • 点击类
  1. _click  :点击不同于按下  可能是mouse也可能是KEY造成的点击(包括keyPress + mouseDown?)
  2. _doubleClick
  • 焦点类
  1. _gotFoucs : 无论是鼠标还是键盘点击了控件,都算 gotfoucs, 必须是确实点击了才算,鼠标移动过来不算
  2. _lostFocus : 必须是焦点真的切走了,鼠标移走没选择其他地方不算
  • 键盘操作
  1. _keyDown: key的按下是一个持续的状态,松开即结束。
  2. _keyUp:     key按下后放开,马上就是keyup状态
  3. _keyPress   : 必须是key点击 , 任意key都可以,应该可以识别是哪个key把?
  • 鼠标操作
  1. _mouseDown:好像有参数可以识别是鼠标的那个键按下,或同时按下
  2. _mouseUp
  3. _mouseMove   :
  • 还不清晰的 怎么用的一些
  1. _error ?
  2. _beforeDragOver
  3. _beforeDropOrPaste

 

3.2.2 mouse类,鼠标相关

  • mousedown: 按下鼠标的那个状态,一般除非刻意,mousedown的时间很短
  • mouseup:    这个和mousedown 互为互斥状态,也就是一对开关状态,一个button要么处于mousedown,要么mouseup
  • mousemove: 鼠标在 控件上方滑过即可,感觉优先级比mouseup要高
Private Sub CommandButton1_MouseDown(ByVal Button As Integer, ByVal Shift As Integer, ByVal X As Single, ByVal Y As Single)
CommandButton1.Caption = "鼠标按下"
Debug.Print "鼠标按下"
Debug.Print Button
Debug.Print Shift   '可以传递参数,判断是否按下了SHIFT
Debug.Print X
Debug.Print Y

'只有鼠标按下不动的那个持续的状态才算,一松开就不算了
End Sub

Private Sub CommandButton1_MouseMove(ByVal Button As Integer, ByVal Shift As Integer, ByVal X As Single, ByVal Y As Single)
CommandButton1.Caption = "鼠标滑过"
'感觉优先级高于 mouseup
Debug.Print "鼠标滑过"
End Sub

Private Sub CommandButton1_MouseUp(ByVal Button As Integer, ByVal Shift As Integer, ByVal X As Single, ByVal Y As Single)
CommandButton1.Caption = "鼠标松开"
'基本是个常态,鼠标一松马上显示 鼠标松开,一直处于 鼠标松开状态
Debug.Print "鼠标松开"

End Sub

 

3.2.3 key类,键盘操作

  • _keyDown:任意键按下都可以
  • _keyUp  :    任意键按下后松开都算,和keydown 属于一对互斥状态,
  • _keyPress  : 优先级高于keydown,但感觉keydown==keypress机会一样
Private Sub CommandButton1_KeyDown(ByVal KeyCode As MSForms.ReturnInteger, ByVal Shift As Integer)
CommandButton1.Caption = "KEY按下了"
Debug.Print Shift
'实测是任何键按下了都算

End Sub

Private Sub CommandButton1_KeyPress(ByVal KeyAscii As MSForms.ReturnInteger)
CommandButton1.Caption = "KEY点击了"
Debug.Print Shift
'点击键盘按键才触发
'有可能keydown 但不触发 keyPress吗?好像不能,keydown 几乎等于keypress吧
'优先级总是高于 keydown
End Sub

Private Sub CommandButton1_KeyUp(ByVal KeyCode As MSForms.ReturnInteger, ByVal Shift As Integer)
CommandButton1.Caption = "KEY松开了"
Debug.Print Shift
'实测是任何键按下了以后,再松开都算
End Sub

 

3.2.4  click类 

  • click 和 doubleClick
  • click 只是一个点击结果,点击的发起者可能是 mouse 或 任意key
  • 现在还不知道为啥  commandbutton.value 一直是false?(默认返回值?)
  • commandbutton 按钮好像没有状态,就是点击,没有什么 按下,起来?---应该有那种点1下下去,再点1下起来的把?
  • click 只是一个行为,只计次
Private Sub CommandButton1_Click()
CommandButton1.Caption = "点击" & a & "次"
a = a + 1
'按下和起来是2个状态,要么是按下,要么是起来

Debug.Print CommandButton1.Value   '没有值默认为false?还是有切换?

End Sub

 

3.2.5 button的代码,如果每种都写,写一起很多会发生事件响应冲突

  • 本身同一类的事件内部就有些冲突
  • 比如mouse类的 mouseup 和 mousemove 就有点重合
  • 比如key类的,keydown 和 keypress 有点重复
  • 比如click,只可能是键盘/鼠标点击,就和 keydown/keypress 以及 mousedown 可能有点重合
Private Sub CommandButton1_BeforeDragOver(ByVal Cancel As MSForms.ReturnBoolean, ByVal Data As MSForms.DataObject, ByVal X As Single, ByVal Y As Single, ByVal DragState As MSForms.fmDragState, ByVal Effect As MSForms.ReturnEffect, ByVal Shift As Integer)
CommandButton1.Caption = "BeforeDragOver"
Debug.Print "BeforeDragOver"
'???
End Sub

Private Sub CommandButton1_BeforeDropOrPaste(ByVal Cancel As MSForms.ReturnBoolean, ByVal Action As MSForms.fmAction, ByVal Data As MSForms.DataObject, ByVal X As Single, ByVal Y As Single, ByVal Effect As MSForms.ReturnEffect, ByVal Shift As Integer)
CommandButton1.Caption = "BeforeDropOrPaste"
Debug.Print "BeforeDropOrPaste"
'???
End Sub

Private Sub CommandButton1_Click()
CommandButton1.Caption = "已经按下"
'按下和起来是2个状态,要么是按下,要么是起来
End Sub


Private Sub CommandButton1_DblClick(ByVal Cancel As MSForms.ReturnBoolean)
CommandButton1.Caption = "你想弄啥"
'操作很明确
End Sub

Private Sub CommandButton1_Error(ByVal Number As Integer, ByVal Description As MSForms.ReturnString, ByVal SCode As Long, ByVal Source As String, ByVal HelpFile As String, ByVal HelpContext As Long, ByVal CancelDisplay As MSForms.ReturnBoolean)
Debug.Print "按钮还会报错?"
'???
End Sub

Private Sub CommandButton1_GotFocus()
CommandButton1.Caption = "来点我啊"
'测试了下,获得焦点的时触发get,点了其他单元格或对象才会触发lostfocus
'和鼠标轨迹无关,移到上面并不触发,移走也不触发lostfocus
End Sub

Private Sub CommandButton1_KeyDown(ByVal KeyCode As MSForms.ReturnInteger, ByVal Shift As Integer)
CommandButton1.Caption = "按下了"
End Sub

Private Sub CommandButton1_KeyPress(ByVal KeyAscii As MSForms.ReturnInteger)
CommandButton1.Caption = "点击了"
'点击键盘按键才触发
End Sub

Private Sub CommandButton1_KeyUp(ByVal KeyCode As MSForms.ReturnInteger, ByVal Shift As Integer)
'???
End Sub

Private Sub CommandButton1_LostFocus()
CommandButton1.Caption = "离开了"
'测试需要真正的焦点变化到其他地方才算,鼠标挪开不算
End Sub

Private Sub CommandButton1_MouseDown(ByVal Button As Integer, ByVal Shift As Integer, ByVal X As Single, ByVal Y As Single)
CommandButton1.Caption = "鼠标按下"
'测试了,只有鼠标按下不动的那个持续的状态才算,一松开就不算了
End Sub

Private Sub CommandButton1_MouseMove(ByVal Button As Integer, ByVal Shift As Integer, ByVal X As Single, ByVal Y As Single)
CommandButton1.Caption = "鼠标滑过"
End Sub

Private Sub CommandButton1_MouseUp(ByVal Button As Integer, ByVal Shift As Integer, ByVal X As Single, ByVal Y As Single)
CommandButton1.Caption = "鼠标松开"
'没试验出来?
'???
End Sub

 

3.2.6 CommandButton的各种属性和方法?

  •  commandbutton.value=false ?

 

4  第3类:option ,checkbox ,分组框

4.1 option 和分组框

  • 好像放在附近的多个option,会自动识别为一组?不写代码也行?
  • 暂时只知道写这样简单的代码
  • 实现互斥效果
  • 实现取得option按钮的返回值的
Private Sub OptionButton1_Click()
OptionButton2.Value = False
a = OptionButton1.Value
Debug.Print a

End Sub

Private Sub OptionButton2_Click()
OptionButton1.Value = False
a = OptionButton2.Value
Debug.Print a

End Sub

 

4.2  CheckBox

  • checkbox 感觉每个都是独立的,代码只需要取的每个 checkbox的返回值就可以?
  • 可以设置其颜色 CheckBox2.BackColor = RGB(255, 0, 0)
Private Sub CheckBox1_Click()
a = CheckBox1.Value   '作用是不是就是这个checkbox返回其勾选值?
Debug.Print a
End Sub

Private Sub CheckBox2_Click()
a = CheckBox2.Value
Debug.Print a

CheckBox2.BackColor = RGB(255, 0, 0)
'CheckBox2.Border = normal
Debug.Print CheckBox2.Name
'Debug.Print CheckBox2.Parent

End Sub

 

4.3 分组框

 

 

5 第4类:显示框+操作框:  listbox , combobox (additem)

 使用additem 更像字典

5.1 listbox

  • ListBox1.Value = arr1
  • 好像只能additem 不能数组赋值,感觉像字典?
  • 暂时没看到 listbox1.value 和  listbox1.text 有什么区别
Private Sub ListBox1_Click()

'arr1 = Array(11, 22, 33, 44, 55)
'ListBox1.Value = arr1
'好像只能additem 不能数组赋值,感觉像字典?


ListBox1.AddItem 1
ListBox1.AddItem 2
ListBox1.AddItem 3
ListBox1.AddItem 4
ListBox1.AddItem 5

Debug.Print ListBox1.Value
Debug.Print ListBox1.Text

End Sub

 

5.2 combobox

  • 两种combobox不一样
  • combobox的 activeX控件也支持用户手动输入
  • 表单控件的combobox只支持下拉框
  • 添加内容也是additem 10
  • 写代码后运行下就可以生效
Private Sub ComboBox1_Change()

ComboBox1.AddItem 10
ComboBox1.AddItem 20
ComboBox1.AddItem 30
ComboBox1.AddItem 40
ComboBox1.AddItem 50

Debug.Print ComboBox1.Value
ComboBox1.BackColor = RGB(255, 0, 0)

End Sub

 

6 第5类  spinbutton , scrollbar (设置min max 范围)

使用 min max 更像一个值域范围

6.1 spinbutton

  • 每个控件都有个index,这个估计和TAB设置次序相关?
  • 可以用 spinbutton1.min 和  spinbutton1.max 设置范围
  • 很多属性可以在VBE中,写  spinbutton1. 自动出来后查看
Private Sub SpinButton1_Change()

Debug.Print SpinButton1.Value;
Debug.Print SpinButton1.Index    '看起来这个像是控件的序号ID
'测试了下,如果不设置值域范围,好像最小是0,最大好像正整数都可以?

'设置值域范围,但是没有外部反应
SpinButton1.Min = 1
SpinButton1.Max = 15
SpinButton1.SmallChange = 3

End Sub

 

6.2 scrollbar

6.2.1 scrollbar的基本用法

  • scrollbar1 不设置值域范围的时候,好像默认是0和正整数
  • scollbar1.smallchange 是针对箭头的调整幅度,比如每次调整10
  • scrolbar1的滑动块,好像不能控制,可以精确到1

 

6.2.2 怎么设置其数据源?  listbox,spinbutton 都应该需要设置把

  • 设置有问题的属性
  • ScrollBar1.SourceName = Range("o25:o35") ? 这样会报错,但是需要怎么设置呢?
  • ScrollBar1.ShapeRange
1

 

6.2.2 表单初始化的时候,给控件赋初值

  •  在表单初始化的时候可以给scrollbar赋初值,而且不会触发 scrollbar_change() 事件
Private Sub UserForm_Initialize()
    ScrollBar1.Value = 1
End Sub

 

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!