Tìm số lượng công nhân tăng, giảm hàng tháng (1 người xem)

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

Người dùng đang xem chủ đề này

tam8678

Đời Xá Chi
Tham gia
30/4/09
Bài viết
417
Được thích
301
Nghề nghiệp
Kế toán
Mong các anh, em trên GPE xem và hướng dẩn giúp, tìm số lượng tăng giảm công nhân hàng tháng.
Cụ thể trong file đính kèm
 

File đính kèm

Upvote 0
Hai trong 1 đây, xin mời mại zô!

PHP:
Option Explicit
Sub SoTangGiam()
 Dim tRng As Range, sRng As Range, Clls As Range, Rng0 As Range, xRng As Range
 Dim jJ As Byte
  
 Set sRng = Range([c4], [c65500].End(xlUp))
 Set tRng = Range([b4], [b65500].End(xlUp))
 For jJ = 1 To 2
   Set xRng = Choose(jJ, [D4], [e4])
   Range(xRng, xRng.End(xlDown)).ClearContents
   For Each Clls In Choose(jJ, sRng, tRng)
      Set Rng0 = Choose(jJ, tRng, sRng).Find(Clls.Value, , xlFormulas, xlWhole)
      If Rng0 Is Nothing Then _
         Choose(jJ, [D65500], [e65500]).End(xlUp).Offset(1).Value = Clls.Value
   Next Clls
 Next jJ
End Sub
 
Upvote 0
Đến : Anh ChanhTQ@
Hơn 1 lần nhấn nút " Cám Ơn "
Đọc mà không hiểu thì mong anh hướng dẩn.
 
Upvote 0
PHP:
Option Explicit
Sub SoTangGiam()
 Dim tRng As Range, sRng As Range, Clls As Range, Rng0 As Range, xRng As Range
 Dim jJ As Byte
 
 Set sRng = Range([c4], [c65500].End(xlUp))
 Set tRng = Range([b4], [b65500].End(xlUp))
 For jJ = 1 To 2
   Set xRng = Choose(jJ, [D4], [e4])
   Range(xRng, xRng.End(xlDown)).ClearContents
   For Each Clls In Choose(jJ, sRng, tRng)
      Set Rng0 = Choose(jJ, tRng, sRng).Find(Clls.Value, , xlFormulas, xlWhole)
      If Rng0 Is Nothing Then _
         Choose(jJ, [D65500], [e65500]).End(xlUp).Offset(1).Value = Clls.Value
   Next Clls
 Next jJ
End Sub
-----------
Nếu được thì nhờ anh xem và sửa giúp 1 lần nửa.
Đính kèm file
 

File đính kèm

Upvote 0
-----------
Nếu được thì nhờ anh xem và sửa giúp 1 lần nửa.
Đính kèm file
Thử code này xem:
PHP:
Sub Compare2List()
  Dim List1 As Range, List2 As Range, Cll1 As Range, Cll2 As Range
  Dim Dic1, Dic2, Dic3
  Set Dic1 = CreateObject("Scripting.Dictionary")
  Set Dic2 = CreateObject("Scripting.Dictionary")
  Set Dic3 = CreateObject("Scripting.Dictionary")
  Set List1 = Range([B4], [B65536].End(xlUp))
  Set List2 = Range([C4], [C65536].End(xlUp))
  Range("D4:F60000").ClearContents
  With Application.WorksheetFunction
    For Each Cll1 In List1
      If .CountIf(List2, Cll1) Then
        Dic1.Add Cll1, Cll1
      Else
        Dic3.Add Cll1, Cll1
      End If
    Next Cll1
    For Each Cll2 In List2
      If .CountIf(List1, Cll2) = 0 Then
        Dic2.Add Cll2, Cll2
      End If
    Next Cll2
    Range("D4").Resize(Dic1.Count) = .Transpose(Dic1.Keys)
    Range("E4").Resize(Dic2.Count) = .Transpose(Dic2.Keys)
    Range("F4").Resize(Dic3.Count) = .Transpose(Dic3.Keys)
  End With
End Sub
Add toàn bộ những gì tìm được vào Dictionary Object, sau đó "quăng ra" bảng tính 1 lần duy nhất ---> Tôi nghĩ cách này cho tốc độ nhanh hơn (thay vì tìm đến đâu, "quăng" đến nấy)
 

