ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

搜索
EH技术汇-专业的职场技能充电站 妙哉!函数段子手趣味讲函数 Excel服务器-会Excel,做管理系统 效率神器,一键搞定繁琐工作
HR薪酬管理数字化实战 Excel 2021函数公式学习大典 Excel数据透视表实战秘技 打造核心竞争力的职场宝典
让更多数据处理,一键完成 数据工作者的案头书 免费直播课集锦 ExcelHome出品 - VBA代码宝免费下载
用ChatGPT与VBA一键搞定Excel WPS表格从入门到精通 Excel VBA经典代码实践指南
查看: 161459|回复: 187

[原创] Excel VBA窗体入门

  [复制链接]

TA的精华主题

TA的得分主题

发表于 2012-6-25 21:29 | 显示全部楼层 |阅读模式
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
本帖已被收录到知识树中,索引项:窗体
本帖最后由 f8b1987 于 2012-6-26 08:36 编辑
示例文件下载见9楼。如有错漏,欢迎各位前辈指正




通过在EH、EP论坛的学习,总算对窗体有大概的认识了。能制作一些简单的窗体方便自己。


正所谓,独乐乐不如众乐乐,不敢独乐,分享各位像我一样的初接触VBA窗体的朋友。希望各位少走弯路。



一、窗体和控件简介什么是窗体?微软是这样解释的:
窗体  窗口或对话框。窗体为控件的容器,多文档接口 (MDI) 窗体可作为子窗体和一些控件的容器。
窗体与控件不同,窗体上可以存放多个控件,在窗体界面直接调用。
打开VBE界面,工程管理器中,右键——插入——用户窗体,即可插入一个用户窗体。插入的窗体名称默认以UserForm开头后带数字,构成默认名称。
选中窗体模块名称,双击可以查看窗体界面,右击可以选择查看该窗体代码。注意:窗体和窗体上的控件代码存放在“用户窗体中”,而非存放在标准模块中。如果代码写在标准模块中,应在窗体代码模块中调用。例如,在标准模块中有过程”sub 显示窗体()”,则应在窗体控件事件中使用以下形式调用:
Private Sub CommandButton1_Click()
       Call  显示窗体
End Sub
以上代码表示单击CommandButton1则调用标准模块中的过程“sub 显示窗体()”。两个窗体间的代码过程并无法相互调用。

                               窗体001.jpg

评分

6

查看全部评分

TA的精华主题

TA的得分主题

 楼主| 发表于 2012-6-25 21:30 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
本帖最后由 f8b1987 于 2012-6-25 21:33 编辑

相关控件  
ALT+F11打开工程管理器中双击窗体名称,可以发现窗体界面和控件工具箱。我们可以点击工具箱上的选择控件,然后在窗体中拖曳即可在窗体中插入相关控件。

工具箱上,除了鼠标箭头外,其他是可以插入的控件,横向分别为标签Label、文字框TextBox、复合框ComboBox、列表框ListBox、复选框CheckBox、选项按钮OptionButton,切换按钮ToggleButton,框架Frame,命令按钮CommandButtonTabStrip,多页Page,滚动条ScrollBar,旋转按钮(数值)SpinButton,图像ImageRefEdit

窗体002.jpg


窗体003.jpg



与工作表的集合有Worksheets一样,窗体控件也有集合Controls,不记得的话,可以看看控件工具箱上方的英文,o(_)o 哈哈。对了,这英文在win7系统下的excel才能看见,XP下看到的是汉字。

点评

列表框也可以选择多项的  发表于 2013-12-12 08:59

评分

3

查看全部评分

TA的精华主题

TA的得分主题

 楼主| 发表于 2012-6-25 21:34 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
窗体中的常用属性:
窗体004.jpg


