用VB.NET(Visual Basic 2010)封装EXCEL VBA为DLL_COM组件(二)

——将EXCEL VBA代码移植到VB.NET

.NET是微软公司在2002年推出的全新编程框架,支持多种语言应用程序开发。使用Visual Basic在Microsoft .NET Framework上编程,这就是Visual Basic.NET,简称VB.NET。

VB.NET是Microsoft Visual Studio .NET组件中的重要组成部分,是VB6.0的后续版本,VB.NET仍使用VB的基本语法,二者几乎在90%以上保持相似或相同,虽然Excel VBA代码不能完全像移植到VB6.0那样直接移植到Visual Basic 2010,但大多数情况下,移植还是相当简单的。

一、Excel程序的对象模型。

在 Excel 中,Excel 程序对象(Application)是顶级的对象,往下依次是工作簿对象(Workbook)、工作表对象(Worksheet)和单元格对象(Range)。只有当打开了 Excel 程序(Appliation 对象),才能创建或打开工作簿(Workbook 对象),才能选中某个工作表(Worksheet 对象),以及对某个单元格区域(Range 对象)进行操作。

众多个工作簿,若干张工作表,数不清的单元格,要在“Book1”工作簿中的“Sheet1”工作表中的“A1”单元格内录入内容“A1”,必须像叙述家庭住址一样把各个需引用的对象关系从大到小的顺序叙述清楚。如下代码:

1 Sub Rng2()
2  Application.Workbooks("Book1.xls").Worksheets("Sheet1").Range("A1").Value = "A1"
3 End Sub

Application对象代表Excel程序,属于最顶层对象,通常可以省略,上述代码亦可修改为:

1 Sub Rng3()
2  Workbooks("Book1.xls").Worksheets("Sheet1").Range("A1").Value = "A1"
3 End Sub

在 Excel VBA 中,引用或操作对象时允许省略其上级对象,但并非表示该对象的上一级的对象不存在。

二、Visual Basic.NET编写处理Excel表格代码(即代码移植)

1、声明对象变量时需要前置“Excel”,例如:

Dim VbApp As Excel.Application '定义Excel对象Dim VbBook As Excel.Workbook '定义工作簿对象Dim VbSht As Excel.Worksheet '定义工作表对象Dim VbRng As Excel.Range '定义单元格对象

2、不能直接使用“Application”(即Excel.exe进程),而需要一个变量调用。

首先在模块中声明一个变量VbApp:

Public VbApp As Excel.Application '定义Excel对象

然后对变量VbApp赋值:

(1)、引用Excel.exe进程

通在Excel中引用DLL动态链接库Excel程序都是已经打开了的,即通过任务管理器查看进程可以看到Excel.exe进程,我们需要处理已打开Excel文档,必须引用当前Excel.exe进程。代码如下:

VbApp = GetObject(, "Excel.Application") '引用当前Excel.exe进程,确保已打开Excel程序否则报错

(2)、创建Excel.exe进程

通过下列语句就可以创建新的Excel.exe进程了,Visual Basic .Net可以通过对此进程的处理来操作Excel表格:

VbApp = New Excel.Application '创建新的Excel.exe进程

在后续的应用中可调用变量VbApp来代替“Application”,如:

当执行完创建一个新的Excel.exe进程语句后,通过任务管理器查看进程就发现多出Excel.exe进程,当此时Excel程序的运行界面并没有显示,在此语句后加入以下代码,Excel的运行界面就显示出来了:

VbApp.Visible = True '显示Excel程序的运行界面

Excel运行界面虽然显示,但其中并没有表格,下列代码是在Excel程序中创建一个新表格:

VbApp.Workbooks.Add

3、所有对象必须显示声明,表示它是Excel的对象。

在 Excel VBA 中,引用或操作对象时允许省略其上级对象,但把代码移植到VB.NET中,我们必须使用完整的表达式精确表示某个对象。例如:

