ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

搜索
EH技术汇-专业的职场技能充电站 妙哉!函数段子手趣味讲函数 Excel服务器-会Excel,做管理系统 Excel Home精品图文教程库
HR薪酬管理数字化实战 Excel 2021函数公式学习大典 Excel数据透视表实战秘技 打造核心竞争力的职场宝典
300集Office 2010微视频教程 数据工作者的案头书 免费直播课集锦 ExcelHome出品 - VBA代码宝免费下载
用ChatGPT与VBA一键搞定Excel WPS表格从入门到精通 Excel VBA经典代码实践指南
楼主: yuanzhuping

VBA常用技巧代码解析

    [复制链接]

TA的精华主题

TA的得分主题

发表于 2009-3-12 20:41 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
本帖已被收录到知识树中,索引项:开发帮助和教程
确实辛苦了,不过爱好、学习execl的中国人都不会忘记你的!

TA的精华主题

TA的得分主题

发表于 2009-3-12 21:21 | 显示全部楼层
谢谢楼主,这样分享的精神和VBA一样值得学习!

TA的精华主题

TA的得分主题

 楼主| 发表于 2009-3-12 22:38 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助

第6部分 使用对话框

技巧73     使用Msgbox函数
73-1        显示简单的提示信息
       在使用Excel的过程中,如果需要向用户显示简单的提示信息,可以使用MsgBox函数显示一个消息框,如下面的代码所示。
  1. #001  Sub mymsgbox()
  2. #002      MsgBox "欢迎光临Excel Home!"
  3. #003  End Sub
复制代码
代码解析:
       Mymsgbox过程使用MsgBox函数显示一个消息框。MsgBox函数用于显示提示信息,语法如下:
MsgBox(prompt[, buttons] [, title] [, helpfile, context])
       参数prompt是必需的,代表在消息框中作为信息显示的字符或字符串,最多只能接受约1024个字符,取决于所使用字符的宽度。
       参数buttons是可选的,用于指定消息框中显示按钮的数目及类型、使用的图标样式、缺省按钮以及消息框的强制回应等。如果省略,则buttons参数的缺省值为0,消息框只显示“确定”按钮。
       参数title是可选的,代表在消息框标题栏中作为标题的字符或字符串。如果省略,则在标题栏中显示“Microsoft Excel”。
       参数helpfile和参数context是可选的,用来为消息框提供上下文相关帮助的帮助文件和帮助主题。如果提供了其中一个参数,则必须提供另一个参数,两者缺一不可。
       运行Mymsgbox过程,显示如图所示的消息框。
Snap1.jpg
73-2        定制个性化的消息框
       如果希望MsgBox函数显示的消息框具有特定的按钮、图标和标题栏,那么可以使用MsgBox函数的buttons参数和title参数,如下面的代码所示。
  1. #001  Sub Specialmsbox()
  2. #002      MsgBox Prompt:="欢迎光临 Excel Home!", _
  3. #003          Buttons:=vbOKCancel + vbInformation, _
  4. #004          Title:="Excel Home"
  5. #005  End Sub
复制代码
代码解析:
       Specialmsbox过程使用MsgBox函数显示一个具有特定的按钮、图标和标题栏的消息框。
       第3行代码设置消息框的Buttons参数,使消息框显示时具有“确定”、“取消”按钮和信息消息图标。MsgBox函数的buttons参数设置值如表格所示。
Snap6.jpg
       在设定buttons参数值时,这些值可以相加使用,但每一组中只能选择一个值。在程序代码中也可以使用buttons参数的常数名称,而不必使用实际数值。
       第4行代码将消息框的Title参数设置为“Excel Home”,使消息框的标题栏显示“Excel Home”。
       运行Specialmsbox过程后,显示一个如图所示的消息框,该消息框具有“Excel Home”标题、信息消息图标和“确定”、“取消”按钮并以“确定”按钮作为默认按钮。
