ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

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

【学习VSTO】——VSTO和VBA的一些区别

[复制链接]

TA的精华主题

TA的得分主题

发表于 2012-11-17 12:00 | 显示全部楼层 |阅读模式
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
本帖最后由 wpxxsyzx 于 2014-10-5 15:10 编辑

学习VSTO,尝试用VSTO制作加载项和任务窗格的过程中,查找资料加自己的实际使用,总结一下,如有不当之处,望指正,也希望各位同道写出自己的心得,众人拾柴火焰高嘛。帖中提到的代码都在一个文档级的项目中,附件为源文件。环境:Vs2010 .net framework 4.0
Office2010
1、  My对象
如果你对用VBA编写复杂的代码,或使用API实现某些功能感到厌烦,好消息,VSTO引入了My对象,它将.NET FrameWork类库中的一些常用功能提取出来分类,现在有时你只需一句代码就可以得到你想要的结果。比如:
获取磁盘列表及相关信息
My后输入”.”,根据智能感知列出的列表选择你所需的对象即可
Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click
        Dim i As Integer
        With My.Computer.FileSystem
            For i = 0 To .Drives.Count - 1
                Me.Cells(i + 1, 3).value =.Drives(i).Name
                Me.Cells(i + 1, 4).value = .Drives(i).DriveFormat
            Next
        End With
End Sub
获取用户名,这个有点特别,需要先根据系统用户名获取,所以加一句
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
        My.User.InitializeWithWindowsUser()'初始化系统用户
        MsgBox(My.User.Name)
    End Sub
1、  新运算符
IsNot运算符,
该运算符用于比较两个对象是否相同,如果相同则返回False,否则返回True
VBA里我们这样比较两个对象:
If not rng is nothing
VSTO里还可以这样写:
If rng isnot nothing
两者作用效果一样,VSTO里都可以用,但是后者更易于理解
AndAlso运算符
该运算符用来计算两个表达式,它的作用和And运算符类似,但是仅当第一个表达式为 True时才计算第二个表达式,而And运算符总是依次计算两个表达式。AndAlso运算符
的好处显而易见,下面是分别使用两个运算符的比较
Private Sub Button4_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button4.Click
        Dim timer As New Stopwatch
        timer.Start()
        For i As Int16 = 1 To 1000
            If Range("e1").Value > 10 AndAlso Range("e1").Value < 100 Then
            End If
        Next
        MsgBox(timer.Elapsed.TotalSeconds)
    End Sub
Private Sub Button5_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button5.Click
        Dim timer As New Stopwatch
        timer.Start()
        For i As Int16 = 1 To 1000
            If Range("e1").Value > 10 And Range("e1").Value < 100 Then
            End If
        Next
        MsgBox(timer.Elapsed.TotalSeconds)
    End Sub
OrElse运算符
该运算符用来计算两个表达式,它的作用和Or运算符类似,但是仅当第一个表达式为 False时才计算第二个表达式,而Or运算符总是依次计算两个表达式。下面是分别使用两个运算符的比较
Private Sub Button6_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button6.Click
        Dim timer As New Stopwatch
        timer.Start()
        For i As Int16 = 1 To 1000
            If Range("g1").Value >100 OrElse Range("g1").Value <10 Then
            End If
        Next
        MsgBox(timer.Elapsed.TotalSeconds)
    End Sub
Private Sub Button7_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button7.Click
        Dim timer As New Stopwatch
        timer.Start()
        For i As Int16 = 1 To 1000
            If Range("g1").Value >100 Or Range("g1").Value <10 Then
            End If
        Next
        MsgBox(timer.Elapsed.TotalSeconds)
    End Sub



文档级.rar

622.1 KB, 下载次数: 297

评分

2

查看全部评分

TA的精华主题

TA的得分主题

 楼主| 发表于 2012-11-17 12:01 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
本帖最后由 wpxxsyzx 于 2012-11-17 13:45 编辑

3、  窗体
VSTO里窗体是类,所以显示窗体前必须实例化窗体,有两个方法分别用于显示模态和非模态的窗体
显示模态窗体如下:
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
        Dim myform As New Form1
        myform.ShowDialog()
End Sub

显示非模态窗体如下
Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click
        Dim myform1 As New Form1
        myform1.Show()
    End Sub
4、 运行时添加控件
和窗体一样,添加控件之前要先实例化
Private Sub Button3_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button3.Click
        Dim i As Int16
        Dim myCmb As New Microsoft.Office.Tools.Excel.Controls.ComboBox
        Dim selection = Globals.ThisWorkbook.Application.Selection
        If TypeName(selection).ToString = "Range" Then
            If selection.count = 1 Then
                myCmb = Me.Controls.AddComboBox(selection.left, selection.top, selection.width, selection.height, "新增")
                With myCmb.Items
                    For i = 1 To 6
                        .Add(i)
                    Next
                End With
            End If
        End If
    End Sub
5、  方法重载
VBA中我们通过给过程设置可选参数来让一个过程实现不同的功能,这在VSTO里依然可用,但是我们还可以利用方法重载:定义多个名字相同的过程,每个过程的参数类型或个数不完全相同,调用过程时输入不同的参数就会调用不同的过程,这就是方法重载,例如:
下面的三个过程名字相同但参数不同
Private Sub sum(ByVal a As Int16, ByVal b As Int16, ByVal c As Int16)
        Me.Range("a1").Value = a + b + c
    End Sub
    Private Sub sum(ByVal a As Int16, ByVal b As Int16)
        Me.Range("a1").Value = a + b
    End Sub
    Private Sub sum(ByVal a As Int16)
        Me.Range("a1").Value = a
    End Sub