Visual Basic .Net处理Excel表格是通过引用(或创建)的Excel.exe进程来实现的。引用(或创建)的Excel.exe进程对应上述代码中的VbApp,即变量VbApp代表Excel 程序对象(Application)。下面代码给工作簿Book1.xls的第1张工作表的“A1”单元格赋值“A1”:

VbApp. BookExcel.Worksheets("Book1.xls").Range("A1").Value = "A1"

当编辑完Excel表格后,可以通过下列语句就关闭Excel表格,并销毁Excel.exe进程:

VbApp. BookExcel.Close ( )'关闭Excel表格

VbApp.Quit ( )'销毁Excel.exe进程

VbApp = Nothing '释放对象变量

可见,我们在Excel编写VBA代码时严格使用完整的表达式精确表示对象,移植代码时使用变量VbApp来调用“Application”,即可。

三、VBA与VB.NET语法变通

随着VB.NET的引入,VB迎来了自发布以来最大的变革,整个运行库模型变成了一个新的公共语言运行库(CLR)环境,语言也从基于对象变成面向对象,对熟悉Excel VBA的程序员移植封装代码带来了困难。不仅需要掌握VB.NET语法,还需要理解并运用VB.NET提出的新功能、概念和观点。当然也需要掌握.Net框架,理解CLR(Common Language Runtime,通用语言进行时)。在移植代码时要特别以下语法变化。

1、数据类型

用于存储任意类型数据的数据类型Variant被Object替代;用于存储大浮点数的数据类型Currency被Decimal替代,并支持更高数度;在VBA中可以在声明字符 串时指定其长度,而VB.NET不支持固定长度字符串。

2、变量赋值

在VBA中不能同时声明和初始化变量,而VB.NET则支持声明的同时初始化变量。例如:

Dim StrName As StringStrName = "VBA封装"

在VB.NET中可以二合一:

Dim StrName As String = "VBA封装"

在VBA中对对象变量赋值必须使用Set语句,而在VB.NET中已取消Set语句,也就是说对象变量的赋值与普通变量一样。如:

ExcelVBA初始化对象变量: Set Rng=Nothing 

而在VB.NET中不需要Set语句: Rng=Nothing 

3、数组

VBA数组下界可以自定义,如以下语句声明了下界为1、上界为10共10个元素的数组Arr:

Dim Arr(1 To 10) As String

而在VB.NET中,数组下界总是从0开始,若使用Dim Arr(1 To 10) As String声明数组将会报错。

在VBA中,可以指定数组的长度,如:

Dim Arr(2) As Integer

这里的Arr数组长度是固定的,不能用ReDim语句改变长度。VB.NET不支持固定长度数组,所以ReDim总是有效。

在VBA中,ReDim用于初始化动态数组,而在VB.NET中,ReDim关键字的使用略有变化,第一个变化是:必须先定义该数组实例,不能用ReDim语句声明数组;第二个变化是:ReDim只能用于改变数组长度,不能改变数组的维数。在VB.NET中动态数组声明时特别注意,如:

Dim Arr() As Integer '声明一维动态数组

上面的声明只能创建一个一维动态数组,若要声明一个二维动态数组,上述声明应包含一个逗号,如:

Dim Arr(,) As Integer '声明二维动态数组

4、变量作用域

在VBA中,变量作用域有:过程级、模块级和全局。在VB.NET中新增了块作用域,也称为结构作用域。

结构是由两条语句而不是一条语句组成的编码结构,如If…Then决策结构、For…Next循环结构。在VB.NET中,如果变量是在结构中声明的,则其作用域限定在结构内,该变量在遇到相应的Dim语句后才被创建,在结构结束处被销毁。如:

1 If Flag = True Then
2 
3     Dim IntNum As Integer
4 
5 End If

5、循环语句

VB.NET增加了Continue关键字,使用Continue For语句,在For…Next循环结构中能够在到达Next语句之前进入下一次For…Next循环;当然也可以使用Continue Do语句,在Do…Loop循环结构中能够在到达Loop语句之前进入下一次Do…Loop循环。

