当前位置: 首页 > news >正文

VBA数组和Excel工作表数据传递

本文介绍如何利用 VBA 的数组(Array) 来提高 Excel 单元格和外部数据传输的性能。如果数量比较大,通过 Array 来传输数据比直接操作单元格要快若干倍。

将 Range 的数据写入 VBA Array

将 Range 数据写入 VBA 的数组非常简单。下面的例子演示了用法:

Dim Arr() as Varint  ' Declare an unallocated array
Arr = Range("A1:C5") ' Arr is now an allocated array

当我们将数据从工作表的range 写入到 VBA 数组的时候,这个数组始终是二维的。第一个维度是行,第二个维度是列。所以,刚才定义的数组有 5 行,有 3 列,等同于 Arr(1 to 5, 1 to 3) 。需要注意的是,即使在 Excel 中只有一行或者一列,这个数组也是二维的,可以理解为 Arr(1 to 1, 1 to 1)。 另外,数组的下标 (LBound) 始终从 1 开始。比如:

Dim Arr() as Variant
Arr = Range("A1:A10")

Arr 相当于 Arr(1 to 10, 1 to 1)

下面的代码演示了如何遍历工作表中 Range 的值:

Public Sub PrintCells()Dim arr() As Variantarr = Range("A1:C5")Dim r As Long  ' r: rowDim c As Long  ' c: columnFor r = 1 To UBound(arr, 1)     '第一个维度是行数For c = 1 To UBound(arr, 2) '第二个维度是列数Debug.Print arr(r, c),NextDebug.PrintNext
End Sub

有一个特例。如果单元格的数量只有一个,那么就不能作为二维数组。上面的代码在一个单元格的时候会出错,需要调整为下面的代码:

Public Sub PrintCells(rng as Range)Dim arr() As VariantIf rng.Cells.Count = 1 ThenReDim arr(1 To 1, 1 To 1)arr(1, 1) = rng.ValueElsearr = rngEnd IfDim r As Long  ' r: rowDim c As Long  ' c: columnFor r = 1 To UBound(arr, 1)     '第一个维度是行数For c = 1 To UBound(arr, 2) '第二个维度是列数Debug.Print arr(r, c),NextDebug.PrintNext
End Sub

将一维数组写入单元格

一维数组可以按行输出,实现的要点:定义一个 Range,将 Range 的列扩充为数组的UBound。

Public Sub WriteOneDimensionArr()Dim arr() As VariantReDim arr(1 To 5)arr(1) = 1arr(2) = 2arr(3) = 3arr(4) = 4arr(5) = 5Dim destination As RangeSet destination = Range("A10")Set destination = destination.Resize(1, UBound(arr)) '对数组进行行扩充destination.Value = arr
End Sub

当然,一维数组也可以实现按列输出:

Public Sub WriteOneDimensionArr2()Dim arr() As VariantReDim arr(1 To 5)arr(1) = 1arr(2) = 2arr(3) = 3arr(4) = 4arr(5) = 5Dim destination As RangeSet destination = Range("A10")Set destination = destination.Resize(UBound(arr), 1) '对数组进行行扩充destination.Value = Application.Transpose(arr)
End Sub

二维数组写入单元格

实际上,将二维数组写入到单元格更加直观。数组的第 1 个维度是行数,第 2 个维度是列数。我们通过下面的示例,演示如果将 A1:C5 的数据拷贝到另外一个区域:

Public Sub CopyCells()Dim arr() As Variantarr = Range("A1:C5")Dim destination As RangeSet destination = Range("A10")destination.Resize(UBound(arr, 1), UBound(arr, 2)).Value = arr
End Sub
http://www.lryc.cn/news/8796.html

相关文章:

  • PyQt5保姆级入门教程——从安装到使用
  • 1.6 epoll实战使用
  • JDK定时、Spring定时、时间轮定时小结
  • 关于cFosSpeed如何配置
  • YOLOV5输出的txt里面有什么猫腻(用于图像分类竞赛中提升图像信息密度)
  • vue+axios常用操作
  • Xshell连接阿里云服务器搭建网站
  • 嵌入式ARM设计编程(三) 处理器工作模式
  • jenkins构建报错:.java:16: error: package javafx.util does not exist
  • 【第三天】策略模式
  • 以应用为导向,看声纹识别中的音频伪造问题
  • RocketMQ源码分析之CommitLog消息存储机制
  • 亿级高并发电商项目-- 实战篇 --万达商城项目 九(广告服务、安装Redis优化用户缓存、广告服务实现类等开发)
  • FreeMarker生成word文档,固定word模板
  • 前端必学的CSS制作Switch动画开关按钮演示
  • C语言运算符(左值右值,基本运算符)
  • 【自学Python】一文读懂Python字符串是否是数字
  • 【PTA Advanced】1146 Topological Order(C++)
  • 基于stm32mp157的嵌入式linux+qt项目实战物联网毕业设计选题之智慧医疗项目
  • Java实现邮件发送功能
  • springboot+vue简单对接支付宝完整流程
  • Map 查找表
  • python--石头剪刀布游戏(列表)
  • Project Caliper:目标是打造最佳VR手柄
  • 自动驾驶:BEV开山之作LSS(lift,splat,shoot)原理代码串讲
  • C# 如何实现对“属性”的扩展
  • EBS 物料属性 先后台对应关系 MTL_SYSTEM_ITEMS_B
  • MYSQL数据库-主从复制(原理及搭建)
  • 3GPP-NR Band25标准定义频点和信道(3GPP V17.7.0 (2022-12))
  • 微信小程序 之 原生开发