相关文章推荐
打篮球的骆驼  ·  break ...·  1 年前    · 
气势凌人的弓箭  ·  Flink ...·  1 年前    · 

redim对二维数组扩展时会丢失数据,即使使用Preserve参数,也不行。

如果使用了 Preserve 关键字,就只能重定义数组最末维的大小,且根本不能改变维数的数目。

本例试图解决这样一个问题:从EBS报表中导出Accout弹性域的值,其中文本格式的,有许多题头类的脏数据,必须过滤;我试着在读取文本的时候将line读取的行字符串装入数组ary1(一维),再将ary1数组装入数组ary2(二维),最后以ary2直接赋值给range对表,快速将Account List主要信息提取到指定工作表上。

问题来了,起初写代码的将ary1装入ary2时,总是这样哪样错误,不能重定义啊、下界超标啊,最终是实现了需求,但代码不简洁。

晚上有空,写个数组相加的函数解决上面的难点,例子如下:

将上图中的数据装入数组,再将数组复制给b,最后将b数据接合到a数据的后面,生成一个将数组;

Sub main()
Dim d() '声明动态数组
a = [A1:C4]
b = a   '直接复制数组
d = b
Debug.Print d(4, 2), "Redim前"
ReDim d(8, 3)        '只有增加最后一维数组的大小时,不会丢失数据
Debug.Print b(4, 2)
Debug.Print d(4, 2), "Redim后"
c = addArr(a, b)
Debug.Print b(4, 2)
Debug.Print c(8, 2), "addArr后"
End Sub
Function addArr(a, b)
'mayc2023-03-02 17:26:19追加一个数组到另一个数组
Dim aAdd()
'ReDim addArr(8, 3)     '不能对函数名代表的数组进行动态声明,仅在其第一次被赋值时可以指定其数组的维度和大小
ReDim aAdd(1 To (UBound(a) + UBound(b)), 1 To UBound(a, 2))
For i = 1 To UBound(a)
    For j = 1 To WorksheetFunction.Max(UBound(a, 2), UBound(b, 2))
'        这里只假设了a,b都是二维数组,第二维度可能不一样;
'        但并没有处理不一样时的数组对齐问题,这是不是一个矩阵问题?mayc2023-03-02 19:54:33
            aAdd(i, j) = a(i, j)
For i = 1 To UBound(b)
    For j = 1 To WorksheetFunction.Max(UBound(a, 2), UBound(b, 2))
            aAdd(i + UBound(a), j) = b(i, j)
addArr = aAdd
End Function

就在写这个文章的时候,想到上面的代码还是可以进一步优化的,比如定义个类,和类属性,完成a.add b,结果就是a追加了b的数据在尾部:)

如何动态地向数组添加新的数据,可以用动态数组实现。 dim arr() as string '定义动态数组,这里不能用variant类型,不然后面用redim会出错 redim preserve arr(row,col) as string 'redim就是起动态定义的作用,因为这里row和col可以是变量,dim中必须是常量。preserve按列保留数组中已有的数据,所有加preserve...
VBA 中,可以使用 "ReDim Preserve" 命令来增加二维数组的前面维度,原有数据将被保留。语法如下: ReDim Preserve 数组名(新维度1 To 新维度2, ...) 例如,如果要将原有的二维数组 "myArray" 的第一维增加到 5,可以使用以下代码: ReDim Preserve myArray(5 To 10, 1 To 10) 注意:如果在没有使用"Prese...
数组的使用是很频繁的,下面介绍两种常用的使用数组的方法。首先利用split'使用split函数创建数组 Public Sub pss_split() Dim arr As Variant ' 利用split创建数组 arr = Split("邓肯 科比 麦迪", " ") MsgBox "arr第二个元素为:" & arr(1) End Sub其次利用Range' 区
'最开始的时候,我喜欢将数组中的元素先串为字符串,然后用Split()方法创建数组,但这种方式比较麻烦,效率也不高 '最近想起了一般人正常是用Redim来创建数组,但网上都没有整合好的函数,所以尝试用更简洁的方式来操作数组。 '数组函数大概需要有以下几个基本功能:创建、增加、减少、查找 'VB的可变体变量,实在太方便了.... '=======创建一个数组对象======= '创建一个只
        通常使用VBA进行处理数据的时候,是实现聚合功能,即:求和、计数等等。但是有些应用场景,需要将汇总记录还原为原始记录。如下图,需要根据左侧数据记录表中“数量”列的数值将记录扩展为右侧的表格。Private Sub CommandButton1_Click() Dim aData, i, j, k, m, n, aRes() aData = Sheets("原数据")...