File đính kèm

Upvote 0
To : NDU
Rất cám ơn sự nhiệt tình của bạn. Ý tôi là như thế này:
Code của anh ChanhTQ tôi đọc còn hiểu lờ mờ chút đỉnh, của NDU thì....mù tịt.
Bạn giúp tôi ( xin phép anh ChanhTQ trước ) thêm, sửa trên đoạn code của anh ChanhTQ để tôi: trước mắt xử dụng cho công việc, sau đó ( so sánh trước và sau ) để học, để có thể áp dụng vào việc khác ( không lẽ mỗi chút mỗi hỏi ).
Mong tin bạn.
 
Upvote 0
To : NDU
Rất cám ơn sự nhiệt tình của bạn. Ý tôi là như thế này:
Code của anh ChanhTQ tôi đọc còn hiểu lờ mờ chút đỉnh, của NDU thì....mù tịt.
Bạn giúp tôi ( xin phép anh ChanhTQ trước ) thêm, sửa trên đoạn code của anh ChanhTQ để tôi: trước mắt xử dụng cho công việc, sau đó ( so sánh trước và sau ) để học, để có thể áp dụng vào việc khác ( không lẽ mỗi chút mỗi hỏi ).
Mong tin bạn.
Vì bài trước bạn yêu cầu khác: Từ 2 list lọc ra 2 list nên sư phụ dùng hàm CHOOSE để gôm lại (cho gọn)
Bây giờ hơi khác 1 chút: Từ 2 list lọc ra 3 list nên không thể CHOOSE được, phải dùng 2 vòng lập riêng biệt
Tôi sửa trên code của sư phụ cho bạn đây:
PHP:
Sub SoTangGiam()
 Dim tRng As Range, sRng As Range, Clls As Range
 Set tRng = Range([B4], [B65500].End(xlUp))
 Set sRng = Range([C4], [C65500].End(xlUp))
 Range("D4:F65000").ClearContents
 For Each Clls In sRng
   If tRng.Find(Clls.Value, , xlFormulas, xlWhole) Is Nothing Then
      [E65500].End(xlUp).Offset(1).Value = Clls.Value
    Else
      [D65500].End(xlUp).Offset(1).Value = Clls.Value
    End If
  Next Clls
  For Each Clls In tRng
   If sRng.Find(Clls.Value, , xlFormulas, xlWhole) Is Nothing Then
      [F65500].End(xlUp).Offset(1).Value = Clls.Value
    End If
  Next Clls
End Sub
Thật ra thuật toán của tôi và sư phụ là giống nhau, chỉ khác về chi tiết quá trình:
- Sư phụ dùng Find để tìm, tôi dùng COUNTIF
- Khi tìm được, sư phụ cho nó vào cell luôn (tức tìm đến đâu ra kết quả đến nấy)... Còn tôi thì cho giá trị tìm được vào Dictionary Object (như thêm từ điển vậy)... Đến cuối quá trình mới cho toàn bộ vào bảng tính
 
Upvote 0
Vẫn cố đấm ăn sôi đây, xin mời tham khảo

PHP:
Option Explicit
Sub SoTangGiam()
 Dim tRng As Range, sRng As Range, Clls As Range, Rng0 As Range, xRng As Range
 Dim jJ As Long
  
 Set sRng = Range([c4], [c65500].End(xlUp))
 Set tRng = Range([b4], [b65500].End(xlUp))
 jJ = sRng.Rows.Count + tRng.Rows.Count
 [D4].Resize(jJ, 3).ClearContents
 For jJ = 1 To 2
   Set xRng = Choose(jJ, [E4], [F4])
   For Each Clls In Choose(jJ, sRng, tRng)
      Set Rng0 = Choose(jJ, tRng, sRng).Find(Clls.Value, , xlFormulas, xlWhole)
      If Rng0 Is Nothing Then
         Choose(jJ, [e65500], [F65500]).End(xlUp).Offset(1).Value = Clls.Value
      Else
         If jJ = 1 Then _
            [D65500].End(xlUp).Offset(1).Value = Clls.Value
      End If
   Next Clls
 Next jJ
End Sub

