【VBA研究】怎样将单元格数据赋给数组

作者:iamlaosong

将工作表中的数据赋给数组或者将数组的数据赋给工作表,一般有两种。一种是循环的方法,一个一个的传,这样的方法一般用于须要对每一个数据特别处理的场合,还有一种是一次性用赋值语句传,就速度来说,另外一种方法要快得多。看以下例程:

Sub tt()
    Dim arr1(240000, 4)
    Dim arr2()
    
    lineno = [A1048576].End(xlUp).Row      '行数
    '循环给数组赋值。数组myarr必须先定义大小
    t1 = Now()
    For i = 3 To lineno
        k = i - 2
        arr1(k, 1) = Cells(i, 1)
        arr1(k, 2) = Cells(i, 2)
        arr1(k, 3) = Cells(i, 3)
        arr1(k, 4) = Cells(i, 4)
    Next i
    t2 = Now()
    Cells(2, 5) = TimeValue(t2) - TimeValue(t1)
    '一次性给数组赋值。数组arr不能定义大小和类型
    t1 = Now()
    arr2 = Range("a3:d" & lineno)
    t2 = Now()
    Cells(2, 6) = TimeValue(t2) - TimeValue(t1)
    MsgBox arr1(20000, 2) & "=" & arr2(20000, 2)

End Sub

只是要注意的是,循环赋值的方法数组必须先定义维数和大小,然后才干使用,而一次性赋值的正好相反。不能定义维数和大小,否则会报错。此外注意,数据一次性读入数组arr2后。arr2成为一个二维数组。即使是读取一列数据。也是二维数组,数组下标都是从1開始,即arr2(1,1),arr2(2,1),arr2(3,1),arr2(4,1),。。

另一点要注意,当读取的工作表非当前工作表时。range对象后面须要加上valuekeyword,否则会报错,比如:

    '方法一:直接读取
    DaiLiNo = Sheets("代理点").[B65536].End(xlUp).Row           '行数
    DaiLiName = Sheets("代理点").Range("B2:B" & DaiLiNo).Value
    '方法二:激活工作表后读取
    Worksheets("代理点").Select
    DaiLiNo = [B65536].End(xlUp).Row           '行数
    DaiLiName = Range("B2:B" & DaiLiNo)
    DaiLiNo = DaiLiNo - 1                      '数据从第2行開始,所以总数量要减一

假设赋值范围用行列号表示,则用下列语句(pos_fst, pos_ems是两个參数,各自是数据起始行和数据所在列):

maxrow = Cells(65536, pos_ems).End(xlUp).Row

Mail = Range(Cells(pos_fst, pos_ems), Cells(maxrow, pos_ems))

用上面的例程測试发现,即使20多万条数据,第一种方法用时非常少(4.62963E-05)。而另外一种方法却差点儿不用时间(0)。

时间: 2024-08-05 15:15:56

【VBA研究】怎样将单元格数据赋给数组的相关文章

【VBA研究】如何将单元格数据赋给数组

作者:iamlaosong 将工作表中的数据赋给数组或者将数组的数据赋给工作表,一般有两种,一种是循环的方法,一个一个的传,这种方法一般用于需要对每个数据特别处理的场合,另一种是一次性用赋值语句传,就速度来说,第二种方法要快得多.看下面例程: Sub tt()     Dim arr1(240000, 4)     Dim arr2()          lineno = [A1048576].End(xlUp).Row      '行数     '循环给数组赋值,数组myarr必须先定义大小

使用VBA将Excel指定单元格数据、字符串或者图表对象插入到Word模板指定书签处

准备工作: 1.首先需要提供一个word模板,并且标记好您要插入书签的位置,定义书签的命名.如图 2.模拟您要插入的Excel原始数据和图表对象 插入代码如下: Private Sub CommandButton1_Click() Dim App, WrdDoc, Mypath As String On Error Resume Next '定义原始模板的储存路径,默认和excel在同一路径 Mypath = ThisWorkbook.Path & "\模板.doc" '用Se

Swing-JTable检测单元格数据变更事件

在JTable的初级教程中往往会提到,使用TableModel的 addTableModelListener方法可以监听单元格数据的变更,在其事件处理函,数tableChanged中,可以通过e.getColumn(),e.getFirstRow(),e.getLastRow(),e.getType()来获取变更发生的位置和变更的类型(插入.更新或删除).然而该方法存在2个致命的问题: 1.双击单元格使其处于可编辑状态后,即使没有做出任何修改,当单元格失去焦点时,该事件将被激活. 2.通过该事件

VBS读取txt文档数据查找Excel中单元格数据符合条件的剪切到工作表2中

Dim fso,f,a set oExcel = CreateObject( "Excel.Application" ) oExcel.Visible = false '4) 打开已存在的工作簿: oExcel.WorkBooks.Open( "F:\1.xlsx" ) On Error Resume Next '判断是否存在Sheet2工作表,不存在新建 If oExcel.WorkSheets("Sheet2") Is Nothing The

在Excel里用vba给合并的单元格添加注释

Excel里使用VBA对已经合并的单元格添加注释,直接使用AddComment会报: 运行时错误 '1004':应用程序定义或者对象定义错误 找了很多文章都没找到怎么解决,最后发现在AddComment之前,先ClearComments一下,就好了 Excel using vba to add comment to a merged cell if occur runtime error 1004, before invoking addcomment, first  invoke ClearC

JS遍历表格获取每行数据及每个单元格数据

/** * 遍历表格获取每行数据及每个单元格数据 * @param tableID 表格ID */ function GetTable(tableID) { var milasUrl = {};//新建对象,用来存储所有数据 var subMilasUrlArr = {};//存储每一行数据 var tableData = {}; $("#" + tableID + " tbody tr").each(function (trindex, tritem) {//遍历

VBA学习笔记之单元格

'单元格对象在VBA中一个非常基础,同时也很重要的. '它的表达方式也是非常的多样化. '---------------------------------------------------- 'Range 对象 '代表某一单元格.某一行.某一列.某一选定区域(该区域可包含一个或若干连续单元格区域),或者某一三维区域. 'Range ("文本型装单元格地址") 'range的常见写法 Sub rng() Range("a1").Select '单元格 Range(

EXCEL中提取某行最后一个有效单元格数据

用户的需求总是多种多样的,有的如同下图:大家可以看下图,只是举例,不一定合理.每个人所属的部门的级别不同,有的人属于公司之下,有的属于team之下,而大家可以看到这个表里面有很多空白单元格,看上去不是很一目了然,现在用公式直接把所属级别直接显示在姓名后面. . 其实上面的这么多废话的中心思想就是:显示某一行最后一个有效单元格的内容 下图是适用于 文本格式的数据 下图是适用于数字格式的内容

002-poi-excel-导出设置单元格数据校验规则

一.数据验证概述 推荐以下操作在2007之后操作 1.1.查看excel的数据验证 1.进入 2.设置规则 通过验证条件允许,可以看到是每个单元格默认只成立一种条件 1.2.POI代码开发-数据验证 1.2.1.两个数之间 public void excelRuleNumberBetween(Sheet sheet, int min, int max, int firstRow, int lastRow, int firstCol, int lastCol){ DataValidationHel