Công thức cộng trừ chuỗi và sắp xếp

Liên hệ QC

laohiep

Thành viên chính thức
Tham gia
29/11/08
Bài viết
58
Được thích
12
Mình cần sự giúp đỡ nho nhỏ:
Mình có 1 file rất nhiều line (như file đính kèm), Cột cuối tuần là kết quả mình cần (lưu ý là kết quả có sắp xếp theo thứ tự luôn)
Nghĩa là đầu tuần mình có chừng đó máy, cột chuyen di là mình xuất máy đi, cột chuyen den là nhận máy về và kết quả là số máy còn lại đầu tuần trừ chuyển đi cộng chuyển đến.
Bạn nào có giải pháp hay giúp mình nhá. Cảm ơn
 

File đính kèm

  • chuyen may.xls
    14.5 KB · Đọc: 67
Bài này nên gọi là Sắp xếp và tái Sắp xếp các món hàng. Theo em thì bạn nên liệt kê hết các sản phẩm ra rồi cho thông số kỹ thuật cho từng sản phẩm vậy sẽ dễ làm hơn. Ví dụ: Món hàng thứ 1 là 10; món hàng thứ 2 là 0, thứ 5 là 1, .v.v...
Và khi hàng ra vào thì cứ việc công trừ các loại hàng đó thôi. Cuối ngày mình kiểm kê lại những món hàng nào khác 0 là biết liền.
Thân.
 
Bài này nên gọi là Sắp xếp và tái Sắp xếp các món hàng. Theo em thì bạn nên liệt kê hết các sản phẩm ra rồi cho thông số kỹ thuật cho từng sản phẩm vậy sẽ dễ làm hơn. Ví dụ: Món hàng thứ 1 là 10; món hàng thứ 2 là 0, thứ 5 là 1, .v.v...
Và khi hàng ra vào thì cứ việc công trừ các loại hàng đó thôi. Cuối ngày mình kiểm kê lại những món hàng nào khác 0 là biết liền.
Thân.
Mình hiểu ý bạn nói, nhưng mà yêu cầu ở đây là phải để nguyên tên như vậy, và mình đang theo dõi sự luân chuyển của các loại hàng này, trong tuần nó đi cái nào và đến cái nào. mà mình phải theo dõi nhiều Line lắm nên cần có công thức để nhanh hơn thôi.
Bạn nào nghiên cứu được cách thì giúp mình náh.
Xin cảm ơn
 
Bài này nếu ko có cột phụ thì tôi thật sự chả biết làm cách gì (đang nói dùng công thức)
Xem file... Việc sort nhường lại cho các bạn vì tôi thấy cũng chẳng quan trọng lắm.
Nếu muốn sort kết quả sao ta ko sort dử liệu gốc trước (đở tốn công thức)
 

File đính kèm

  • Tonghop_Tonkho_01.xls
    20 KB · Đọc: 64
Lần chỉnh sửa cuối:
Đây là macro chép nối, chưa sắp xếp (Nếu muốn xếp thì fát ngôn tiếp!)

PHP:
Option Explicit
Sub ChuyenVi()
 Dim Rng As Range, Clls As Range
 
 Set Rng = Range("C3:C" & [c65500].End(xlUp).Row)
 Range("E3:E" & [e65500].End(xlUp).Row).Clear
 For Each Clls In Range("B3:B" & [b65500].End(xlUp).Row)
    If Rng.Find(what:=Clls.Value, LookIn:=xlFormulas, lookat:=xlWhole) Is Nothing Then _
        [e65500].End(xlUp).Offset(1).Value = Clls.Value
 Next Clls
 Set Rng = Nothing
 Set Rng = Range([d3], [d65500].End(xlUp))
 If Not Rng Is Nothing Then _
    [e65500].End(xlUp).Offset(1).Resize(Rng.Rows.Count).Value = Rng.Value
End Sub
 
PHP:
Option Explicit
Sub ChuyenVi()
 Dim Rng As Range, Clls As Range
 
 Set Rng = Range("C3:C" & [c65500].End(xlUp).Row)
 Range("E3:E" & [e65500].End(xlUp).Row).Clear
 For Each Clls In Range("B3:B" & [b65500].End(xlUp).Row)
    If Rng.Find(what:=Clls.Value, LookIn:=xlFormulas, lookat:=xlWhole) Is Nothing Then _
        [e65500].End(xlUp).Offset(1).Value = Clls.Value
 Next Clls
 Set Rng = Nothing
 Set Rng = Range([d3], [d65500].End(xlUp))
 If Not Rng Is Nothing Then _
    [e65500].End(xlUp).Offset(1).Resize(Rng.Rows.Count).Value = Rng.Value
End Sub
Sư phụ ơi, code này sẽ không còn chính xác nếu sau khi ta "chuyển đến" 1 máy nào đó rồi lại "chuyển đi" (tức cột C và D có tên trùng nhau)
 
Bài này nếu ko có cột phụ thì tôi thật sự chả biết làm cách gì (đang nói dùng công thức)
Xem file... Việc sort nhường lại cho các bạn vì tôi thấy cũng chẳng quan trọng lắm.
Nếu muốn sort kết quả sao ta ko sort dử liệu gốc trước (đở tốn công thức)
Chân thành cảm ơn anhtuan1066, nhưng nếu với công thức này khi em áp dụng cho nhiều line thì phải sửa lại vùng chọn nữa đúng không?
 