下面三个按钮调用sum过程但输入不同的参数,得到不同的结果
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
        Call sum(1, 2, 3)
    End Sub
Private Sub Button2_Click_1(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click
        Call sum(1, 2)
    End Sub
Private Sub Button3_Click_1(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button3.Click
        Call sum(1)
End Sub

6、  控件数组
VB中有控件数组可以只写一段代码,让一组控件实现相同的功能。VBA没有控件数组,要实现上述功能只能写类模块,VSTO也没有控件数组,但我们可以使用如下的方法。
Private Sub Button4_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button4.Click, Button5.Click, Button6.Click
        RadioButton1.Enabled = False
    End Sub
注意Handles子句,上段代码可以实现单击Button4, Button5, Button6都可以实现RadioButton1按钮不可用,就是说在Handles子句后跟上要实现相同功能的过程名就可以实现控件数组的功能,不需为每个按钮写相同的代码

TA的精华主题

TA的得分主题

 楼主| 发表于 2012-11-17 12:02 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
本帖最后由 wpxxsyzx 于 2012-11-17 13:44 编辑

7、  枚举常量
VSTOExcel枚举常量存储在不同的命名空间里,要使用枚举常量要明确三件事:一要指定所需常量在那个命名空间里,二要知道所需的枚举常量名(这一点在vba中我们不用关心,只需输入”.”就可以选取常量值了),三要全限定枚举常量,比如:
我们需要的常量名是XlInsertShiftDirection,这个常量在Excel命名空间,全限定输入后就可以选取所需的常量值了。Excel是Microsoft.Office.Interop.Excel命名空间的别名
Private Sub Button1_Click_1(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
        Rows("1:1").insert(Excel.XlInsertShiftDirection.xlShiftDown)
        With Range("a1").Borders(Excel.XlBordersIndex.xlEdgeBottom)
            .LineStyle = Excel.XlLineStyle.xlContinuous
            .ColorIndex = Excel.XlColorIndex.xlColorIndexAutomatic
            .Weight = Excel.XlBorderWeight.xlMedium
        End With
    End Sub
Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click
With Application.FileDialog(Microsoft.Office.Core.MsoFileDialogType.msoFileDialogFilePicker)
            .Show()
            .AllowMultiSelect = False
            If .SelectedItems.Count = 1 Then
                MsgBox(.SelectedItems(0))
            Else
                MsgBox("没?有&reg;D选?择?文?件t")
            End If
        End With
    End Sub
8、  字符串
VSTO中字符串变身为对象,拥有很多方法、属性,利用这些方法我们可以完成对字符串的分割、截取、替换等操作,这些操作在VBA中我们使用各种函数来实现,例子
Private Sub Button4_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button4.Click
        Me.Range("c4").Value = Me.Range("b4").Value.ToString.Split(",")(0)
        Me.Range("d4").Value = Me.Range("b4").Value.ToString.Split(",")(1)
        Me.Range("e4").Value = Me.Range("b4").Value.ToString.Split(",")(2)
        Me.Range("c2").Value = Me.Range("b2").Value.ToString.Length
        Me.Range("d2").Value = Me.Range("b2").Value.ToString.ToUpper
        Me.Range("e2").Value = Me.Range("b2").Value.ToString.Replace("s", "q")
        Me.Range("f2").Value = Me.Range("b2").Value.ToString.Substring(1, 3)
    End Sub
VSTO中很多数据类型都可以使用.ToString将自身转换为字符串,它的作用和CStr函数相同
顺便说下,
1VSTO中不能再使用定长字符串,
2、数组都是0基的,你不能这样定义数组
Dim a(1 to 10) as string

TA的精华主题

TA的得分主题

发表于 2012-11-17 12:16 | 显示全部楼层

TA的精华主题

TA的得分主题

发表于 2012-11-19 09:27 | 显示全部楼层
这是vb.net的语法,不是VSTO的{:soso_e102:}

TA的精华主题

TA的得分主题

 楼主| 发表于 2012-11-19 09:42 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
本帖最后由 wpxxsyzx 于 2012-11-19 09:43 编辑
wqfzqgk 发表于 2012-11-19 09:27
这是vb.net的语法,不是VSTO的


vb.net语法是学习vsto的基础,要不就开vs子版块了,你说呢

TA的精华主题

TA的得分主题

发表于 2012-11-19 09:44 | 显示全部楼层
熟悉了操作 .Net x.x类库,是在 office对象之外操作office,视野和功能都大不一样了。

TA的精华主题

TA的得分主题

发表于 2012-11-22 11:47 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
拜读拜读!!

TA的精华主题

TA的得分主题

发表于 2014-3-20 00:22 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
写但太好了,希望版主继续分享好文,受益匪浅,谢谢了。

TA的精华主题

TA的得分主题

发表于 2014-3-25 09:34 | 显示全部楼层
您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

关闭

最新热点上一条 /1 下一条

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

GMT+8, 2024-4-20 03:48 , Processed in 0.060732 second(s), 11 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

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

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

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