Cần viết Code Delete cả dòng nếu có 4 ô cùng dòng đó nằm ở cột B, C, D, E giống nhau (1 người xem)

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

hung2412

Thành viên tích cực
Tham gia
5/8/08
Bài viết
934
Được thích
240
Giới tính
Nam
Xin chào các Anh chị và các bạn GPE!
Nhờ các Anh chị và các bạn giúp đỡ cho tôi vấn đề này với, cụ thể như sau:
Tôi có 1 bảng tính như vầy:

VCtRJkO.png


Nếu có 4 ô cùng dòng nằm ở cột B, C, D, E giống nhau thì sẽ Delete dòng đó.
Ví dụ:
- Dòng 6 có 4 ô B6, C6, D6, E6 giống nhau (Cùng một số liệu là 22) => Delete dòng 6.
- Dòng 8 có 4 ô B8, C8, D8, E8 giống nhau (Cùng một số liệu là CT12/25) => Delete dòng 8.
=> Để giải bài trên tôi xài Code:
[GPECODE=vb]Sub Delete()
Dim i As Long
For i = 25 To 4 Step -1
If Cells(i, 2) = Cells(i, 3) = Cells(i, 4) = Cells(i, 5) Then
Cells(i, 2).EntireRow.Delete
End If
Next
End Sub[/GPECODE]
=> Code trên chạy không đúng như đề bài => Không hiểu là tại làm sao?
Mong các bạn GPE chỉ giáo!
Trân trọng cảm ơn!
P/s: Có 01 File đính kèm.

 

File đính kèm

Xin chào các Anh chị và các bạn GPE!
Nhờ các Anh chị và các bạn giúp đỡ cho tôi vấn đề này với, cụ thể như sau:
Tôi có 1 bảng tính như vầy:

VCtRJkO.png


Nếu có 4 ô cùng dòng nằm ở cột B, C, D, E giống nhau thì sẽ Delete dòng đó.
Ví dụ:
- Dòng 6 có 4 ô B6, C6, D6, E6 giống nhau (Cùng một số liệu là 22) => Delete dòng 6.
- Dòng 8 có 4 ô B8, C8, D8, E8 giống nhau (Cùng một số liệu là CT12/25) => Delete dòng 8.
=> Để giải bài trên tôi xài Code:
[GPECODE=vb]Sub Delete()
Dim i As Long
For i = 25 To 4 Step -1
If Cells(i, 2) = Cells(i, 3) = Cells(i, 4) = Cells(i, 5) Then
Cells(i, 2).EntireRow.Delete
End If
Next
End Sub[/GPECODE]
=> Code trên chạy không đúng như đề bài => Không hiểu là tại làm sao?
Mong các bạn GPE chỉ giáo!
Trân trọng cảm ơn!
P/s: Có 01 File đính kèm.

Viết thế này:
If Cells(i, 2) = Cells(i, 3) = Cells(i, 4) = Cells(i, 5) Then
anh Bill hông hiểu đâu, sửa lại tí tẹo
If Cells(i, 2) = Cells(i, 3) And Cells(i, 2) = Cells(i, 4) And Cells(i, 2) = Cells(i, 5) Then
Thân
 
Upvote 0
Viết thế này:

If Cells(i, 2) = Cells(i, 3) = Cells(i, 4) = Cells(i, 5) Then

anh Bill hông hiểu đâu,...

Thật ra anh Bill hiểu, nhưng hiểu theo lô gíc định nghĩa của toán tử =
Trong VBA, toán tử = được định nghĩa tuỳ theo ngữ cảnh, một là phép gán và hai là phép so sánh.
Đi sau từ khoá IF thì nó coi như ngữ cảnh phép so sánh. Trong phép so sánh, = là toán tử 2 ngôi, tức là có một biểu thức bên trái và một biểu thức bên phải. Không thể nhiều hơn, không thể ít hơn. Vì vậy, trong ví dụ trên, VBA không thể tính một lần cả chuỗi mà bắt buộc phải tính tuần tự từng biểu thức.
Theo luật biểu thức, nếu có nhiều toán tử thì sẽ được thanh toán theo thứ tự ưu tiên toán tử. Vì ở đây các toán tử đều là = cho nên chúng ngang hàng nhau. Và đối với toán tử ngang hàng thì VBA tính từ trái sang phải.

Như vậy khi ta gặp 4 cells bằng nhau:
Biểu thức Cells(i, 2) = Cells(i, 3) có kết quả là -1 <true>
Biểu thức -1 = Cells(i, 4) có kết quả là 0 <false>
Biểu thức 0 = Cells(i, 5) có kêt quả là 0 <false>
Kết quả cuối cùng là false.

Chứng minh:
thử code MsgBox 1 = 1 = 1 = 1, sẽ thấy nó cho ra False
thử code MsgBox 1 = 1 = 1 = 0, sẽ thấy nó cho ra True
thử code MsgBox 1 = 1 = -1 = -1, sẽ thấy nó cho ra True