Snap2.jpg
73-3        获得消息框的返回值
       如果希望能根据用户对于消息框的不同选择,进行相应的操作,可以对消息框的返回值进行判断,如下面的代码所示。
  1. #001  Private Sub Workbook_BeforeClose(Cancel As Boolean)
  2. #002      Dim iMsg As Integer
  3. #003      iMsg = MsgBox("文件即将关闭,是否保存?", 3 + 32)
  4. #004      Select Case iMsg
  5. #005          Case 6
  6. #006              Me.Save
  7. #007          Case 7
  8. #008              Me.Saved = True
  9. #009          Case 2
  10. #010              Cancel = True
  11. #011      End Select
  12. #012  End Sub
复制代码
代码解析:
       工作簿的BeforeClose过程,在关闭工作簿前使用MsgBox函数显示一个消息框,并根据用户的回应用进行相应的操作。
       第3行代码,使用MsgBox函数显示一个具有“是”、“否”和“否”按钮的消息框,并把用户的回应,即消息框的返回值赋给变量iMsg。MsgBox是一个函数,这意味着它将返回一个值,如果希望获得返回值,可使用和第3行相似的代码,此时如果不使用括号将参数封闭起来,则会提示编译错误。
       第4行到第11行代码,Select Case结构语句,根据变量iMsg的值判断用户的回应,如果变量iMsg的值为6,说明用户选择了“是”按钮,则使用Save方法保存工作簿;如果变量iMsg的值为7,说明用户选择了“否”按钮,则将工作簿的Saved属性设置为True,不保存更改而直接关闭工作簿。关于Save方法和Saved属性请参阅技巧45-2。如果变量iMsg的值为2,说明用户选择了“取消”按钮,是将BeforeClose过程的Cancel 参数设置为True,取消关闭工作簿操作。
MsgBox函数的返回值如表格所示,在程序代码中也可以使用常数名称,而不必使用实际数值。
Snap7.jpg
       在关闭本工作簿时将显示一个如图所示的消息框,询问用户是否保存,并根据用户的回应用进行相应的操作。
Snap3.jpg
73-4        在消息框中排版
       如果在消息框中显示的字符串很长,比如是一段多行的文字内容,为了达到美观的效果,需要首字缩进,并将各行分隔开来,如下面代码所示。
  1. #001  Sub Newlinemsbox()
  2. #002      MsgBox Space(4) & "欢迎来到 ExcelHome 技术论坛,全球最领先的 Excel 技术论坛之一。" & Chr(10) _
  3. #003          & Space(4) & "在这里,我们讨论 Microsoft  Office 系列产品的应用技术,重点讨论" & Chr(10) _
  4. #004          & "Microsoft Excel。" & Chr(10) _
  5. #005          & Space(4) & "本论坛从属于 Excel Home 这一全球最大的华语 Excel 技术门户,目前" & Chr(10) _
  6. #006          & "是个人、非营利性质的网站学习平台。" & Chr(10) _
  7. #007          & Space(4) & "Let’s do it better! 这是 Excel Home 的口号,我们的宗旨是帮助大" & Chr(10) _
  8. #008          & "家解决在使用Office软件中的问题,提升自己的应用技能。"
  9. #009  End Sub
复制代码
代码解析:
       Newlinemsbox过程使用消息框显示一段经过排版后的文本内容。
       代码中使用Space 函数在每段的首字前插入4个空格,使首字缩进,在需要换行的地方插入换行符 (Chr(10)) 将各行分隔开来。也可以使用回车符 (Chr(13))、或是回车与换行符的组合 (Chr(13) & Chr(10))换行。
在程序代码中也可以使用vbCrLf、vbNewLine等常数,而不必使用Chr 函数,如表格 73 3所示。
Snap8.jpg
       运行Newlinemsbox过程, 用消息框显示一段经过排版后的文本内容,效果如图所示。
Snap4.jpg
73-5        对齐消息框中显示的信息
       在用消息框显示如图所示的工作表中多行多列的单元格区域时,如果只用换行符(Chr(10))等进行换行,而数据列没有对齐,会使显示的信息显得杂乱无章,缺乏可读性。
