VBA数组和Excel工作表数据传递
创始人
2024-05-26 00:55:25
0

本文介绍如何利用 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

上一篇:初学vector

下一篇:go 连接redis集群

相关内容

热门资讯

监控摄像头接入GB28181平... 流程简介将监控摄像头的视频在网站和APP中直播,要解决的几个问题是:1&...
Windows10添加群晖磁盘... 在使用群晖NAS时,我们需要通过本地映射的方式把NAS映射成本地的一块磁盘使用。 通过...
protocol buffer... 目录 目录 什么是protocol buffer 1.protobuf 1.1安装  1.2使用...
在Word、WPS中插入AxM... 引言 我最近需要写一些文章,在排版时发现AxMath插入的公式竟然会导致行间距异常&#...
修复 爱普生 EPSON L4... L4151 L4153 L4156 L4158 L4163 L4165 L4166 L4168 L4...
【PdgCntEditor】解... 一、问题背景 大部分的图书对应的PDF,目录中的页码并非PDF中直接索引的页码...
Fluent中创建监测点 1 概述某些仿真问题,需要创建监测点,用于获取空间定点的数据࿰...
educoder数据结构与算法...                                                   ...
MySQL下载和安装(Wind... 前言:刚换了一台电脑,里面所有东西都需要重新配置,习惯了所...
MFC文件操作  MFC提供了一个文件操作的基类CFile,这个类提供了一个没有缓存的二进制格式的磁盘...