Chương trình so sánh 2 file Excel

  • Thread starter Thread starter hkthuy
  • Ngày gửi Ngày gửi
Liên hệ QC

hkthuy

Thành viên mới
Tham gia
22/5/10
Bài viết
16
Được thích
0
Chào mọi người. M đang cần sự giúp đỡ để giải quyết 1 bài tập khó. Hi vọng sẽ nhận được những lời giải đáp của các bạn.
Nội dung như sau:
Cho 2 file Excel thống kê số hàng bán trong 1 ngày của 1 cửa hàng.(do 1 nhân viên đứng bán và 1 nhân viên thu ngân thống kê) gồm các cột: Mã hàng, tên hàng, tổng giá.
Yêu cầu.
1/Xuất ra những mặt hàng mà MaHang file 1 có, file 2 không có.
2/Xuất ra những mặt hàng mà MaHang file 2 có, file 1 không có.
3/Xuất ra những mặt hàng mà MaHang file 1 & 2 đều có và TongGia giống nhau.
4/Xuất ra những mặt hàng mà MaHang file 1 & 2 đều có và TongGia khác nhau.
 
Để nhận được sự giúp đỡ nhiệt tình của các thành viên bạn hãy gửi file mẫu lên, kèm theo việc diễn giải chi tiết các yêu cầu của bài toán, nếu cần thiết bạn lấy cả ví dụ cụ thể về số liệu mong muốn có được bằng cách gõ trực tiếp vào file mẫu.
 
Upvote 0
Đây là file đính kèm(Số liệu thử). Các bạn giúp mình.
Cảm ơn
 

File đính kèm

Lần chỉnh sửa cuối:
Upvote 0
Cặp macro của bạn đây

PHP:
Option Explicit
Dim ShN As Worksheet, ShD As Worksheet
Dim Rng As Range, sRng As Range, Rng0 As Range

Sub HaiTrong1()
 Dim Lech As Byte, Cls As Range
 
 Lech = InputBox("Hay Chon Fuong Án", "1 - Lech 1", "1")
 If Lech = 1 Then
   Set ShN = Sheets("WToE"):        Set ShD = Sheets("PToE")
   Set Rng0 = ShN.Range(ShN.[c3], ShN.[c65500].End(xlUp))
   Set Rng = ShD.Range(ShD.[c2], ShD.[c65500].End(xlUp))
   Sheets("Lech1").Select
 ElseIf Lech = 2 Then
   Set ShD = Sheets("WToE"):        Set ShN = Sheets("PToE")
   Set Rng0 = ShN.Range(ShN.[c3], ShN.[c65500].End(xlUp))
   Set Rng = ShD.Range(ShD.[c2], ShD.[c65500].End(xlUp))
   Sheets("Lech2").Select
 ElseIf Lech > 2 Then
   Set ShN = Sheets("WToE"):        Set ShD = Sheets("PToE")
   Set Rng0 = ShN.Range(ShN.[c3], ShN.[c65500].End(xlUp))
   Set Rng = ShD.Range(ShD.[c2], ShD.[c65500].End(xlUp))
   If Lech = 3 Then
      Sheets("Giong1").Select
   Else
      Sheets("KhacTri").Select
   End If
   [c4].Resize(Rng0.Rows.Count + Rng.Rows.Count, 5).ClearContents
   For Each Cls In Rng0
      Set sRng = Rng.Find(Cls.Value, , xlFormulas, xlWhole)
      If Not sRng Is Nothing Then
         If Cls.Offset(, 4).Value = sRng.Offset(, 4).Value _
            And Lech = 3 Then
            With [c65500].End(xlUp).Offset(1)
               .Resize(, 5).Value = Cls.Resize(, 5).Value
            End With
         ElseIf Cls.Offset(, 4).Value <> sRng.Offset(, 4).Value _
            And Lech = 4 Then
            With [c65500].End(xlUp).Offset(1)
               .Resize(, 5).Value = Cls.Resize(, 5).Value
               .Offset(1).Resize(, 5).Value = sRng.Resize(, 5).Value
            End With
         End If
      End If
   Next Cls
   Exit Sub
 End If
 [c4].Resize(Rng0.Rows.Count, 5).ClearContents
 Chung12 Lech
 
 Set ShN = Nothing:                 Set ShD = Nothing
 Set sRng = Nothing:                Set Rng0 = Nothing
