VBA算是非主流语言,接触过的人想必不多,在此就谈谈我对VBA的一些肤浅的看法。

VBA就是Visual Basic for Application 的简称,它有两大特点,一就是它是采用BASIC语法的脚本语言(解释执行),另一个就是它嵌入到某个其他应用中来控制调用这个应用系统的功能。在我印象中,它最早是出现在微软的Office中,比如Word或Excel的宏,并逐步扩展到其他应用中,比如AutoCad,VS.NET集成开发环境等就支持VBA。在微软.NET框架中,就已经包含了一个VBA的运行引擎,使用这个引擎可以使得我们开发的系统也支持VBA。

IE浏览器支持VBScript,它采用Basic的语法,也能调用浏览器的某些功能,但个人认为不算VBA,因为VBScript的控制力度太弱了,而且有着很多安全限制。但VBA除了能控制应用系统处理的文档内容外,还能控制更多的模块,而且一般没有安全限制,可以连接数据库或访问二进制文件。可以说VBA是普通编程语言和脚本语言的中间体,同时具有两者的优点和缺点。当个功能不复杂,用常规编程方式太麻烦,若系统支持VBA,则可以考虑使用VBA来实现。

VBA有一个显著的特点就是和应用系统的紧密结合,能方便的调用系统接口,比如对于Word或Excel,可在系统界面上新增菜单或按钮来映射到VBA函数,可以定义快捷键,这样就临时扩展了应用系统的功能。

在此演示一个在VS.NET2003集成开发环境的VBA的开发和应用。

对VS.NET进行扩展编程,首先想到的是插件,VS.NET提供了比较复杂的API,大家要写程序并编译生成可执行文件,然后对VS.NET进行一定的配置才能使用。若使用VBA则过程大大简化。

自此想实现一个功能,将一个C#工程中所有的文件拷贝到一个目录下面,而在工程目录中但不包含在工程中的文件将不拷贝。VS.NET2003的C#工程文件扩展名为 .csproj , 它内容是一个XML文档,没有XML声明头,采用ANSI编码格式,我们的VBA代码将加载并解析这个XML文档,分析其中的工程引用信息和包含的文件清单,将引用的DLL文件和所有的工程文件拷贝到指定目录下。其所有的VBA代码如下

   Public   Sub  CopyCSProject()

Dim  myPrj  As  EnvDTE.Project  =  DTE.ActiveWindow.Project

If   UCase (System.IO.Path.GetExtension(myPrj.FullName))  <>   " .CSPROJ "   Then
             MsgBox ( " 当前工程不是 C# 工程 " , MsgBoxStyle.Information,  " 复制CS工程 " )
             Exit Sub
         End   If

Dim  myFile  As   New  System.IO.StreamReader(myPrj.FullName, System.Text.Encoding.GetEncoding( 936 ))
         Dim  myDoc  As   New  System.Xml.XmlDocument
        myDoc.LoadXml(myFile.ReadToEnd())
        myFile.Close()

Dim  strPath  As   String   =   InputBox ( " 请输入输出目录名称 " ,  " 输入 " )
         If  strPath  Is   Nothing   Then
             Return
         End   If
         If  strPath.Length  =   0   Then
             Return
         End   If

Dim  ThisPath  As   String   =  System.IO.Path.GetDirectoryName(myPrj.FullName)

CopyFile(myPrj.FullName, strPath)

Dim  FileCount  As   Integer
         Dim  myElement  As  System.Xml.XmlElement
         Dim  strFileName  As   String
         Dim  strNewFileName  As   String
         For   Each  myElement  In  myDoc.SelectNodes( " VisualStudioProject/CSHARP/Build/Referencds/Reference " )
            strFileName  =  myElement.GetAttribute( " HintPath " )
             If  strFileName.StartsWith( " c: " )  =   False   And  strFileName.StartsWith( " C: " )  =   False   Then
                CopyFile(ThisPath, strPath, strFileName)
                FileCount  =  FileCount  +   1
             End   If
         Next

