请教高手,如何在excel中比较两个sheet,将其中不同的记录(行)找到并复制到其他的sheet或地方?

时间:2021-02-09 04:28:34
最近在办公中遇到这样一个问题。由于数据量很大,如果通过人工目测的方法,工作量将会很大,且不一定能找全。万般无奈只有来请教各位高手了。
数据的特点是,在同一个excel文件中存在两个sheet,他们的数据结构是一样的,其中一个中的数据是另一个的子集,目的是要找出他们的不同,即找出在那张大些的sheet中存在,但在那张小些的sheet中不存在的记录(行),并把它保存到第三个sheet或某个sheet的其他空白地方。

21 个解决方案

#1


用CS-ExcelDiff 1.0工具比较
下载地址:http://download.com.com/3000-2077-10180310.html?tag=lst-0-4

#2


首先谢谢你的帮忙。
根据你提供的信息,我下载了该软件,并尝试使用。经过几次尝试,发掘该软件并不能完成我需要做的工作。当我试图做的时候提示如下:
CANNOT COMPARE!!!
REASON: DIFFERENT NUMBER OF FRAMES.
该软件要求不同的excel表中选中的sheet重要有相同的行数(即记录数),他能比较出相同行中相应数据发生的变化。而我要做的工作正是在同一个excel文件中2个sheet中有不同的行数,其中一个是另一个的子集,即只要它们都有的记录一定是相同的,需要找出全集中子集中不包含的记录。

#3


我好像听说过可以在office中用vb进行编程的。不知道通过vb的编程利用数据库的查询功能可否实现?
请那位高手指点一下!

#4


首先推荐你用EXCEL的高级筛选,具体方法如下:
在大的一张表中加入一列(设为列F,标题为"SHEET"),全部填入“大”或其他任何字符,小的表也一样,不过必须填入一个与大表完全不同的符号。这样,两张表的结构完全一样,这很重要。
step1:两张表拼成一张表,第一行为标题行,列F记录着记录来自哪一张原始表;
step2:选择“数据”——>”筛选“-->"高级筛选”,高级筛选的“数据区域”为合并后的表,条件设置可参考exceL帮助,注意,在最后一个单选框中,一定要选择“选择不重复记录”。
这样完全可以得到你所需要的结果。

如果你不会设置筛选条件的话,可与我联系。

我编过一个这样的程序,他的功能是在一个工作簿中至少有两个表(sheet1,sheet2,...),sheet1和sheet2有一列数据(设为a列)需要进行比较,我的程序是把sheet1的a列中的数据于sheet2的某一列比较,如果在sheet2中出现过,就写可以识别出来,把它删或作上一个excel可识别的标记。

如果需要程序的话,可与我联系。

联系方法:X810214@hotmail.com

#5


我读的时候发现有的时候明明在 Excel中有数据但用ADO读却说为NULL,望各位指教

#6


vlookup本能实现比较功能吗?

#7


正迷茫中,还有那位高手能帮忙?

#8


有高手可以介绍一下吗?

#9


Enetfox():
FlySay(天长笑)的那个程序发给你了吗?如果有的话,你把它也给我一份吧,谢谢了!
cityview@163.com

#10


没有,我没有想他要,你要的话自己和他说一下吧。

#11


Sub macro()

 Dim i As Integer
 Dim j As Integer
 
 For i = 1 To 4
 
   For j = 1 To 3
      
   If Sheet1.Cells(i, 1).Value = Sheet2.Cells(j, 1).Value Then
   
   Sheet1.Cells(i, 2).Value = 1
   
    End If
    Next
    Next
    
Dim used As Range
 Set used = Sheet1.UsedRange
 
 Dim sum As Integer
  sum = used.Rows.Count
  
 Dim z As Integer
 Dim k As Integer
     
 k = 1
      
 For z = 1 To sum
   
  If Sheet1.Cells(z, 2).Value = "" Then
     
     Sheet3.Cells(k, 1).Value = Sheet1.Cells(z, 1).Value
      
      k = k + 1
     End If
          
      
      Next
       