窗体名(其他控件对象名同)长度不得超过40个字符。BackColor:用于设置窗体的背景色。
  Caption:控件显示的标题文本。
  BorderStyle:设置窗体的边框样式。
  Enabled:用于设置窗体是否有效。设置为True时,程序运行时窗体可以被操作,即窗体可以响应作用于它的事件,设置为False时,窗体不可以被操作,而且窗体上的对象也不可以进行操作。
Font:设置窗体上文本的字体、字型和字号。
ForeColor:设置窗体上文本和图形的前景色。
Moveable:设置窗体在程序运行时能否被移动。
Left和Top:用于设置程序运行时窗体在屏幕上的位置,Left属性值决定窗体左上角在屏幕上的横坐标,Top属性值决定窗体左上角在屏幕上的的纵坐标。
Height和Width:用于设置程序运行时窗体在屏幕上的大小(高和宽),Height属性值决定窗体的高度,Width属性值决定窗体的宽度。
Picture:用图片填充窗体背景。单击可以选择路径。
ShowModal:模式选择。如果为FALSE,则窗体模式为无模式,此时可以显示窗体并选择单元格和其他窗体;如果为TRUE,则为有模式,无法选择其他窗体和单元格。代码调用模式优于此属性设置。
StartUpPosition:调整窗体出现的位置。
控件属性TabIndex:设置光标跳动顺序。
PasswordChar:TextBox控件中使用符号代替输入的内容,例如用*代替输入的密码。

评分

2

查看全部评分

TA的精华主题

TA的得分主题

 楼主| 发表于 2012-6-25 21:38 | 显示全部楼层
二、窗体的显示显示窗体的语法:UserFormName.Show
例如:UserForm1.Show就是显示名称为UserForm1的窗体。
窗体显示方式分两种,可以通过ShowModal属性或者代码调用进行设置
1.有模式:此模式下,只显示本窗体,只能在本窗体使用控件,无法选择其他窗体或者工作表对象。默认ShowModal属性为TRUE,也就是有模式。
2.无模式   无模式下,可以同时显示多个窗体,能在多个窗体间切换(其他窗体也必须是无模式),能自由选择工作表对象,例如复制单元格内容等操作。
3.代码设置显示模式前面我们说过,用UserFormName.Show的方法显示窗体。
如不指定Show的参数,UserForm1.Show调用模式按ShowModal原有属性设置显示窗体模式。
1)强制使用有模式显示:
         UserForm1.Show 1
2)强制使用无模式显示:
         UserForm1.Show 0
  备注:可以使用load UserForm1装载窗体到内存中而不显示。

三、窗体的隐藏要隐藏窗体,可以用Hide,如下代码表示隐藏UserForm1窗体:
UserForm1.Hide
也可以通过点击窗体右上方的红色关闭按钮实现。
窗体005.jpg


                              
窗体的卸载:Unload UserForm1,通过Unload从内存中删除窗体,释放窗体所占用的内存空间

TA的精华主题

TA的得分主题

 楼主| 发表于 2012-6-25 21:40 | 显示全部楼层
四、窗体事件什么叫事件?这个交给前辈们去解释,在下水平有限无法解释清楚。

以下内容参考了http://jpkc.wxit.edu.cn/vb/Wlkc/vb2/02-01-00.html网站的文章:

1.C1ick单击事件。程序运行时,当用户用鼠标左键单击窗体时,引发该窗体的C1ick事件(也称单击事件)。
2.DblClick双击事件。程序运行时,当用户用鼠标左键双击窗体时,引发该窗体的DblClick事件(也称双击事件)。
3.Load装载事件。运行程序,当系统把窗体由外部存储介质装入内存时,引发该窗体的Load事件(也称装载事件)。
4.Resize改变窗体尺寸事件。程序运行时,当窗体大小被改变时,引发该窗体的Resize事件。
5.Activate激活窗体事件。程序运行时,当窗体变为当前窗体时,引发该窗体的Activate事件(也称激活事件)。
6.Deactivate失去激活事件。程序运行时,当A窗体取代B窗体变成当前窗体时,引发B窗体的Deactivate事件(也称失去激活事件)。
7.Unload卸载事件。当窗体被从内存中卸载时,引发该窗体的Unload事件(也称卸载事件)。
8. QueryClose 关闭按钮事件。当点击窗体右上方的关闭按钮时触发的时间,此事件在控制关闭窗体就退出关闭工作簿的时候很有用处,使用登录窗体的朋友不会错过它。如下代码,完整写入到对应窗体代码模块中即可实现点击该窗体的关闭按钮,就执行不保存工作簿就退出。
   Private Sub UserForm_QueryClose(Cancel As Integer, CloseMode AsInteger)
