Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/vba/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Excel VBA比较两个列表并删除不同列中具有重复值的行_Excel_Vba_Duplicates - Fatal编程技术网

Excel VBA比较两个列表并删除不同列中具有重复值的行

Excel VBA比较两个列表并删除不同列中具有重复值的行,excel,vba,duplicates,Excel,Vba,Duplicates,我有两个列表,其中有几列。有些列是不同的,但许多列是相同的,并且顺序不同 如何比较List1和List2,以及(例如)删除List1的第34行,因为List1的单元格E34=List2的H10 由于预先确定的格式:List1从第12行开始(第11行的标题),List2从第7行开始(第6行的标题) Sub-cleardeplicate() Dim sht1作为工作表 将sht2变暗为工作表 一排一样长 一排排一样长 将所有行变长 Dim SerialNumber作为字符串 昏昏欲睡 设置sht1=

我有两个列表,其中有几列。有些列是不同的,但许多列是相同的,并且顺序不同

如何比较List1和List2,以及(例如)删除List1的第34行,因为List1的单元格E34=List2的H10

由于预先确定的格式:List1从第12行开始(第11行的标题),List2从第7行开始(第6行的标题)

Sub-cleardeplicate()
Dim sht1作为工作表
将sht2变暗为工作表
一排一样长
一排排一样长
将所有行变长
Dim SerialNumber作为字符串
昏昏欲睡
设置sht1=工作表(“打开报告”)
设置sht2=工作表(“FNDWRR”)
sht2.激活
C2TotalRows=Application.CountA(范围(“H:H”))
C1row=12
在sht1.Cells(C1row,5.Value)时执行
SerialNumber=sht1.Cells(C1row,5).Value
对于C2row=7到C2TotalRows
如果SerialNumber=单元格(C2row,8)。则为
sht1.激活
行(C1row).删除
NoDups=NoDups+1
C1row=C1row-1
sht2.激活
退出
如果结束
下一个
C1row=C1row+1
环
MsgBox节点和“已删除重复项”
端接头
删除重复行(
Application.Match
  • 以下操作将删除目标工作表中的所有行,其中给定列中的值也在源工作表的给定列中
  • 代码(
    deleteDupeRows
    )通过使用两个函数进行“简化”:
    refNonEmptyColumn
    getCombinedRange
选项显式
子deleteDupeRows()
"来源:
Const sName As String=“FNDWRR”
Const sFirst As String=“H7”
“目的地
Const dName As String=“打开报告”
Const dFirst As String=“E12”
'工作簿
将wb设置为工作簿:设置wb=ThisWorkbook
'Debug.Print wb.Name
'创建对源范围的引用。
将sws标注为工作表:设置sws=wb.工作表(sName)
Dim srg As Range:设置srg=refNonEmptyColumn(sws.Range(sFirst))
如果srg为空,则退出Sub
'Debug.Print sws.Name,srg.Address
'创建对目标范围的引用。
将dws标注为工作表:设置dws=wb。工作表(dName)
作为范围的尺寸图:设置图=参考非空列(dws.范围(dFirst))
如果drg为空,则退出Sub
'Debug.Print dws.Name,drg.Address
'将匹配的目标单元格合并到一个范围中。
调暗crg As范围
Dim dCell As范围
暗数等于长数
对于drg单元格中的每个数据单元格
如果是数值型(Application.Match(dCell.Value,srg,0)),则
设置crg=getCombinedRange(crg,dCell)
dCount=dCount+1
如果结束
下一个dCell
'一次性删除匹配目标单元格的整行。
如果crg什么都不是,那么
MsgBox“未找到重复项”,VBE感叹号,“重复项”
其他的
'crg.Worksheet.Activate
'crg.EntireRow.Select
'Debug.Print crg.Worksheet.Name,crg.Address
'Debug.Print crg.Worksheet.Name,crg.EntireRow.Address
crg.EntireRow.Delete
如果dCount=1,则
MsgBox“已删除1个副本”,vbInformation,“副本”
其他的
MsgBox dCount&“已删除重复项”,vbInformation,“重复项”
如果结束
如果结束
端接头
函数refNonEmptyColumn(_
第一个单元格(作为范围)_
As范围
Const ProcName As String=“refNonEmptyColumn”
关于错误转到clearError
如果不是第一个细胞什么都不是
第一个单元格。单元格(1)
暗淡的lCell As范围
设置lCell=.Resize(.Worksheet.Rows.Count-.Row+1)_
.Find(“*”,xlFormulas,,xlPrevious)
如果不是lCell,那就什么都不是了
Set refNonEmptyColumn=.Resize(lCell.Row-.Row+1)
如果结束
以
如果结束
程序出口:
退出功能
clearError:
Debug.Print“”&ProcName&“:意外错误!”&vbLf_
&“&”运行时错误“&”错误编号&“:”&vbLf_
&“”错误描述(&R)
恢复程序退出
端函数
函数getCombinedRange(_
比瓦尔建筑范围作为范围_
ByVal AddRange作为范围)_
As范围
Const ProcName As String=“getCombinedRange”
关于错误转到clearError
如果AddRange为空,则
如果不是BuiltRange,则什么都不是
设置getCombinedRange=BuiltRange
如果结束
其他的
如果BuiltRange什么都不是,那么
设置getCombinedRange=AddRange
其他的
如果AddRange.Worksheet是BuiltRange.Worksheet,则
设置getCombinedRange=Union(BuiltRange,AddRange)
如果结束
如果结束
如果结束
程序出口:
退出功能
clearError:
Debug.Print“”&ProcName&“:意外错误!”&vbLf_
&“&”运行时错误“&”错误编号&“:”&vbLf_
&“”错误描述(&R)
恢复程序退出
端函数

我可能会为每一列构建一个
字典
,并将每个单元格中的
作为“键”,行号作为“值”。然后使用每个字典中的
进行比较,并根据您的发现,您可以使用存储的行号删除/编辑/修改工作表。有关某些信息,请参阅。我尝试运行您的代码,但发现“``创建对源范围的引用”的“下标超出范围(错误9)”错误。将sws标注为工作表:设置sws=wb.工作表(sName)
Sub ClearDuplicate()

Dim sht1 As Worksheet
Dim sht2 As Worksheet
Dim C1row As Long
Dim C2row As Long
Dim C2TotalRows As Long
Dim SerialNumber As String
Dim NoDups As Long

Set sht1 = Worksheets("Open Report")
Set sht2 = Worksheets("FNDWRR")
sht2.Activate
C2TotalRows = Application.CountA(Range("H:H"))
C1row = 12

Do While sht1.Cells(C1row, 5).Value <> ""

SerialNumber = sht1.Cells(C1row, 5).Value

    For C2row = 7 To C2TotalRows

        If SerialNumber = Cells(C2row, 8).Value Then
            
            sht1.Activate
            Rows(C1row).Delete
            NoDups = NoDups + 1
            C1row = C1row - 1
            sht2.Activate
            Exit For
        
        End If
        
    Next
    
    C1row = C1row + 1

Loop
    
MsgBox NoDups & " Duplicates were removed"

End Sub