End Sub
PHP:
 Sub Chung12(Lech As Byte)
  Dim Cls As Range
 
 For Each Cls In Rng0
   Set sRng = Rng.Find(Cls.Value, , xlFormulas, xlWhole)
   If sRng Is Nothing Then
      With [c65500].End(xlUp).Offset(1)
         .Resize(, 5).Value = Cls.Resize(, 5).Value
      End With
   End If
 Next Cls
End Sub
 

File đính kèm

Chỉnh sửa lần cuối bởi điều hành viên:
Upvote 0
M đã up lên dữ liệu để thử. Rất mong nhận được sự góp ý của mọi người
Giống giống khác khác... tối tăm mặt mũi, Đọc code của HYen17 càng tẩu hỏa nhập ma (tại chưa đủ trình độ để hiểu), lỡ làm bằng công thức và vài cột phụ để tham khảo, hy vọng ra kết quả đúng.
 

File đính kèm

Upvote 0
PHP:
Option Explicit
Dim ShN As Worksheet, ShD As Worksheet
Dim Rng As Range, sRng As Range, Rng0 As Range

Sub HaiTrong1()
 Dim Lech As Byte, Cls As Range
 
 Lech = InputBox("Hay Chon Fuong Án", "1 - Lech 1", "1")
 If Lech = 1 Then
   Set ShN = Sheets("WToE"):        Set ShD = Sheets("PToE")
   Set Rng0 = ShN.Range(ShN.[c3], ShN.[c65500].End(xlUp))
   Set Rng = ShD.Range(ShD.[c2], ShD.[c65500].End(xlUp))
   Sheets("Lech1").Select
 ElseIf Lech = 2 Then
   Set ShD = Sheets("WToE"):        Set ShN = Sheets("PToE")
   Set Rng0 = ShN.Range(ShN.[c3], ShN.[c65500].End(xlUp))
   Set Rng = ShD.Range(ShD.[c2], ShD.[c65500].End(xlUp))
   Sheets("Lech2").Select
 ElseIf Lech > 2 Then
   Set ShN = Sheets("WToE"):        Set ShD = Sheets("PToE")
   Set Rng0 = ShN.Range(ShN.[c3], ShN.[c65500].End(xlUp))
   Set Rng = ShD.Range(ShD.[c2], ShD.[c65500].End(xlUp))
   If Lech = 3 Then
      Sheets("Giong1").Select
   Else
      Sheets("KhacTri").Select
   End If
   [c4].Resize(Rng0.Rows.Count + Rng.Rows.Count, 5).ClearContents
   For Each Cls In Rng0
      Set sRng = Rng.Find(Cls.Value, , xlFormulas, xlWhole)
      If Not sRng Is Nothing Then
         If Cls.Offset(, 4).Value = sRng.Offset(, 4).Value _
            And Lech = 3 Then
            With [c65500].End(xlUp).Offset(1)
               .Resize(, 5).Value = Cls.Resize(, 5).Value
            End With
         ElseIf Cls.Offset(, 4).Value <> sRng.Offset(, 4).Value _
            And Lech = 4 Then
            With [c65500].End(xlUp).Offset(1)
               .Resize(, 5).Value = Cls.Resize(, 5).Value
               .Offset(1).Resize(, 5).Value = sRng.Resize(, 5).Value
            End With
         End If
      End If
   Next Cls
   Exit Sub
 End If
 [c4].Resize(Rng0.Rows.Count, 5).ClearContents
 Chung12 Lech
 
 Set ShN = Nothing:                 Set ShD = Nothing
 Set sRng = Nothing:                Set Rng0 = Nothing
End Sub
PHP:
 Sub Chung12(Lech As Byte)
  Dim Cls As Range
 
 For Each Cls In Rng0
   Set sRng = Rng.Find(Cls.Value, , xlFormulas, xlWhole)
   If sRng Is Nothing Then
      With [c65500].End(xlUp).Offset(1)
         .Resize(, 5).Value = Cls.Resize(, 5).Value
      End With
   End If
 Next Cls