Application.Quit
ThisWorkbook.Close False
End Sub
9.Userform_Initialize()窗体初始化事件。该事件表示利用Userform1.Show方法,加载窗体的时候触发该事件。

评分

1

查看全部评分

TA的精华主题

TA的得分主题

 楼主| 发表于 2012-6-25 21:43 | 显示全部楼层
五、控件事件1.单击事件Click.注意TextBox控件没有单击事件,可以通过获得焦点事件处理。
2.双击事件,DblClick
3. Change 事件,当控件的值(VALUE)变动,则触发事件发生执行事件代码。
4. Enter事件,获得焦点事件,可以简单理解为光标跳动到当前控件时触发的事件。
5. Exit事件,失去焦点事件。简单理解为光标离开当前控件时触发的事件。如果窗体中有多个可选控件(非标签控件),要实现文本框中回车触发,也可以使用Exit事件处理。


窗体006.jpg


                              


6. KeyDown KeyUp 事件。按下和释放某键时这两个事件依次发生。按下键时发生 KeyDown 事件,而释放键时发生 KeyUp 事件。
利用KeyDown处理回车事件示例:

Private Sub TextBox1_KeyDown(ByVal KeyCode AsMSForms.ReturnInteger, ByVal Shift As Integer)

        IfKeyCode = 13 Then

             ………此处写执行的代码……..
        End if
End sub




补充内容 (2014-9-4 10:57):
Private Sub TextBox2_KeyDown(ByVal KeyCode As MSForms.ReturnInteger, ByVal Shift As Integer)
        If KeyCode = 13 Then
                TextBox1.SetFocus  '改变光标跳动

评分

1

查看全部评分

TA的精华主题

TA的得分主题

 楼主| 发表于 2012-6-25 21:47 | 显示全部楼层
六、打开即显示窗体
这个比较简单,只需要使用工作簿的Open事件即可。在thisworkbook模块加入代码即可。
Private Sub Workbook_Open()
    UserForm1.Show
End Sub
七、只显示窗体,隐藏工作簿
这个也简单,在上面提到的“打开即显示窗体”代码中加入一句隐藏工作簿的代码即可。
Private Sub Workbook_Open()
   Application.Visible = False
   UserForm1.Show
End Sub
注意,如果你调用的窗体无调用关闭工作簿的命令,退出窗体并不关闭工作簿,工作簿依然在后台运行。需要关闭,则需要随意打开一个其他excel文档,即可显示全部excel文档窗口。当然,最好是在窗体上用控件关闭工作簿,或者使用前面提到的QueryClose事件控制关闭。
八、为窗体设置快捷键
有窗体了,不需要的时候关闭,但是需要的时候还得用控件调出或者到VBE界面去运行,这样是不是很不方便呢?要是有快捷键多好,窗体就可以“呼之即来挥之即去”。
使用Onkey即可轻松实现。
首先插入标准模块(代码如写在窗体模块中无法调用),写入过程如下
SUB 窗体1()
       UserForm1.Show0
End sub
然后在Thisworkbook模块写入如下代码
Private Sub Workbook_Open()
Application.OnKey "{F2}", "窗体1"
End Sub
接下来即可F2快捷键调出窗体UserForm1。注意:快捷键如与系统原快捷键功能冲突,快捷键执行代码指定功能。更多详细信息,请查看excel帮助关于onkey的说明。