Thật ra thuật toán của tôi và sư phụ là giống nhau, chỉ khác về chi tiết:
- Dùng Find / COUNTIF
- Khi tìm được, sư cho nó vào cell luôn (tức tìm đến đâu ra kết quả đến nấy)... Còn tôi thì cho giá trị tìm được vào Dictionary Object (như thêm từ điển vậy)... Đến cuối quá trình mới cho toàn bộ vào bảng tính

Chưa thực nghiệm có quyền chưa tin 'Ai nhanh hơn ai!" :-= --=0 --=0
 
Upvote 0
Chưa thực nghiệm có quyền chưa tin 'Ai nhanh hơn ai!" :-= --=0 --=0
Em chắc ăn 100% vì đã thử nghiệm rồi:
- Find chậm hơn COUNTIF và MATCH
- Cho dử liệu tìm được vào mãng, sau đó mới ra kết quả ở cuối quá trình sẽ nhanh hơn so với cách tìm và ra kết quả ngay
- Có người nói rằng MATCH nhanh hơn COUNTIF ---> Em thí nghiệm trên vài chục ngàn dòng, thấy chẳng khác gì
 
Upvote 0
Mong các anh, em trên GPE xem và hướng dẩn giúp, tìm số lượng tăng giảm công nhân hàng tháng.
Cụ thể trong file đính kèm
Tôi vừa phát hiện ra 1 cách cực kỳ đơn giàn, dùng Advanced Filter... Bạn làm như sau:
1> Chỉnh lại bảng tính như hình dưới đây

attachment.php


Tức xóa công thức ở dòng 3 và gõ vào tiêu đề cột
2> Công thức của ĐK1, ĐK2ĐK3 là:
PHP:
=COUNTIF($C$4:$C$18,$B4)>0
PHP:
=COUNTIF($B$4:$B$16,$C4)=0
PHP:
=COUNTIF($C$4:$C$18,$B4)=0
3> Dùng Advanced Filter, Lọc List1 theo DK1... Lọc List2 theo DK2lọc List1 theo DK3
Vậy là xong!
Nếu không muốn làm bằng tay, ta cũng có thể viết code dựa trên cách làm này
PHP:
Sub Compare2List()
  Dim List1 As Range, List2 As Range
  Dim Dk1 As Range, Dk2 As Range, Dk3 As Range
  Set List1 = Range([B3], [B65536].End(xlUp))
  Set List2 = Range([C3], [C65536].End(xlUp))
  Set Dk1 = Range("H3:H4")
  Set Dk2 = Range("I3:I4")
  Set Dk3 = Range("J3:J4")
  List1.AdvancedFilter 2, Dk1, [D3]
  List2.AdvancedFilter 2, Dk2, [E3]
  List1.AdvancedFilter 2, Dk3, [F3]
End Sub
Bảo đảm ĐƠN GIẢN và NHANH
 

File đính kèm

Upvote 0
Trích NDU:
Tôi vừa phát hiện ra 1 cách cực kỳ đơn giàn, dùng Advanced Filter...
Rất trân trọng ý kiến của bạn .
Còn tôi cũng vừa phát hiện ra 1 lỗi cũng cực kỳ đơn giản:
- Trong trường hợp số thẻ (ST) vừa tăng, xong rồi lại giảm trong cùng 1 kỳ. Cụ thể là ST vào ngày 2, nghĩ vào ngày 20 chẳng hạn thì làm gì có trong bảng lương tháng ?
- Ghi chú:
* Lương nghỉ việc thanh toán 1 tháng 2 lần vào các ngày 15 và 2
* Lương bình thường vào ngày 5 của tháng sau
* ST : được đánh liên tục từ thấp đến cao.
Bạn có cao kiến gì không ? ( mời bạn uống cafe nhé )
 
Upvote 0
Trích NDU:
Tôi vừa phát hiện ra 1 cách cực kỳ đơn giàn, dùng Advanced Filter...
Rất trân trọng ý kiến của bạn .
Còn tôi cũng vừa phát hiện ra 1 lỗi cũng cực kỳ đơn giản:
- Trong trường hợp số thẻ (ST) vừa tăng, xong rồi lại giảm trong cùng 1 kỳ. Cụ thể là ST vào ngày 2, nghĩ vào ngày 20 chẳng hạn thì làm gì có trong bảng lương tháng ?
- Ghi chú:
* Lương nghỉ việc thanh toán 1 tháng 2 lần vào các ngày 15 và 2
* Lương bình thường vào ngày 5 của tháng sau
* ST : được đánh liên tục từ thấp đến cao.
Bạn có cao kiến gì không ? ( mời bạn uống cafe nhé )
Giải thuật dựa trên cơ sơ dử liệu thật mà ra... Vì vậy, để có được cách tính toán chính xác tôi cần dử liệu nhập của bạn, cụ thể phải có những trường hợp đặc biệt như bạn vừa nói trong file ---> Từ đó nghiên cứu và tìm giải thuật chính xác!
 
