Target này sai ở đâu?

  • Thread starter Thread starter ST-Lu!
  • Ngày gửi Ngày gửi
Liên hệ QC

ST-Lu!

Love Wingchun
Tham gia
19/8/08
Bài viết
730
Được thích
546
Nghề nghiệp
Xích lô một thời
PHP:
Private Sub Worksheet_Change(ByVal Target As Range)

Dim Co As String
With Range("G:G")
Co = Target.Offset(, -2)

If Not Intersect(.Cells, Target) Is Nothing _
And (Co <> "*" & "TOYOTA" & "*" Or Co <> "*" & "Canon" & "*") Then
Target.Offset(, 2) = "TM"
Target.Offset(, 3) = Now: .Offset(, 3).NumberFormat = "dd/mm/yy"

End If

End With

End Sub

Em xin mô tả như sau
- Cột E : cột công ty
- Cột F: để ẩn
- Cột G: cột hoá đơn
---
Đoạn code trên là nhập hoá đơn vào cột G, nếu cột E là công ty có tên CANON hoặc TOYOTA thì bỏ qua nhưng không hiểu sao viết xong nhập Canon và cột E
gõ số hoá đơn vào cột G thì tại cột I sẽ là "TM" và J là ngày tháng..

Chỉ ra số sai của em với?
-------
P/S: nếu cột F để ẩn thì em để offset là (,-1) hay (,-2)

Xin cám ơn
 
Lần chỉnh sửa cuối:
PHP:
Private Sub Worksheet_Change(ByVal Target As Range)

Dim Co As String
With Range("G:G")
Co = Target.Offset(, -2)

If Not Intersect(.Cells, Target) Is Nothing _
And (Co <> "*" & "TOYOTA" & "*" Or Co <> "*" & "Canon" & "*") Then
Target.Offset(, 2) = "TM"
Target.Offset(, 3) = Now: .Offset(, 3).NumberFormat = "dd/mm/yy"

End If

End With

End Sub
Em xin mô tả như sau
- Cột E : cột công ty
- Cột F: để ẩn
- Cột G: cột hoá đơn
---
Đoạn code trên là nhập hoá đơn vào cột G, nếu cột E là công ty có tên CANON hoặc TOYOTA thì bỏ qua nhưng không hiểu sao viết xong nhập Canon và cột E
gõ số hoá đơn vào cột G thì tại cột I sẽ là "TM" và J là ngày tháng..

Chỉ ra số sai của em với?
-------
P/S: nếu cột F để ẩn thì em để offset là (,-1) hay (,-2)

Xin cám ơn
Lý ra phải là vầy:
PHP:
Private Sub Worksheet_Change(ByVal Target As Range)
  Dim Co As String
  With Range("G:G")
    If Not Intersect(.Cells, Target) Is Nothing Then
       Co = Target.Offset(, -2).Value
       If InStr(Co, "TOYOTA") = 0 And InStr(Co, "CANON") = 0 Then
         Target.Offset(, 2) = "TM"
         Target.Offset(, 3) = Now: .Offset(, 3).NumberFormat = "dd/mm/yy"
       End If
    End If
  End With
End Sub
- Bạn phải đặt đ/k cho Target trước (nằm trong cột G) ---> Đằng này Target chưa tồn tại mà bạn đã Co = Target.Offset(, -2) ---> Điều này đồng nghĩa dù bạn gõ cái gì đó ở bất cứ cell nào thì Co của bạn sẽ xác định giá trị nằm ở Target.Offset(, -2)
- Tôi nghĩ cách so sánh (Co <> "*" & "TOYOTA" & "*" Or Co <> "*" & "Canon" & "*") không ổn ---> Bạn dùng InStr thì tốt hơn (như hàm Find trong công thức Excel ấy)
 
Upvote 0
thêm UCASE thì tuyệt cú mèo

PHP:
Private Sub Worksheet_Change(ByVal Target As Range)
  Dim Co As String
  With Range("G:G")
    If Not Intersect(.Cells, Target) Is Nothing Then
       Co = Target.Offset(, -2).Value
       If InStr(UCase(Co), "TOYOTA") = 0 And InStr(UCase(Co), "CANON") = 0 Then
         Target.Offset(, 2) = "TM"
         Target.Offset(, 3) = Now: .Offset(, 3).NumberFormat = "dd/mm/yy"
       End If
    End If
  End With
End Sub

Lúc đầu quyên Capslock em thấy nhập Toyota hoặc canon vẫn ok như thường...
hoá ra là mình quên vụ UCase()

Cám ơn Anh NDU cái vụ Instr này hay quá, tìm string 2 trong string 1
- nếu thấy = 1
- nếu không thấy = 0

hay quá nhưng em vẫn băn khoăn 1 cái nếu mình AND nhiều hơn 2 điều kiện thì sao?
ví dụ if condition 1 and condition 2 then nhưng nếu có 3, hoặc 4 điều kiện chẳng nhẽ
if condition 1 and condition 2 and condition 3 and condition 4 ...ạh?

Cám ơn Anh nhiều
 
Lần chỉnh sửa cuối:
Upvote 0
hay quá nhưng em vẫn băn khoăn 1 cái nếu mình AND nhiều hơn 2 điều kiện thì sao?
ví dụ if condition 1 and condition 2 then nhưng nếu có 3, hoặc 4 điều kiện chẳng nhẽ
if condition 1 and condition 2 and condition 3 and condition 4 ...ạh?

