VB.NET实现查找两个Excel工作表指定列中不共同存在的元素
两列元素匹配(含独有元素标记)实现方案
原有代码仅在两列元素匹配时才触发行添加逻辑,未对「ws1列独有元素」做捕获,且嵌套循环时间复杂度较高,数据量大时运行效率低。建议通过哈希集合做存在性快速判断,修改逻辑如下:
核心修改思路
- 提前将ws2的F列所有有效元素存入哈希集合,单次查询耗时为O(1),远优于嵌套循环遍历
- 遍历ws1的A列每一个元素,直接查询哈希集合判断是否存在,分别添加对应标记的行
修改后代码
' 需提前导入命名空间:Imports System.Collections.Generic Dim ws1 As Excel.Worksheet Dim ws2 As Excel.Worksheet ws1 = xlApp.Workbooks.Open(TextBox1.Text).Worksheets(ComboBox1.SelectedItem) ws2 = xlApp.Workbooks.Open(TextBox2.Text).Worksheets(ComboBox2.SelectedItem) ' 修正原代码的范围取值逻辑,获取两列的最后有效行避免读取空行 Dim lastRowWs1 As Integer = ws1.Cells(ws1.Rows.Count, "A").End(Excel.XlDirection.xlUp).Row Dim findme1 As Excel.Range = ws1.Range("A4:A" & lastRowWs1) Dim lastRowWs2 As Integer = ws2.Cells(ws2.Rows.Count, "F").End(Excel.XlDirection.xlUp).Row Dim findme2 As Excel.Range = ws2.Range("F5:F" & lastRowWs2) Dim MyArray As Object(,) = CType(findme1.Value, Object(,)) Dim MyArrayy As Object(,) = CType(findme2.Value, Object(,)) ' 先把ws2 F列的元素存入哈希集合 Dim ws2Elements As New HashSet(Of Object) For m = 1 To MyArrayy.GetLength(0) ' 跳过空值 If MyArrayy(m, 1) IsNot Nothing Then ws2Elements.Add(MyArrayy(m, 1)) End If Next ' 遍历ws1 A列的每个元素做判断 For n = 1 To MyArray.GetLength(0) Dim currentVal = MyArray(n, 1) ' 跳过空值,可根据需求删除该判断 If currentVal Is Nothing Then Continue For If ws2Elements.Contains(currentVal) Then Form2.DataGridView1.Rows.Add(currentVal, currentVal, "Found") Else Form2.DataGridView1.Rows.Add(currentVal, "", "未找到") End If Next
注意事项
- 如果两列元素都是字符串格式,可将
HashSet(Of Object)改为HashSet(Of String),同时将元素用ToString()转换后再存入和查询,避免类型不一致导致的匹配失败 - 原嵌套循环如果出现重复值会重复添加相同行,修改后的逻辑每个ws1的元素仅会添加一次,符合常规需求
- 如果需要同时捕获仅在ws2 F列存在的元素,可再遍历一次哈希集合,筛选没有出现在MyArray中的元素添加即可
内容的提问来源于stack exchange,提问作者fly high
相关产品推荐
相关产品推荐