以上语法变化是必必须掌握的,当然我们还需要逐渐掌握一些新旧语法替代,如:虽VB.NET还支持数据类型转换函数,但在VB.NET应力争避免使用,处理数据类型转换的更通用方法是使用System.Convert类;Excel VBA是通过On Error语句来处理错误,这种处理方法在VB.NET中仍得到支持,但已被摒弃,强烈建议使用Try…Catch…Finally结构来处理异常(错误);VB.NET仍支持老式MsgBox()函数,但不建议使用,而是改用MessageBox.Show()函数。

以上介绍并不能使读者了解VB.NET语法的方方面面,如果想进一步了解必须阅读一些专业书籍。如:

《Visual Basic 2010入门经典(中文版)》——[美] James Foxall 著、梅兴文 译、人民邮电出版社。

《Visual Basic 2010 & .NET 4 高级编程(第6版)》——(美) Billy Hollis 等著、彭珲 余科洋 译、清华大学出版社。

转载于:https://www.cnblogs.com/zyjq/p/6659144.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/488692.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

css 背景图片透明度_web前端入门到实战:css重点知识和bug解决方法

1.图片向下撑大3像素问题在一个盒子里面放一张图片,默认情况下,图片会向下撑大3像素,有以下几种解决方法:1.1给图片添加display:block;1.2给图片添加float:left;1.3 给图片添加vertical-align:middle;1.4 给…

像个字段相减绝对值_遇见你丨像个英雄一样活着 瘫痪作家用手指敲击文字著百万字文学作品...

患有先天性肌迟缓症,出生后便全身瘫痪,这样一个原本生活里充满艰难的人,他的名字却出现在了中国作家协会的2020年新会员名单中,他叫高淳。 今年36岁的高淳,家住江苏常熟,从2002年开始文学创作,凭…

计算机 运行新ie 命令,(新)计算机应用基础IE浏览器设置学习笔记——精品.doc

计算机应用基础IE浏览器设置学习笔记一、IE浏览器设置简介Internet Explorer浏览器(简称IE浏览器)是能够接收用户的请求信息,并到相应网站获取网页内容的专用软件。IE浏览器的使用和各种设置是考查的重点,同学们需要认真实践,熟练掌握各种操作…

python日历模块_Python calendar日历模块的说明

calendar(日历)模块,默认每周第一天是星期一,最后一天是星期天。 函数及描述 1. calendar.calendar(year, w2, l1, c6, m3) 返回一个多行字符串格式的year年年历。 2. calendar.firstweekday() 返回当前每周起始日期的设置。默认返…

RPM命令使用

