使用VBA数组公式——Excel之VBA(11)

摘要:
1、 了解VBA数组和常见操作示例:计算区域的总量Subtest()Dimi,kDimtt=Timer'获取时间值Fori=2To200000IfRange(“g”&i)=Range(“n5”)Thenk=k+Range(“j”&i)EndIfNext=Timer-t'获取时间差Range(“p5”)=kMsgBoxFormat(t,“0.000000”)'显示时间差EndSubt=2.07S

一、 认识VBA数组及常用操作

引例:计算所属区域的总金额

使用VBA数组公式——Excel之VBA(11)第1张

Sub test()

Dim i, k
Dim t

t = Timer '获取时间值

For i = 2 To 200000
    If Range("g" & i) = Range("n5") Then
        k = k + Range("j" & i)
    End If
Next

t = Timer - t '得到时间差

Range("p5") = k

MsgBox Format(t, "0.00000") '显示时间差

End Sub

t = 2.07

Sub test()

Dim
i, k Dim t Dim str As String t = Timer '获取时间值 str = Range("n5") ' 优化取数过程,加快执行效率 For i = 2 To 200000 If Range("g" & i) = str Then k = k + Range("j" & i) End If Next t = Timer - t '得到时间差 Range("p5") = k MsgBox Format(t, "0.00000") '显示时间差 End Sub

t = 1.18

Sub test()

Dim i, k
Dim t
Dim str As String
Dim arr()


t = Timer '获取时间值

str = Range("n5") '优化取数过程,加快执行效率
arr = Range("g1:j200000") '将数据源放进数组中存放,进一步加快效率

For i = 2 To 200000
    If arr(i, 1) = str Then
        k = k + arr(i, 4)
    End If
Next

t = Timer - t '得到时间差

Range("p5") = k

MsgBox Format(t, "0.00000") '显示时间差

End Sub

t = 0.164

1. 什么是数组


2. 如何定义数组

一维数组二维数组
Sub test()



dim arr (0 to 3) '定义的数组起始值不一定要从0,如dim arr(1 to 4)

arr(0) = "张三"

arr(1) = "李四"

arr(2) = "王五"

arr(3) = "赵六"

range("b1")  = arr(2)   '手动录入数组是一维的

range("a10:g10") = arr  ' 一维数组是横的,直接赋值整个数组要横着赋,即一条记录

' 当数组的值已经输出完,继续输出,后一个值为空,再后会报错N/A



end Sub
Sub test()

Dim arr() '不设置起始值

arr = Range("a1:a5") '直接录入数据区域

Range("c1") = arr(2, 1) '尽管录入的数据区域是1列的也是二维数组,arr(行,列)

End Sub

 要点:

'定义的数组起始值不一定要从0,如dim arr(1 to 4)
'手动录入数组是一维的
' 一维数组是横的,直接赋值整个数组要横着赋,即一条记录
' 当数组的值已经输出完,继续输出,后一个值为空,再后会报错N/A
'尽管录入的数据区域是1列的也是二维数组,arr(行,列)
 
 
 
 


3. 动态数组与静态数组

要点:

静态数组:定义时设置了起始值

动态数组:定义时不设置起始值

引例:

使用VBA数组公式——Excel之VBA(11)第2张

Sub test()

Dim arr() '定义动态数组
Dim j, i As Integer

j = Range("a65536").End(xlUp).Row - 1 ' 取产品的行号
'如果上面不定义arr,而直接在这里
' Dim arr(1 to j)
'会报错,arr的定义必须是常量表达式

ReDim arr(1 To j) '重定义数组,因为上面定义了arr,所以这里是重定义 For i = 1 To j arr(i) = Range("b" & i + 1) * Range("c" & i + 1) '计算产品销售额 Next Range("h3") = Application.WorksheetFunction.Max(arr) '调取产品最大销售额 'Application.WorksheetFunction.Match(Range("h3"), arr, 0) 匹配最大销售额的位置 Range("h2") = Range("a" & Application.WorksheetFunction.Match(Range("h3"), arr, 0) + 1)

 MsgBoxUBound(arr) '弹出arr数组的上限
 MsgBoxLBound(arr) '弹出arr数组的下

End Sub

 

要点:

' ReDim arr(1 To j) '重定义数组,因为上面定义了arr,所以这里是重定义
 MsgBox UBound(arr) '弹出arr数组的上限
 MsgBox LBound(arr) '弹出arr数组的下限

4. 计算数组的大小 Ubound和Lbound

Ubound:U代指UP,指的是上边界

Lbound:L代指Low,指的是下边界


5. 重定义数组大小 ReDim [Preserve] Arr(10)

二、数组应用实例解析

如何将区域赋值给数组
数组的维度
给数组赋值与取值

三、 本节案例演示

1)使用数组遍历计算多条件求和
2)查找销售额最高的商品
3)排列组合计算回款金额

