NguyenthiH
Thành viên mới đăng ký
- Tham gia
- 11/12/16
- Bài viết
- 965
- Được thích
- 175
- Giới tính
- Nữ
Ý của em là quét 2 bảng. chọn Conditional Formatting.cái nào trùng thì nổi lên. cái nào không trùng thì còn sót lại.Cách làm làm sao anh? Em có vào Duplicate, nhưng nó không được.
=IF(COUNTIF($I$2:$M$26,A2),"",A2)
=COUNTIF($I$2:$M$26,A2)=0
Lọc ra luôn dùm em ở bảng em có ghi chú đó ạ.
Bạn có thể sử dụng VBA với 2 Function được viết trên diễn đànChào các anh chị, em có file, trong file có 2 bảng, mong các anh chị giúp em lọc ra những PO nào mà bảng 1 có mà bảng 2 không có ạ.
Sub SoSanh()
Dim sArray1, sArray2, Arr, TG As Double
sArray1 = JoinColunm(Range("C2:G16"))
sArray2 = JoinColunm(Range("I2:M16"))
Arr = Compare2List(sArray1, sArray2, 2)
Range("O2").Resize(UBound(Arr, 1)).Value = Arr
End Sub
' Ham duoc viet boi ??ö??ß?†?†µ? giaiphapexcel.com
Function JoinColunm(ParamArray Table_Array())
Dim Tmp, Item, Arr(), n As Long, i As Long
On Error Resume Next
For i = LBound(Table_Array) To UBound(Table_Array)
Tmp = Table_Array(i)
If TypeOf Table_Array(i) Is Range Then
For Each Item In Tmp
If Item <> Empty Then
n = n + 1
ReDim Preserve Arr(1 To n)
Arr(n) = Item
End If
Next
Else
n = n + 1
ReDim Preserve Arr(1 To n)
Arr(n) = Table_Array(i)
End If
Next i
JoinColunm = WorksheetFunction.Transpose(Arr)
End Function
' Ham duoc viet boi anhtuan1066 dien dan giaiphapexcel.com
Function Compare2List(ByVal sArray1, ByVal sArray2, ByVal CompareMod As Long)
Dim Dic1, Dic2, Item, Item1, Item2, TmpKeys1, TmpKeys2, Arr() As String
Dim Tmp1 As String, Tmp2 As String, j As Long, ub As Long
On Error Resume Next
Set Dic1 = CreateObject("Scripting.Dictionary")
Set Dic2 = CreateObject("Scripting.Dictionary")
For Each Item1 In sArray1
If CStr(Item1) <> "" Then
Tmp1 = CStr(Item1)
If Not Dic1.Exists(Tmp1) Then Dic1.Add Tmp1, ""
End If
Next
TmpKeys1 = Dic1.Keys
For Each Item2 In sArray2
If CStr(Item2) <> "" Then
Tmp2 = CStr(Item2)
If Not Dic2.Exists(Tmp2) Then Dic2.Add Tmp2, ""
End If
Next
TmpKeys2 = Dic2.Keys
ub = IIf(Dic1.Count > Dic2.Count, Dic1.Count, Dic2.Count)
ReDim Arr(1 To ub, 1 To 1)
Select Case CompareMod
Case 1
For Each Item In TmpKeys1
If Dic2.Exists(CStr(Item)) Then
j = j + 1
Arr(j, 1) = CStr(Item)
End If
Next
Case 2
For Each Item In TmpKeys1
If Not Dic2.Exists(CStr(Item)) Then
j = j + 1
Arr(j, 1) = CStr(Item)
End If
Next
Case 3
For Each Item In TmpKeys2
If Not Dic1.Exists(CStr(Item)) Then
j = j + 1
Arr(j, 1) = CStr(Item)
End If
Next
End Select
Compare2List = Arr
End Function
Chạy codeChào các anh chị, em có file, trong file có 2 bảng, mong các anh chị giúp em lọc ra những PO nào mà bảng 1 có mà bảng 2 không có ạ.
Sub LocDuLieuKhongTrung()
Dim Rng As Range, Rng2 As Range, fRes As Range, Res()
Dim sRow&, sCol&, sRow2&, sCol2&, i&, j&, k&, c&, iKey$
Application.DisplayAlerts = False
On Error Resume Next
Bang1:
Set Rng = Application.InputBox("Chon Bang 1", Type:=8)
If Rng Is Nothing Then MsgBox ("Phai chon Bang 1"): GoTo Bang1
sRow = Rng.Rows.Count
sCol = Rng.Columns.Count
Bang2:
Set Rng2 = Application.InputBox("Chon Bang 2", Type:=8)
If Rng2 Is Nothing Then MsgBox ("Phai chon Bang 2"): GoTo Bang2
sRow2 = Rng2.Rows.Count
sCol2 = Rng2.Columns.Count
KetQua:
Set fRes = Application.InputBox("Chon Cell tra ket qua", Type:=8)
If fRes Is Nothing Then MsgBox ("Phai chon Cell tra ket qua"): GoTo KetQua
On Error GoTo 0
ReDim Res(1 To sRow, 1 To sCol)
With CreateObject("scripting.dictionary")
For i = 1 To sRow2
For j = 1 To sCol2
iKey = Rng2(i, j)
If iKey <> Empty Then .Item(iKey) = ""
Next j
Next i
c = 1
For i = 1 To sRow
For j = 1 To sCol
iKey = Rng(i, j)
If iKey <> Empty Then
If .exists(iKey) = False Then
If k < sRow Then
k = k + 1
Else
k = 1
c = c + 1
End If
Res(k, c) = Rng(i, j)
End If
End If
Next j
Next i
End With
fRes.Resize(sRow, c) = Res
Application.DisplayAlerts = True
End Sub
Bảng 1 | Sau khi lọc thì có | Mong anh chỉnh cho đúng theo thứ tự bên bảng 1 dùm ạ |
PO30414 | PO30414 | |
PO30415 | PO32280 | |
PO32280 | PO30415 | |
PO32282 | PO32282 | |
Ngon, bổ, rẻ là đây!Công thức cho O2
Kéo sang phải tới cột U rồi xuống dưới tới dòng cuối của bảng 1.Mã:=IF(COUNTIF($I$2:$M$26,A2),"",A2)
-------------
CF: chọn bảng 1 -> CF -> công thức
-> chọn mầu.Mã:=COUNTIF($I$2:$M$26,A2)=0
Mù đâu có bị cấm thích?Kinh nhể...hehe mù VBA mà cứ thích xài VBA.
Thay đổi thứ tự 2 vòng For i và For jCám ơn anh Hiếu nhiều, nhưng xin anh chỉnh code cho các PO nằm liền nhau thì cứ giữ nguyên như vậy.
Ví dụ trong bảng 1 có
Bảng 1 Sau khi lọc thì có Mong anh chỉnh cho đúng theo thứ tự bên bảng 1 dùm ạ PO30414 PO30414 PO30415 PO32280 PO32280 PO30415 PO32282 PO32282
Sub LocDuLieuKhongTrung()
Dim Rng As Range, Rng2 As Range, fRes As Range, Res()
Dim sRow&, sCol&, sRow2&, sCol2&, i&, j&, k&, c&, iKey$
Application.DisplayAlerts = False
On Error Resume Next
Bang1:
Set Rng = Application.InputBox("Chon Bang 1", Type:=8)
If Rng Is Nothing Then MsgBox ("Phai chon Bang 1"): GoTo Bang1
sRow = Rng.Rows.Count
sCol = Rng.Columns.Count
Bang2:
Set Rng2 = Application.InputBox("Chon Bang 2", Type:=8)
If Rng2 Is Nothing Then MsgBox ("Phai chon Bang 2"): GoTo Bang2
sRow2 = Rng2.Rows.Count
sCol2 = Rng2.Columns.Count
KetQua:
Set fRes = Application.InputBox("Chon Cell tra ket qua", Type:=8)
If fRes Is Nothing Then MsgBox ("Phai chon Cell tra ket qua"): GoTo KetQua
On Error GoTo 0
ReDim Res(1 To sRow, 1 To sCol)
With CreateObject("scripting.dictionary")
For i = 1 To sRow2
For j = 1 To sCol2
iKey = Rng2(i, j)
If iKey <> Empty Then .Item(iKey) = ""
Next j
Next i
c = 1
For j = 1 To sCol
For i = 1 To sRow
iKey = Rng(i, j)
If iKey <> Empty Then
If .exists(iKey) = False Then
If k < sRow Then
k = k + 1
Else
k = 1
c = c + 1
End If
Res(k, c) = Rng(i, j)
End If
End If
Next i
Next j
End With
fRes.Resize(sRow, c) = Res
Application.DisplayAlerts = True
End Sub