For   Each  myElement  In  myDoc.SelectNodes( " VisualStudioProject/CSHARP/Files/Include/File " )
            strFileName  =  myElement.GetAttribute( " RelPath " )

If   Not  strFileName  Is   Nothing   Then
                 If  strFileName.IndexOf( " : " )  =   - 1   Then
                    CopyFile(ThisPath, strPath, strFileName)
                    FileCount  =  FileCount  +   1
                 End   If
             End   If
         Next
         MsgBox ( " 共拷贝  "   &  FileCount.ToString()  &   "  个文件 " )

End Sub

Public   Sub  CreateDirectory( ByVal  strDir  As   String )
         If  System.IO.Directory.Exists(strDir)  =   False   Then
            System.IO.Directory.CreateDirectory(strDir)
         End   If
     End Sub
     Public   Sub  CopyFile( ByVal  strPath1  As   String ,  ByVal  strPath2  As   String ,  ByVal  strFilePath  As   String )
         Dim  strName1  As   String   =  System.IO.Path.Combine(strPath1, strFilePath)
         Dim  strName2  As   String   =  System.IO.Path.Combine(strPath2, strFilePath)

Dim  dir1  As   String   =  System.IO.Path.GetDirectoryName(strName1)
         If  System.IO.Directory.Exists(dir1)  =   False   Then
            System.IO.Directory.CreateDirectory(dir1)
         End   If

Dim  dir2  As   String   =  System.IO.Path.GetDirectoryName(strName2)
         If  System.IO.Directory.Exists(dir2)  =   False   Then
            System.IO.Directory.CreateDirectory(dir2)
         End   If

System.IO.File.Copy(strName1, strName2,  True )

End Sub
     Public   Sub  CopyFile( ByVal  strFileName  As   String ,  ByVal  strNewPath  As   String )
        System.IO.File.Copy(strFileName, System.IO.Path.Combine(strNewPath, System.IO.Path.GetFileName(strFileName)),  True )
     End Sub

代码编写完毕后就在VS.NET工具条上新增一个按钮来映射到这段代码,其过程演示如下。

从上面看出,实现这个过程非常简单,采用了简单的面向过程的编程方法,没有复杂的配置,而且这里的VBA没有安全限制,可以调用.NET框架的所有的类,可以连接数据库,操作二进制文件,启动其他程序等。我们可以编写VBA来实现各种需要的功能,比如检查文档内容,自动生成源代码等等。有兴趣大家一起来研究研究。

在这里提醒一下,这段代码只能在VS.NET2003中运行,由于VS.NET2005的C#工程文件格式和2003的不同,因此进行移植时需要修改解析c#工程文件的部分代码。而且VBA调用 System.Windows.Forms 下面的类型时可能有问题,VBA正在运行时可能会影响VS.NET的正常工作,有时VBA不能运行,则关闭VS.NET然后重新打开就能用了。