End Sub

Chào bạn. Bạn có thể giải thích thêm cho m một chút được chứ. M ko biết nhiều về Excel. Vì thế, đoạn code bạn viết m ko biết là sẽ insert nó vào đâu, hay xử lý nó ntn.
Cảm ơn vì sự giúp đỡ
 
Upvote 0
Hãy vận hành thuần thục với file đính kèm, nha

Chào bạn & có thể giải thích thêm cho m một chút được chứ. M ko biết nhiều về Excel. Vì thế, đoạn code bạn viết m ko biết là sẽ insert nó vào đâu, hay xử lý nó ntn.
--=0 --=0

(*) Cách xài 1 macro đã có nhiều trên diễn đàn, nên mình không nhắc lại nữa;

(*) Mình đã gán tổ hợp fím nóng cho macro đó là {CTRL}+{SHIFT}+H; Bạn cần bấm đồng thời chúng nha.
Khi đó 1 hộp thoại xuất hiện. Nó hỏi bạn muốn đi đâu & về đâu; Bạn bấm nhập số '1' nó sẽ làm theo iêu cầu đầu tiên của bạn & đưa ta về trang 'Lech1'; Những lần sau bạn cứ thử với các con số từ '2' đến '4'
Bạn có thể có vài cách kiểm tra sự đúng đắn của macro. Hãy tự làm với dữ liệu giả lập & sau đó đến dữ liệu của bạn.
Macro đang nằm ở đâu trong workbook của bạn thì tự tìm giúp cái nha.

Chúc bạn đạt ước nguyện của mình!
 

File đính kèm

Upvote 0
--=0 --=0

(*) Cách xài 1 macro đã có nhiều trên diễn đàn, nên mình không nhắc lại nữa;

(*) Mình đã gán tổ hợp fím nóng cho macro đó là {CTRL}+{SHIFT}+H; Bạn cần bấm đồng thời chúng nha.
Khi đó 1 hộp thoại xuất hiện. Nó hỏi bạn muốn đi đâu & về đâu; Bạn bấm nhập số '1' nó sẽ làm theo iêu cầu đầu tiên của bạn & đưa ta về trang 'Lech1'; Những lần sau bạn cứ thử với các con số từ '2' đến '4'
Bạn có thể có vài cách kiểm tra sự đúng đắn của macro. Hãy tự làm với dữ liệu giả lập & sau đó đến dữ liệu của bạn.
Macro đang nằm ở đâu trong workbook của bạn thì tự tìm giúp cái nha.

Chúc bạn đạt ước nguyện của mình!
Chào bạn. Nếu file của m chỉ có 2 cột là MaHang và TongGia thì sẽ chỉnh ntn vậy bạn?
 
Upvote 0
Chào bạn. Nếu file của m chỉ có 2 cột là MaHang và TongGia thì sẽ chỉnh ntn vậy bạn?
Thấy file mới nói tiếp cái gì khác, chứ vầy thì dễ "Ông nói gà bà bảo vịt lắm!"
 
Upvote 0
Trong file cũ của m đó. m bỏ đi tất cả các cột khác, chỉ để lại cột MaHang và cột tổng giá
 

File đính kèm

Upvote 0
Nữa buổi để viết lại từ đầu & vẫn dễ hơn sửa

PHP:
Option Explicit
Dim Sh0 As Worksheet, Rng As Range

