Excel精英培训网

 找回密码
 注册
数据透视表40+个常用小技巧,让你一次学会!

[分享] 新春献礼:VSTO C#入门

[复制链接]
发表于 2014-2-9 09:59 | 显示全部楼层
刚刚上班,回来就见好东西啊
excel精英培训的微信平台,每天都会发送excel学习教程和资料。扫一扫明天就可以收到新教程
回复

使用道具 举报

发表于 2014-2-9 10:55 | 显示全部楼层
回复

使用道具 举报

 楼主| 发表于 2014-2-9 13:39 | 显示全部楼层
操作range:
获取ActiveSheet单元格A2的值有以下等等方式:
Excel.Worksheet sht = Application.ActiveSheet;
var s = sht.get_Range("a2").Value;
var s = sht.get_Range("a1").get_Offset(1,0).Value;

var s = Application.ActiveSheet.Cells(2,"a").Value;

var s = Application.ActiveSheet.Cells(2, 1).Value;

var s = Application.ActiveSheet.Range("a2").Value;

var s = Application.ActiveSheet.Cells(1, 1)(2,1).Value;
由于C#是强类型的语言,变量必须声明类型,但单元格中的值却有文本、数字等,所以这里的变量s定义为var(也可为object)。可见,单元格的表示与VBA中相比,只是要在前面加点东西就成了,其余都一样,如下面的选择单元格:

选择单元格(单个、多个、多列):
Application.ActiveSheet.Cells[2, 3].Select();
Application.ActiveSheet.Range["d3:J8"].Select();
Application.ActiveSheet.Range["d:J"].Select();

复制粘贴单元格:
Application.ActiveSheet.Range["d3:e3"].Copy(Application.ActiveSheet.Range["d6"]);  

Application.ActiveSheet.Range["d3:e3"].Copy();
Application.ActiveSheet.Range["a6:b8"].Select();
Application.ActiveSheet.Paste();
Application.ActiveSheet.Range["h6:i6"].Select();
Application.ActiveSheet.Paste();

单元格区域写进数组、数组写回单元格
var  ar = Application.ActiveSheet.Range("d3:e3").Value;
或object[,] ar = Application.ActiveSheet.get_Range("d3:e3").Value;
Application.ActiveSheet.get_Range("d5:e5").Value =ar;


     有这些基本的了后,就可以着手写一些功能性的代码了。其它的表示方式可参照着改一下VBA中的,很容易得出其表示方式,如设置边框、插入行列等。
     接下来,就以坛子中个别实际提问来展示在VSTO C#中的解决方式。除了特别说明,后面的代码都是以office外接程序------excel 2013工作薄中添加菜单按钮的形式来完成功能,展示出来的都仅仅是功能代码段,同时附上vba代码,其它的就不再提了。

       同时,非常希望各位网友提供实例给以补充、斧正,众人拾柴火焰高嘛

待续……

回复

使用道具 举报

 楼主| 发表于 2014-2-9 20:50 | 显示全部楼层
昨天的一个回贴http://www.excelpx.com/thread-318622-1-1.html,示数组、字典的部分使用。
vba代码:
Sub t()
Dim d As New Dictionary, ar()
rows_c& = Rows.Count
i& = Cells(rows_c, 1).End(3).Row
ar = Range("a1:a" & i).Value
For i = 1 To UBound(ar)
    If ar(i, 1) <> "" Then d(ar(i, 1)) = ar(i, 1)
Next
rows_c = Cells(rows_c, 2).End(3).Row
ar = Range("b1:b" & rows_c).Value
For i = 1 To UBound(ar)
    If ar(i, 1) <> "" Then
      If d.Exists(ar(i, 1)) Then
         ar(i, 1) = d(ar(i, 1))
      Else
        ar(i, 1) = ""
      End If
    End If
Next
Range("c1:c" & rows_c) = ar
End Sub

以上面的VBA一一翻译过来的VSTO C#:
public void t()
        {
            Dictionary<string, string> d = new Dictionary<string, string>();
            int rows_c = Application.ActiveSheet.Rows.Count;
            int i = Application.ActiveSheet.Cells(rows_c, 1).end(3).Row;
            var ar = Application.ActiveSheet.Range("a1:a"+i.ToString()).value;            
            for ( i = 1; i <= ar.Length; i++)
                    if(ar[i, 1] is string ) d[ar[i, 1]] = ar[i, 1];
            rows_c = Application.ActiveSheet.Cells(rows_c, 2).end(3).Row;
            ar = Application.ActiveSheet.Range("b1:b" + rows_c.ToString()).value;  
            for (i = 1; i <= ar.Length; i++)
                if (ar[i, 1] is string)
                   if (d.ContainsKey(ar[i, 1]))
                       ar[i, 1]=d[ar[i, 1]];
                   else
                       ar[i, 1] = "";
            Application.ActiveSheet.Range("c1:c" + rows_c.ToString()).value = ar;
        }

其中,
if(ar[i, 1] is string ) d[ar[i, 1]] = ar[i, 1];
可改为:
if(!d.ContainsKey(ar[i,1]))
       d.Add(ar[i, 1], ar[i, 1]);

两处的if (ar[i, 1] is string)是为了避免当单元格为空的时候代码息菜

                     
回复

使用道具 举报

发表于 2014-2-10 08:49 | 显示全部楼层
非常强大,收藏备用吧,VBA字典还卡着呢!
回复

使用道具 举报

发表于 2014-2-10 09:08 | 显示全部楼层
这个功能很强大呀,还是慢慢来,系统学习,谢谢楼主了!
回复

使用道具 举报

发表于 2014-2-10 09:18 | 显示全部楼层
大神,我装的VS2013 for windows desktop版本,打开新建项目没有找到OFFICE模板,怎么弄?
QQ图片20140210091753.jpg
回复

使用道具 举报

发表于 2014-2-10 10:00 | 显示全部楼层
顶一个,不过没排版开起来不是很爽啊~~
回复

使用道具 举报

发表于 2014-2-10 10:12 | 显示全部楼层
青城山苦丁茶 发表于 2014-2-9 20:50
昨天的一个回贴http://www.excelpx.com/thread-318622-1-1.html,示数组、字典的部分使用。
vba代码:
Su ...

这么看来,是不是VSTO里字典里的数据不能直接用.keys或者.items赋值到数组?
回复

使用道具 举报

发表于 2014-2-10 12:14 | 显示全部楼层
来涨点姿势
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

小黑屋|手机版|Archiver|Excel精英培训 ( 豫ICP备11015029号 )

GMT+8, 2024-4-30 20:03 , Processed in 0.268245 second(s), 7 queries , Gzip On, Yac On.

Powered by Discuz! X3.4

Copyright © 2001-2020, Tencent Cloud.

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