VBA学习 Transpose转置函数的用法

因为在工作当中常常需要处理大量的数据,常规的VBA编程思路虽然也能实现效果,但往往比较慢,效率不太高。之前很是为此而烦恼:以前编写的小程序在处理十多万行,和几百列的数据上,往往运行有十几,甚至几十分钟,修改一次原始文档,再次运行有要等几十分钟,很浪费时间。所以最近一直在研究数组。

今天要讲的内容和数组关系很大,是Excel转置函数Transpose的相关知识及其应用。至于为什么要讲讲这个函数呢?因为我在编写程序时遇到的一个小问题,因为用了这个转置函数,所以快速的解决了。要不然,就又得写一个循环了。

好了,废话不多述,进入正题。

我们先来认识下Transpose函数。 Excel中TRANSPOSE函数就是进行行列互转的函数,这是基础用法,在Excel中和VBA中都适用。首先看看TRANSPOSE函数的基础用法。官方帮助说明,TRANSPOSE函数可返回转置单元格区域,即将行单元格区域转置成列单元格区域,反之亦然。

TRANSPOSE函数语法是:TRANSPOSE(数组) 或者TRANSPOSE(区域)。很简单是不是?不过你可别小瞧哟,接下来我要开始讲述上面的问题了,以及怎样运用Transpose解决问题。因为涉及到公司数据的保密性,我这里用一个例子替代。

比如,一个班级有3000名学生,叫张三1,张三2,一次类推,然后由此月考(只靠语文和数学两科),然后需要根据语文和数学成绩的和来判断该学生是否及格。大于等于120分就及格,反之不及格。很简单的题目对不对,VBA中有无数中方式实现,如果有30万条记录呢?用数组就会快很多了。下面就是我第一次写的实现代码:

Sub arr()

Dim arr1(), arr2()

Dim i As Integer

Range("A1:D1") = Array("姓名", "语文", "数学", "成绩评定")

ReDim Preserve arr1(1 To 3000, 1 To 3), arr2(1 To 3000)

For i = 1 To 3000

arr1(i, 1) = "张三" & i

arr1(i, 2) = Int(Rnd() * 99 + 1)

arr1(i, 3) = Int(Rnd() * 99 + 1)

If (arr1(i, 2) + arr1(i, 3)) >= 120 Then

arr2(i) = "及格"

Else

arr2(i) = "不及格"

End If

Next i

Range("A2:C3001") = arr1()

Range("D2:D3001") = arr2()

End Sub

然后点击运行后发现D列一直是同一种结果(全是及格或者全是不及格),我想了好久,怎么都没发现问题所在,后面一直调试才发现问题:最后arr2()赋值给区域Range("D2:D3001")的这条代码有问题Range("D2:D3001") = arr2(),因为我们知道我Dim的arr2()是一个一维数组,而Range("D2:D3001")是一个一维纵向区域, 如果看成数组的话就是一个二维数组,虽然只有一列数据。而一维数组是不能赋值给二维数组的,所以这里用到转置函数Transpose,把需要赋值的一维数组转置为二维数组,从而和被赋值的数组匹配,如下面我修改后的代码所示:

Sub arr()

Dim arr1(), arr2()

Dim i As Integer

Range("A1:D1") = Array("姓名", "语文", "数学", "成绩评定")

ReDim Preserve arr1(1 To 3000, 1 To 3), arr2(1 To 3000)

For i = 1 To 3000

arr1(i, 1) = "张三" & i

arr1(i, 2) = Int(Rnd() * 99 + 1)

arr1(i, 3) = Int(Rnd() * 99 + 1)

If (arr1(i, 2) + arr1(i, 3)) >= 120 Then

arr2(i) = "及格"

Else

arr2(i) = "不及格"

End If

Next i

Range("A2:C3001") = arr1()

Range("D2:D3001") = WorksheetFunction.Transpose(arr2())

End Sub

这样,就完美解决了问题了。重点来了!!!!!Transpose函数是可以改变数组维度的!!!!!,有些时候,这个小小的功能会帮我们大忙。

看会这个例子,如果不用Transpose函数行不行呢?也行,不过需要用循环来逐步赋值给Range("D2:D3001")区域,这样就比较慢了。

好啦,以上就是Transpose函数在VBA中的小小应用啦~~

以上,2018/12/15日 星期六。

发布于 2018-12-15 12:29

文章被以下专栏收录