Sub ThongKe()
 Dim S0 As Byte, StrC As String, KC As String:                          KC = Space(7)
 Dim Rws As Long:                                  Dim Sh As Worksheet, Rng0 As Range
 
 StrC = "Chon 1 De Xem Mau lech 1;" & Chr(10) & KC & "2 De Xem Mau Lech E;" & Chr(10) _
   & KC & "3 De Xem Gióng Nhau;" & Chr(10) & KC & "4 De Xem Khác Nhau Vè Tong Giá"
 S0 = InputBox(StrC, "GPE.COM Xin Chào!", "1")
 If S0 < 1 Or S0 > 4 Then Exit Sub
 Set Sh0 = _
   Sheets(Switch(S0 = 1, "Lech1", S0 = 2, "Lech2", S0 = 3, "Giong1", S0 = 4, "KhacTri"))
 Select Case S0
 Case 1, 3
   Set Sh = Sheets("PToE"):                                      Sheets("WToE").Select
   Rws = Sh.[b2].CurrentRegion.Rows.Count:               Set Rng = Sh.[b2].Resize(Rws)
   Sh0.[c4].Resize(Rws, 2).ClearContents
   Set Rng0 = [b2].Resize([b2].CurrentRegion.Rows.Count).Offset(1)
   GPE Rng0, S0
 Case 2, 4
   Set Sh = Sheets("WToE"):                                      Sheets("PToE").Select
   Rws = Sh.[b2].CurrentRegion.Rows.Count:               Set Rng = Sh.[b2].Resize(Rws)
   Sh0.[c4].Resize(Rws, 2).ClearContents
   Set Rng0 = [b2].Resize([b2].CurrentRegion.Rows.Count).Offset(1)
   GPE Rng0, S0
 End Select 
End Sub


Mã:
[B]Sub GPE(Rng0 As Range, Num As Byte)[/B]
 Dim Cls As Range, sRng As Range
 
 For Each Cls In Rng0
   Set sRng = Rng.Find(Cls.Value, , xlFormulas, xlWhole)
   If sRng Is Nothing Then
      If Num < 3 Then Sh0.[c65500].End(xlUp).Offset(1).Resize(, 2).Value _
         = Cls.Resize(, 2).Value
   Else
      If Num = 3 And Cls.Offset(, 1).Value = sRng.Offset(, 1).Value Then
         Sh0.[c65500].End(xlUp).Offset(1).Resize(, 2).Value = Cls.Resize(, 2).Value
      ElseIf Num > 3 And Cls.Offset(, 1).Value <> sRng.Offset(, 1).Value Then
         Sh0.[c65500].End(xlUp).Offset(1).Resize(, 2).Value = Cls.Resize(, 2).Value
      End If
   End If
 Next Cls
 Sh0.Select:                                                         Set Sh0 = Nothing
End Sub
 

File đính kèm

Upvote 0
Chào bạn. M đã coi bài của bạn. phần 1,2,3 thì ok. Nhưng trong phần 4 (lọc những MaHang giống nhau nhưng có TongGia khác nhau), nếu m muốn in ra các cặp sai TongGia thì giải pháp sẽ ntn? M lấy ví dụ cụ thể hơn, nếu tìm thấy MaHang = 123456 trong sheet WToE là 100 000 VND, trong sheet PToE là 120 000 VND.
Làm cách nào để trong sheet KhacTri (chọn 4) in ra định dạng table 4 cột như sau
STT_____MaHang____WToE______PToE
1_______123456_____100 000____120 000
 

File đính kèm

Lần chỉnh sửa cuối:
Upvote 0
Sẵn lòng thôi, xin mời!

PHP:
Option Explicit
Dim Sh0 As Worksheet, Rng As Range

Sub ThongKe()
 Dim S0 As Byte, StrC As String, KC As String:                          KC = Space(7)
 Dim Rws As Long:                                  Dim Sh As Worksheet, Rng0 As Range
 
 StrC = "Chon 1 De Xem Mau lech 1;" & Chr(10) & KC & "2 De Xem Mau Lech E;" & Chr(10) _
   & KC & "3 De Xem Gióng Nhau;" & Chr(10) & KC & "4 De Xem Khác Nhau Vè Tong Giá"
 S0 = InputBox(StrC, "GPE.COM Xin Chào!", "1")
 If S0 < 1 Or S0 > 4 Then Exit Sub
 Set Sh0 = _
   Sheets(Switch(S0 = 1, "Lech1", S0 = 2, "Lech2", S0 = 3, "Giong1", S0 = 4, "KhacTri"))
 Select Case S0
 Case 1, 3
   Set Sh = Sheets("PToE"):                                      Sheets("WToE").Select
   Rws = Sh.[b2].CurrentRegion.Rows.Count:               Set Rng = Sh.[b2].Resize(Rws)
   Sh0.[c4].Resize(Rws, 2).ClearContents
   Set Rng0 = [b2].Resize([b2].CurrentRegion.Rows.Count).Offset(1)
   GPE Rng0, S0
 Case 2, 4
   Set Sh = Sheets("WToE"):                                      Sheets("PToE").Select
   Rws = Sh.[b2].CurrentRegion.Rows.Count:               Set Rng = Sh.[b2].Resize(Rws)
   Sh0.[c4].Resize(Rws, 2).ClearContents
   Set Rng0 = [b2].Resize([b2].CurrentRegion.Rows.Count).Offset(1)