Cám ơn Anh nhiều
Thì ráng mà viết chứ sao
Ẹc... Ẹc... (ai bảo bạn dài dòng chi?)
Nói vui thôi!
Trong trường hợp này, nếu là tôi thì tôi sẽ tạo 1 vùng điều kiện để tham chiếu (các điều kiện chứa trong vùng này)... và nếu dùng công thức thì tôi dùng COUNTIF để kiểm tra, còn VBA thì dùng phương thức Find là nhanh nhất
chú ý: nếu Find không tìm thấy sẽ báo lổi nha... vì thế mà bạn phải thuộc lòng câu lệnh này:
PHP:
If Not VungDK.Find(... gì gì đó...) Is Nothing then
  .. Làm tiếp...
End If
Tìm thấy có thì làm tiếp
Hoặc
PHP:
If VungDK.Find(... gì gì đó...) Is Nothing then
   .. Làm tiếp...
End If
Tìm thấy không có thì làm tiếp
 
Upvote 0
Thực ra không cần đặt biến Co vì dùng chỉ có 2 lần. Tuy nhiên dùng cũng không sao --=0
Phần With..End with nên cụ thể hơn.

Và nên bẫy lỗi cho sự kiện Sheet_Change, nếu không sẽ bị vòng lặp.

PHP:
Private Sub Worksheet_Change(ByVal Target As Range)
    Dim Co As String
    Application.EnableEvents = False
    If Not Intersect(Range("G:G"), Target) Is Nothing Then
        Co = UCase$(Target.Offset(0, -2))
        If InStr(1, Co, "TOYOTA") + InStr(1, Co, "CANON") = 0 Then
            With Target
                .Offset(0, 2) = "TM"
                .Offset(0, 3) = Now
                .Offset(0, 3).NumberFormat = "dd/mm/yy"
            End With
        End If
    End If
    Application.EnableEvents = True
End Sub
--CV--
 
Lần chỉnh sửa cuối:
Upvote 0
Thực ra không cần đặt biến Co vì dùng chỉ có 2 lần. Tuy nhiên dùng cũng không sao --=0
Phần With..End with nên cụ thể hơn.

Và nên bẫy lỗi cho sự kiện Sheet_Change, nếu không sẽ bị vòng lặp.

PHP:
Private Sub Worksheet_Change(ByVal Target As Range)
    Dim Co As String
    Application.EnableEvents = False
    If Not Intersect(Range("G:G"), Target) Is Nothing Then
        Co = UCase$(Target.Offset(0, -2))
        If InStr(1, Co, "TOYOTA") + InStr(1, Co, "CANON") = 0 Then
            With Target
                .Offset(0, 2) = "TM"
                .Offset(0, 3) = Now
                .Offset(0, 3).NumberFormat = "dd/mm/yy"
            End With
        End If
    End If
    Application.EnableEvents = True
End Sub
--CV--
Mình nghĩ rằng do ta không thay đổi giá trị của Target nên không cần thiết phải dùng Application.EnableEvents
 
Upvote 0
Mình nghĩ rằng do ta không thay đổi giá trị của Target nên không cần thiết phải dùng Application.EnableEvents

Đúng là ta không thay đổi target, nhưng làm điều này có 2 cái lợi

  1. Tạo thói quen bẫy lỗi khi viết Code
  2. Vòng lặp không chạy lại lần nữa, mặc dù các vòng sau chỉ chạy kiểm tra xong thoát ngay, nhưng nếu dữ liệu thay đổi nhiều thì nó đều chạy lại kiểm tra. Như vậy rõ ràng là tốn thời gian. Và nếu như code rất nhiều thì việc chạy vòng lặp như vậy rất khó kiểm soát.
Tuy nhiên, tùy ở mỗi người, việc áp dụng hay không thì tùy quan điểm. Không nhất thiết là phải có hay không có.

--CV--
 
Upvote 0
Mình nghĩ rằng do ta không thay đổi giá trị của Target nên không cần thiết phải dùng Application.EnableEvents

Test
1. Em dùng Application.EnableEvents = fasle
- Nhập liệu --> Ok
- Xoá nhập --> nhập lại --> Sub không chạy nữa


-------
KÍnh gửi Anh NDU
Trên đây là 2 điều kiện "TOYOTA" và "CANON" nhưng giả sử có thêm 2 điều kiện nữa là
"ABC" và "XYZ" thì em gộp các điều kiền trên thành một mảng được không
ví dụ
Dim Codition as Variant
codition = Array("TOYOTA", "CANON", "ABC", "XYZ")

sau đó em tham chiếu qua Condition trên --> được không?

Gợi ý cho em với
 
Lần chỉnh sửa cuối:
Upvote 0
Trên đây là 2 điều kiện "TOYOTA" và "CANON" nhưng giả sử có thêm 2 điều kiện nữa là
"ABC" và "XYZ" thì em gộp các điều kiền trên thành một mảng được không
ví dụ
Dim Codition as Variant
codition = Array("TOYOTA", "CANON", "ABC", "XYZ")

sau đó em tham chiếu qua Condition trên --> được không?

Gợi ý cho em với
Đương nhiên là được rồi....
Lưu ý:
- Có thể dùng hàm HLOOKUP để truy xuất mãng này
- Nếu tìm không thấy thì HLOOKUP sẽ báo lổi, vì vậy bạn phải lường trước việc này
 
Upvote 0
Web KT

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

Back
Top Bottom