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),最后输出移动元素后的数组。