giúp mình giữ các giá trị cho sẵn.

Liên hệ QC

thanhthao22112008

Thành viên mới
Tham gia
9/3/12
Bài viết
19
Được thích
3
Mình có 1 file excel gồm 2 sheet, sheet "dam" và sheet "cot".
Trong mỗi sheet này đều có cấu trúc giống nhau. (ở cột B có COMB1, COMB2, COMB3.....COMBn) ở đây mình chỉ đến COMB5 (về sau có thể thay đổi tùy vào công trình) Nhưng COMBBAO MAX và COMBBAO MIN luôn có tên cố định.
Bây giờ mình muốn ở sheet "dam" thì giữ lại những dòng có COMBBAO MAX và COMBBAO MIN
Và sheet cột thì lại xóa những dòng có COMBBAO MAX và COMBBAO MIN.
Mong các ACE trên diễn đàn giúp em.
Mong sớm hồi âm.
Thân!
 

File đính kèm

Lần chỉnh sửa cuối:
Bạn muốn biết có lỗi gì xuất hiện hay không, hãy xóa dòng On Error Resume Next rồi test lại sẽ biết liền

em cám ơn anh NDU
đúng như lời anh nói.
Anh cho em hỏi là tại sao khi xóa On Error Resume Next thì tại sao lại hết vậy.
On Error Resume Next nó có nghĩa là gì vậy anh NDU?
 
Lần chỉnh sửa cuối:
Upvote 0
em cám ơn anh NDU
đúng như lời anh nói.
Anh cho em hỏi là tại sao khi xóa On Error Resume Next thì tại sao lại hết vậy.
On Error Resume Next nó có nghĩa là gì vậy anh NDU?
Dòng này có tác dụng khi gặp lỗi thì "vượt qua" luôn
Trong code có dùng SpecialCells, cái này chắc chắn gặp lỗi với dữ liệu lớn, và nó đã "vượt qua" lỗi nhờ dòng On Error Resume Next ở trên ---> Dẫn đến chẳng trích lọc được thứ gì cả
 
Upvote 0
em có dạng này mong anh giúp cho:

Tại ô L2 của em có công thức =IF(LEFT(B2,1)="b","Dam",IF(LEFT(B2,1)="C","Cot",""))
bây giờ em muốn là tự động filer theo cột B hay cột A đều được
Ví dụ cột A (hay cột B có 80000 dòng thì tự động filer đến dòng thứ 80000)
Nêú cột A hay B có 90000 thì tự động filer đến dòng thứ 90000).
Em chân thành cám ơn
 

File đính kèm

Upvote 0
Dòng này có tác dụng khi gặp lỗi thì "vượt qua" luôn
Trong code có dùng SpecialCells, cái này chắc chắn gặp lỗi với dữ liệu lớn, và nó đã "vượt qua" lỗi nhờ dòng On Error Resume Next ở trên ---> Dẫn đến chẳng trích lọc được thứ gì cả
Xem qua thì dòng lệnh này rất dễ hiểu, nhưng sử dụng nó rất khó Sư Phụ nhỉ
- Gặp dòng lệnh lỗi bỏ qua và thực hiện lệnh tiếp theo, không khéo thì chăng đâu đến đâu
- Gặp dòng lệnh lỗi sẽ nhảy đến dòng lệnh nào đó (bỏ qua đoạn lệnh)
- Gặp dòng lệnh lỗi thoát thủ tục (Hàm)
Cái này chắc chỉ phụ thuộc vào kinh nghiệm là chủ yếu
 
Upvote 0
Xem qua thì dòng lệnh này rất dễ hiểu, nhưng sử dụng nó rất khó Sư Phụ nhỉ
- Gặp dòng lệnh lỗi bỏ qua và thực hiện lệnh tiếp theo, không khéo thì chăng đâu đến đâu
- Gặp dòng lệnh lỗi sẽ nhảy đến dòng lệnh nào đó (bỏ qua đoạn lệnh)
- Gặp dòng lệnh lỗi thoát thủ tục (Hàm)
Cái này chắc chỉ phụ thuộc vào kinh nghiệm là chủ yếu
Thì cứ suy đoán từ từ thôi
- SpecialCells bị lỗi
- Dẫn đến .SpecialCells(4).EntireRow.Delete cũng lỗi luôn (hay tất cả các lệnh sau SpecialCells đều không thực hiện được)
- Cuối cùng là: Không thực thi được cái gì
--------------
Kinh nghiệm: Đừng bao giờ cho On Error Resume Next vào code khi đang Test ---> Đến khi bạn chắc chắn không còn lỗi nào nữa (hoặc đã biết chắc lỗi ấy là gì) thì hãy cho vào
 