Snap9.jpg
       为了达到消息框中显示信息各列对齐的效果,在使用换行符(Chr(10))等进行换行的基础上,还需要使用制表符(Chr(9))或常数vbTab,对数据列进行分隔,使之排列整齐,如下面代码所示。
  1. #001  Sub Outmsbox()
  2. #002      Dim sMsg As String
  3. #003      Dim iRow As Integer
  4. #004      Dim iCom As Integer
  5. #005      For iRow = 1 To 11
  6. #006          For iCom = 1 To 5
  7. #007              sMsg = sMsg & Cells(iRow, iCom) & Chr(9)
  8. #008          Next
  9. #009          sMsg = sMsg & Chr(10)
  10. #010      Next
  11. #011      MsgBox sMsg
  12. #012  End Sub
复制代码
代码解析:
       Outmsbox过程使用两层循环读取当前工作表中A1到E11单元格的内容,并用消息框显示出来。
       第7行代码,iCom循环中在把逐列读取的单元格内容赋给变量myMsg时插入一个制表符(Chr(9)),对列进行分隔。
       第9行代码,iRow循环中在读取下一行单元格内容赋给变量myMsg时插入一个换行符(Chr(10)),对行进行换行。
       运行Outmsbox过程将用消息框显示当前工作表中A1至E11单元格区域中的内容,并排列整齐,如图所示。
Snap5.jpg

技巧73 使用Msgbox函数.rar

30.06 KB, 下载次数: 1609

TA的精华主题

TA的得分主题

 楼主| 发表于 2009-3-12 22:45 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
原帖由 qygszlb 于 2009-3-12 18:04 发表
要把链接修改成直奔楼层就好了,如84楼就用:http://club.excelhome.net/redire ... 186&ptid=395683做链接,要求很过份吧.

我也想这样,可是为什么我复制的链接不是到楼层的而只能到页?

TA的精华主题

TA的得分主题

 楼主| 发表于 2009-3-12 23:17 | 显示全部楼层

第6部分 使用对话框

技巧74         自动关闭的消息框
       在程序执行完毕后给用户一个提示信息,但用MsgBox函数显示的消息框将一直保持,需要用户单击“确定”或“关闭”按钮才会关闭。如果希望显示的消息框自动关闭,那么可以使用以下方法显示消息框。
74-1        使用WshShell.Popup方法显示消息框
  1. #001  Sub WshShell()
  2. #002      Dim WshShell As Object
  3. #003      Set WshShell = CreateObject("Wscript.Shell")
  4. #004      WshShell.popup "执行完毕!", 2, "提示", 64
  5. #005      Set WshShell = Nothing
  6. #006  End Sub
复制代码
代码解析:
       WshShell过程使用WshShell.Popup方法显示消息框,2秒后自动关闭。
       WshShell.Popup方法的语法如下:
WshShell.Popup(strText, [natSecondsToWait], [strTitle], [natType]) = intButton
       参数strText是必需的,与Msgbox的Prompt参数类似,代表在消息框中作为信息显示的字符或字符串。如果显示的内容超过一行,可以在每一行之间用换行符 (Chr(10))等将各行分隔开来。
       参数natSecondsToWait是可选的,其时间单位为妙。如果提供natSecondsToWait参数且其值大于零,则消息框在natSecondsToWait 参数指定的秒数后关闭。
       参数strTitle是可选的,代表在消息框标题栏中作为标题的字符或字符串,若省略,则窗口标题为“Windows 脚本宿主”。
       参数natType是可选的,指定消息框中显示按钮的数目及类型、使用的图标样式、缺省按钮以及消息框的强制回应等,与MsgBox函数buttons参数相同,请参阅技巧73-2。
       参数intButton指示用户所单击的按扭编号,与MsgBox函数的返回值相同,请参阅技巧73-3。若用户在natSecondsToWait 秒之前不单击按扭,则返回值为 -1 。
       运行WshShell过程显示一个如图所示消息框,无需点击“确定”按纽,2秒后自动关闭。