TA的精华主题

TA的得分主题

 楼主| 发表于 2012-6-25 21:49 | 显示全部楼层
九、制作密码登录框
现有情况:
1.以前采用的Excel4.0宏表方式,在Excel2003实现禁用宏就关闭工作簿,但在EXCEL2007/2010中则可以禁用宏并打开。
2.Excel2010/2007的工作簿打开密码几乎牢不可破,可以设置打开密码、修改密码、工作表密码。
3.文本框控件TextBox,可以设置PasswordChar 属性利用其他字符代替输入内容的显示效果,在制作密码输入的时候防“目测”有作用。
4.可以实现打开工作簿的时候执行指定事件。
5.可以设置只显示窗体,不显示工作簿窗口,可以实现点击窗体“关闭按钮”则关闭工作簿。
6.可以实现点击关闭工作簿的时候,执行指定事件过程。
7.可以使用代码深度隐藏、取消隐藏工作表。
8.可以添加VBA工程密码。
综合以上情况,我们可以有这样一个思路:
1.    使用Excel2007/2010特有格式XLSM格式保存,设置打开密码、修改密码、工作表保护、VBA工程密码。
2.    在Thisworkbook模块写下:
(1)打开工作簿启用宏,即运行窗体并隐藏工作簿界面。注意给TextBox控件设置PasswordChar 属性,避免“偷窥”密码。
(2)按登录窗体输入内容判断取消对应权限的工作表保护、取消深度隐藏。要先取消工作表保护,才执行取消隐藏,否则出错。
(3)点击关闭的时候,执行深度隐藏工作表,并添加工作表密码,执行保存(注意:如果对方无修改权限密码,以只读打开,代码执行保存工作簿会导致出错,因此关闭事件代码要添加On Error Resume Next这一句)。
实现以上过程,基本能实现以下效果:
无密码不能打开;又因带打开密码的工作簿无法破解VBA工程密码,因此无法从代码中获取密码信息。
不启用宏就无法正常查看隐藏数据,只能按登录用户查看指定内容。
       这方法只能对一些对excel了解比较少的人会起作用。但对excel稍微了解的朋友就知道有什么漏洞,如何破解了。
好比卖密码锁的人,不会宣传如何破解自己密码锁的话,所以我也不说明如何破解,各位也自己知道好了。
破解方法不普及的话,还能稍微解决excel2010下的宏对话框“安全”登陆。
       最后奉献各位一句,除了excel2010/2007的打开密码是比较安全的,其他浮云。要更加安全,还得借助其他程序。

TA的精华主题

TA的得分主题

 楼主| 发表于 2012-6-25 22:14 | 显示全部楼层
本帖最后由 f8b1987 于 2012-6-26 17:58 编辑

以下示例文件使用excel2010格式XLSM制作,只是为了“密码”安全。觉得有用的朋友请自行转为XLS格式。

示例文件。


窗体示例.rar (113.27 KB, 下载次数: 6505)

登录窗体未加VBA密码,请自行添加。其实这登录方式非常不安全,慎用
登录窗体.rar (572.16 KB, 下载次数: 5764)

评分

10

查看全部评分

TA的精华主题

TA的得分主题

发表于 2012-6-25 22:28 | 显示全部楼层
谢谢分享
只是自己的EXCEL版本太低。
您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

手机版|关于我们|联系我们|ExcelHome

GMT+8, 2024-11-18 12:20 , Processed in 0.054887 second(s), 11 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

沪公网安备 31011702000001号 沪ICP备11019229号-2

本论坛言论纯属发表者个人意见,任何违反国家相关法律的言论,本站将协助国家相关部门追究发言者责任!     本站特聘法律顾问:李志群律师

快速回复 返回顶部 返回列表