Giải thích giúp về code lọc dữ liệu (1 người xem)

Liên hệ QC

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

pchuanhac7

Thành viên mới
Tham gia
8/1/09
Bài viết
16
Được thích
3
phiền anh NDU chút nữa vậy.

PHP:
Private Sub Worksheet_Change(ByVal Target As Range)
  Dim Clls As Range
  On Error Resume Next
  If Target.Address = "$B$1" Then 
    Application.ScreenUpdating = False
    Range("A2:A65536").ClearContents
    With Sheet1.Range("A1").CurrentRegion
      .AutoFilter 1, "*" & Target & "*", xlAnd, IIf(Target = "SR10", "*", "<>*SR10*") 
      .Offset(1).SpecialCells(12).Copy
      Range("A2").PasteSpecial 3  
     .AutoFilter
    End With
    For Each Clls In Range([A2], [A65536].End(xlUp))
      Clls = Mid(Clls, 1, InStr(Clls, ",") - 1)
    Next Clls
    Target.Select
    Application.ScreenUpdating = True
  End If
End Sub
nếu như trong bảng trên có nhiều cột.cần sửa làm sao để đoạn code trên có thể copy nhiều cột qua sheet khác. làm sao biết được là đang kiểm tra điều kiện trên cột nào? nếu muốn thay đổi việc kiểm tra điều kiện trên cột khác thì thay đồi tại chỗ nào. mong anh giúp đỡ nhiều.
 
phiền anh NDU chút nữa vậy.

PHP:
Private Sub Worksheet_Change(ByVal Target As Range)
  Dim Clls As Range
  On Error Resume Next
  If Target.Address = "$B$1" Then 
    Application.ScreenUpdating = False
    Range("A2:A65536").ClearContents
    With Sheet1.Range("A1").CurrentRegion
      .AutoFilter 1, "*" & Target & "*", xlAnd, IIf(Target = "SR10", "*", "<>*SR10*") 
      .Offset(1).SpecialCells(12).Copy
      Range("A2").PasteSpecial 3  
     .AutoFilter
    End With
    For Each Clls In Range([A2], [A65536].End(xlUp))
      Clls = Mid(Clls, 1, InStr(Clls, ",") - 1)
    Next Clls
    Target.Select
    Application.ScreenUpdating = True
  End If
End Sub
nếu như trong bảng trên có nhiều cột.cần sửa làm sao để đoạn code trên có thể copy nhiều cột qua sheet khác. làm sao biết được là đang kiểm tra điều kiện trên cột nào? nếu muốn thay đổi việc kiểm tra điều kiện trên cột khác thì thay đồi tại chỗ nào. mong anh giúp đỡ nhiều.
Code phải tùy theo tình hình cụ thể của dử liệu mới có thể chạy chính xác được... Vì thế nếu mang code của người khác về mà không biết tùy biến thì cũng bằng không... Tốt nhất bạn đưa file lên đi ---> Giải thích trực tiếp vào file thật của bạn cho dể
 
Upvote 0
trong bảng trên em muốn lọc với các điều kiện sau.
1. lọc theo từng ngày.
2. lọc từ ngày đến ngày.
3. lọc theo BKS
4. lọc theo chủ xe.
mỗi bảng lọc của em phải nằm trên các sheet khác nhau.(nếu không em dùng autofilter rồi -0-/.)
và em muôn cứ mỗi khi chọn điều kiện lọc tại mối bảng như trong bài trước của anh thì dữ liệu sẽ tự động cập nhật luôn.(sử dụng validation giống bài của anh NDU đó).
(mong sớm nhận được sự trả lời của các bác)
 

File đính kèm

Lần chỉnh sửa cuối:
Upvote 0
trong bảng trên em muốn lọc với các điều kiện sau.
1. lọc theo từng ngày.
2. lọc từ ngày đến ngày.
3. lọc theo BKS
4. lọc theo chủ xe.
mỗi bảng lọc của em phải nằm trên các sheet khác nhau.(nếu không em dùng autofilter rồi -0-/.)
và em muôn cứ mỗi khi chọn điều kiện lọc tại mối bảng như trong bài trước của anh thì dữ liệu sẽ tự động cập nhật luôn.(sử dụng validation giống bài của anh NDU đó).
(mong sớm nhận được sự trả lời của các bác)
Bạn gữi lên đây luôn các sheet kết quả (sau khi đã lọc bằng tay) cho dể hình dung
Vì xem file xong chỉ mới biết được có điều kiện lọc! Còn lọc ra đâu? Cách thiết kế bảng tính (giao diện) sau khi lọc nó như thế nào vẫn chưa thấy bạn đề cập đến
 
Upvote 0
gửi các anh file lọc bằng tay của em.
Vừa xem file của bạn xong! Tạm hiểu (90%)
Còn lại 1 chổ chưa hiểu: Tại cột Chủ xe có những dòng trống, vậy nó có ý nghĩa gì? Không có chủ xe à? Lý nào lại thế! Có biển số phải có chủ xe chứ nhỉ? Hay bảng dò dử liệu của bạn (tại sheet Chuxe) đang điền thiếu dử liệu đây?
 
Lần chỉnh sửa cuối:
Upvote 0
đúng là trong bảng, trong cột chủ xe có những dòng trống. đó không phải là em điền thiếu mà tại vì những xe đó không có chủ mình chỉ kiểm soát các xe đó bằng biển số thôi. vì 1 số xe cả tuần hay 1 tháng mới vào 1 lần. không lấy thường xuyên nên em thấy không cần thiết phải điền vào.
(mong các bác làm nhanh dùm em với, em đang cần gấp lắm -+*/)

cảm ơn các bác nhiều.
 
Lần chỉnh sửa cuối:
Upvote 0
các pro giúp em code lọc dữ liệu của bài trên cái. em đang cần gấp lắm.em cảm ơn trước.
 
Upvote 0
các pro giúp em code lọc dữ liệu của bài trên cái. em đang cần gấp lắm.em cảm ơn trước.
Lý ra bài này không phải là khó lắm! Gợi ý chọn bạn:
- Thay vì lọc ra nhiều sheet, bạn chỉ cần 1 sheet là đủ ---> Lọc tiêu chí nào thì chọn vào Validation
- Phương pháp lọc tốt nhất tôi nghĩ không ngoài AutoFilterAdvanced Filter
Bạn cố suy nghĩ xem, nếu bạn có thể lọc bằng tay được thì đương nhiên sẽ biến thành code được (cố gắng lọc bằng tay thành công thì record macro quá trình ấy)
Tự làm cho quen tay bạn à! (dạng này làm tới làm lui hoài, chẳng có gì mới mẻ)
 
