VBA中找出两数组之间的差异

您所在的位置:网站首页 net调用vba数组 VBA中找出两数组之间的差异

VBA中找出两数组之间的差异

2024-04-07 21:12| 来源: 网络整理| 查看: 265

两数组之间的差异中主要会运用到 Filter 函数

Filter 函数

Filter 函数用于过滤数组中的元素,返回符合指定条件的元素组成的数组。该函数通常用于处理数组数据。

语法:

Filter(要过滤的数组, 包含的元素,[返回方式, [比较模式]])

参数说明:

要过滤的数组:要进行过滤操作的数组。包含的元素:用于过滤的条件。要搜索的字符串。返回方式(可选):指示是否返回包括或不包括要搜索的字符串的子字符串。如果返回方式为True,则Filter 返回包含要搜索的字符串作为子字符串的数组的子集。如果返回方式为False,则Filter 返回不包含要搜索的字符串作为子字符串的数组的子集。默认为True。[比较模式](可选):用于指定比较的方式,可以是vbBinaryCompare(区分大小写)或vbTextCompare(不区分大小写)。默认为vbBinaryCompare。

示例:

Sub FilterExample() Dim arr() As String arr = Split("apple,banana,cherry,date,grape", ",") Dim b() As String b = Filter(arr, "a", vbTextCompare) Dim i As Integer For i = LBound(b) To UBound(b) Debug.Print "Element " & i + 1 & ": " & b(i) Next i End Sub

输出如下:

Element 1: appleElement 2: bananaElement 3: dateElement 4: grape 找出两数组之间的差异实例

Sub cc() Set a = Worksheets(1) x = a.UsedRange.Rows.Count For i = 4 To x i1 = a.Cells(i, 1) i2 = a.Cells(i, 2) shuzu1 = Split(i1, " ") shuzu2 = Split(i2, " ") Call chaji(shuzu1, shuzu2, 1) s = Join(shuzu1, " ") a.Cells(i, 3) = "删除" & "(" & s & ")" shuzu1 = Split(i1, " ") shuzu2 = Split(i2, " ") Call chaji(shuzu1, shuzu2, 2) h = Join(shuzu2, " ") a.Cells(i, 4) = "增加" & "(" & h & ")" Next End Sub Sub chaji(shuzu1, shuzu2, fangx) If (fangx = 1) Then For i = UBound(shuzu1) To 0 Step -1 For j = 0 To UBound(shuzu2) If shuzu1(i) = shuzu2(j) Then shuzu1 = Filter(shuzu1, shuzu1(i), False) Exit For End If Next Next Else For i = UBound(shuzu2) To 0 Step -1 For j = 0 To UBound(shuzu1) If shuzu2(i) = shuzu1(j) Then shuzu2 = Filter(shuzu2, shuzu2(i), False) Exit For End If Next Next End If End Sub

目的是从第一个工作表中的某个行开始,对两列数据进行比较,然后在两列之间找到差异并将结果写入同一行的两个不同列。下面解释代码的大体步骤:

1. Set a = Worksheets(1): 这一行代码将第一个工作表(工作簿中的第一个标签页)赋值给变量 a。2. x = a.UsedRange.Rows.Count: 这一行代码计算第一个工作表中使用的行数,并将结果存储在变量 x 中。3. For i = 4 To x: 这是一个循环,从第4行开始,一直循环到第 x 行,即工作表中的最后一行。4. i1 = a.Cells(i, 1): 这一行代码将第 i 行第1列的单元格的值赋给变量 i1。5. i2 = a.Cells(i, 2): 这一行代码将第 i 行第2列的单元格的值赋给变量 i2。6. shuzu1 = Split(i1, " ") 和 shuzu2 = Split(i2, " "): 这两行代码将 i1 和 i2 中的字符串按空格分割成数组,并分别存储在 shuzu1 和 shuzu2 中。7. Call chaji(shuzu1, shuzu2, 1): 这一行代码调用名为 chaji 的子过程,并传递了 shuzu1、shuzu2 和 1 作为参数。chaji 的子过程为两个数组之间的比较。8. s = Join(shuzu1, " "): 这一行代码将经过 chaji 处理后的 shuzu1 数组重新连接成一个字符串,并用空格分隔,然后将结果存储在 s 中。9. a.Cells(i, 3) = "删除" & "(" & s & ")": 这一行代码将删除操作的结果(存储在 s 中)写入第 i 行的第3列单元格,形如"删除 (差异内容)"。10. Call chaji(shuzu1, shuzu2, 2): 这一行代码再次调用名为 chaji 的子过程,但这次传递了 shuzu1、shuzu2 和 2 作为参数。11. h = Join(shuzu2, " "): 这一行代码将经过 chaji 处理后的 shuzu2 数组重新连接成一个字符串,并用空格分隔,然后将结果存储在 h 中。12. a.Cells(i, 4) = "增加" & "(" & h & ")": 这一行代码将增加操作的结果(存储在 h 中)写入第 i 行的第4列单元格,形如"增加 (差异内容)"。13. Sub chaji(shuzu1, shuzu2, fangx): 这是一个名为 chaji 的子过程,接受 shuzu1、shuzu2 和 fangx 三个参数。fangx 用于区分是处理删除操作(1)还是增加操作(2)。14. 在 chaji 子过程中,根据传入的 fangx 参数,分别对 shuzu1 和 shuzu2 数组进行操作。它使用嵌套循环来比较数组元素,如果发现相同的元素,就使用 Filter 函数将该元素从数组中移除,从而得到差异。

总之,这段代码的作用是比较两列数据,找到差异,并将删除和增加的差异内容写入工作表中,用于记录两列数据之间的差异。不过,需要注意的是,chaji 子过程会修改传入的数组,因此在实际应用中,可能需要根据具体情况进行适当的修改以满足具体的需求。

结果如下:



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3