ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

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

VSTO选C#还是 VB.NET?

[复制链接]

TA的精华主题

TA的得分主题

发表于 2013-1-11 16:06 | 显示全部楼层 |阅读模式
本帖最后由 wpxxsyzx 于 2013-1-16 16:31 编辑

vba里遇到一个比较简单的问题,根据A列去除重复从大到小排序。试着用vsto解决,采用vb.net和c#来解决,不是说两种语言谁更好,只是写一下个人的感受。用c#操作excel要比vb.net麻烦许多,特别是已经习惯vba语法的人会很不习惯,可能你要付出更多时间去适应或积累知识。再次声明,不讨论孰优孰劣。也不讨论技术细节,那样的话牵涉内容太多。
vb.net的代码

Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
        Dim d As New Dictionary(Of Int16, String)
        Dim sht = Globals.Sheet1
        Dim arr As Object
        Dim brr As Array
        arr = sht.Range("a1:a" & sht.Range("a65536").End(3).Row).Value
        For i = 1 To UBound(arr)
            'ContainsKey就是vba的Exists,检查key是否存在,vs的字典还提供
            'ContainsValue检查item是否存在
            If d.ContainsKey(arr(i, 1)) = False Then d(arr(i, 1)) = ""
        Next
        brr = New Int16(d.Count) {}
        'vs的字典提供CopyTo可以将字典的keys或items拷贝到数组,
        'Toarray字典的keys或items转为数组
        'vba里Application.transpose(d.keys)在vs强类型语言里会报错,应写成
        'Application.transpose(d.keys。头array())
        d.Keys.CopyTo(brr, 0)
        'array类提供了sort可以对一维数组升序排列,虽然没有提供降序排列,但提供了
        'Reverse对数组反转,先生序后反转就降序了
        Array.Sort(brr)
        Array.Reverse(brr)
        sht.Range("b1").Resize(brr.Length, 1).Value = Application.transpose(brr)
    End Sub

c#的代码

