mayxanh0301
Thành viên mới
- Tham gia
- 20/9/11
- Bài viết
- 11
- Được thích
- 0
Có phải ý bạn là tìm thấy C2 trong bảng DK thì lấy KQ 1, không tìm thấy là KQ 2?Các điều kiện em để trong file đính kèm nhờ a/c coi qua giúp em với!
Thanks cả nhà GPE!
=IF(COUNTIF(DK,C2),K2,K3)
Với bài tập này em dùng sự kiện Worksheet_Change nhưng không biết nhầm ở đâu mà nó ra kết quả sai lung tung cả đi. Chỉ nhập số 6 là cho kết quả đúng mong các thầy các anh chị và các bạn xem giúp!Các điều kiện em để trong file đính kèm nhờ a/c coi qua giúp em với!
Thanks cả nhà GPE!
Thực ra đã có cách đơn giản là dùng công thức của leonguyen rồi nhưng do đang học VBA nên mình làm thử bằng VBA.Option Explicit
Public Sub Worksheet_Change(ByVal Target As Range)
Application.EnableEvents = False
Dim rng As Range, cll As Range
Set rng = Range("D2:I10")
If Not Intersect(Target, Range("C2")) Is Nothing Then
For Each cll In rng
If cll = Range("C2") Then
Range("L2") = Range("K2")
Else
Range("L2") = Range("K3")
End If
Next cll
End If
Application.EnableEvents = True
End Sub
Nhập số 6 ra kết quả đúng vì code bạn viết nó như thếVới bài tập này em dùng sự kiện Worksheet_Change nhưng không biết nhầm ở đâu mà nó ra kết quả sai lung tung cả đi. Chỉ nhập số 6 là cho kết quả đúng mong các thầy các anh chị và các bạn xem giúp!
Thực ra đã có cách đơn giản là dùng công thức của leonguyen rồi nhưng do đang học VBA nên mình làm thử bằng VBA.
Bạn xem lại chỗ màu đỏ.Với bài tập này em dùng sự kiện Worksheet_Change nhưng không biết nhầm ở đâu mà nó ra kết quả sai lung tung cả đi. Chỉ nhập số 6 là cho kết quả đúng mong các thầy các anh chị và các bạn xem giúp!
Thực ra đã có cách đơn giản là dùng công thức của leonguyen rồi nhưng do đang học VBA nên mình làm thử bằng VBA.Option Explicit
Public Sub Worksheet_Change(ByVal Target As Range)
Application.EnableEvents = False
Dim rng As Range, cll As Range
Set rng = Range("D2:I10")
If Not Intersect(Target, Range("C2")) Is Nothing Then
For Each cll In rng
If cll = Range("C2") Then
Range("L2") = Range("K2")
Else
Range("L2") = Range("K3")
End If
Next cll
End If
Application.EnableEvents = True
End Sub
Public Sub Worksheet_Change(ByVal Target As Range)
Application.EnableEvents = False
Dim rng As Range, cll As Range
Set rng = Range("D2:I10")
If Not Intersect(Target, Range("C2")) Is Nothing Then
Range("L2") = Range("K3")
For Each cll In rng
If cll = Range("C2") Then
Range("L2") = Range("K2")
Exit Sub
End If
Next cll
End If
Application.EnableEvents = True
End Sub
Bạn xem lại, tôi vừa test thử code của bạn thấy cũng không ra kết quả như tác giả yêu cầu!Bạn xem lại chỗ màu đỏ.
Xét tất cả các ô trong vùng D2:I10, nếu không có ô nào bằng C2 thì L2 = K3, ngược lại nếu có 1 ô bằng C2 thì L2 = K2
Code của bạn sửa lại thành:
HTML:Public Sub Worksheet_Change(ByVal Target As Range) Application.EnableEvents = False Dim rng As Range, cll As Range Set rng = Range("D2:I10") If Not Intersect(Target, Range("C2")) Is Nothing Then Range("L2") = Range("K3") For Each cll In rng If cll = Range("C2") Then Range("L2") = Range("K2") Exit Sub End If Next cll End If Application.EnableEvents = True End Sub
Oh. Mình không để ý kỹ code của bạn có cặp lệnh:Bạn xem lại, tôi vừa test thử code của bạn thấy cũng không ra kết quả như tác giả yêu cầu!
Application.EnableEvents = False
....................
Application.EnableEvents = True
Cảm ơn Susu16 nhiều nhé! Có thể giải thích giúp tôi tại sao trong trường hợp này bỏ 2 dòng lệnh:Oh. Mình không để ý kỹ code của bạn có cặp lệnh:
Thực tế thì code của bạn không cần 2 lệnh này.Mã:Application.EnableEvents = False .................... Application.EnableEvents = True
Nên đoạn Code mình sửa ở trên bạn có thể sửa lại theo 1 trong các cách sau:
1 - Bỏ 2 lệnh:
Application.EnableEvents = False
Application.EnableEvents = True
2 - Thay Exit Sub bằng Exit For
3 - Thêm Application.EnableEvents = True vào trên dòng Exit Sub
Cảm ơn bạn đã nhắc nhở!
đi thì lại được không?Application.EnableEvents = False
Application.EnableEvents = True
Em đã hiểu ý của anh rồi! Nếu trong vùng đó mà tìm thấy cll có giá trị bằng Range("C2") thì phải dừng vòng lập For ngay bằng Exit For.Nhập số 6 ra kết quả đúng vì code bạn viết nó như thế
Bạn cho chạy hết bảng, thì nó......chạy hết bảng, thằng cuối cùng của bảng là 6 nên chỉ có nhập số 6 mới có kết quả đúng, bi nhiêu còn lại là "tèo" hết. Híc
Thân
ption Explicit
Public Sub Worksheet_Change(ByVal Target As Range)
Application.EnableEvents = False
Dim rng As Range, cll As Range
Set rng = Range("D2:I10")
If Not Intersect(Target, Range("C2")) Is Nothing Then
For Each cll In rng
If cll = Range("C2") Then
Range("L2") = Range("K2")
Exit For
Else
Range("L2") = Range("K3")
End If
Next cll
End If
Application.EnableEvents = True
End Sub
2 dòng lệnh trên là nó tắt/bật chức năng kích hoạt sự kiện của Excel (ở đây là Worksheet_Change). Sau khi tắt (để tránh vòng lặp vô tận) bạn phải bật lại ở cuối Sub. Lệnh Exit Sub mà không có Application.EnableEvents = True ở trên. Nên nó không bật lại chức năng này sau khi đã tắt, nên chạy lần sau sự kiện Worksheet_Change không hoạt động.Cảm ơn Susu16 nhiều nhé! Có thể giải thích giúp tôi tại sao trong trường hợp này bỏ 2 dòng lệnh:
đi thì lại được không?Application.EnableEvents = False
Application.EnableEvents = True
[COLOR=#000000][I]If Not Intersect(Target, Range("C2")) Is Nothing Then[/I][/COLOR]
Không thực sự cần thiết, bạn có thể bỏ nó đi và sử dụng Exit Sub như bình thường.Application.EnableEvents = False
Application.EnableEvents = True