Upvote 0
Đang khoái cái vụ Arr(), gặp nó là làm bài tập cho quen tay luôn.
Mỗi sheet một nút bấm nhìn nó chạy cho "đã".
Các sheet phụ là để lưu dữ liệu gốc, copy tới lui để thử thôi.
Nếu ex sau 2003 thì chỉnh số dòng trong code thêm cho đủ xài.
Hổng biết với ex sau hơn 2003 nó có chạy được không.
Nhờ các bạn "nhắc nhỡ" thêm.
 

File đính kèm

Upvote 0
Nếu ex sau 2003 thì chỉnh số dòng trong code thêm cho đủ xài.
Hổng biết với ex sau hơn 2003 nó có chạy được không.
Nhờ các bạn "nhắc nhỡ" thêm.
Sửa .[A65000].End(xlUp) thành .Cells(.Cells.Rows.Count, 1).End(xlUp) là được rồi ---> Excel nào cũng chơi được
 
Upvote 0
Sửa .[A65000].End(xlUp) thành .Cells(.Cells.Rows.Count, 1).End(xlUp) là được rồi ---> Excel nào cũng chơi được

NDU ơi.
Em sửa như anh nói thì kết quả không như ý mong muốn anh àh.
Em chân thành cám ơn các anh vì đã quan tâm đến chủ đề của em.
Em Hy vọng với chủ đề này sẽ có nhiều sáng kiến hơn các anh ah.
Chúc các anh một ngày may mắn.
 
Lần chỉnh sửa cuối:
Upvote 0
Upvote 0
Nếu kết quả sai là do câu lệnh khác còn việc sửa câu lệnh .[A65000].End(xlUp) thành .Cells(.Cells.Rows.Count, 1).End(xlUp) thì đúng là tuyệt chiêu, miễn bàn nha.