End Sub

#12


winternet()

能解释一下你的程序吗?
小弟还很菜,看得不是很明白。

#13


首先对各位表示抱歉,我前面所提到的采用筛选的方法是行不通的.经过实际操作,应该使用if和match函数.其原理如下:
把sheet1中的每一个值在sheet2中查找一遍,lookup_value设为sheet1中待查找的一个单元格,lookup_array设为sheet2中包含有sheet1的重复数据的区域(一定为绝对引用才行),match_type设为0.在sheet1中的一个单元格写好后使用自动填充.再采用if语句进行判断match成功与否,而赋予单元格不同的值.再使用筛选,选出match failed的记录.

我做了一个简单的实验,sheet1中为1-18的连续整数,shee2中为1-55的连续奇数,用上面的方法可以把sheet1中的,没有在sheet2中出现过的数据标记出来.

再次表示抱歉.

#14


同时我贴出我程序的源码聊表歉意:
Sub DataCheck()
'
' Flaysay    2003.03.15
'This program is used to find out the different data in two table
'sheets(1) has records which also exist in sheets(2),and these data can be marked by
'the program.Before running ,first,shoud insert a column in the front for outputing
'the results,I will mark the data with a "yes" in the added column in the same row.
'Then,the paraments "DataToCheck" shoud be modified,it indicates the total count of data
'in sheet(1)

  Const DataToCheck As Long = 2371  'sheet1中记录的总数
  Dim InRow As Long, InCol As Long 'inrow表示sheet1中当前的行号,incol表示列号
  Dim CurrentCell As Range          'currentcell表示从sheet2中搜到的单元格,当sheet2中不存在时,返回nothing
  Dim OutCol As Long                '记号输出列
  
  InCol = 2                         '处理sheet1中第2列
  For InRow = 2 To DataToCheck
      '待比较的数据从sheet1的row2开始至行datatocheck止
    

    Set CurrentCell = Sheets(2).Cells.Find(What:=Trim(Sheets(1).Cells(InRow, InCol)), After:=ActiveCell, LookIn:=xlFormulas _
        , LookAt:=xlPart, SearchOrder:=xlByColumns, SearchDirection:=xlNext, _
        MatchCase:=False)
      '在sheet2中查找sheet1.cells(inrow,incol)
    If Not CurrentCell Is Nothing Then
        Sheets(1).Cells(InRow, OutCol) = "Yes"    '如果sheet2中已存在,在sheet1的单元格(inrow,outcol)中输入"YES"
     End If
  Next InRow
    
    End Sub

#15


谢谢flysay。
再问一个问题,怎么得到excel表中的数据的行数?

#16


在excel公式中用row()函数

#17


在程序中能使用这个函数吗?
我在程序中写了如下语句:

dim rowcount as long
row=excel.rows

运行时发生错误,详细信息是:运行时错误'7':   内存益处

请问为什么?怎么正确使用该函数?或者是在程序中有别的方法可以获得excel文件中某个sheets的数据行数码?

#18


Sub macre()
  
  Dim sheet As Worksheet
  Set sheet = ThisWorkbook.ActiveSheet
  
  Dim used As Range
  Set used = sheet.UsedRange
  
  Dim rowcount As Long
  rowcount = used.Rows.Count
  
  MsgBox rowcount
  

End Sub

#19


row函数是直接输入到单元格中的.
在vba中可以使用row,column属性来得到对象的行号和列号,如果对象包含多个单元格,那它返回区域中第一块的第一行的行号。Long 类型,只读
Sub test()

  Dim currentcell As Range
  
  Set currentcell = Sheet1.Cells(1, 3)
  
  
  RowNo = currentcell.Row
  columnNo = currentcell.Column
End Sub

#20


excel vba帮助文档中的例子

本示例显示 Sheet1 选定区域的行数。如果是多重选定区域,本示例将对每一个子区域进行循环。

Worksheets("Sheet1").Activate
areaCount = Selection.Areas.Count
If areaCount <= 1 Then
    MsgBox "The selection contains " & _
        Selection.Rows.Count & " rows."
