|
本帖最后由 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)
需要使用新的方法或改变写法习惯的地方还很多,这是两个例子 |
|