Upvote 0
Giải thuật dựa trên cơ sơ dử liệu thật mà ra... Vì vậy, để có được cách tính toán chính xác tôi cần dử liệu nhập của bạn, cụ thể phải có những trường hợp đặc biệt như bạn vừa nói trong file ---> Từ đó nghiên cứu và tìm giải thuật chính xác!
--------
Đã soát, xét lại quá trình nhập liệu.Nhờ các anh em GPE xem giúp ( lại phiền đến NDU)
Đính kèm file ( lần thứ 3 )
 

File đính kèm

Upvote 0
--------
Đã soát, xét lại quá trình nhập liệu.Nhờ các anh em GPE xem giúp ( lại phiền đến NDU)
Đính kèm file ( lần thứ 3 )
Theo như những gì bạn trình bày trong file thì:
- Ta chỉ cần tìm những số thể ổn định và số thẻ tăng
- Số thẻ giảm chính là cột D (số thể nghỉ việc)
Đúng không?
Tôi đề xuất code này:
PHP:
Sub Compare2List()
  Dim List1 As Range, List2 As Range, List3 As Range
  Dim Cll1 As Range, Cll2 As Range, Dic1, Dic2
  On Error Resume Next
  Set Dic1 = CreateObject("Scripting.Dictionary")
  Set Dic2 = CreateObject("Scripting.Dictionary")
  Set List1 = Range([B4], [B65536].End(xlUp))
  Set List2 = Range([C4], [C65536].End(xlUp))
  Set List3 = Range([D4], [D65536].End(xlUp))
  Range("E4:G60000").ClearContents
  With Application
    For Each Cll1 In List1.SpecialCells(2)
      If .CountIf(List2, Cll1) Then Dic1.Add Cll1, Cll1
    Next Cll1
    For Each Cll2 In List2.SpecialCells(2)
      If .CountIf(List1, Cll2) = 0 Then Dic2.Add Cll2, Cll2
    Next Cll2
    Range("E4").Resize(Dic1.Count) = .Transpose(Dic1.Keys)
    Range("F4").Resize(Dic2.Count) = .Transpose(Dic2.Keys)
    List3.SpecialCells(2).Copy: Range("G4").PasteSpecial 3
    .CutCopyMode = False
  End With
End Sub
Ngoài ra bạn vẫn có thể áp dụng Advanced Filter để tìm số thẻ ổn định và số thẻ tăng, riêng số thẻ giảm ta vẫn dùng cách copy từ cột D sang cột G
Ghi chú: Tôi dùng SpecialCells(2) với mục đích chỉ duyệt qua các cell có dử liệu (bỏ qua các cell rổng) ---> Như vậy sẽ tăng tốc độ làm việc cho code
 
Upvote 0
To: NDU
Có gì không phải thì RẤT MONG bạn bỏ qua.
Tôi xin nói thẳng : tôi là dân học kế toán, học excel cùa các trung tâm ( Biên Hòa ) được 1 tháng, Code trước của bạn dùng 2 vòng lặp thì tôi hiểu được ít nhiều ( rất quý ), bạn tuần tự thì tôi theo được ( dù rằng code có chậm nhưng tôi vẫn thích, tôi chấp nhận tôi dốt, nhưng tôi hiểu vấn đề), bạn cao quá thì tôi thua (đọc không nổi ), bạn viết tầm tầm thôi để tôi còn thở, bạn có thể xử dụng hàm find để giải quyết vấn đề này được không ?
Trích:
- Ta chỉ cần tìm những số thể ổn định và số thẻ tăng => chính xác
- Số thẻ giảm chính là cột D (số thể nghỉ việc) => Chính xác, nhưng có thể sắp xếp cùng 1 Số thẻ thì cùng 1 dòng được không bạn nhỉ ( như trong file đính kèm, vì việc này liên quan đến phân tích dữ liệu : lý do tại sao vừa nhận việc lại nghĩ..., từ số thẻ còn liên quan đến các tổ, mức độ ổn định của các tổ sản xuất ....)