使用VBA数组公式——Excel之VBA(11)第3张

说明:示例代码简单采用了暴力算法

Sub test()

Dim i, j, k, l As Integer

t = Timer

For i = 2 To 80
    For j = 2 To 80
        For k = 2 To 80
            For l = 2 To 80

                If Range("a" & i) + Range("a" & j) + Range("a" & k) + Range("a" & l) = 124704 Then '如果四个相加等于回款信息
                    Range("f3") = Range("a" & i) '记录回款信息
                    Range("g3") = Range("a" & j)
                    Range("h3") = Range("a" & k)
                    Range("i3") = Range("a" & l)

                    GoTo 100 '单单只是exit for是不行的,只会退出一层,这里用GoTo跳出所有循环

                End If
            Next
        Next
    Next
Next

100

t = Timer - t
MsgBox t


End Sub                                                 

t = 1.925

 优化算法:

Sub test()

Dim i, j, k, l As Integer

t = Timer

arr = Range("a1:a80") '把数据录入数组,避免重复取数,加快

For i = 2 To 80
    For j = 2 To 80
        For k = 2 To 80
            For l = 2 To 80
                
                ' If Range("a" & i) + Range("a" & j) + Range("a" & k) + Range("a" & l) = 124704 Then '
            
                If arr(i, 1) + arr(j, 1) + arr(k, 1) + arr(l, 1) = 124704 Then '如果四个相加等于回款信息
                    ' Range("f3") = Range("a" & i)
                    Range("f3") = arr(i, 1) '记录回款信息
                    Range("g3") = arr(j, 1)
                    Range("h3") = arr(k, 1)
                    Range("i3") = arr(l, 1)
                    
                    GoTo 100  '单单只是exit for是不行的,只会退出一层,这里用GoTo跳出所有循环
                    
                End If
            Next
        Next
    Next
Next

100

t = Timer - t
MsgBox Format(t, "0.0000")
 

End Sub

t=  0.0195

四、小结

需要理解并记住写法的概念

Dim Arr() As String
Range(“a1”)=Arr(2,1)
Arr=Range(“a1:b10”)

需要理解的概念

什么是数组 Dim Arr(10,2)
Ubound和Lbound ReDim [Preserve] Arr(10)
使用数组的优势
Timer GOTO 100

回顾以下几个概念
数组有维度 有大小
可以把值赋值给数组 也可以把区域复制给数组
数组可以用在函数里

免责声明:文章转载自《使用VBA数组公式——Excel之VBA(11)》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇ODOO权限管理,在两个方面设置权限pycharm安装插件的方法下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

Aho

Aho - Corasick string matching algorithm 俗称:多模式匹配算法,它是对 Knuth - Morris - pratt algorithm (单模式匹配算法) 形成多模式匹配算法的一种改进,如果我们用单模式匹配算法实现多模式匹配算法,假如模式串有 M 个 , 则需要重复调用 M 次单模式匹配算法 ; 举个很简单的例子,...

利用ADO操作外部数据——Excel之VBA(15)

引例: 在VBA里录制导入现有外部数据的宏查看宏代码  1 Sub 宏1() 2 ' 3 ' 宏1 宏 4 ' 5 6 ' 7 Application.CutCopyMode = False 8 With ActiveSheet.ListObjects.Add(SourceType:=0, Source:=Array(...

mis系统的技术需求

  所谓MIS(管理信息系统--Management Information System)系统,主要指的是进行日常事务操作的系统。这种系统主要用于管理需要的记录,并对记录数据进行相关处理,将处理的信息及时反映给管理者的一套网络管理系统。   开发一个mis系统需要用到eclipse,还需要tomcat和mySQL。   tomcat安装、配置过程:首先下...

面试准备

编程基础: (关注代码的时间复杂度空间复杂度) 进程间通信方式 线程和进程 线程的状态转化 数组和链表的区别 数据结构学过哪些,回答了数组,链表,然后问他们各自的特点以及适合在什么场景下应用,以及他们的时间复杂度 死锁产生的条件,以及如何避免死锁,银行家算法,产生死锁后如何解决 java内存模型java内存区域 java中创建类的实例有几种方法 死锁的原因...

java常见异常

算术异常类:ArithmeticExecption 空指针异常类:NullPointerException 类型强制转换异常:ClassCastException 数组负下标异常:NegativeArrayException 数组下标越界异常:ArrayIndexOutOfBoundsException 违背安全原则异常:SecturityExceptio...

xtrabackup增量备份mysql +MHA

http://blog.csdn.net/yanggd1987/article/category/2214421 https://www.centos.bz/2013/09/innobackupex-auto-backup-with-shell/   之前我们提到过xtrbackup备份mysql的几种方式:完整备份、增量备份、部分备份等,但是在实际生...