Snap11.jpg
74-2        使用API函数显示消息框
       使用API函数也可以达到这一效果,如下面的代码所示。
  1. #001  Public Declare Function SetTimer Lib "user32" ( _
  2. #002      ByVal hWnd As Long, _
  3. #003      ByVal nIDEvent As Long, _
  4. #004      ByVal uElaspe As Long, _
  5. #005      ByVal lpTimerFunc As Long) As Long
  6. #006  Public Declare Function KillTimer Lib "user32" ( _
  7. #007      ByVal hWnd As Long, _
  8. #008      ByVal nIDEvent As Long) As Long
  9. #009      Dim TID As Long
  10. #010  Sub Test()
  11. #011      TID = SetTimer(0, 0, 2000, AddressOf CloseTest)
  12. #012      MsgBox "执行完毕!"
  13. #013  End Sub
  14. #014  Sub CloseTest(ByVal hWnd As Long, ByVal uMsg As Long, ByVal idevent As Long, _
  15. #015      ByVal Systime As Long)
  16. #016      Application.SendKeys "~", True
  17. #017      KillTimer 0, TID
  18. #018  End Sub
复制代码
代码解析:
       第1行代码到第9行代码是API函数声明。
       Test过程显示一个消息框并在3秒钟后运行CloseTest过程。
       CloseTest过程发送一个确定键给Excel程序关闭显示的消息框。
       运行Test过程显示一个如图所示的消息框并在2秒钟后关闭。
Snap12.jpg
PS:由于本人对API函数的知识有限,停留在只能拿来用用的程度,所以以后有类似的API函数不做讲解,对这方面内容感兴趣的朋友请参阅有关的资料。

技巧74 自动关闭的消息框.rar

7.39 KB, 下载次数: 1297

点评

通过定时器发送回车键来关闭消息框。如果在这期间切换到其他应用程序就可能达不到目的。  发表于 2013-12-24 15:36
API函数的代码好复杂,理解起来有点困难  发表于 2011-10-16 17:42

TA的精华主题

TA的得分主题

发表于 2009-3-13 00:37 | 显示全部楼层

TA的精华主题

TA的得分主题

 楼主| 发表于 2009-3-13 08:16 | 显示全部楼层

第6部分 使用对话框

技巧75         使用InputBox函数
75-1        简单的数据输入
       Excel的使用过程中,有时需要用户输入简单的数据,此时可以使用InputBox函数显示一个对话框,供用户在对话框中输入数据信息,如下面的代码所示。
  1. #001  Sub myInputBox()
  2. #002      Dim sInt As String
  3. #003      Dim r As Integer
  4. #004      r = Sheet1.Range("A65536").End(xlUp).Row
  5. #005      sInt = InputBox("请输入人员姓名:")
  6. #006      If Len(Trim(sInt)) > 0 Then
  7. #007          Sheet1.Cells(r + 1, 1) = sInt
  8. #008      Else
  9. #009          MsgBox "您没有输入内容!"
  10. #010      End If
  11. #011  End Sub
复制代码
代码解析:
       myInputBox过程使用InputBox函数显示一个对话框供用户在对话框中输入数据,InputBox函数显示一个对话框,等待用户输入正文或按下按钮,并返回包含文本框内容的字符串,语法如下:
InputBox(prompt[, title] [, default] [, xpos] [, ypos] [, helpfile, context])
       参数prompt是必需的,作为对话框消息出现的字符串表达式。
       参数title是可选的,作为显示在对话框标题栏中的字符串表达式,如果省略title参数,则在标题栏中显示“Microsoft Excel”。
       参数default是可选的,显示在文本框中的字符串表达式,在没有其它输入时作为缺省值,如果省略default参数,则文本框为空。
       参数xpos是可选的,指定对话框的左边与屏幕左边的水平距离。如果省略xpos参数,则对话框会在水平方向居中。
       参数ypos是可选的,指定对话框的上边与屏幕上边的距离。如果省略ypos参数,则对话框被放置在屏幕垂直方向距下边大约三分之一的位置。
       参数helpfile和参数context是可选的,为对话框提供上下文相关的帮助和编号,如果提供了其中一个参数,则必须提供另一个参数,两者缺一不可。
       第5行代码,使用InputBox函数显示一个提示用户输入邮政编码的对话框,其中“请输入人员姓名:”是必需的prompt参数,其他参数使用缺省值。
       第4行代码,使用Len函数和Trim函数判断返回的去除空格后的字符串长度。如果字符串长度大于零,说明用户单击了对话框的“确定”按钮,则将用户输入的数据写到工作表的A列单元格。如果返回的是长度为零的字符串,说明用户单击了对话框的“取消”按钮,则显示一条提示消息。
       因为当用户单击对话框的“确定”按钮后,InputBox函数返回包含文本框内容的字符串,如果用户单击对话框的“取消”按钮则返回一个长度为零的字符串(""),通过返回的字符串长度可以判断用户做出的选择。
       运行sInput过程将显示一个提示用户输入数据的对话框,如图所示。