1   If S0 = 4 Then
      Sh0.[d3].Value = Sheets("PToE").Name:                       Sh0.[E3] = Sh.Name
2   End If
   GPE Rng0, S0
 End Select
 
End Sub
Mã:
[B]Sub GPE(Rng0 As Range, Num As Byte)[/B]
 Dim Cls As Range, sRng As Range
 
 For Each Cls In Rng0
   Set sRng = Rng.Find(Cls.Value, , xlFormulas, xlWhole)
   If sRng Is Nothing Then
      If Num < 3 Then Sh0.[c65500].End(xlUp).Offset(1).Resize(, 2).Value _
         = Cls.Resize(, 2).Value
   Else
      If Num = 3 And Cls.Offset(, 1).Value = sRng.Offset(, 1).Value Then
         Sh0.[c65500].End(xlUp).Offset(1).Resize(, 2).Value = Cls.Resize(, 2).Value
      ElseIf Num > 3 And Cls.Offset(, 1).Value <> sRng.Offset(, 1).Value Then
[COLOR=Blue]3[/COLOR]         With Sh0.[c65500].End(xlUp).Offset(1)
            .Resize(, 2).Value = Cls.Resize(, 2).Value
[COLOR=RoyalBlue]5[/COLOR]            .Offset(, 2).Value = sRng.Offset(, 1).Value
[COLOR=RoyalBlue]6 [/COLOR]        End With
      End If
   End If
 Next Cls
 Sh0.Select:                                                         Set Sh0 = Nothing
[B]End Sub[/B]
 
Upvote 0
Hi.
Mình có chút khó khăn mới trong chương trình này. Yêu cầu mới bắt buộc mình phải thể hiện sự khác nhau trong hai file. Mình không rành về Excel. Mình rất mong nhận được sự giúp đỡ của GPE. Cảm ơn mọi người đã ghé đọc tin.
 

File đính kèm

Lần chỉnh sửa cuối:
Upvote 0
File trống trơn thì đưa lên làm gì vậy bạn?
 
Upvote 0
Xl, Mình quên không bổ xung dữ liệu thử. Mọi người giúp mình
 
Upvote 0
Có ai giúp mình. GPE ơi! Tôi cần sự giúp đỡ. Sắp bị gõ đầu rùi.
 
Upvote 0
Hi.
Mình có chút khó khăn mới trong chương trình này. Yêu cầu mới bắt buộc mình phải thể hiện sự khác nhau trong hai file. Mình không rành về Excel. Mình rất mong nhận được sự giúp đỡ của GPE. Cảm ơn mọi người đã ghé đọc tin.
Đọc trong file thì đây là yêu cầu so sánh 2 list:
- Tìm cái có trong A mà không có trong B
- Tìm cái có trong B mà không có trong A
- Tìm cái có trong cả A và B
vân vân...
Dạng này đã được làm nhiều lần trên GPE rồi ---> Nếu có thể được, bạn đưa dữ liệu nhiều 1 chút (làm mới đã tay) ---> Tóm lại, dữ liệu của bạn dài đến bao nhiêu hãy đưa hết lên càng tốt
 
Upvote 0
Đó chỉ là dữ liệu test. A có thể thêm vào tùy ý. Em đang cần sự giúp đỡ của cộng đồng GPE!^^
 
Upvote 0
Web KT

Bài viết mới nhất

Back
Top Bottom