Else
    i = 1
    For Each a In Selection.Areas
        MsgBox "Area " & i & " of the selection contains " & _
            a.Rows.Count & " rows."
        i = i + 1
    Next a
End If

#21


谢谢 flysay and winternet,感谢你们一直以来的无私帮助,特别是flysay(天长笑).

#1


用CS-ExcelDiff 1.0工具比较
下载地址:http://download.com.com/3000-2077-10180310.html?tag=lst-0-4

#2


首先谢谢你的帮忙。
根据你提供的信息,我下载了该软件,并尝试使用。经过几次尝试,发掘该软件并不能完成我需要做的工作。当我试图做的时候提示如下:
CANNOT COMPARE!!!
REASON: DIFFERENT NUMBER OF FRAMES.
该软件要求不同的excel表中选中的sheet重要有相同的行数(即记录数),他能比较出相同行中相应数据发生的变化。而我要做的工作正是在同一个excel文件中2个sheet中有不同的行数,其中一个是另一个的子集,即只要它们都有的记录一定是相同的,需要找出全集中子集中不包含的记录。

#3


我好像听说过可以在office中用vb进行编程的。不知道通过vb的编程利用数据库的查询功能可否实现?
请那位高手指点一下!

#4


首先推荐你用EXCEL的高级筛选,具体方法如下:
在大的一张表中加入一列(设为列F,标题为"SHEET"),全部填入“大”或其他任何字符,小的表也一样,不过必须填入一个与大表完全不同的符号。这样,两张表的结构完全一样,这很重要。
step1:两张表拼成一张表,第一行为标题行,列F记录着记录来自哪一张原始表;
step2:选择“数据”——>”筛选“-->"高级筛选”,高级筛选的“数据区域”为合并后的表,条件设置可参考exceL帮助,注意,在最后一个单选框中,一定要选择“选择不重复记录”。
这样完全可以得到你所需要的结果。

如果你不会设置筛选条件的话,可与我联系。

我编过一个这样的程序,他的功能是在一个工作簿中至少有两个表(sheet1,sheet2,...),sheet1和sheet2有一列数据(设为a列)需要进行比较,我的程序是把sheet1的a列中的数据于sheet2的某一列比较,如果在sheet2中出现过,就写可以识别出来,把它删或作上一个excel可识别的标记。

如果需要程序的话,可与我联系。

联系方法:X810214@hotmail.com

#5


我读的时候发现有的时候明明在 Excel中有数据但用ADO读却说为NULL,望各位指教

#6


vlookup本能实现比较功能吗?

#7


正迷茫中,还有那位高手能帮忙?

#8


有高手可以介绍一下吗?

#9


Enetfox():
FlySay(天长笑)的那个程序发给你了吗?如果有的话,你把它也给我一份吧,谢谢了!
cityview@163.com

#10


没有,我没有想他要,你要的话自己和他说一下吧。

#11


Sub macro()

 Dim i As Integer
 Dim j As Integer
 
 For i = 1 To 4
 
   For j = 1 To 3
      
   If Sheet1.Cells(i, 1).Value = Sheet2.Cells(j, 1).Value Then
   
   Sheet1.Cells(i, 2).Value = 1
   
    End If
    Next
    Next
    
Dim used As Range
 Set used = Sheet1.UsedRange
 
 Dim sum As Integer
  sum = used.Rows.Count
  
 Dim z As Integer
 Dim k As Integer
     
 k = 1
      
 For z = 1 To sum
   
  If Sheet1.Cells(z, 2).Value = "" Then
     
     Sheet3.Cells(k, 1).Value = Sheet1.Cells(z, 1).Value
      
      k = k + 1
     End If
          
      
      Next
       
End Sub

#12


winternet()

能解释一下你的程序吗?
小弟还很菜,看得不是很明白。

#13