PHP:
Option Explicit
Sub ChuyenVi()
 Dim Rng As Range, Clls As Range
 
 Set Rng = Range("C3:C" & [c65500].End(xlUp).Row)
 Range("E3:E" & [e65500].End(xlUp).Row).Clear
 For Each Clls In Range("B3:B" & [b65500].End(xlUp).Row)
    If Rng.Find(what:=Clls.Value, LookIn:=xlFormulas, lookat:=xlWhole) Is Nothing Then _
        [e65500].End(xlUp).Offset(1).Value = Clls.Value
 Next Clls
 Set Rng = Nothing
 Set Rng = Range([d3], [d65500].End(xlUp))
 If Not Rng Is Nothing Then _
    [e65500].End(xlUp).Offset(1).Resize(Rng.Rows.Count).Value = Rng.Value
End Sub
anh ChanhTQ@ ơi, em cũng xin cảm ơn anh đã nghĩ cách giúp em, nhưng đoạn code của anh phức tạp quá, với lại em chưa biết nhiều về Macro nên khó để mà ứng dụng nó. Chúc anh có nhiều giải pháp hay để giúp mọi người. Cảm ơn!!!
 
Em sửa lại code của sư phụ như sau:
PHP:
Option Explicit
Sub ChuyenVi()
 Dim Rng As Range, Clls As Range, Temp As Range
 Set Rng = Range([C3], [C65500].End(xlUp))
 Range([E2], [E65500].End(xlUp)).Offset(1).ClearContents
 Range([D3], [D65500].End(xlUp)).Copy
 With Range([B3], [B65500].End(xlUp))
   .End(xlDown)(2, 1).PasteSpecial 3
   Set Temp = Selection
   For Each Clls In Union(.Cells, Temp)
     If Rng.Find(Clls, , xlFormulas, xlWhole) Is Nothing Then _
        [E65500].End(xlUp).Offset(1) = Clls
   Next Clls
   Temp.ClearContents
 End With
End Sub
(code của sư phụ còn bị thêm 1 chiêu nữa là xóa mất tiêu đề, em đã sửa lại)
 

File đính kèm

  • Sualai.xls
    22.5 KB · Đọc: 34
Chân thành cảm ơn anhtuan1066, nhưng nếu với công thức này khi em áp dụng cho nhiều line thì phải sửa lại vùng chọn nữa đúng không?
Bạn nói "nhiều line" nghĩa là sao? Tôi chưa hiểu!
Nếu "nhiều line" là nhiều dòng thì ko sao, name là name động, sẽ tự động cập nhật
 
Rút gọn tiếp lần nữa:
PHP:
Sub ChuyenVi()
 Dim Clls As Range
 Range([E2], [E65500].End(xlUp)).Offset(1).ClearContents
 With Range([C3], [C65500].End(xlUp))
   For Each Clls In Union(Range([B3], [B65500].End(xlUp)), Range([D3], [D65500].End(xlUp)))
     If .Find(Clls, , xlFormulas, xlWhole) Is Nothing Then _
        [E65500].End(xlUp).Offset(1) = Clls
   Next Clls
 End With
End Sub
 

File đính kèm

  • Chuyenmay_02.xls
    22.5 KB · Đọc: 13
Gọn thì có gọn, nhưng hiệu quả thì phải so thêm tẹo nữa!

Rút gọn tiếp lần nữa:
PHP:
Sub ChuyenVi()
 Dim Clls As Range
 Range([E2], [E65500].End(xlUp)).Offset(1).ClearContents
 With Range([C3], [C65500].End(xlUp))
   For Each Clls In Union(Range([B3], [B65500].End(xlUp)), Range([D3], [D65500].End(xlUp)))
     If .Find(Clls, , xlFormulas, xlWhole) Is Nothing Then _
        [E65500].End(xlUp).Offset(1) = Clls
   Next Clls
 End With
End Sub
:-=

Giữa vòng lặp & phép gán sẽ khác nhau, nếu dữ liệu là nhiều, chú NDU à!
 
Cảm ơn sư phụ!
Em nhận thấy rằng FOR trong vùng cột B và D thì số lần quét sẽ nhiều hơn... vậy theo em, ta nên quét với vùng ít hơn (là vùng máy chuyển đi)
Cải tiến lại:
PHP:
Sub ChuyenVi()
  Dim Clls As Range
  Range([E2], [E65500].End(xlUp)).Offset(1).ClearContents
  With Range([B3], [B65500].End(xlUp))
    Range("E65500").End(xlUp).Offset(1).Resize(.Rows.Count).Value = .Value
  End With
  With Range([D3], [D65500].End(xlUp))
    Range("E65500").End(xlUp).Offset(1).Resize(.Rows.Count).Value = .Value
  End With
  With Range([E3], [E65500].End(xlUp))
    For Each Clls In Range([C3], [C65500].End(xlUp))
      With .Find(Clls, , xlFormulas, xlWhole)
        If Not .Cells Is Nothing Then .Cells.Delete Shift:=xlUp
      End With
    Next Clls
  End With
End Sub
Em nghĩ code này có dài hơn nhưng tốc độ có lẽ sẽ nhanh hơn cái trước!
Sư phụ góp ý thêm với!
 

File đính kèm

  • Chuyenmay_03.xls
    25.5 KB · Đọc: 23
Web KT
Back
Top Bottom