Snap1.jpg

75-2        使用对话框输入密码
       使用InputBox函数显示的对话框输入密码简单方便,但有个明显的缺陷,就是输入过程中不能用占位符显示密码,不够安全。借助API函数可以在输入密码过程中以占位符“*”号来显示密码,如下面的代码所示。
  1. #001  Public Declare Function FindWindow Lib "user32" Alias "FindWindowA" (ByVal lpClassName As String, ByVal lpWindowName As String) As Long
  2. #002  Public Declare Function FindWindowEx Lib "user32" Alias "FindWindowExA" (ByVal hWnd1 As Long, ByVal hWnd2 As Long, ByVal lpsz1 As String, ByVal lpsz2 As String) As Long
  3. #003  Public Declare Function SendMessage Lib "user32" Alias "SendMessageA" (ByVal hwnd As Long, ByVal wMsg As Long, ByVal wParam As Long, lParam As Any) As Long
  4. #004  Public Declare Function timeSetEvent Lib "winmm.dll" (ByVal uDelay As Long, ByVal uResolution As Long, ByVal lpFunction As Long, ByVal dwUser As Long, ByVal uFlags As Long) As Long
  5. #005  Public Declare Function timeKillEvent Lib "winmm.dll" (ByVal uID As Long) As Long
  6. #006  Public Declare Function GetTickCount Lib "kernel32" () As Long
  7. #007  Public Const EM_SETPASSWORDCHAR = &HCC
  8. #008  Public lTimeID As Long
  9. #009  Sub TimeProc(ByVal uID As Long, ByVal uMsg As Long, ByVal dwUser As Long, ByVal dw1 As Long, ByVal dw2 As Long)
  10. #010      Dim hwd As Long
  11. #011      hwd = FindWindow("#32770", "密码")
  12. #012      If hwd <> 0 Then
  13. #013          hwd = FindWindowEx(hwd, 0, "edit", vbNullString)
  14. #014          SendMessage hwd, EM_SETPASSWORDCHAR, 42, 0
  15. #015          timeKillEvent lTimeID
  16. #016      End If
  17. #017    End Sub
  18. #018  Sub Password()
  19. #019      Dim Password As Variant
  20. #020      lTimeID = timeSetEvent(10, 0, AddressOf TimeProc, 1, 1)
  21. #021      Password = InputBox("请输入密码:", "密码")
  22. #022      If Password = "123456" Then
  23. #023          MsgBox "密码正确!"
  24. #024      Else
  25. #025          MsgBox "密码错误!"
  26. #026      End If
  27. #027  End Sub
复制代码
代码解析:
       Password过程使用InputBox函数显示一个输入密码的对话框,并且以占位符“*”号显示输入的密码。
       第1行到第8行代码,API函数声明。
       第9行到第17行代码,TimeProc过程是timeSetEvent的回调函数,获得对话框句柄。
       第18行到第27行代码,Password过程显示一个提示用户输入密码的对话框。
       运行Password过程将显示一个密码输入框,输入的密码以占位符“*”号代替,如图所示。
Snap2.jpg

技巧75 使用InputBox函数.rar

15.28 KB, 下载次数: 1549

点评

又是又臭又长的API函数,太难理解  发表于 2011-10-16 17:44

评分

1

查看全部评分

TA的精华主题

TA的得分主题

发表于 2009-3-13 09:00 | 显示全部楼层

TA的精华主题

TA的得分主题

发表于 2009-3-13 09:56 | 显示全部楼层

TA的精华主题

TA的得分主题

发表于 2009-3-13 09:57 | 显示全部楼层
听君一席话,胜读十年书!
谢谢楼猪整理共享,一定good good study ,day  day up!
您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

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

GMT+8, 2024-4-28 06:58 , Processed in 0.052247 second(s), 13 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

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

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

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