首先对各位表示抱歉,我前面所提到的采用筛选的方法是行不通的.经过实际操作,应该使用if和match函数.其原理如下:
把sheet1中的每一个值在sheet2中查找一遍,lookup_value设为sheet1中待查找的一个单元格,lookup_array设为sheet2中包含有sheet1的重复数据的区域(一定为绝对引用才行),match_type设为0.在sheet1中的一个单元格写好后使用自动填充.再采用if语句进行判断match成功与否,而赋予单元格不同的值.再使用筛选,选出match failed的记录.

我做了一个简单的实验,sheet1中为1-18的连续整数,shee2中为1-55的连续奇数,用上面的方法可以把sheet1中的,没有在sheet2中出现过的数据标记出来.

再次表示抱歉.

#14


同时我贴出我程序的源码聊表歉意:
Sub DataCheck()
'
' Flaysay    2003.03.15
'This program is used to find out the different data in two table
'sheets(1) has records which also exist in sheets(2),and these data can be marked by
'the program.Before running ,first,shoud insert a column in the front for outputing
'the results,I will mark the data with a "yes" in the added column in the same row.
'Then,the paraments "DataToCheck" shoud be modified,it indicates the total count of data
'in sheet(1)

  Const DataToCheck As Long = 2371  'sheet1中记录的总数
  Dim InRow As Long, InCol As Long 'inrow表示sheet1中当前的行号,incol表示列号
  Dim CurrentCell As Range          'currentcell表示从sheet2中搜到的单元格,当sheet2中不存在时,返回nothing
  Dim OutCol As Long                '记号输出列
  
  InCol = 2                         '处理sheet1中第2列
  For InRow = 2 To DataToCheck
      '待比较的数据从sheet1的row2开始至行datatocheck止
    

    Set CurrentCell = Sheets(2).Cells.Find(What:=Trim(Sheets(1).Cells(InRow, InCol)), After:=ActiveCell, LookIn:=xlFormulas _
        , LookAt:=xlPart, SearchOrder:=xlByColumns, SearchDirection:=xlNext, _
        MatchCase:=False)
      '在sheet2中查找sheet1.cells(inrow,incol)
    If Not CurrentCell Is Nothing Then
        Sheets(1).Cells(InRow, OutCol) = "Yes"    '如果sheet2中已存在,在sheet1的单元格(inrow,outcol)中输入"YES"
     End If
  Next InRow
    
    End Sub

#15


谢谢flysay。
再问一个问题,怎么得到excel表中的数据的行数?

#16


在excel公式中用row()函数

#17


在程序中能使用这个函数吗?
我在程序中写了如下语句:

dim rowcount as long
row=excel.rows

运行时发生错误,详细信息是:运行时错误'7':   内存益处

请问为什么?怎么正确使用该函数?或者是在程序中有别的方法可以获得excel文件中某个sheets的数据行数码?

#18


Sub macre()
  
  Dim sheet As Worksheet
  Set sheet = ThisWorkbook.ActiveSheet
  
  Dim used As Range
  Set used = sheet.UsedRange
  
  Dim rowcount As Long
  rowcount = used.Rows.Count
  
  MsgBox rowcount
  

End Sub

#19


row函数是直接输入到单元格中的.
在vba中可以使用row,column属性来得到对象的行号和列号,如果对象包含多个单元格,那它返回区域中第一块的第一行的行号。Long 类型,只读
Sub test()

  Dim currentcell As Range
  
  Set currentcell = Sheet1.Cells(1, 3)
  
  
  RowNo = currentcell.Row
  columnNo = currentcell.Column
End Sub

#20


excel vba帮助文档中的例子

本示例显示 Sheet1 选定区域的行数。如果是多重选定区域,本示例将对每一个子区域进行循环。

Worksheets("Sheet1").Activate
areaCount = Selection.Areas.Count
If areaCount <= 1 Then
    MsgBox "The selection contains " & _
        Selection.Rows.Count & " rows."
Else
    i = 1
    For Each a In Selection.Areas
        MsgBox "Area " & i & " of the selection contains " & _
            a.Rows.Count & " rows."
        i = i + 1
    Next a
End If

#21


谢谢 flysay and winternet,感谢你们一直以来的无私帮助,特别是flysay(天长笑).