Tôi thật sự rất trân trọng sự nhiệt tình của bạn và anh ChanhTQ@, không phải diển đàn nào cũng có được những thành viên như thế.
Có gì không phải thì RẤT MONG bạn bỏ qua.
 
Upvote 0
To: NDU
Có gì không phải thì RẤT MONG bạn bỏ qua.
Tôi xin nói thẳng : tôi là dân học kế toán, học excel cùa các trung tâm ( Biên Hòa ) được 1 tháng, Code trước của bạn dùng 2 vòng lặp thì tôi hiểu được ít nhiều ( rất quý ), bạn tuần tự thì tôi theo được ( dù rằng code có chậm nhưng tôi vẫn thích, tôi chấp nhận tôi dốt, nhưng tôi hiểu vấn đề), bạn cao quá thì tôi thua (đọc không nổi ), bạn viết tầm tầm thôi để tôi còn thở, bạn có thể xử dụng hàm find để giải quyết vấn đề này được không ?
Trích:
- Ta chỉ cần tìm những số thể ổn định và số thẻ tăng => chính xác
- Số thẻ giảm chính là cột D (số thể nghỉ việc) => Chính xác, nhưng có thể sắp xếp cùng 1 Số thẻ thì cùng 1 dòng được không bạn nhỉ ( như trong file đính kèm, vì việc này liên quan đến phân tích dữ liệu : lý do tại sao vừa nhận việc lại nghĩ..., từ số thẻ còn liên quan đến các tổ, mức độ ổn định của các tổ sản xuất ....)

Tôi thật sự rất trân trọng sự nhiệt tình của bạn và anh ChanhTQ@, không phải diển đàn nào cũng có được những thành viên như thế.
Có gì không phải thì RẤT MONG bạn bỏ qua.
Vâng! Không có gì đâu bạn à, vì trước đây tôi cũng vậy thôi: Chỉ áp dụng cái nào ta hiểu được, cái gì không hiểu sẽ không áp dụng... Ẹc... Ẹc...
Có điều tôi thấy cái Dictionary Object này nó quá đơn giản và dùng nó xử lý mãng là vô địch ---> Vì thế mà áp vào bài này (tôi đọc Help và hiểu được nguyên lý, tôi nghĩ bạn chắc cũng sẽ thừa hiểu)
Về vấn đề bạn yêu cầu:
nhưng có thể sắp xếp cùng 1 Số thẻ thì cùng 1 dòng được không bạn nhỉ
Nếu vậy thật sự quá đơn giản nếu ta dùng công thức:
Ví dụ:
PHP:
E4 =IF(COUNTA(B4:C4)=2,B4,"")
PHP:
F4 =IF(AND(B4="",C4<>""),C4,"")
PHP:
G4 =IF(D4="","",D4)
Bạn nghĩ sao?
-------------------
Tôi xin nói thẳng : tôi là dân học kế toán, học excel cùa các trung tâm ( Biên Hòa )
Vậy chắc nhà bạn ở Biên Hòa?
 
Lần chỉnh sửa cuối:
Upvote 0
Vậy chắc nhà bạn ở Biên Hòa?
Đúng vậy, tôi dân BH,ở BH, không biết NDU ở đâu ?
Tôi đã kiểm tra code của NDU, chắc có lẻ do tôi trình bày trong file không được rỏ ràng nên code NDU viết kết quả không được như mong muốn. Các số thẻ vừa tăng, vừa giảm chỉ ra được kết quả giảm mà không có tăng ( khi có kết quả thì có thể sắp xếp những trường hợp này cùng 1 dòng được không ?)
Đính kèm file
 

File đính kèm