private void button1_Click(object sender, EventArgs e)
        {
            Dictionary<object, string> d = new Dictionary<object, string>();
            Excel.Worksheet sht = Globals.ThisWorkbook.Worksheets["Sheet1"];
            Object[,] arr;
            object[] brr;
            arr = sht.get_Range("a1:a" + sht.get_Range("a65536").get_End(Excel.XlDirection.xlUp).Row).get_Value();
            for (int i = 1; i < arr.Length; i++)
            {
                if(d.ContainsKey (arr[i, 1])==false)
                {
                    d.Add (arr[i, 1],"");
                }
            }
            brr=new object[d.Count ];
            d.Keys.CopyTo(brr, 0);
            Array.Sort(brr);
            Array.Reverse(brr);
            sht.get_Range("b1").get_Resize(d.Count, 1).set_Value(System.Type.Missing, (object[,])this.Application.WorksheetFunction.Transpose(brr));

vba里常用的rang,end,resize,offset要使用新的方法,
C#不支持可选参数,vba里有的提供30个参数,大多不用,vba里不写就可以了,
c#里都得补齐了,比如常用的Find,
Excel.Range rngFind = rng.Find(strSaveFormat, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Excel.XlSearchDirection.xlNext, Type.Missing, Type.Missing, Type.Missing)
需要使用新的方法或改变写法习惯的地方还很多,这是两个例子

c#.rar

190.81 KB, 下载次数: 117

vb.net.rar

103.73 KB, 下载次数: 169

原附件.rar

9.39 KB, 下载次数: 60

TA的精华主题

TA的得分主题

发表于 2013-1-11 19:26 | 显示全部楼层
以前C#使用office的com组件是比较麻烦的
除了LZ提到的可选参数问题,还有很多COM组件返回Object类型对象,C#以前不支持后期绑定,只能通过反射来使用这些对象。
但是从C#4.0(vs2010)开始,C#支持可选参数和命名参数,以及dynamic对象,解决了这些问题。
不过C#中属性不支持参数,提供了一种特殊的"索引器"也有不少限制,所以像Range这样的成员在C#中任然只能以方法的形式出现。

Sort可以用Comparison<T>委托进行自定义排序,或者用LINQ

TA的精华主题

TA的得分主题

 楼主| 发表于 2013-1-11 20:26 | 显示全部楼层
本帖最后由 wpxxsyzx 于 2013-1-11 20:37 编辑
PLINQ 发表于 2013-1-11 19:26
以前C#使用office的com组件是比较麻烦的
除了LZ提到的可选参数问题,还有很多COM组件返回Object类型对象, ...

关于可选参数,例子中我就省略了,我的就是2010,不是2010的人也不少
你说的其他问题也正是我要说的,如果仅是vsto,c#要比vb.net的学习代价大
总之,就像vb被弄进vs成了面向对象一样,c#也在想方法去适应本来从vb来的vba,再提供什么改进,抛开学习代价不说,也没vba的直系来的方便

TA的精华主题

TA的得分主题

发表于 2013-1-16 23:02 | 显示全部楼层
C#不支持可选参数


这个后面的版本已经解决了这个问题

TA的精华主题

TA的得分主题

发表于 2013-1-20 12:58 | 显示全部楼层
习惯就好,以前我对VBA比较熟悉,自从几年前学了C#后,越来越觉C#的好用,现在再来看VBA的代码就觉得很反胃了!我现在要尽量把VBA从脑海中遗忘,让C#充满大脑,让C#的编程思想
融入骨髓!

TA的精华主题

TA的得分主题

发表于 2013-1-22 12:47 | 显示全部楼层
写小东西当然是VBA好用,上点规模的就不好使了。
VBA中没有现成的数据结构和算法。
VBA面向对象支持不好,没有继承。代码重复利用不方便:比如一个布置好控件的窗体,在程序中有多个用途,相同的事件要响应不同的代码...
c#资料比VB.NET多,很多经典的教程也都是用c#语言的,而且C语法的语言各类比较多,以后转其他的也方便,所以总学习成本还是C#低点。
只学过C++/C/VB/C#,没学过VB.NET。以上是各人观点。

TA的精华主题

TA的得分主题

发表于 2013-1-24 20:47 | 显示全部楼层
据说VB.NET操作Excel比C#明显要快

TA的精华主题

TA的得分主题

发表于 2013-1-29 15:45 | 显示全部楼层
星浩 发表于 2013-1-24 20:47
据说VB.NET操作Excel比C#明显要快

VB.NET和C#编译生成的MSIL代码都是一样的,想不通VB.NET为什么会比C#快!

TA的精华主题

TA的得分主题

发表于 2013-1-29 15:50 | 显示全部楼层
至少选C#,以后你可以找到专业的程序开发工作,选VB.NET没多大希望,现在专业的软件开发都是用C#的!其实VB.NET和C#的入门难度都是一样的!VB.NET跟VBA还是有很多区别的,既然都要重学,何不学现在常用的C#语言呢?再说C#的资料比VB.NET要多得多,因为90%的人都是用C#!

TA的精华主题

TA的得分主题

发表于 2013-1-30 13:59 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
本帖最后由 hehex 于 2013-1-30 14:00 编辑

C# 太像Java 了,好像以前还因为这个打过官司。
感觉VSTO 目前还是专业程序人员手中的工具,那么相对VB.net C# 更贴近专业程序员吧。(俺猜的,毕竟俺也不是专业程序员)。
如果纯从计算机爱好者,或者excel 爱好者的角度就不同,VBA->VB.net 怎么也比->C# 快。
记得去年底一时兴起去看了点Java 的教程,因为同时在EH培训班学中级VBA, 造成我的VBA作业的所有程序第一时间全是错,定义变量都放在前面 int xxx; long xxx; 每行代码后面还都加上了;{:soso_e110:}
对于专业的.net 开发者C# 本身就是他们的第一语言,从java 转估计也很快。即使是C,C++ 程序员用C# 恐怕也比用VBA 以及VB.net 更习惯吧。至于俺这样的玩票的菜鸟,如果将来要用VSTO 可能还是VB.net学习成本低些吧。
您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

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

GMT+8, 2024-12-4 01:03 , Processed in 0.062333 second(s), 10 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

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

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

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