工作表1是来自一个系统的一组数据,而工作表2是来自不同系统的另一组数据。我想要做的是首先比较两个工作表中的第1列,其中包含该人唯一的ID,一旦每个工作表中第1列的条目相同,那么这就是同一个人。然后
我当时想要做的是比较第1页上第1列和第2列第23列右侧存储的17列的值(两者都是国家保险号)。
只有当它们不同时,我才想从Sheet 1(Number,FirstName和Surname)复制行的前3列和两张表中的国家保险号值(Sheet1(0,17)Sheet2(0, 23)到Sheet3。
这是我正在尝试的代码,它会逐行复制整行,如果逻辑工作,我可以更改为仅复制我想要的单元格,但无济于事似乎是复制几乎整个工作表1 .....
Sub compareData()
Dim ws1 As Worksheet, ws2 As Worksheet, ws3 As Worksheet
Dim i As Long, j As Long
Dim newSheetPos As Integer
Set ws1 = ActiveWorkbook.Sheets("Sheet1")
Set ws2 = ActiveWorkbook.Sheets("Sheet2")
Set ws3 = ActiveWorkbook.Sheets("Sheet3")
newSheetPos = ws3.Cells(ws3.Rows.Count, 2).End(xlUp).Row
For i = 1 To ws1.Cells(ws1.Rows.Count, 2).End(xlUp).Row
For j = 1 To ws2.Cells(ws2.Rows.Count, 2).End(xlUp).Row
If ws1.Cells(i, 1).Value = ws2.Cells(j, 1).Value Then
If ws1.Cells(i, 17).Value <> ws2.Cells(j, 23).Value Then
ws1.Cells(j, 1).EntireRow.Copy ws3.Cells(newSheetPos, 1)
newSheetPos = newSheetPos + 1
Else
End If
Else
End If
Next j
Next i
End Sub
答案 0 :(得分:0)
遇到类似的问题,我发现使用Trim(), UCase()
和.Value2
属性可以消除由格式化和/或文本大小写引起的许多不匹配问题。如果使用Trim()和.Value2,则代码看起来应该是这样的。
If Trim(ws1.Cells(i, 1).Value2) = Trim(ws2.Cells(j, 1).Value2) Then
If Trim(ws1.Cells(i, 17).Value2) <> Trim(ws2.Cells(j, 23).Value2) Then
ws1.Cells(j, 1).EntireRow.Copy ws3.Cells(newSheetPos, 1)
newSheetPos = newSheetPos + 1
Else
End If
End If
.Text
,.Value
或.Value2
可引用存储在单元格中的值。 Value2提供基础值而不进行任何格式化。 TEXT vs VALUE vs VALUE2是指向提供出色解释的文章的链接。
答案 1 :(得分:0)
您好我现在已对此进行了排序,我意识到当偏移从1开始而不是0时我不得不将标准偏移量增加1,请参阅下面
Dim ws1 As Worksheet, ws2 As Worksheet, ws3 As Worksheet
Dim i As Long, j As Long
Dim newSheetPos As Integer
Set ws1 = ActiveWorkbook.Sheets("Sheet1")
Set ws2 = ActiveWorkbook.Sheets("Sheet2")
Set ws3 = ActiveWorkbook.Sheets("NINO Differences")
newSheetPos = ws3.Cells(ws3.Rows.Count, 2).End(xlUp).Row
For i = 1 To ws1.Cells(ws1.Rows.Count, 2).End(xlUp).Row
For j = 1 To ws2.Cells(ws2.Rows.Count, 2).End(xlUp).Row
If Trim(ws1.Cells(i, 1).Value2) = Trim(ws2.Cells(j, 1).Value2) Then
If Trim(ws1.Cells(i, 17).Value2) <> Trim(ws2.Cells(j, 24).Value2) Then
ws1.Cells(j, 1).EntireRow.Copy ws3.Cells(newSheetPos, 1)
newSheetPos = newSheetPos + 1
Else
End If
Else
End If
Next j
Next i