袁永福 ( http://www.xdesigner.cn ) 2006-12-1

转载于:https://www.cnblogs.com/xdesigner/archive/2006/12/01/579367.html

使用VBA扩展VS.NET集成开发环境,有Flash演示动画相关推荐

  1. 基于Eclipse的TI集成开发环境IDE-CCSv5使用教程

    TI嵌入式处理器的集成开发环境(IDE)包括调试器,编译器,编辑器,DSP/BIOS操作系统等等,现在最新的CCSv5 IDE基于Eclipse开源软件框架(v4+)并融合了TI设备的支持与功能,适用 ...

  2. 集成开发环境(IDE)

    学习目标: 1.了解Java的IDE开发工具 2.会使用Eclipse.IDEA开发工具新建项目,编写代码,并运行程序. 学习过程: 使用文本开发效率无疑是很低的,每次编写完代码后,还需要手动的编译执 ...

  3. python软件包自带的集成开发环境-Python的10大集成开发环境和代码编辑器(指南)...

    使用IDLE或者Python Shell来编写Python是非常适合于简单程序的,但是这些工具往往将大型的编程项目变成一个个充满绝望和沮丧的"坑".使用一款集成开发环境甚至是一款好 ...

  4. python自带的集成开发环境是什么-Python的10大集成开发环境和代码编辑器(指南)...

    使用IDLE或者Python Shell来编写Python是非常适合于简单程序的,但是这些工具往往将大型的编程项目变成一个个充满绝望和沮丧的"坑".使用一款集成开发环境甚至是一款好 ...

  5. python软件包自带的集成开发环境-实验一 熟悉Python的集成开发环境

    实验一 熟悉Python的集成开发环境 一.实验目的与要求 1.了解什么是Python: 2.了解Python的特性: 3.掌握下载和安装Python的方法: 4.学习执行Python命令和脚本文件的 ...

  6. 10 个免费的 C/C++ 集成开发环境

    http://cnbeta.com/articles/188721.htm 集成开发环境(IDE)可以给程序员提供很大的帮助.大多数的IDE包含编译器和解释器.例如微软的 Visual Studio ...

  7. python开发环境比较好_python开发环境比较好,python 集成开发环境哪个好

    python 集成开发环境哪个好 PyCharm是一种Python IDE,带有一整套可以帮助用户在使用Python语言开发时提高其效率的工具,比如调试.语法高亮.Project管理.代码跳转.智能提 ...

  8. Python初学者选择集成开发环境的原则!可以从以下几个方面着手

    编程语言在进行编程时,都需要借助一定的集成开发环境和代码编辑器,Python编程亦如此,以下是在Python初学者在选择Python编辑器时,可以从以下几个方面着手: 1. 保存和重载代码文件 如果一 ...

  9. 64位 linux 32位连接器,意法半导体为 32 位微控制器发布了一款自由的 Linux 集成开发环境...

    32 位微控制器世界向 Linux 敞开大门.前一段时间,领先的 ARM Cortex-M 供应商意法半导体(ST)发布了 一款自由的 Linux 桌面版开发程序,该软件面向其旗下的 STM32 微控 ...

最新文章

  1. Markdown上下标内容多于一项
  2. ORA-32004: obsolete and/or deprecated parameter(s) specified
  3. Cause: invalid code lengths set
  4. QT显式调用VC开发的DLL
  5. php定时红包,PHP随机红包和等额红包的简单实现
  6. 数据库单表数据过亿_我也能写数据库 —— 单表查询
  7. linux下安装Jira6.3
  8. _过程_函数_触发器_游标
  9. 八、属性和方法(属性和方法的概念以及使用,注意,新特性中的自动属性,方法的重载)...
  10. Creating Your First Mac App--Implementing Action Methods 实现动作方法
  11. gcc详解以及静态,动态库的生成 2
  12. Java编程思想读书笔记(一)第1~13、16章
  13. Python入门学习十:Python绘图
  14. 如何生成你自己的icon 图标库
  15. 计算机里的文件中的桌面不见了,电脑重启桌面文件不见了怎么办
  16. WLAN定义和基本架构
  17. ubuntu中firfox插件xmarks的同步问题
  18. 镭速——FTP服务器概念详解
  19. 2021日照市地区高考成绩排名查询,日照高中高考成绩排名,2021年日照各高中高考成绩排行榜...
  20. (转)日语汉字音便规则

热门文章

  1. 录歌,唱歌,赚钱两部误!点击进来!看规则!
  2. css边框角;table 合并单元格
  3. JAVA字符串转日期或日期转字符串
  4. mysql 删除slave_如何清除Slave的配置信息
  5. 炫云3ds Max插件的非典型功能介绍
  6. python 删除文件、目录_python如何删除文件、目录
  7. Android路由框架ARouter原理
  8. python的requests库发送携带上传文件的接口_python requests 库请求带有文件参数的接口实例...
  9. MongoDB安装部署
  10. 别人总结的英语网站大全