đúng là em đã làm sai.
Hướng dẫn một đằng làm một nẻo.
Em cám ơn các anh.
Các anh ơi hướng dẫn em bài 23 (#23) mới.
Mong sớm hồi âm của các anh.
 
Upvote 0
Lấy code tại #7 để làm ví dụ:
Mã:
Sub XoaDong()
    On Error Resume Next
    With Sheets("dam")[COLOR=#ff0000][B].Range("c1:c" & [a65000].End(3).Row)[/B][/COLOR]
        .AutoFilter 1, "<>COMBBA0 MAX", 1, "<>COMBBA0 MIN"
        .Offset(1).SpecialCells(12).EntireRow.Delete
        .AutoFilter
    End With
    
    With Sheets("cot").Range("c1:c" & [a65000].End(3).Row)
        .AutoFilter 1, "=COMBBA0 MAX", 2, "=COMBBA0 MIN"
        .Offset(1).SpecialCells(12).EntireRow.Delete
        .AutoFilter
    End With
End Sub

Nếu lọc cột A thì Bạn sửa đoạn màu đỏ thành .Range([a1], .Cells(.Cells.Rows.Count, 1).End(xlUp))
Nếu lọc cột B thì Bạn sửa thành .Range([b1], .Cells(.Cells.Rows.Count, 2).End(xlUp))

Chú ý: Số 1 là cột A; số 2 là cột B; số 3 là cột C ...số 10 là cột J ...
 
Upvote 0
bài viết thật hay.
đây cũng là vấn đề mình quan tâm với dữ liệu kiểu mảng
 
Lần chỉnh sửa cuối:
Upvote 0
Lấy code tại #7 để làm ví dụ:
Mã:
Sub XoaDong()
    On Error Resume Next
    With Sheets("dam")[COLOR=#ff0000][B].Range("c1:c" & [a65000].End(3).Row)[/B][/COLOR]
        .AutoFilter 1, "<>COMBBA0 MAX", 1, "<>COMBBA0 MIN"
        .Offset(1).SpecialCells(12).EntireRow.Delete
        .AutoFilter
    End With
    
    With Sheets("cot").Range("c1:c" & [a65000].End(3).Row)
        .AutoFilter 1, "=COMBBA0 MAX", 2, "=COMBBA0 MIN"
        .Offset(1).SpecialCells(12).EntireRow.Delete
        .AutoFilter
    End With
End Sub

Nếu lọc cột A thì Bạn sửa đoạn màu đỏ thành .Range([a1], .Cells(.Cells.Rows.Count, 1).End(xlUp))
Nếu lọc cột B thì Bạn sửa thành .Range([b1], .Cells(.Cells.Rows.Count, 2).End(xlUp))

Chú ý: Số 1 là cột A; số 2 là cột B; số 3 là cột C ...số 10 là cột J ...

anh hiểu nhầm ý của em rồi anh ah
Bài này em không xoá cái gì hết anh ah.
em chỉ muốn là cột L (từ cột L2 trở đi) nếu chữ cái đầu tiên của cột B2 có ký hiệu là: "B" thì cột L2 viết là "dam"
Còn nếu cột B2 là: "C" thì cột L2 sẽ viết là "cot" em đã là được điều này.
Nhwng em muốn là cột B có bao nhiêu dòng thì từ ô L2 sẽ tự động filer đến dòng cuối cùng của cột B.
(giả sử cột B có 70000 thì twf ô L2 sẽ filer đến dòng thứ L70000. hay cột B có 80000 thì từ ô L2 sẽ filer đến L80000 anh ah.
Mong anh giúp em.
em cám ơn nhiều
 

File đính kèm

Upvote 0
ý tôi là chỉ mượn dòng code màu đỏ để làm ví dụ còn bạn phải sửa lại code của bạn chứ tôi có biết code của bạn như thế nào đâu ?.
Câu lệnh để xác định dòng cuối cùng có dữ liệu là Cells(Cells.Rows.Count, ...).End(3).Row . Muốn lấy cột nào để xác định dòng cuối thì bạn thay số thứ tự của cột đó vào chỗ 3 chấm.
Ví dụ: Câu lệnh để Autofilter từ L2 đến dòng L cuối - xác định theo dữ liệu của cột A như sau:
Mã:
Range("l2:l" & Cells(Cells.Rows.Count, 1).End(3).Row).Autofilter
 
Lần chỉnh sửa cuối:
Upvote 0
ý tôi là chỉ mượn dòng code màu đỏ để làm ví dụ còn bạn phải sửa lại code của bạn chứ tôi có biết code của bạn như thế nào đâu ?.
Câu lệnh để xác định dòng cuối cùng có dữ liệu là Cells(Cells.Rows.Count, ...).End(3).Row . Muốn lấy cột nào để xác định dòng cuối thì bạn thay số thứ tự của cột đó vào chỗ 3 chấm.
Ví dụ: Câu lệnh để Autofilter từ L2 đến dòng L cuối - xác định theo dữ liệu của cột A như sau:
Mã:
Range("l2:l" & Cells(Cells.Rows.Count, 1).End(3).Row).Autofilter

Em cám ơn anh.
Chắc là với hướng dẫn của anh thì em sẽ làm được.
 
Upvote 0
anh hiểu nhầm ý của em rồi anh ah
Bài này em không xoá cái gì hết anh ah.
em chỉ muốn là cột L (từ cột L2 trở đi) nếu chữ cái đầu tiên của cột B2 có ký hiệu là: "B" thì cột L2 viết là "dam"
Còn nếu cột B2 là: "C" thì cột L2 sẽ viết là "cot" em đã là được điều này.
Nhwng em muốn là cột B có bao nhiêu dòng thì từ ô L2 sẽ tự động filer đến dòng cuối cùng của cột B.
(giả sử cột B có 70000 thì twf ô L2 sẽ filer đến dòng thứ L70000. hay cột B có 80000 thì từ ô L2 sẽ filer đến L80000 anh ah.
Mong anh giúp em.
em cám ơn nhiều
Tức là sau khi lọc xong, ta sẽ viết ghi chú (Dam, Cot) vào cột L, đúng không?
Cái này quá dễ, để Ba Tê làm cho bạn... Viết bằng code đưa ghi chú trực tiếp vào bảng tính luôn, chẳng cần phải công thức, rồi kéo fill gì đó đâu
Ẹc... Ẹc...
 
Upvote 0
Tức là sau khi lọc xong, ta sẽ viết ghi chú (Dam, Cot) vào cột L, đúng không?
Cái này quá dễ, để Ba Tê làm cho bạn... Viết bằng code đưa ghi chú trực tiếp vào bảng tính luôn, chẳng cần phải công thức, rồi kéo fill gì đó đâu
Ẹc... Ẹc...

vâng!
em cám ơn anh.
Anh có thể nhờ anh Ba Tê giúp em được không ah.
Em cám ơn nhiều
 
Upvote 0
vâng!
em cám ơn anh.
Anh có thể nhờ anh Ba Tê giúp em được không ah.
Em cám ơn nhiều
Tôi đề xuất thế này: Lọc dữ liệu sang 2 sheet khác, giữ nguyên sheet dữ liệu, đừng sửa đổi gì cả (lỡ có sai sót gì sẽ không mất dữ liệu)
Vậy thì ta sẽ tiến hành làm như sau:
- Đổi tên sheet chứ dữ liệu thành Data
- Tạo thêm 2 sheet tên Temp1 và Temp2
- Chạy code dưới đây:
PHP:
Sub Main()
  Dim sArray, Arr1(), Arr2()
  Dim lR As Long, lC As Byte, k1 As Long, k2 As Long
  Dim tmp1 As String, tmp2 As String
  On Error Resume Next
  With Sheets("Data")
    sArray = .Range(.[A1], .Cells(.Cells.Rows.Count, 1).End(xlUp)).Resize(, 12).Value
    ReDim Arr1(1 To UBound(sArray, 1), 1 To 12)
    ReDim Arr2(1 To UBound(sArray, 1), 1 To 12)
    k1 = 1: k2 = 1
    For lR = 2 To UBound(sArray, 1)
      If Right(sArray(lR, 3), 3) = "MAX" Or Right(sArray(lR, 3), 3) = "MIN" Then
        k1 = k1 + 1
        For lC = 1 To 10
          If k1 = 2 Then Arr1(1, lC) = sArray(1, lC)
          Arr1(k1, lC) = sArray(lR, lC)
        Next
        tmp1 = Left(Arr1(k1, 2), 1)
        Arr1(k1, 12) = IIf(tmp1 = "B", "Dam", IIf(tmp1 = "C", "Cot", ""))
      Else
        k2 = k2 + 1
        For lC = 1 To 10
          If k2 = 2 Then Arr2(1, lC) = sArray(1, lC)
          Arr2(k2, lC) = sArray(lR, lC)
        Next
        tmp2 = Left(Arr2(k2, 2), 1)
        Arr2(k2, 12) = IIf(tmp2 = "B", "Dam", IIf(tmp2 = "C", "Cot", ""))
      End If
    Next
  End With
  With Sheets("Temp1")
    .Range("A:L").ClearContents
    If k1 Then .Range("A1").Resize(k1, 12).Value = Arr1
  End With
  With Sheets("Temp2")
    .Range("A:L").ClearContents
    If k2 Then .Range("A1").Resize(k2, 12).Value = Arr2
  End With
End Sub
Sau khi chạy code, dữ liệu sẽ được lọc sang sheet Temp1 và Temp2
Xem file
 

File đính kèm

Upvote 0
anh hiểu nhầm ý của em rồi anh ah
Bài này em không xoá cái gì hết anh ah.
em chỉ muốn là cột L (từ cột L2 trở đi) nếu chữ cái đầu tiên của cột B2 có ký hiệu là: "B" thì cột L2 viết là "dam"
Còn nếu cột B2 là: "C" thì cột L2 sẽ viết là "cot" em đã là được điều này.
Nhwng em muốn là cột B có bao nhiêu dòng thì từ ô L2 sẽ tự động filer đến dòng cuối cùng của cột B.
(giả sử cột B có 70000 thì twf ô L2 sẽ filer đến dòng thứ L70000. hay cột B có 80000 thì từ ô L2 sẽ filer đến L80000 anh ah.
Mong anh giúp em.
em cám ơn nhiều
Không xóa gì cả nghĩa là không cần lọc bỏ Max, Min hay chừa lại Max, Min gì cả phải không?
Chỉ là ghi chú thêm cho cột L là "Dam" hay "Cot" là đủ yêu cầu phải không?
Nếu đúng như vậy thì bấm chuột vào cái ô màu vàng trên cột L thử xem.
Nhwng em muốn là cột B có bao nhiêu dòng thì từ ô L2 sẽ tự động filer đến dòng cuối cùng của cột B.
Dùng chữ filer này khó hiểu thật.
 

File đính kèm

Upvote 0
Không xóa gì cả nghĩa là không cần lọc bỏ Max, Min hay chừa lại Max, Min gì cả phải không?
Chỉ là ghi chú thêm cho cột L là "Dam" hay "Cot" là đủ yêu cầu phải không?
Nếu đúng như vậy thì bấm chuột vào cái ô màu vàng trên cột L thử xem.

Dùng chữ filer này khó hiểu thật.

Cả hai đoạn code cua anh NDU và anh Ba Tê đều đúng ý của em.
Em cám ơn các anh.
em gõ nhầm: chữ fill mới đúng
anh có thể giải thích cho em câu lện này được không ah.

ReDim Arr(1 To UBound(Rngs, 1), 1 To 1)
For i = 1 To UBound(Rngs, 1)
If Left(Rngs(i, 2), 1) = "B" Then
Arr(i, 1) = "Dam"

Em cám ơn anh
 
Lần chỉnh sửa cuối:
Upvote 0
Web KT

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

Back
Top Bottom