Lần chỉnh sửa cuối:
Upvote 0
Vậy chắc nhà bạn ở Biên Hòa?
Đúng vậy, tôi dân BH,ở BH, không biết NDU ở đâu ?
Tôi đã kiểm tra code của NDU, chắc có lẻ do tôi trình bày trong file không được rỏ ràng nên code NDU viết kết quả không được như mong muốn. Các số thẻ vừa tăng, vừa giảm chỉ ra được kết quả giảm mà không có tăng ( khi có kết quả thì có thể sắp xếp những trường hợp này cùng 1 dòng được không ?)
Đính kèm file
Tôi đã hiểu ý bạn rồi ---> Mấu chốt nằm ở chổ các số thẻ giống nhau nằm trên 1 hàng, vì thế mà tôi đưa ra công thức
Nếu bạn muốn dùng code, tôi đề xuất:
PHP:
Sub Test()
  With Range([C4], [C65536].End(xlUp))
    .Offset(, 2).Value = "=IF(COUNTA(RC[-3]:RC[-2])=2,RC[-3],"""")"
    .Offset(, 3).Value = "=IF(AND(RC[-4]="""",RC[-3]<>""""),RC[-3],IF(AND(RC[-4]="""",RC[-2]<>""""),RC[-2],""""))"
    .Offset(, 4).Value = "=IF(RC[-3]="""","""",RC[-3])"
    With .Offset(, 2).Resize(, 3)
      .Value = .Value
    End With
  End With
End Sub
Đơn giản là tôi cho công thức ấy vào code
Bạn test lại thử
(Tôi cũng ở Biên Hòa luôn ---> Có thể uống cafe được đấy... ẹc... ẹc...)
 

File đính kèm

Upvote 0
Viết sao cho NDU hiểu. Bạn cố gắng giúp tôi vậy thì hãy mường tượng như thế này NDU hởi :
- Mở file " Số công nhân tăng giảm lần 3 "
- Các cột từ B4 đến B...,C4 đến C..., D4 đến D...là khu vực nhập liệu, các số thẻ không nằm ngay ngắn và theo thứ tự từ thấp đến cao, không có khoảng trắng
- Tôi trình bày trong file trước là đã sắp xếp cho dể hiểu thôi
File đính kèm
( Số thẻ đến thời điểm này là 900 - không dùng hàm choose được phải không ?)
(Tôi cũng ở Biên Hòa luôn ---> Có thể uống cafe được đấy... ẹc... ẹc...)
NDU ở phường nào ? Sao lại có thể uống cafe ? , bình thường thôi
Chúc mệt mà vui ( đừng có nổi quạo nhé)
 

File đính kèm

Upvote 0
Viết sao cho NDU hiểu. Bạn cố gắng giúp tôi vậy thì hãy mường tượng như thế này NDU hởi :
- Mở file " Số công nhân tăng giảm lần 3 "
- Các cột từ B4 đến B...,C4 đến C..., D4 đến D...là khu vực nhập liệu, các số thẻ không nằm ngay ngắn và theo thứ tự từ thấp đến cao, không có khoảng trắng
- Tôi trình bày trong file trước là đã sắp xếp cho dể hiểu thôi
File đính kèm
( Số thẻ đến thời điểm này là 900 - không dùng hàm choose được phải không ?)

NDU ở phường nào ? Sao lại có thể uống cafe ? , bình thường thôi
Chúc mệt mà vui ( đừng có nổi quạo nhé)
Quả thật rắc rối ghê ---> Rắc rối nằm ở chổ sắp xếp chứ việc tìm kiếm thì quá dể rồi
Hic...
Cũng cố làm nhát nữa xem thế nào:
PHP:
Sub Compare2List()
  Dim List1 As Range, List2 As Range, List3 As Range
  Dim Cll1 As Range, Cll2 As Range, Cll3 As Range, i As Long
  Set List1 = Range([B4], [B65536].End(xlUp))
  Set List2 = Range([C4], [C65536].End(xlUp))
  Set List3 = Range([D4], [D65536].End(xlUp))
  Range("E4:G60000").ClearContents
  With WorksheetFunction
    For Each Cll1 In List1
      If .CountIf(List2, Cll1) Then [E65536].End(xlUp)(2) = Cll1
    Next Cll1
    For Each Cll2 In List2
      If .CountIf(List1, Cll2) = 0 Then [F65536].End(xlUp)(2) = Cll2
    Next Cll2
    For Each Cll3 In List3
      If .CountIf(List1, Cll3) = 0 Then
        With Range("F65536").End(xlUp)
          .Offset(1, 0) = Cll3
          .Offset(1, 1) = Cll3
        End With
      Else
        Cells(i + 4, "G") = Cll3
        i = i + 1
      End If
    Next Cll3
  End With
