百度360必应搜狗淘宝本站头条
当前位置:网站首页 > IT技术 > 正文

VBA信息获取与处理第四个专题:工作表数据和数组之间的传输比较

wptr33 2024-12-16 16:31 47 浏览

《VBA信息获取与处理》教程(版权10178984)是我推出第六套教程,目前已经是第一版修订了。这套教程定位于最高级,是学完初级,中级后的教程。这部教程给大家讲解的内容有:跨应用程序信息获得、随机信息的利用、电子邮件的发送、VBA互联网数据抓取、VBA延时操作,剪贴板应用、Split函数扩展、工作表信息与其他应用交互,FSO对象的利用、工作表及文件夹信息的获取、图形信息的获取以及定制工作表信息函数等等内容。程序文件通过32位和64位两种OFFICE系统测试。是非常抽象的,更具研究的价值。

教程共两册,二十个专题。今日分享内容是:VBA信息获取与处理第四个专题第一节:工作表数据和数组之间的传输比较

【分享成果,随喜正能量】人这一辈子,无非就四个字:钱、命、家、情。钱是什么?

钱是生活不可或缺的一部分,有钱走遍天下,没钱寸步难行。虽然钱不是万能的,但是没有钱是万万不能的。。

专题四 EXCEL工作表数据的读取、回填和查找

这个专题,我们讲解工作表数据的处理的问题,对于VBA而言,我给予的定位是“实现个人小型数据自动化处理的利器”,对于大多数朋友而言,利用VBA是与EXCEL相关联的,很多的代码也是用于处理EXCEL内或者相关的各种数据,工作表更是作为和用户的交互对象而存在,那么对于工作表的数据如何进行查找,以及如何读取就是一个十分关键的课题,我们这讲就来主要讲解这个问题。

第一节 工作表数据和数组之间的传输比较

工作表单元格数据和VBA变量之间的数据传输是经常要应用的操作,这项操作占用的时间要比其他操作占用的时间要多,所以我们的原则是应将这种操作保持在最低的次数。通过一次操作(而不是一次单元格的操作)将数据传递给数组,或者将数组数据传递给工作表,这样可以大大提高Excel应用程序的性能。一般的原则是:如果需要对VBA中的数据进行大量计算,则应将工作表中的所有值传输到数组中,对数组进行计算,然后再将可能利用的数组数据回填到工作表。这样的操作可以将工作表和VBA之间传输数据的次数保持在最小值。例如将100个数组数据一次传输到工作表比传输100次,每次传输一个数据值的效率要高得多。

我们在VBA中处理数据时,一般有三种方案可以选择和利用,一是数组存储数据,二是字典存储数据,第三是不在内存中处理,直接在工作表中读取和处理。

1 将工作表数据存储在数组中,在内存中处理数据

我们先来讲解上面的第一种方案,将工作表数据存储在数组中,然后在内存中处理数据的方案,为了验证处理的效果,我们在工作表中给出了2000个数据,然后先将这些数据读到数组中,再在数组中求和计算,我们看下面的代码:

Sub MYNZ() '数组求和

t = Timer

Sheets("SHEET1").Select

Dim Arr() As Variant

Arr = Range("A1:A2000")

MYSUM = 0

For R = 1 To UBound(Arr, 1)

MYSUM = MYSUM + Arr(R, 1)

Next

t2 = Timer - t

MsgBox "总和为:" & MYSUM & Chr(13) & "运行时间:" & Format(t2, "0.00000") & "秒"

End Sub

代码截图:

这些代码对于中级以上的朋友是非常容易理解的,只是思路的问题。代码就不再讲解。

看看下面的运行结果:

运行结果:

2 将工作表数据存储在字典中,在内存中处理数据

我们再来讲解上面的第二种方案,将工作表数据存储在字典中,然后在内存中处理数据的方案,为了验证处理的效果,我们同样在工作表中给出了同样的2000个数据,然后先将这些数据读到字典中,再在求和计算,我们看下面的代码:

Sub MYNZA() '字典求和

t = Timer

Sheets("SHEET1").Select

Dim Arr() As Variant

Arr = Range("A1:A2000")

Set myDic = CreateObject("scripting.dictionary")

For i = 1 To UBound(Arr)

myDic(i) = Arr(i, 1) '初始化字典

MYSUM = MYSUM + myDic(i)

Next i

t2 = Timer - t

MsgBox "总和为:" & MYSUM & Chr(13) & "运行时间:" & Format(t2, "0.00000") & "秒"

End Sub

代码的截图:

代码的运行结果:

3 直接在工作表中处理数据

最后我们来讲解上面的第三种方案,直接在工作表中处理数据,为了验证处理的效果,我们同样在工作表中给出了同样的2000个数据,然后直接在工作表中对这些数据求和处理,我们看下面的代码:

Sub MYNZB() '工作表求和

t = Timer

i = 1

Sheets("SHEET1").Select

MYSUM = 0

Do While Cells(i, 1) <> ""

MYSUM = MYSUM + Cells(i, 1)

i = i + 1

Loop

t2 = Timer - t

MsgBox "总和为:" & MYSUM & Chr(13) & "运行时间:" & Format(t2, "0.00000") & "秒"

End Sub

代码截图:

代码的运行:

我们看看数据的运行结果,可以看出运行的效率,但要提醒大家注意:

① 不要一味的追求的效率,注意理解我的一篇文章《VBA程序的运行时间优化和视觉效果的兼顾》。

② 每种方案都有自己的可利用价值,比如字典的排重是非常有效的手段。

本节知识点回向:实现数据在工作表和VBA之间的传输有哪些方案?各是什么?注意根据自己的经验理解每种方案的优缺点。

本专题参考程序文件:004工作表.XLSM

我20多年的VBA实践经验,全部浓缩在下面的各个教程中,教程学习顺序:

相关推荐

redis的八种使用场景

前言:redis是我们工作开发中,经常要打交道的,下面对redis的使用场景做总结介绍也是对redis举报的功能做梳理。缓存Redis最常见的用途是作为缓存,用于加速应用程序的响应速度。...

基于Redis的3种分布式ID生成策略

在分布式系统设计中,全局唯一ID是一个基础而关键的组件。随着业务规模扩大和系统架构向微服务演进,传统的单机自增ID已无法满足需求。高并发、高可用的分布式ID生成方案成为构建可靠分布式系统的必要条件。R...

基于OpenWrt系统路由器的模式切换与网页设计

摘要:目前商用WiFi路由器已应用到多个领域,商家通过给用户提供一个稳定免费WiFi热点达到吸引客户、提升服务的目标。传统路由器自带的Luci界面提供了工厂模式的Web界面,用户可通过该界面配置路...

这篇文章教你看明白 nginx-ingress 控制器

主机nginx一般nginx做主机反向代理(网关)有以下配置...

如何用redis实现注册中心

一句话总结使用Redis实现注册中心:服务注册...

爱可可老师24小时热门分享(2020.5.10)

No1.看自己以前写的代码是种什么体验?No2.DooM-chip!国外网友SylvainLefebvre自制的无CPU、无操作码、无指令计数器...No3.我认为CS学位可以更好,如...

Apportable:拯救程序员,IOS一秒变安卓

摘要:还在为了跨平台使用cocos2d-x吗,拯救objc程序员的奇葩来了,ApportableSDK:FreeAndroidsupportforcocos2d-iPhone。App...

JAVA实现超买超卖方案汇总,那个最适合你,一篇文章彻底讲透

以下是几种Java实现超买超卖问题的核心解决方案及代码示例,针对高并发场景下的库存扣减问题:方案一:Redis原子操作+Lua脚本(推荐)//使用Redis+Lua保证原子性publicbo...

3月26日更新 快速施法自动施法可独立设置

2016年3月26日DOTA2有一个79.6MB的更新主要是针对自动施法和快速施法的调整本来内容不多不少朋友都有自动施法和快速施法的困扰英文更新日志一些视觉BUG修复就不翻译了主要翻译自动施...

Redis 是如何提供服务的

在刚刚接触Redis的时候,最想要知道的是一个’setnameJhon’命令到达Redis服务器的时候,它是如何返回’OK’的?里面命令处理的流程如何,具体细节怎么样?你一定有问过自己...

lua _G、_VERSION使用

到这里我们已经把lua基础库中的函数介绍完了,除了函数外基础库中还有两个常量,一个是_G,另一个是_VERSION。_G是基础库本身,指向自己,这个变量很有意思,可以无限引用自己,最后得到的还是自己,...

China&#39;s top diplomat to chair third China-Pacific Island countries foreign ministers&#39; meeting

BEIJING,May21(Xinhua)--ChineseForeignMinisterWangYi,alsoamemberofthePoliticalBureau...

移动工作交流工具Lua推出Insights数据分析产品

Lua是一个适用于各种职业人士的移动交流平台,它在今天推出了一项叫做Insights的全新功能。Insights是一个数据平台,客户可以在上面实时看到员工之间的交流情况,并分析这些情况对公司发展的影响...

Redis 7新武器:用Redis Stack实现向量搜索的极限压测

当传统关系型数据库还在为向量相似度搜索的性能挣扎时,Redis7的RedisStack...

Nginx/OpenResty详解,Nginx Lua编程,重定向与内部子请求

重定向与内部子请求Nginx的rewrite指令不仅可以在Nginx内部的server、location之间进行跳转,还可以进行外部链接的重定向。通过ngx_lua模块的Lua函数除了能实现Nginx...