Lưu ý 1: những cái này chỉ áp dụng cho VBA. Không hẳn áp dụng cho ngôn ngữ khác.

Lưu ý 2: tôi chỉ bàn với các bạn muốn nói chuyện ngôn ngữ thôi. Còn những bạn thích học theo kiểu cấp tốc, không cần học luật ngữ pháp của VBA thì xin bỏ qua đừng thắc mắc mấy cái này, uổng công.
 
Lần chỉnh sửa cuối:
Upvote 0
Mình đã từng ngớ ngẩn vụ này rồi 1 lần cho nên sẽ viết kiểu này cho an toàn.
PHP:
Sub Delete()
Dim i As Long
For i = 25 To 4 Step -1
   If Cells(i, 2) = Cells(i, 3) Then
      If Cells(i, 3) = Cells(i, 4) Then
         If Cells(i, 4) = Cells(i, 5) Then
            Cells(i, 2).EntireRow.Delete
         End If
      End If
    End If
Next
End Sub
 
Upvote 0
& đây sẽ là thí nghiệm vui về And & Or

PHP:
Sub GPEAnd_Or()
 Dim I As Long
 
 [A2].Resize(29, 5).Interior.ColorIndex = 2
 For I = 25 To 2 Step -1
   If Cells(I, 2) = Cells(I, 3) And Cells(I, 3) = Cells(I, 4) Then _
       Cells(I, 1).Interior.ColorIndex = 38
   If Cells(I, 2) = Cells(I, 3) Or Cells(I, 3) = Cells(I, 4) Then _
       Cells(I, 2).Interior.ColorIndex = 37
 Next
End Sub
 
Upvote 0
PHP:
Sub GPEAnd_Or()
 Dim I As Long
 
 [A2].Resize(29, 5).Interior.ColorIndex = 2
 For I = 25 To 2 Step -1
   If Cells(I, 2) = Cells(I, 3) And Cells(I, 3) = Cells(I, 4) Then _
       Cells(I, 1).Interior.ColorIndex = 38
   If Cells(I, 2) = Cells(I, 3) Or Cells(I, 3) = Cells(I, 4) Then _
       Cells(I, 2).Interior.ColorIndex = 37
 Next
End Sub
Bạn cho tôi hỏi
Nếu chỉ muốn tô màu cho các dòng giốnh nhau như B2=C2=D2, nghĩa là tô dòng số 2 từ B đến D thì code sửa ntn?
Xin cảm ơn!
 
Upvote 0
Mình đã từng ngớ ngẩn vụ này rồi 1 lần cho nên sẽ viết kiểu này cho an toàn.
PHP:
Sub Delete()
Dim i As Long
For i = 25 To 4 Step -1
   If Cells(i, 2) = Cells(i, 3) Then
      If Cells(i, 3) = Cells(i, 4) Then
         If Cells(i, 4) = Cells(i, 5) Then
            Cells(i, 2).EntireRow.Delete
         End If
      End If
    End If
Next
End Sub

Đây là cách viết hy sinh ngắn gọn để cho code chạy ít tốn năng suất máy.
Theo cách này, phải qua được điều kiện 1 mới xét đến điều kiện 2, qua được điều kiện 2 mới xét đến 3

Viết theo cách của bài #2 là cách viết chạy suốt cả từ đầu đến cuối. Mọi điều kiện (mọi vế) đều được xét. Và tuỳ theo toán tử And hay Or mà có kết quả cuối.

Điều này rất quan trọng khi biểu thức có khả năng thay đổi giá trị biến. Ví dụ biểu thức gồm có hàm, bên trong hàm có lệnh thay đổi trị của biến.

Vấn đề đáng chú ý là trong toán học, người ta lợi dụng tính chất truyền của toán tử = trong không gian vec tơ số thực để viết vắn tắt biểu thức "a = b và b = c" thành "a = b = c" --> hiểu ngầm liên tự "và" (and)
Tuy nhiên, hầu hết ngôn ngữ lập trình, trong đó có gồm VBA, không đặt tính chất truyền cho toán tử = , cho nên không thể viết tắt.

Ghi nhớ:
- biểu thức toán học được định nghĩa trên ngữ cảnh không gian vec tơ. Trong toán số, không gian này được mặc định là số thực.
- biểu thức lệnh lập trình được mặc định theo quy luật ép kiểu, tuỳ theo ngữ cảnh.
Khi bạn viết IF 1 = 1 = 1 thì kết quả của 1 = 1 là True, muốn so sánh với trị kế tiếp là 1 thì True phải bị ép kiểu thành Integer, tức là -1; vì -1 <> 1 cho nên kết quả cuối cùng là False.
 
Upvote 0

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

Back
Top Bottom