End Sub
Phải công nhận là code mới nhất này CỦ CHUỐI nhất trong tất cả
Bạn kiểm tra lại xem nhé (không chắc là đúng)
(Tôi ở Trãng Dài ---> Hẹn uống cafe nếu có dịp... Ẹc.. Ẹc...)
 

File đính kèm

Lần chỉnh sửa cuối:
Upvote 0
Trước tiên cám ơn bạn cái đã.
- Tôi ở gần trường NGÔ QUYỀN, bạn cho tôi số tel, liên hệ xuống BH uống cafe cho vui ( không biết NDU bao nhiêu tuổi ? Cho dễ xưng hô hởi " Tác giả Đại Ca"...câu này của bạn )
- Đã kiểm tra code rất kỷ, kết quả.......
icon13.gif

Quả thật rắc rối ghê
- Bạn mà còn thấy như thế thì tôi như thế nào ?
- Bạn giải thích dùm tôi đọan code sau để tôi còn tiếp tục...
For Each Cll1 In List1
If .CountIf(List2, Cll1) Then [E65536].End(xlUp)(2) =
Cll1
Next Cll1

và đọan này :
For Each Cll3 In List3
If .CountIf(List1, Cll3) = 0 Then
With Range
("F65536").End(xlUp)
.
Offset(1, 0) = Cll3
.Offset(1, 1) = Cll3
End With
Else
Cells(i + 4, "G") = Cll3
i
= i + 1
End
If
Next Cll3
Mong tin.
 
Upvote 0
Trước tiên cám ơn bạn cái đã.
- Tôi ở gần trường NGÔ QUYỀN, bạn cho tôi số tel, liên hệ xuống BH uống cafe cho vui
Để nhắn tin riêng hen!
( không biết NDU bao nhiêu tuổi ? Cho dễ xưng hô hởi " Tác giả Đại Ca"...câu này của bạn )
Birthday = 06/10/1966
- Bạn giải thích dùm tôi đọan code sau để tôi còn tiếp tục...
PHP:
For Each Cll1 In List1
       If .CountIf(List2, Cll1) Then [E65536].End(xlUp)(2) = Cll1
     Next Cll1
- Duyệt các cell trong List1
- Nếu các cell này có tồn tại trong List2 thì "quăng" nó vào cột E, tại dưới cell cuối cùng có dử liệu
và đọan này :
PHP:
For Each Cll3 In List3
      If .CountIf(List1, Cll3) = 0 Then
        With Range("F65536").End(xlUp)
          .Offset(1, 0) = Cll3
          .Offset(1, 1) = Cll3
        End With
      Else
        Cells(i + 4, "G") = Cll3
        i = i + 1
      End If
    Next Cll3
Mong tin.
- Duyệt các cell trong List3
- Nếu các cell này không tòn tại trong List 1 thì "quăng" nó vào cột F, ngay dưới cell cuối cùng có dử liệu... Đồng thời cũng điền luôn vào cột G (cùng dòng) ---> Ngược lại thì điền từ cell F4 trở xuống! --> (Cells(i + 4, "G") = Cll3)
Chổ màu đỏ này tôi lo lắng nhất, có thể nó sẽ "đè" vào dử liệu trước đó
Lý ra nên là
Range("G4:G60000").SpecialCells(4).Areas(1)(1) = Cll3 thì chắc ăn hơn ---> Ý nghĩa của code này là: Trong cột G, thấy chổ nào còn trống thì điền vào
Bạn kiểm tra thế nào rồi?
 
Lần chỉnh sửa cuối:
Upvote 0
To : NDU
Tôi đã kiểm tra rất kỷ code của bạn, kết quả là ...thất bại hoàn toàn ( Cười lên đi )
Tôi không hiểu ý của bạn viết trong code nhưng tôi đoán (có đoán ở trong đây ) lỗi chắc chắn nằm ở đây :
Chổ màu đỏ này tôi lo lắng nhất, có thể nó sẽ "đè" vào dử liệu trước đó
Vì vậy tôi mới nhờ bạn giải thích đoạn code là như thế.
Vậy thì tiếp tục hay là ................cười?
NDU nhắn tin theo số :0917150322 ( NDU = tuổi em út tôi )
Mong tin
 