Upvote 0
em thử làm record macro rồi, nhưng lọc trên 1 sheet thì được. em ko bít làm sao để lấy điều kiện bên sheet khác và ko biết làm sao để copy được phần lọc đó qua sheet khác.
mong anh hướng dẫn thêm.
 
Upvote 0
em thử làm record macro rồi, nhưng lọc trên 1 sheet thì được. em ko bít làm sao để lấy điều kiện bên sheet khác và ko biết làm sao để copy được phần lọc đó qua sheet khác.
mong anh hướng dẫn thêm.
Với Advanced Filter thì bạn phải lưu ý điều này:
- Giả sử bạn có 2 sheet: NGUON (chứa dử liệu nhập) và DICH (chứa dử liệu cần lọc)
- Để có thể dùng Advanced Filter, bạn phải đứng ở sheet DICH mà gọi Advanced Filter
- Tức điều kiện lọc nằm tại sheet ta đang đứng, còn List Range thì nằm ở sheet khác
Nếu bạn làm ngược lại: Đứng ở sheet NGUON rồi gọi Advanced Filter thì nó sẽ không chạy
 
Upvote 0
code lọc dữ liệu.

cho em hỏi, vì sao đoạn code sau không lọc dữ liệu theo ngày tháng được?(lọc theo chỗi thì ok)
mấy anh xem rồi sửa lại cho em với. nếu muốn lọc dữ liệu từ ngày đến ngày thì phải làm sao?
PHP:
Private Sub Worksheet_Change(ByVal Target As Range)
  Dim Clls As Range
  On Error Resume Next
  If Target.Address = "$F$3" Then
    Application.ScreenUpdating = False
    Range("A10:o65536").ClearContents
    With Sheet1.Range("A13").CurrentRegion
      .AutoFilter 1, "*" & Target
      .Offset(1).SpecialCells(12).Copy
      Range("A10").PasteSpecial 3
      .AutoFilter
    End With
    Target.Select
    Application.ScreenUpdating = True
  End If
End Sub
 
Upvote 0
cho em hỏi, vì sao đoạn code sau không lọc dữ liệu theo ngày tháng được?(lọc theo chỗi thì ok)
mấy anh xem rồi sửa lại cho em với. nếu muốn lọc dữ liệu từ ngày đến ngày thì phải làm sao?
PHP:
Private Sub Worksheet_Change(ByVal Target As Range)
  Dim Clls As Range
  On Error Resume Next
  If Target.Address = "$F$3" Then
    Application.ScreenUpdating = False
    Range("A10:o65536").ClearContents
    With Sheet1.Range("A13").CurrentRegion
      .AutoFilter 1, "*" & Target
      .Offset(1).SpecialCells(12).Copy
      Range("A10").PasteSpecial 3
      .AutoFilter
    End With
    Target.Select
    Application.ScreenUpdating = True
  End If
End Sub
Bạn đưa cả file + code lên luôn đi, chứ nhìn code thế thì sao biết được bạn đang lọc tại sheet nào (ví dụ: If Target.Address = "$F$3" Then là đang nói đến Sheet nào đây?)
 
Upvote 0
nhờ anh xem rồi viết dùm em đoạn code lọc từ ngày đến ngày luôn nhé.
 

File đính kèm

Upvote 0
nhờ anh xem rồi viết dùm em đoạn code lọc từ ngày đến ngày luôn nhé.
Sửa code lại thế này là được:
PHP:
Private Sub Worksheet_Change(ByVal Target As Range)
  Dim Clls As Range
  On Error Resume Next
  If Not Intersect([C2:C3], Target) Is Nothing Then
    Application.ScreenUpdating = False
    Range("A10:L65536").ClearContents
    With Sheet1.Range("A12").CurrentRegion
      .AutoFilter 1, ">=" & CDbl([C2]), xlAnd, "<=" & CDbl([C3])
      .Offset(1).SpecialCells(12).Copy
      Range("A10").PasteSpecial 3
      .AutoFilter
    End With
    Target.Select
    Application.ScreenUpdating = True
  End If
End Sub
Lưu ý:
- Vì lọc TỪ NGÀY.. ĐẾN NGÀY nên Target của bạn là 2 cell (không phải 1 cell F3)... vì thế mà có đoạn If Not Intersect([C2:C3], Target) Is Nothing Then
- Muốn lọc trong 1 ngày, chỉ cần gõ ngày giống nhau vào C2 và C3
- Khi dùng AutoFilter để lọc dử liệu có liên quan đến ngày tháng, hãy nhớ nằm lòng đoạn: CDbl(cell chứa ngày)
Xem file
 

File đính kèm

Upvote 0
Sửa code lại thế này là được:
PHP:
Private Sub Worksheet_Change(ByVal Target As Range)
  Dim Clls As Range
  On Error Resume Next
  If Not Intersect([C2:C3], Target) Is Nothing Then
    Application.ScreenUpdating = False
    Range("A10:L65536").ClearContents
    With Sheet1.Range("A12").CurrentRegion
      .AutoFilter 1, ">=" & CDbl([C2]), xlAnd, "<=" & CDbl([C3])
      .Offset(1).SpecialCells(12).Copy
      Range("A10").PasteSpecial 3
      .AutoFilter
    End With
    Target.Select
    Application.ScreenUpdating = True
  End If
End Sub
Lưu ý:
- Vì lọc TỪ NGÀY.. ĐẾN NGÀY nên Target của bạn là 2 cell (không phải 1 cell F3)... vì thế mà có đoạn If Not Intersect([C2:C3], Target) Is Nothing Then
- Muốn lọc trong 1 ngày, chỉ cần gõ ngày giống nhau vào C2 và C3
- Khi dùng AutoFilter để lọc dử liệu có liên quan đến ngày tháng, hãy nhớ nằm lòng đoạn: CDbl(cell chứa ngày)
Xem file

Chào anh!

Đoạn code anh đã lập rất ngắn gọn và hiệu quả!

Tuy nhiên, em có một chút nhờ anh chỉ giáo:

Cũng vẫn với điều kiện lọc theo từ ngày, đến ngày như anh đã viết code nhưng không lấy nguyên bảng dữ liệu từ sheet xuat qua sheet locngay mày em chỉ muốn lấy một số cột (như đã định sẵn bên sheet locngay, thì phải sửa code ra sao anh?

Mong sớm nhận được hồi âm và sự giúp đỡ của anh!
(Anh xem file đính kèm)
 

File đính kèm

Upvote 0
Chào anh!

Đoạn code anh đã lập rất ngắn gọn và hiệu quả!

Tuy nhiên, em có một chút nhờ anh chỉ giáo:

Cũng vẫn với điều kiện lọc theo từ ngày, đến ngày như anh đã viết code nhưng không lấy nguyên bảng dữ liệu từ sheet xuat qua sheet locngay mày em chỉ muốn lấy một số cột (như đã định sẵn bên sheet locngay, thì phải sửa code ra sao anh?

Mong sớm nhận được hồi âm và sự giúp đỡ của anh!
(Anh xem file đính kèm)


Gửi cho bạn file này tham khảo
 

File đính kèm

Upvote 0
Gửi cho bạn file này tham khảo
Bài này mà bạn XuanThanh dùng vòng lập thì phải nói là.. quá dở luôn ---> Dử liệu càng nhiều thì tốc độ càng rất chậm ---> Sao có thể so sánh được với các chức năng sẳn có của Excel
Bạn Tony Jaa xem đây, chỉ cần thêm Union vào nữa là xong, muốn cắt bất cứ cột nào cũng được cả:
PHP:
Private Sub Worksheet_Change(ByVal Target As Range)
  If Not Intersect([C2:C3], Target) Is Nothing Then
    On Error Resume Next
    Application.ScreenUpdating = False
    Range("A11:G65536").ClearContents
    With Sheet1.Range(Sheet1.[A12], Sheet1.[K65536].End(xlUp))
      .AutoFilter 2, ">=" & CDbl([C2]), xlAnd, "<=" & CDbl([C3])
      Union(.Offset(1, 0).Resize(, 2), .Offset(1, 3).Resize(, 4), .Offset(1, 10).Resize(, 1)).SpecialCells(12).Copy
      Range("A11").PasteSpecial 3
      .AutoFilter
    End With
    Target.Select
    With Range("A10").CurrentRegion
      If .Rows.Count > 1 Then
        .Resize(, 1).SpecialCells(2, 1).Value = Evaluate("ROW(R:R)")
      End If
    End With
    Application.ScreenUpdating = True
  End If
End Sub
Code dài thêm 1 chút là vì tôi làm luôn phần đánh STT cho bạn
Bạn chú ý thêm: Bên sheet xuat, ở các dòng cuối cùng có 1 mớ lằng nhằng gì đó (hãy xóa đi cho nó nhẹ file nhé)
 

File đính kèm

Upvote 0
Bài này mà bạn XuanThanh dùng vòng lập thì phải nói là.. quá dở luôn ---> Dử liệu càng nhiều thì tốc độ càng rất chậm ---> Sao có thể so sánh được với các chức năng sẳn có của Excel
Bạn Tony Jaa xem đây, chỉ cần thêm Union vào nữa là xong, muốn cắt bất cứ cột nào cũng được cả:
PHP:
Private Sub Worksheet_Change(ByVal Target As Range)
  If Not Intersect([C2:C3], Target) Is Nothing Then
    On Error Resume Next
    Application.ScreenUpdating = False
    Range("A11:G65536").ClearContents
    With Sheet1.Range(Sheet1.[A12], Sheet1.[K65536].End(xlUp))
      .AutoFilter 2, ">=" & CDbl([C2]), xlAnd, "<=" & CDbl([C3])
      Union(.Offset(1, 0).Resize(, 2), .Offset(1, 3).Resize(, 4), .Offset(1, 10).Resize(, 1)).SpecialCells(12).Copy
      Range("A11").PasteSpecial 3
      .AutoFilter
    End With
    Target.Select
    With Range("A10").CurrentRegion
      If .Rows.Count > 1 Then
        .Resize(, 1).SpecialCells(2, 1).Value = Evaluate("ROW(R:R)")
      End If
    End With
    Application.ScreenUpdating = True
  End If
End Sub
Code dài thêm 1 chút là vì tôi làm luôn phần đánh STT cho bạn
Bạn chú ý thêm: Bên sheet xuat, ở các dòng cuối cùng có 1 mớ lằng nhằng gì đó (hãy xóa đi cho nó nhẹ file nhé)


Cám ơn vì cái Union này
 
Upvote 0
PHP:
Private Sub Worksheet_Change(ByVal Target As Range)
  If Not Intersect([C2:C3], Target) Is Nothing Then
    On Error Resume Next
    Application.ScreenUpdating = False
    Range("A11:G65536").ClearContents
    With Sheet1.Range(Sheet1.[A12], Sheet1.[K65536].End(xlUp))
      .AutoFilter 2, ">=" & CDbl([C2]), xlAnd, "<=" & CDbl([C3])
      Union(.Offset(1, 0).Resize(, 2), .Offset(1, 3).Resize(, 4), .Offset(1, 10).Resize(, 1)).SpecialCells(12).Copy
      Range("A11").PasteSpecial 3
      .AutoFilter
    End With
    Target.Select
    With Range("A10").CurrentRegion
      If .Rows.Count > 1 Then
        .Resize(, 1).SpecialCells(2, 1).Value = Evaluate("ROW(R:R)")
      End If
    End With
    Application.ScreenUpdating = True
  End If
End Sub

Code cực kỳ ngắn gọn và hiệu quả, nhưng em chưa hiểu cái đoạn Union, bác làm ơn giải thích dùm em để em biết ứng dụng cho các trường hợp khác nữa (có nghĩa là khi muốn trích lọc được các cột dữ liệu theo ý của mình, thì phải thay đổi các thông số nào trong cái Union?)

PHP:
      Union(.Offset(1, 0).Resize(, 2), .Offset(1, 3).Resize(, 4), .Offset(1, 10).Resize(, 1)).SpecialCells(12).Copy

Cảm ơn bác nhé!
 
Upvote 0
Code cực kỳ ngắn gọn và hiệu quả, nhưng em chưa hiểu cái đoạn Union, bác làm ơn giải thích dùm em để em biết ứng dụng cho các trường hợp khác nữa (có nghĩa là khi muốn trích lọc được các cột dữ liệu theo ý của mình, thì phải thay đổi các thông số nào trong cái Union?)

PHP:
      Union(.Offset(1, 0).Resize(, 2), .Offset(1, 3).Resize(, 4), .Offset(1, 10).Resize(, 1)).SpecialCells(12).Copy
Cảm ơn bác nhé!
Union dùng để kết hợp các vùng nằm cách biệt nhau thành 1
Giải thích từng đoạn nhé:
.Offset(1, 0).Resize(, 2)A12:B517 tại sheet xuat (vùng 1)
.Offset(1, 3).Resize(, 4)D12:G517 tại sheet xuat (vùng 2)
.Offset(1, 10).Resize(, 1)K12:K517 tại sheet xuat (vùng 3)
.SpecialCells(12) nghĩa là chỉ chọn dòng nào đang hiện, dòng ẩn không chọn (vì sau khi AutoFilter sẽ có 1 số dòng không đạt đ/k lọc được ẩn đi)
Union(vùng 1, vùng 2, vùng 3).SpecialCells(12).Copy gần tương đương với việc quét chọn vùng 1, bấm giữ Ctrl, quét vùng 2, vẫn giữ Ctrl và quét chọn vùng 3 rồi bấm Ctrl + C
Quá đơn giản phải không?
Tôi giả sử các bạn không biết đến cái Union này thì cùng lắm ta copy 3 lần, paste 3 lần cũng chẳng sao
 
Lần chỉnh sửa cuối:
Upvote 0
Union dùng để kết hợp các vùng nằm cách biệt nhau thành 1
Giải thích từng đoạn nhé:
.Offset(1, 0).Resize(, 2)A12:B517 tại sheet xuat (vùng 1)
.Offset(1, 3).Resize(, 4)D12:G517 tại sheet xuat (vùng 2)
.Offset(1, 10).Resize(, 1)K12:K517 tại sheet xuat (vùng 3)
.SpecialCells(12) nghĩa là chỉ chọn dòng nào đang hiện, dòng ẩn không chọn (vì sau khi AutoFilter sẽ có 1 số dòng không đạt đ/k lọc được ẩn đi)
Union(vùng 1, vùng 2, vùng 3).SpecialCells(12).Copy gần tương đương với việc quét chọn vùng 1, bấm giữ Ctrl, quét vùng 2, vẫn giữ Ctrl và quét chọn vùng 3 rồi bấm Ctrl + C
Quá đơn giản phải không?
Tôi giả sử các bạn không biết đến cái Union này thì cùng lắm ta copy 3 lần, paste 3 lần cũng chẳng sao

Rất cảm ơn bác về cách giải thích tận tình và dễ hiểu!

Bây giờ nhờ bác tí nữa, bác sửa code để trích lọc dữ liệu theo 3 điều kiện (bác xem file đính kèm)
 

File đính kèm

Upvote 0
Rất cảm ơn bác về cách giải thích tận tình và dễ hiểu!

Bây giờ nhờ bác tí nữa, bác sửa code để trích lọc dữ liệu theo 3 điều kiện (bác xem file đính kèm)
Lần trước ta AutoFilter cột 2, giờ thêm AutoFilter cột 11 nữa là xong chứ gì
Cụ thể:
PHP:
Private Sub Worksheet_Change(ByVal Target As Range)
  If Not Intersect(Union([C2:D2], [C3]), Target) Is Nothing Then
    On Error Resume Next
    Application.ScreenUpdating = False
    Range("A11:G65536").ClearContents
    With Sheet1.Range(Sheet1.[A12], Sheet1.[K65536].End(xlUp))
      .AutoFilter 2, ">=" & CDbl([C2]), xlAnd, "<=" & CDbl([D2])
      .AutoFilter 11, [C3]
      Union(.Offset(1, 0).Resize(, 2), .Offset(1, 3).Resize(, 4), .Offset(1, 10).Resize(, 1)).SpecialCells(12).Copy
      Range("A11").PasteSpecial 3
      .AutoFilter
    End With
    Target.Select
    With Range("A10").CurrentRegion
      If .Rows.Count > 1 Then
        .Resize(, 1).SpecialCells(2, 1).Value = Evaluate("ROW(R:R)")
      End If
    End With
    Application.ScreenUpdating = True
    MsgBox "Da thuc hien xong!", vbInformation, "Thong Bao"
  End If
Thêm bao nhiêu điều kiện nữa cũng được tuốt
Chú ý thêm:
Thông thường người dùng muốn rằng: Nếu xóa điều kiện thứ 2 đi (điều kiện gõ tại C3) thì đồng nghĩa là chỉ lọc theo ngày tháng, còn điều kiện LOẠI thì lấy toàn bộ... vậy ta sửa lại nhau sau:
Thay:
PHP:
.AutoFilter 11, [C3]
thành:
PHP:
.AutoFilter 11, IIf([C3] = "", "<>", [C3])
Vậy toàn bộ code cho bạn sẽ là:
PHP:
Private Sub Worksheet_Change(ByVal Target As Range)
  If Not Intersect(Union([C2:D2], [C3]), Target) Is Nothing Then
    On Error Resume Next
    Application.ScreenUpdating = False
    Range("A11:G65536").ClearContents
    With Sheet1.Range(Sheet1.[A12], Sheet1.[K65536].End(xlUp))
      .AutoFilter 2, ">=" & CDbl([C2]), xlAnd, "<=" & CDbl([D2])
      .AutoFilter 11, IIf([C3] = "", "<>", [C3])
      Union(.Offset(1, 0).Resize(, 2), .Offset(1, 3).Resize(, 4), .Offset(1, 10).Resize(, 1)).SpecialCells(12).Copy
      Range("A11").PasteSpecial 3
      .AutoFilter
    End With
    Target.Select
    With Range("A10").CurrentRegion
      If .Rows.Count > 1 Then
        .Resize(, 1).SpecialCells(2, 1).Value = Evaluate("ROW(R:R)")
      End If
    End With
    Application.ScreenUpdating = True
    MsgBox "Da thuc hien xong!", vbInformation, "Thong Bao"
  End If
End Sub
 

File đính kèm

Upvote 0
Phiền bác chút nữa:

Bây giờ em muốn đoạn code trên bỏ vào trong một nút lệnh, khi nhấn vào button thì mới thực hiện chạy lệnh này (chứ không phải ở chế độ Private Sub Worksheet_Change(ByVal Target As Range)).

Sau khi trích lọc dữ liệu, có dòng tổng cộng bên dưới cùng của bảng tính để sum ở những cột có số (cột số khối, cột thành tiền, ...)

Bác sửa code dùm em nhé!
 
Lần chỉnh sửa cuối:
Upvote 0
Phiền bác chút nữa:

Bây giờ em muốn đoạn code trên bỏ vào trong một nút lệnh, khi nhấn vào button thì mới thực hiện chạy lệnh này (chứ không phải ở chế độ Private Sub Worksheet_Change(ByVal Target As Range)).

Sau khi trích lọc dữ liệu, có dòng tổng cộng bên dưới cùng của bảng tính để sum ở những cột có số (cột số khối, cột thành tiền, ...)

Bác sửa code dùm em nhé!
Xóa toàn bộ code củ, Insert 1 Module và chèn code này vào:
PHP:
Sub Loc()
  Dim Sh1 As Worksheet, Sh2 As Worksheet
  On Error Resume Next
  Set Sh1 = Sheets("xuat"): Set Sh2 = Sheets("locngay")
  Application.ScreenUpdating = False
  Sh2.Range("A11:G65536").ClearContents
  With Sh1.Range(Sh1.[A12], Sh1.[K65536].End(xlUp))
    .AutoFilter 2, ">=" & CDbl(Sh2.[C2]), xlAnd, "<=" & CDbl(Sh2.[D2])
    .AutoFilter 11, IIf(Sh2.[C3] = "", "<>", Sh2.[C3])
    Union(.Offset(1, 0).Resize(, 2), .Offset(1, 3).Resize(, 4), .Offset(1, 10).Resize(, 1)).SpecialCells(12).Copy
    Sh2.Range("A11").PasteSpecial 3
    .AutoFilter
  End With
  ActiveCell.Select
  With Sh2.Range("A10").CurrentRegion
    If .Rows.Count > 1 Then
      .Resize(, 1).SpecialCells(2, 1).Value = Evaluate("ROW(R:R)")
      .Offset(.Rows.Count)(1, 1) = "T" & ChrW(7892) & "NG C" & ChrW(7896) & "NG"
      .Offset(.Rows.Count)(1, 5) = Evaluate("Sum(" & .Offset(, 4).Resize(, 1).Address & ")")
      .Offset(.Rows.Count)(1, 6) = Evaluate("Sum(" & .Offset(, 5).Resize(, 1).Address & ")")
    End If
  End With
  Application.ScreenUpdating = True
  MsgBox "Da thuc hien xong!", vbInformation, "Thong Bao"
End Sub
Thật ra code cũng tương tự như củ, chỉ sửa lại 1 vài chổ (bạn mở 2 file và tự so sánh nhé)
Chú ý: Ở đây ghi tên sheet rất đầy đủ để bạn có thể chạy code ở bất cứ sheet nào vẫn cho kết quả đúng
 

File đính kèm

Upvote 0
Em vận dụng code của anh để làm cho công việc của mình, mạn phép anh sửa code tí xíu nhưng vẫn chưa đúng. Anh dúp dùm em tiếp mấy trường hợp sau:

  1. Điều kiện lọc "Báo cáo tăng lao động" là từ ngày, đến ngày và thêm điều kiện thứ 3 là tại cột số 13 sheet "Du lieu goc" không có nhập ngày thôi việc (riêng điều kiện thứ 3 này viết vào trong code luôn, chứ kg để ngòai sheet) --> tức là người nào đã nghỉ việc thì không lọc ra báo cáo tăng lao động nữa.
  2. Tại sheet "Bao cao tang" Cột TỔNG PHỤ CẤP bằng "PHỤ CẤP 1" + "PHỤ CẤP 2" của sheet "Du lieu goc".
  3. Tại sheet "Bao cao tang" Cột TIỀN CƠM bằng cột "TIỀN CƠM" của sheet "Du lieu goc".
  4. Tại sheet "Bao cao tang" Cột TỔNG THU NHẬP bằng cột "LƯƠNG CHÍNH" = "PHỤ CẤP" + "TIỀN CƠM" của sheet "Bao cao tang".
  5. Sau khi lọc dữ liệu xong, thực hiện định dạng tự động cho báo cáo tăng (kẻ ô + dòng TỔNG CỘNG chữ đậm).

Bác xem và thực hiện vào file đính kèm dùm em;

Cảm ơn anh nhiều!
 

File đính kèm

Lần chỉnh sửa cuối:
Upvote 0
Em vận dụng code của anh để làm cho công việc của mình, mạn phép anh sửa code tí xíu nhưng vẫn chưa đúng. Anh dúp dùm em tiếp mấy trường hợp sau:

  1. Điều kiện lọc "Báo cáo tăng lao động" là từ ngày, đến ngày và thêm điều kiện thứ 3 là tại cột số 13 sheet "Du lieu goc" không có nhập ngày thôi việc (riêng điều kiện thứ 3 này viết vào trong code luôn, chứ kg để ngòai sheet) --> tức là người nào đã nghỉ việc thì không lọc ra báo cáo tăng lao động nữa.
Nếu ngày thôi việc nằm trong khoản ngày đầu và ngày cuối thì thế nào.
Ví dụ: Báo cáo tăng từ ngày 01/01/2000 -> 10/01/2009, trang danh sách có 1 nhân viên thôi việc ngày 10/01/2009 và 1 NV là 11/01/2009. Vậy lấy 1 hay lấy cả hai.
Và MSNV co duy nhất? Nguyễn Văn 98 ?MSNV
 
Lần chỉnh sửa cuối:
Upvote 0
Nếu ngày thôi việc nằm trong khoản ngày đầu và ngày cuối thì thế nào.
Ví dụ: Báo cáo tăng từ ngày 01/01/2000 -> 10/01/2009, trang danh sách có 1 nhân viên thôi việc ngày 10/01/2009 và 1 NV là 11/01/2009. Vậy lấy 1 hay lấy cả hai.
Và MSNV co duy nhất? Nguyễn Văn 98 ?MSNV

Tại sheet Du lieu goc cột 13 và cột 14 nếu có nhập ngày nghỉ việc của nhân viên đó thì không trích lọc qua báo cáo tăng lao động (bởi vì đã vào làm, nhưng nghỉ rồi thì không báo cáo tăng, mà sau này em sẽ làm thêm 1 báo cáo giảm).

Cảm ơn bác!
 
Upvote 0
Tại sheet Du lieu goc cột 13 và cột 14 nếu có nhập ngày nghỉ việc của nhân viên đó thì không trích lọc qua báo cáo tăng lao động (bởi vì đã vào làm, nhưng nghỉ rồi thì không báo cáo tăng, mà sau này em sẽ làm thêm 1 báo cáo giảm).

Cảm ơn bác!
Tôi làm lại, cũng theo code của ndu, chỉ triển khai thêm phần cộng.
PHP:
Option Explicit
Sub Loc()
  On Error Resume Next
  Dim dongcuoi As Long, Data As Range
  Const endR = 200
  With Application
    .ScreenUpdating = False
    .Calculation = xlCalculationManual
  End With
  With S02
    .Range("A6:L" & endR).ClearContents
    .Rows("6:" & endR).EntireRow.Hidden = False
  End With
  With S01
    .AutoFilterMode = False
    dongcuoi = .[B65536].End(xlUp).Row
    Set Data = .Range("A3:N" & dongcuoi)
    With Data
      .Offset(1, 1).Resize(, 1).Name = "MSNV"
      .Offset(1, 9).Resize(, 1).Name = "Phucap1"
      .Offset(1, 10).Resize(, 1).Name = "Phucap2"
      .Offset(1, 11).Resize(, 1).Name = "tiencom"
      .AutoFilter 8, ">=" & CDbl(S02.[C3]), xlAnd, "<=" & CDbl(S02.[D3])
      .AutoFilter 13, "=" & ""
      Union(.Offset(1, 0).Resize(, 3), .Offset(1, 5).Resize(, 4)).SpecialCells(12).Copy
      S02.Range("A6").PasteSpecial 3
      .AutoFilter
    End With
  End With
  Application.CutCopyMode = False
  ActiveCell.Select
  With S02.Range("A5").CurrentRegion
    If .Rows.Count > 1 Then
      .Resize(, 1).SpecialCells(2, 1).Value = Evaluate("ROW(R:R)")
      .Rows(.Rows.Count + 2 & ":" & endR).EntireRow.Hidden = True
      .Range("H6:H" & .Rows.Count).FormulaR1C1 = "=SUMIF(MsNV,RC2,PhuCap1)+SUMIF(MsNV,RC2,PhuCap2)"
      .Range("I6:I" & .Rows.Count).FormulaR1C1 = "=SUMIF(MsNV,RC2,tiencom)"
      .Range("J6:J" & .Rows.Count).FormulaR1C1 = "=RC[-3]+RC[-2]+RC[-1]"
      .Range("H6:J" & .Rows.Count).Value = .Range("H6:J" & .Rows.Count).Value
    End If
  End With
  
  Set Data = Nothing
  With S01
    .Names("MSNV").Delete
    .Names("Phucap1").Delete
    .Names("Phucap2").Delete
    .Names("Tiencom").Delete
  End With
  With Application
    .ScreenUpdating = True
    .Calculation = xlCalculationAutomatic
  End With
  MsgBox "Da thuc hien xong!", vbInformation, "Thong Bao"
End Sub
 

File đính kèm

Upvote 0
Tại sheet Du lieu goc cột 13 và cột 14 nếu có nhập ngày nghỉ việc của nhân viên đó thì không trích lọc qua báo cáo tăng lao động (bởi vì đã vào làm, nhưng nghỉ rồi thì không báo cáo tăng, mà sau này em sẽ làm thêm 1 báo cáo giảm).

Cảm ơn bác!
Cũng chẳng khó gì, thêm có 1 đoạn nhỏ For... Next nữa vào là xong!
PHP:
Sub Loc()
  Dim Clls As Range
  On Error Resume Next
  Application.ScreenUpdating = False
  S02.Range("A6:K65536").ClearContents
  With S01.Range(S01.[A3], S01.[A65536].End(xlUp)).Resize(, 14)
    .AutoFilter 8, ">=" & CDbl(S02.[C3]), xlAnd, "<=" & CDbl(S02.[D3])
    .AutoFilter 14, "<>" & "Nghi viec"
    Union(.Offset(1, 0).Resize(, 3), .Offset(1, 5).Resize(, 7), .Offset(1, 13).Resize(, 1)).SpecialCells(12).Copy
    S02.Range("A6").PasteSpecial 3
    .AutoFilter
  End With
  ActiveCell.Select
  With S02.Range(S02.[A6], S02.[A65536].End(xlUp)).Resize(, 11)
    If .Rows.Count > 1 Then
      .Resize(, 1).Value = Evaluate("ROW(R:R)")
      .Offset(.Rows.Count)(1, 3) = "T" & ChrW(7892) & "NG C" & ChrW(7896) & "NG"
      .Offset(.Rows.Count)(1, 7) = Evaluate("Sum(" & .Offset(, 6).Resize(, 1).Address & ")")
      For Each Clls In .Offset(, 7).Resize(, 1)
        Clls = Clls + Clls(, 2)
        Clls(, 2) = Clls(, 3)
        Clls(, 3) = Clls(, 0) + Clls + Clls(, 2)
      Next
      .Offset(.Rows.Count)(1, 8) = Evaluate("Sum(" & .Offset(, 7).Resize(, 1).Address & ")")
      .Offset(.Rows.Count)(1, 9) = Evaluate("Sum(" & .Offset(, 8).Resize(, 1).Address & ")")
      .Offset(.Rows.Count)(1, 10) = Evaluate("Sum(" & .Offset(, 9).Resize(, 1).Address & ")")
    End If
  End With
  Application.ScreenUpdating = True
  MsgBox "Da thuc hien xong!", vbInformation, "Thong Bao"
End Sub
Phần kẻ khung, tô màu thì dùng Conditional Formating
Xem file nhé ---> Thử so sánh xem, tôi gần như giữ nguyên code củ, chỉ thêm vao 1 vòng lập mà thôi
 

File đính kèm

Lần chỉnh sửa cuối:
Upvote 0
Ah... vừa phát hiện ra 1 chiêu khá đơn giản, nguyên tắc như sau:
- Tại sheet nhập liệu, ta ẩn những cột nào không cần thiết rồi cứ AutoFilter bình thường
- Sau khi copy dử liệu sang sheet lọc xong, ta lại cho hiện các cột
Cụ thể ta ẩn cột 4, cột 5 và cột 13
Vậy hãy thay đoạn:
PHP:
  With S01.Range(S01.[A3], S01.[A65536].End(xlUp)).Resize(, 14)
    .AutoFilter 8, ">=" & CDbl(S02.[C3]), xlAnd, "<=" & CDbl(S02.[D3])
    .AutoFilter 14, "<>" & "Nghi viec"
    Union(.Offset(1, 0).Resize(, 3), .Offset(1, 5).Resize(, 7), .Offset(1, 13).Resize(, 1)).SpecialCells(12).Copy
    S02.Range("A6").PasteSpecial 3
    .AutoFilter
  End With
thành:
PHP:
  With S01.Range(S01.[A3], S01.[A65536].End(xlUp)).Resize(, 14)
    Union(.Cells(1, 4).Resize(, 2), .Cells(1, 13)).EntireColumn.Hidden = True
    .AutoFilter 8, ">=" & CDbl(S02.[C3]), xlAnd, "<=" & CDbl(S02.[D3])
    .AutoFilter 14, "<>" & "Nghi viec"
    .Offset(1).SpecialCells(12).Copy
    S02.Range("A6").PasteSpecial 3
    .AutoFilter
    .Cells.EntireColumn.Hidden = False
  End With
Có vẽ dể nhìn hơn đấy ---> Cái đoạn Union(....) dài thòng lòng kia giờ ngắn gọn lại:
.Offset(1).SpecialCells(12).Copy
Có lý chứ?
--------------
Còn nữa, Tôi phát hiện code của bạn:
.AutoFilter 14, "<>" & "Nghi viec"
thế sao không là:
.AutoFilter 14, "<>Nghi viec"
??? Cho nó gọn
--------------
Với ThuNghi: Tôi thấy rằng nếu hủy chế độ AutoFilter đi thì chế độ CutCopy cũng "bay" luôn ---> Vì thế không cần phải dùng Application.CutCopyMode = False ---> Bạn kiểm tra lại xem
 
Lần chỉnh sửa cuối:
Upvote 0
Code này cực kỳ hiệu quả:
Cũng chẳng khó gì, thêm có 1 đoạn nhỏ For... Next nữa vào là xong!
PHP:
Sub Loc()
  Dim Clls As Range
  On Error Resume Next
  Application.ScreenUpdating = False
  S02.Range("A6:K65536").ClearContents
  With S01.Range(S01.[A3], S01.[A65536].End(xlUp)).Resize(, 14)
    .AutoFilter 8, ">=" & CDbl(S02.[C3]), xlAnd, "<=" & CDbl(S02.[D3])
    .AutoFilter 14, "<>" & "Nghi viec"
    Union(.Offset(1, 0).Resize(, 3), .Offset(1, 5).Resize(, 7), .Offset(1, 13).Resize(, 1)).SpecialCells(12).Copy
    S02.Range("A6").PasteSpecial 3
    .AutoFilter
  End With
  ActiveCell.Select
  With S02.Range(S02.[A6], S02.[A65536].End(xlUp)).Resize(, 11)
    If .Rows.Count > 1 Then
      .Resize(, 1).Value = Evaluate("ROW(R:R)")
      .Offset(.Rows.Count)(1, 3) = "T" & ChrW(7892) & "NG C" & ChrW(7896) & "NG"
      .Offset(.Rows.Count)(1, 7) = Evaluate("Sum(" & .Offset(, 6).Resize(, 1).Address & ")")
      For Each Clls In .Offset(, 7).Resize(, 1)
        Clls = Clls + Clls(, 2)
        Clls(, 2) = Clls(, 3)
        Clls(, 3) = Clls(, 0) + Clls + Clls(, 2)
      Next
      .Offset(.Rows.Count)(1, 8) = Evaluate("Sum(" & .Offset(, 7).Resize(, 1).Address & ")")
      .Offset(.Rows.Count)(1, 9) = Evaluate("Sum(" & .Offset(, 8).Resize(, 1).Address & ")")
      .Offset(.Rows.Count)(1, 10) = Evaluate("Sum(" & .Offset(, 9).Resize(, 1).Address & ")")
    End If
  End With
  Application.ScreenUpdating = True
  MsgBox "Da thuc hien xong!", vbInformation, "Thong Bao"
End Sub
Phần kẻ khung, tô màu thì dùng Conditional Formating
Xem file nhé ---> Thử so sánh xem, tôi gần như giữ nguyên code củ, chỉ thêm vao 1 vòng lập mà thôi

Ah... vừa phát hiện ra 1 chiêu khá đơn giản, nguyên tắc như sau:
- Tại sheet nhập liệu, ta ẩn những cột nào không cần thiết rồi cứ AutoFilter bình thường
- Sau khi copy dử liệu sang sheet lọc xong, ta lại cho hiện các cột
Cụ thể ta ẩn cột 4, cột 5 và cột 13

Em khg muốn áp dụng cách này, tại vì vùng dữ liệu nguồn rất lớn, các cột trích lọc cách nhau liên tục và đâu phải lúc nào cũng làm thủ công là đi dấu cột trước khi lọc, rồi lọc xong lại unhide.

Và em có một nhu cầu nhỏ thế này: Bây giờ sau khi lọc ra dữ liệu tại cột TỔNG THU NHẬP, em muốn kết quả cuối cùng nó hiển thị giá trị mà vẫn nhìn thấy công thức SUM(cột G đến cột I) thì sửa đoạn code như thế nào, bác dúp em?

Chữ Clls là gì thế nhỉ?
PHP:
      For Each Clls In .Offset(, 7).Resize(, 1)
        Clls = Clls + Clls(, 2) 
        Clls(, 2) = Clls(, 3)
        Clls(, 3) = Clls(, 0) + Clls + Clls(, 2) ' LAM SAO DE DOAN NAY HIEN THI LA CONG THUC
      Next
 
Lần chỉnh sửa cuối:
Upvote 0
Em khg muốn áp dụng cách này, tại vì vùng dữ liệu nguồn rất lớn, các cột trích lọc cách nhau liên tục và đâu phải lúc nào cũng làm thủ công là đi dấu cột trước khi lọc, rồi lọc xong lại unhide.
Đâu phải... là tôi nói nguyên tắc làm việc của code thôi chứ đâu có bắt bạn phải làm gì ---> Code nó làm tất cả: Hide.. rồi Unhide.. rồi lọc gì gì đó.. Tự nó làm tất
Và em có một nhu cầu nhỏ thế này: Bây giờ sau khi lọc ra dữ liệu tại cột TỔNG THU NHẬP, em muốn kết quả cuối cùng nó hiển thị giá trị mà vẫn nhìn thấy công thức SUM(cột G đến cột I) thì sửa đoạn code như thế nào, bác dúp em?
Dể hơn ăn khoai %#^#$ ---> Biến công thức thành giá trị thì mất công, chứ để nguyên thì... càng khỏe
Trong code có đoạn Clls(, 3) = Clls(, 0) + Clls + Clls(, 2)
thì sửa lại thành: Clls(, 3) = "=Sum(RC[-3]+RC[-2]+RC[-1])"
Có muốn đặt công thức ở dòng tổng cuối cùng luôn không?
Nếu muốn thì cứ chổ nào có đoạn
Evaluate("Sum(..... )")
hãy sửa lại thành:
"=SUM(.....)"
Tức bỏ Evaluate đi
(tôi làm luôn trong file rồi đó)
Chữ Clls là gì thế nhỉ?
Chỉ là 1 biến tạm tôi thêm vào để nó duyệt qua các cell trong vòng lập thôi mà
Thật ra bài này vẫn còn 1 cách không cần đến vòng lập For vẩn ra kết quả ---> Dùng theo kiểu Copy\PasteSpecial\Add ---> Bạn tự nghiên cứu xem... hoặc thử thay đoạn:
PHP:
For...
  ....
Next
thành:
PHP:
With .Offset(, 7).Resize(, 1)
 .Value = Evaluate(.Address & "+" & .Offset(, 1).Address)
 .Offset(, 1) = .Offset(, 2).Value
 .Offset(, 2) = "=Sum(RC[-3]+RC[-2]+RC[-1])"
End With
Khỏi phải PHO PHIẾC gì ráo --- >chắc là tốc độ sẽ nhanh hơn ---> Bạn test xem!
Ẹc... Ẹc...
-----------
Code cuối cùng tôi đề xuất như sau:
PHP:
Sub Loc()
  Dim Clls As Range
  On Error Resume Next
  Application.ScreenUpdating = False
  S02.Range("A6:K65536").ClearContents
  With S01.Range(S01.[A3], S01.[A65536].End(xlUp)).Resize(, 14)
    .AutoFilter 8, ">=" & CDbl(S02.[C3]), xlAnd, "<=" & CDbl(S02.[D3])
    .AutoFilter 14, "<>Nghi viec"
    Union(.Offset(1, 0).Resize(, 3), .Offset(1, 5).Resize(, 7), .Offset(1, 13).Resize(, 1)).SpecialCells(12).Copy
    S02.Range("A6").PasteSpecial 3
    .AutoFilter
  End With
  ActiveCell.Select
  With S02.Range(S02.[A6], S02.[A65536].End(xlUp))
    If .Rows.Count > 1 Then
      .Value = Evaluate("ROW(R:R)")
      .Offset(.Rows.Count)(1, 3) = "T" & ChrW(7892) & "NG C" & ChrW(7896) & "NG"
      With .Offset(, 7)
        .Value = Evaluate(.Address & "+" & .Offset(, 1).Address)
        .Offset(, 1) = .Offset(, 2).Value
        .Offset(, 2) = "=Sum(RC[-3]:RC[-1])"
      End With
      .Offset(.Rows.Count, 6).Resize(1, 4) = "=Sum(R[-" & .Rows.Count & "]C:R[-1]C)"
    End If
  End With
  Application.ScreenUpdating = True
  MsgBox "Da thuc hien xong!", 64, "Thong Bao"
End Sub
 

File đính kèm

Lần chỉnh sửa cuối:
Upvote 0
Đâu phải... là tôi nói nguyên tắc làm việc của code thôi chứ đâu có bắt bạn phải làm gì ---> Code nó làm tất cả: Hide.. rồi Unhide.. rồi lọc gì gì đó.. Tự nó làm tất

Dể hơn ăn khoai %#^#$ ---> Biến công thức thành giá trị thì mất công, chứ để nguyên thì... càng khỏe
Trong code có đoạn Clls(, 3) = Clls(, 0) + Clls + Clls(, 2)
thì sửa lại thành: Clls(, 3) = "=Sum(RC[-3]+RC[-2]+RC[-1])"
Có muốn đặt công thức ở dòng tổng cuối cùng luôn không?
Nếu muốn thì cứ chổ nào có đoạn
Evaluate("Sum(..... )")
hãy sửa lại thành:
"=SUM(.....)"
Tức bỏ Evaluate đi
(tôi làm luôn trong file rồi đó)

Chỉ là 1 biến tạm tôi thêm vào để nó duyệt qua các cell trong vòng lập thôi mà
Thật ra bài này vẫn còn 1 cách không cần đến vòng lập For vẩn ra kết quả ---> Dùng theo kiểu Copy\PasteSpecial\Add ---> Bạn tự nghiên cứu xem... hoặc thử thay đoạn:
PHP:
For...
  ....
Next
thành:
PHP:
With .Offset(, 7).Resize(, 1)
 .Value = Evaluate(.Address & "+" & .Offset(, 1).Address)
 .Offset(, 1) = .Offset(, 2).Value
 .Offset(, 2) = "=Sum(RC[-3]+RC[-2]+RC[-1])"
End With
Khỏi phải PHO PHIẾC gì ráo --- >chắc là tốc độ sẽ nhanh hơn ---> Bạn test xem!
Ẹc... Ẹc...
-----------
Code cuối cùng tôi đề xuất như sau:
PHP:
Sub Loc()
  Dim Clls As Range
  On Error Resume Next
  Application.ScreenUpdating = False
  S02.Range("A6:K65536").ClearContents
  With S01.Range(S01.[A3], S01.[A65536].End(xlUp)).Resize(, 14)
    .AutoFilter 8, ">=" & CDbl(S02.[C3]), xlAnd, "<=" & CDbl(S02.[D3])
    .AutoFilter 14, "<>Nghi viec"
    Union(.Offset(1, 0).Resize(, 3), .Offset(1, 5).Resize(, 7), .Offset(1, 13).Resize(, 1)).SpecialCells(12).Copy
    S02.Range("A6").PasteSpecial 3
    .AutoFilter
  End With
  ActiveCell.Select
  With S02.Range(S02.[A6], S02.[A65536].End(xlUp))
    If .Rows.Count > 1 Then
      .Value = Evaluate("ROW(R:R)")
      .Offset(.Rows.Count)(1, 3) = "T" & ChrW(7892) & "NG C" & ChrW(7896) & "NG"
      With .Offset(, 7)
        .Value = Evaluate(.Address & "+" & .Offset(, 1).Address)
        .Offset(, 1) = .Offset(, 2).Value
        .Offset(, 2) = "=Sum(RC[-3]:RC[-1])"
      End With
      .Offset(.Rows.Count, 6).Resize(1, 4) = "=Sum(R[-" & .Rows.Count & "]C:R[-1]C)"
    End If
  End With
  Application.ScreenUpdating = True
  MsgBox "Da thuc hien xong!", 64, "Thong Bao"
End Sub
[/QUOT
Cũng với file trên , nếu như mình muốn sử dụng Combobox thì phải làm sao ? Nhờ anh ndu96081631 giúp đỡ cho em nha . Thanks !
 
Upvote 0

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

Back
Top Bottom