几个Excel vba示例文件. 包括行列转置,表格数据数组,一维数组二维数组,单列转多列等。均含示例数据,如: 250B的文本测试数据,晶振微调后的频率测试数据等。 另外还有EXCEL的常用命令语句精选。
redim时只有最后1维可变化,redim不太适合和循环搭配,即使用 redim preserve也不行! 你装数据时一般都会有一个充当计数器的变量,这个变量最后的值就是数组中装入值的数量 一般是声明一个足够大的静态数组,或二次声明一个足... '仿制简单的SQL查询语句,用于对二维数组的查询 '参照SQL语句:Select * From array [Where conditions] [Distinct fields] [ResultWithTitle] '实现功能: ' 依条件设置查询数组,返回包含查询字段(或全部字段)的数组,可多条件组合。 ' 条件运算符包括:> = < >= <= <> , like(正则表达式) ' 使用此函数,需要在文件中引用正则表达式脚本 Microsoft VBScript Regular Expressions x.x ' (根据不同的电脑配置和环境此处会有差异) '算法简要: ' 1、查询条件运算符:仅有 >, =, <, >=, <=, <> , like(正则表达式) ' 本函数中仅有上述运算符。原因在于,更多的运算符编制逻辑过于复杂,又不太常用。 ' 为了尽可能多地容纳各种运算关系,添加了正则表达式匹配运算, ' 在某个单一条件中,正则几乎可以容纳绝大部分的比对运算关系了。 ' 2、数字比较: ' 采用了将数字型字符串类型转换为数字之后再比较的方法,结果更为准确。 ' 3、其他算法和运算速度: ' 编制过程中,试验过使用 正则+逻辑分支+表达式引用 的方法, ' 可以实现几乎等同于SQL查询语句的复杂功能,而且代码更简捷。 ' 但运算速度相差过于悬殊(大概几十到上百倍 - "一闪而过"和"一袋烟"的差距!),最后不得不放弃。 ' 所以现在的版本相当于一个简化了的select语句,但对于大多数查询情况而言够用了。
Excel(WPS表格) VBA数据处理自动化,内容包括VBA语言基础、Excel 4大对象、图形、图表、数据透视表、公式和函数、正则表达式、字典、界面设计等。相关套餐:Python+VBA办公自动化系列课程-CSDN程序员研修院 讲师:童大谦图书《代替VBA!用Python轻松实现Excel编程》和《对比VBA学Python 高xiao实现数据处理自动化》作者。 致力于Office和WPS Office办公自动化,提供VBA和Python全系列视频课程。熟悉Power BI, Python, R, SPSS, MATLAB等数据分析软件。有多年VB和.NET软件开发经验。
### 回答1: VBA 二维数组元素可以使用Array.Copy或者Array.Move函数移动。Array.Copy可以将一个数组从一个特定的位置复制到另一个特定的位置,而Array.Move可以将一个数组移动到另一个特定的位置。 ### 回答2: 在VBA中,可以通过交换数组元素的方法来实现二维数组元素的移动。 首先,我们需要定义一个二维数组,并给数组元素赋值。例如,我们定义一个名为arr的二维数组,其中包含3行3列,赋予一些初始值: ```vba Dim arr(1 To 3, 1 To 3) As Integer arr(1, 1) = 1 arr(1, 2) = 2 arr(1, 3) = 3 arr(2, 1) = 4 arr(2, 2) = 5 arr(2, 3) = 6 arr(3, 1) = 7 arr(3, 2) = 8 arr(3, 3) = 9 如果我们想将第一行的元素向下移动一行,可以使用一个临时变量来交换相邻的两行元素: ```vba Dim temp As Integer For i = 1 To 3 temp = arr(1, i) arr(1, i) = arr(2, i) arr(2, i) = temp Next i 现在,arr(1, 1)的值变为4,arr(1, 2)的值变为5,arr(1, 3)的值变为6,arr(2, 1)的值变为1,arr(2, 2)的值变为2,arr(2, 3)的值变为3。 同理,我们可以根据具体情况,使用类似的方法来实现数组元素的其他移动方式,如向左移动、向右移动、向上移动等。 需要注意的是,如果要交换的数组元素较多,可能需要使用嵌套的循环来实现。此外,还可以使用VBA中的Array函数封装数组元素的移动操作,以便在更复杂的场景中使用。 ### 回答3: VBA中的二维数组元素移动可以通过循环和临时变量来实现。下面是一个示例代码: ```vba Sub MoveArrayElement() Dim arr(1 To 3, 1 To 3) As Variant Dim i As Integer, j As Integer Dim temp As Variant ' 初始化二维数组 arr(1, 1) = 1 arr(1, 2) = 2 arr(1, 3) = 3 arr(2, 1) = 4 arr(2, 2) = 5 arr(2, 3) = 6 arr(3, 1) = 7 arr(3, 2) = 8 arr(3, 3) = 9 ' 输出原始数组 For i = 1 To 3 For j = 1 To 3 Debug.Print arr(i, j) Next j Next i ' 将元素(1,1)的值移动到(2,2) temp = arr(1, 1) arr(1, 1) = arr(2, 2) arr(2, 2) = temp ' 输出移动元素后的数组 For i = 1 To 3 For j = 1 To 3 Debug.Print arr(i, j) Next j Next i End Sub 运行以上代码后,会首先输出原始数组的元素值,然后将元素(1,1)的值移动到(2,2),最后输出移动元素后的数组