Upvote 0
To : NDU
Tôi đã kiểm tra rất kỷ code của bạn, kết quả là ...thất bại hoàn toàn ( Cười lên đi )
Tôi không hiểu ý của bạn viết trong code nhưng tôi đoán (có đoán ở trong đây ) lỗi chắc chắn nằm ở đây :

Vì vậy tôi mới nhờ bạn giải thích đoạn code là như thế.
Vậy thì tiếp tục hay là ................cười?
NDU nhắn tin theo số :0917150322 ( NDU = tuổi em út tôi )
Mong tin
Ai chà! Vậy phải gọi bằng anh rồi
Anh đã thử thay đoạn màu đỏ thành cái mới chưa?
Thất bại là thất bại chổ nào?
Tôi nghĩ file anh đưa lên chỉ là giả lập thôi, đúng không? Vậy sao anh không đưa file thật lên? ---> Vì đôi khi chúng ta giả lập chưa tổng quát cũng ảnh hưởng rất nhiều đến code đấy
(nếu không tiện đưa file lên, anh có thể gữi vào mail này: ndu96081631@yahoo.com)
 
Upvote 0
Nó đây chú NDU ơi .
Đính kèm fỉe ( 2 code trước và sau )
Nt cho anh đi.
Phùùùùùùùùùù ---> Chỉ có mỗi cái "SẮP XẾP" mà nó "nhọc" ghê!
Tạm thời làm cho anh theo phương án này:
PHP:
Sub Compare2List()
  Dim List1 As Range, List2 As Range, List3 As Range
  Dim Cll1 As Range, Cll2 As Range, Cll3 As Range, i As Long
  Set List1 = Range([B4], [B65536].End(xlUp))
  Set List2 = Range([C4], [C65536].End(xlUp))
  Set List3 = Range([D4], [D65536].End(xlUp))
  Range("E4:G60000").ClearContents
  With WorksheetFunction
    For Each Cll1 In List1
      If .CountIf(List2, Cll1) Then [E65536].End(xlUp)(2) = Cll1
    Next Cll1
    For Each Cll2 In List2
      If .CountIf(List1, Cll2) = 0 Then [F65536].End(xlUp)(2) = Cll2
    Next Cll2
    For Each Cll3 In List3
      If .CountIf(List1, Cll3) = 0 Then
        With Range("F65536").End(xlUp)
          .Offset(1, 0) = Cll3
          .Offset(1, 1) = Cll3
        End With
      End If
    Next Cll3
    For Each Cll3 In List3
      If .CountIf(List1, Cll3) Then [G65536].End(xlUp)(2) = Cll3
    Next Cll3
  End With
End Sub
Chẳng hay tí nào nhưng anh cứ test thử xem ---> Có gì thông báo lại cho em biết nhé!
(Điều anh yêu cầu cũng khá lý thú, tạo công ăn việc làm cho em nên chắc chắn em rất hào hứng chứ chẳng "quạo" gì... Ẹc... Ẹc... ---> Có điều em thấy nó không hay, để em cố gắng tìm phương án khác, nếu được em post lên cho anh)
 

File đính kèm

Lần chỉnh sửa cuối:
Upvote 0
To : Tác giả Đại Ca
Chậm trả lời do phải test code thật kỷ, kết quà => Chính xác
Chú xem file đính kèm sẽ thấy số liệu được sắp xếp rất dể thương, đúng yêu cầu.
Còn 1 yêu cầu nhỏ, ghi chú trong file.
Điều anh yêu cầu cũng khá lý thú
Kết quả thể hiện trong file thấy yêu cầu cũng bình thường, nhưng để đạt được thì oải quá phải không ?
Anh còn nhiều yêu cầu bình thường như thế.... Cười
Chúc thật vui
Trân trọng sự nhiệt tình của NDU
 

File đính kèm

Upvote 0
Còn 1 yêu cầu nhỏ, ghi chú trong file.
Yêu cầu của anh là:
Có hàm nào tính dược số vừa tăng vừa giảm không NDU nhỉ, như ví dụ dưới là =4
Cái này dể thôi:
PHP:
=SUMPRODUCT(1*(F4:F20=G4:G20))
hoặc:
PHP:
=SUMPRODUCT(COUNTIF(F4:F20,G4:G20))
Tham chiếu F4:F20 và G4:G20 anh tự chỉnh lại cho phù hợp với dử liệu thật nhé
 
Upvote 0

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

Back
Top Bottom