如何解决真的需要您关于VBA的帮助
我有三张纸:1)1张纸; 2)表2; 3)表3。 我想比较工作表1的A列和工作表2的B列。如果有相似的值,我不想打印这些值。我只想打印工作表2上的值,而不打印工作表3上的工作表1上的值。
我花了很多时间在此上,但是我什么都没想出来。
我在这里编写的代码在第3页上打印了公共值和唯一值。但是我不希望有公共值。如果您能帮助我,将不胜感激!
Sub GetUniques()
Dim data1 As Long,data As Long,merged As Long
Dim i As Long
data = Cells(Rows.Count,"A").End(xlUp).Row
data1 = Cells(Rows.Count,"C").End(xlUp).Row
merged = 1
For i = 1 To data1
Cells(merged,"E").Value = Cells(i,"A").Value
merged = merged + 1
Next i
For i = 1 To data1
Cells(merged,"C").Value
merged = merged + 1
Next i
Range("E:E").RemoveDuplicates Columns:=1,Header:=xlNo
End Sub
解决方法
如果您有O365,则可以使用类似的内容:
=LET(x,FILTER(Sheet2!B1:B1000,(Sheet2!B1:B1000<>"")* ISERROR(MATCH(Sheet2!B1:B1000,Sheet1!A1:A1000,0))),IF(x="","",x))
如果您拥有Excel 2007+,则可以使用:
=IFERROR(INDEX(Sheet2!B1:B1000,AGGREGATE(15,6,1/((Sheet2!B1:B1000<>"")*ISERROR(MATCH(Sheet2!B1:B1000,0)))*ROW($B$1:$B$1000),ROW(INDEX($A:$A,1):INDEX($A:$A,1000)))),"")
在某些版本中,您可能必须使用ctrl
+ shift
+ enter
在多个行上以数组形式输入此公式;或使用INDEX
函数显示返回数组的各个元素。
如果您必须具有vba解决方案,我建议
- 将每一列读入vba数组(比在工作表中工作要快得多/
- 使用Sheet1列A中的唯一条目创建字典
D1
- 在Sheet2列B中创建第二个项字典,其中不包括在
D1
中找到的任何项(或在sheet2中重复的项) - 在sheet3上输出结果
例如:
Option Explicit
Sub getUniques()
Dim WS1 As Worksheet,WS2 As Worksheet,WS3 As Worksheet
Dim V1 As Variant,V2 As Variant,vResults As Variant
Dim D1 As Object,dResults As Object
Dim V As Variant,I As Long
Set WS1 = ThisWorkbook.Worksheets("sheet1")
Set WS2 = ThisWorkbook.Worksheets("Sheet2")
Set WS3 = ThisWorkbook.Worksheets("Sheet3")
With WS1
V1 = .Range(.Cells(1,1),.Cells(.Rows.Count,1).End(xlUp))
End With
With WS2
V2 = .Range(.Cells(1,2),2).End(xlUp))
End With
Set D1 = CreateObject("Scripting.Dictionary")
D1.CompareMode = TextCompare
For Each V In V1
If Not D1.Exists(V) Then D1.Add V,V
Next V
Set dResults = CreateObject("scripting.dictionary")
dResults.CompareMode = TextCompare
For Each V In V2
If Not D1.Exists(V) And Not dResults.Exists(V) Then dResults.Add V,V
Next V
ReDim vResults(1 To dResults.Count,1 To 1)
I = 0
For Each V In dResults.Keys
I = I + 1
vResults(I,1) = V
Next V
Application.ScreenUpdating = False
With WS3.Range("M1").Resize(rowsize:=UBound(vResults))
.EntireColumn.Clear
.Value = vResults
.EntireColumn.AutoFit
End With
End Sub
,
如果还没有let函数,则可以在工作表2的c列中使用此公式。如果在sheet1或sheet3的a列中找不到该值,它将说“唯一”,否则将重复。
使用Ctrl + Shift + Enter进入
=IF(OR(ISNUMBER(FIND(B1,Sheet1!A:A)),ISNUMBER(FIND(B1,Sheet3!A:A))),"duplicate","unique")
,
通过2数组Match()
我只想打印在工作表2上而不是在工作表1上的值〜>在工作表3上。
我演示了两个数据字段数组的Match()
比较,
其中base
代表sheet2上的值,comp
代表要与sheet1上进行比较的列。
结果数组是找到的duplo索引和Error 2042
的混合,如果没有发现,
因此显示出一个独特的基础物品。因此,最终的数组可以通过简单的循环填充唯一性
只能拾取独特的物品。
请注意,此示例调用通过项目工作表的代码(名称)引用工作表。
Sub CompareSheetColumns()
'[1]get column data and assign them to arrays
Dim base: base = getColRange(Sheet2,"B").Value
Dim comp: comp = getColRange(Sheet1,"A").Value
'[2]compare both column values,where Sheet2 represents base data
comp = Application.Transpose(Application.Match(base,comp,0))
'[3]get uniques
Dim i As Long,ii As Long
For i = 1 To UBound(comp)
If IsError(comp(i)) Then ' uniques stand out by Error 2042 instead of found index
ii = ii + 1 ' increment uniques counter
comp(ii) = base(i,1) ' get unique item
End If
Next
ReDim Preserve comp(1 To ii) ' reduce to final count
'[4]write results to any target
Sheet3.Range("M2").Resize(UBound(comp),1) = Application.Transpose(comp)
End Sub
帮助功能getColRange()
返回给定列的基于1的2维数据字段数组,并精简主代码以使其更具可读性:
Function getColRange(mySheet As Worksheet,_
Optional ByVal myColumn As Variant = "A",_
Optional ByVal Startrow As Long = 2) As Range
With mySheet
'a) get last row in given column
Dim lastRow As Long
lastRow = .Cells(.Rows.Count,myColumn).End(xlUp).Row
'b) return data range as function result
Set getColRange = .Range(myColumn & Startrow & ":" & myColumn & lastRow)
End With
End Function
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。