1.6 VBA代码如何快速修改为VB.NET代码

1,017 次浏览

小目标

学会一般VBA代码修改为VB.NET的一般技巧

视频讲解

1.6 VBA代码如何快速修改为VB.NET代码

VBA写一段代码 在VS测试框架里插入模块写入代码

变量必须定义 可以不定义类型 但是必须定义

VBA里变量可以不定义直接使用,VB.NET必须定义,不过也可以不定义类型
直接Dim x 定义名称即可 大部分情况下 都可以不定义类型
可以定义的时候直接赋值比如
Dim x=1 这点比VBA方便 VBA必须写2行

常见的Excel对象类型加Excel.前缀 形如

Excel.Range Excel.Worksheet Excel.Workbook
如果是不需要智能提示 直接改为Object也可以
VBA中的 dim r as Range 改为 dim r as Excel.range

单行定义多个变量 注意类型会以最后一个为准

处理方式为,无类型和有类型混合定义的行,带类型的单独提到新行定义
比如在vba中 可以这样定义

Dim i,j,k,s as String

在VB.NET中你这样复制过去不会报错,但是运行的时候可能出错,因为它会把i,j,k也全部定义为String类型,在VB.net中要修改为下面的形式,不同的数据类型要换一行定义

Dim i,j,k
Dim s as String

Range=值以及 变量=Range 的方式 必须加Range.value

在VBA中,我们习惯了Range类型的默认值比如如下代码

range("A1")=1
x=range("A1")
cells(1,1)=1
x=cells(1,1)

这些vba代码复制到VB.NET不会报错 但是运行时会出错 因为在VB.net没有默认的.value属性,我们必须加上.value 修改如下

range("A1").value=1
x=range("A1").value
cells(1,1).value=1
x=cells(1,1).value

这个情况还要衍生到窗体控件里 比如我们常用的 x=Textbox1,实际上是取的.text默认属性,在.net里我们都要加上 x=Textbox1.text

Set 变量=对象 不再需要Set语句

在VBA中我们的对象变量赋值要加Set r=range
由于在VB.NET里一切都是对象 ,所以赋值语句一视同仁, Set语句再也不需要了,直接赋值即可。

过程名(参数1,参数2)方式 必须加上括号

在vba中调用子函数如下形式

Sub TestSub()
    子函数 1
End Sub

Sub 子函数(x)
    MsgBox (x)
End Sub

以上是VBA子函数子过程的调用形式, 当不需要返回值的时候,我们是不带括号的,在VB.NET里统一只要带参数的函数和过程调用,无论是否有返回值,都要加上括号如下

'在VB.NET
Sub TestSub()
子函数(1) '这样在vba里是无法运行的 在VB.NET里必须加括号
End Sub

Variant类型全部改为Object类型

如果在VBA里显示声明了变体类型

dim x as Variant

在VB.NET中改为 或者直接删除 as Variant
因为在vb.net里变量默认就是object类型

dim x as Object
dim x

数据类型的基本对应关系 实际使用中可不定义类型

如果在VBA中声明了具体类型 ,请参考下表在VB.NET中做出相应修改
一般来说 ,新手不用声明类型 ,在强大的VS自动类型推断能力下, 也许比你自己声明类型,运行速度更快
实际使用中 不用带System.的前缀
VBA基本类型 .NET类或结构

file

参数参数默认按值Byval传递 要按引用传递需要指定ByRef

在VBA的函数参数里,默认都为ByRef引用传递,到了VB.NET注意默认都是ByVal传递,如果希望对基本数据类型在传递过程中进行修改,那需要在参数前加ByRef声明

file
如上图所示 在VB.NET里参数声明要改为

Sub 改变参数(ByRef x, y)
    x = x + y 'x会被子函数改变
End Sub

Excel枚举值的处理方式

在Excel880VSTO框架阿加持下 大部分枚举值可不用修改直接复制到VS直接使用
少部分枚举值如果提示未定义 在VBA立即窗口 ?枚举值 输出具体值 代码中替换即可
更多细节在后续课程实践中一一解决

作业

录制一个VBA宏, 选中一片区域, 填充随机数,填充底色加边框,然后修改为VB.NET代码调试运行

郑广学VSTO教程购买方式

淘宝下单地址(支持花呗)
郑广学VSTO课程云课堂网址
登陆后可免费试学前3节