RPM是RedHat Package Manager(RedHat软件包管理工具)的缩写•rpm的常用参数i:安装应用程序(install) e:卸载应用程序(erase) vh:显示安装进度;(ve…

一幅图读懂量子力学(数学的判决)

来源:悦智网 未来智能实验室是人工智能学家与科学院相关机构联合成立的人工智能,互联网和脑科学交叉研究机构。未来智能实验室的主要工作包括:建立AI智能系统智商评测体系,开展世界人工智能智商评测;开展互联网&#x…

python中扑克牌类设计_Python中的计数 Counter类

点击上方"AI机器学习与深度学习算法",选择"星标"公众号原创干货,第一时间送达在很多场景中经常会用到统计计数的需求,比如在实现 kNN 算法时统计 k 个标签值的个数,进而找出标签个数最多的标签值作为最终 kNN…

计算机多文件管理,电脑文件管理几条小技巧

电脑文件管理几条小技巧在电脑的内部,在电脑的桌面上,在“资源管理器”中,充斥着无序与混乱,这种虚拟的混乱极大地影响了电脑的性能和我们办公的效率,下面小编为大家带来了电脑文件管理几条小技巧,希望对大家有用。电脑…

python读取excel画散点图对应多个y_Python Scatter Plot,每个X都有多个Y值

How can I plot different numbers of Y values for each X value 只需分别绘制每个组: for xe, ye in zip(x, y): plt.scatter([xe] * len(ye), ye) and how can I change the X axis from being the numbers 1 and 2 to text categories “cat1” and “cat2”. 手…

追加10亿!腾讯宣布设立15亿元“战疫基金”

来源:腾讯刚刚,腾讯宣布设立15亿元“抗击新型冠状病毒感染肺炎疫情综合保障基金”(以下简称战疫基金)。这是腾讯在设立首期3亿元疫情防控基金、2亿元战疫开发者公益联盟资金池后,再次升级追加10亿元基金,为…

hdu2609 How many

地址:http://acm.hdu.edu.cn/showproblem.php?pid2609 题目: How many Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 2625 Accepted Submission(s): 1135 Problem DescriptionGive yo…

equals null报错吗_轻轻松松教你搞定Java中的==和equals

前言相信很多读者关于和equals懂了又懵,懵了又懂,如此循环,事实上可能是因为看到的博客文章之类的太多了,长篇大论,加上一段时间的洗礼之后就迷路了。本篇文章再一次理清楚。当然如果觉得本文太啰嗦的话,当…

java八股 spring + mybatis

Spring常用注解(绝对经典)_spring注解-CSDN博客 框架篇-02-Spring-单例bean是线程安全的吗_哔哩哔哩_bilibili 1.spring.bean 单例 线程不安全 2.AOP 项目里可以说记录用户登录日志,利用request去获取姓名、ip、、请求方式、url&#xff0…

python import 找不到指定模块_python模块以及导入出现ImportError: No module named ‘xxx‘问题...

python中,每个py文件被称之为模块,每个具有__init__.py文件的目录被称为包。只要模 块或者包所在的目录在sys.path中,就可以使用import 模块或import 包来使用 如果你要使用的模块(py文件)和当前模块在同一目录&#x…

服务器数据库2008怎么备份数据库文件,怎么备份SQL Server2008数据库

在使用SQL Server 2008服务器的时候,我们需要定时的备份数据库来防止数据的丢失,下面学习啦小编为大家介绍备份SQL Server 2008数据库的方法。备份SQL Server 2008数据库的方法在开始菜单中点击“SQL Server Management Studio”在弹出的界面点击连接&am…

蝙蝠为啥这么厉害?地球人整明白了没有?

来源:周末八点半公元一世纪的时候,希腊的普鲁塔克提出了一个问题:如果忒修斯船上的零件被逐渐替换,直到所有的零件都不是原来的零件,那么这艘船还是原来的那艘船吗?这就是人类历史上的忒修斯悖论&#xff0…

vant input框禁止调用手机键盘_春运不要变“泰囧”手机这些功能让回家的路更安全...

随着春节的临近,年味儿可以说是越来越浓了,比如刚刚开始的支付宝集五福活动激发了大家的参与热情,而每年都会上热搜的春运更是成为了我国人民过年最真实的写照。就拿小编来说,作为一个张家口的北漂人,前几天京张高铁的…

RCC 2017 Qual 1 Mail.Ru, April 2, 2017 Problem B. Painting the Wall

题意&#xff1a;给一个n*m(<100)的图&#xff0c;图中0表示台灯&#xff0c;1表示空地&#xff0c;以台灯和墙作为边界&#xff0c;问能否使用k种使得联通的线段上没有重复的颜色 分析&#xff1a;只要连续的空地不超过k个就必然存在一个解&#xff0c;可以选择如下构造&am…

math python 向上取整_Python成为专业人士笔记-各数学运算操作深度剖析

“专业人士笔记”系列目录&#xff1a;创帆云&#xff1a;Python成为专业人士笔记--强烈建议收藏&#xff01;每日持续更新&#xff01;​zhuanlan.zhihu.comPython可以执行常见的数学运算符&#xff0c;包括整数和浮点除法、乘法、取幂、加法和减法&#xff0c;而数学math模块…

css3 shapes是什么意思,如何在Web中使用CSS Shapes

布局一般都是遵循按行和列等线性原则&#xff0c;Web网站的布局到今天为止很大程度上受到这些原则的影响。虽然CSS Grid的出现让布局变得更好&#xff0c;更灵活&#xff0c;但相对于印刷媒体而言&#xff0c;Web布局总体上还是受到很好的限制&#xff0c;特别是内容流上。杂志…