Nhập dữ liệu có điều kiện

Liên hệ QC

thanh tong

Thành viên hoạt động
Tham gia
27/5/10
Bài viết
122
Được thích
11
Mình viết một đoạn code để nhập dữ liệu, nếu dữ liệu không phải là chữ "x" thì nó không cho nhập
mình viết như sau:
Private Sub Worksheet_Change(ByVal Target As Range)
Dim i
For i = 4 To 200
If Cells(i, 3) <> x Then
MsgBox "Ban phai nhap chu X"
Cells(i, 3).ClearContents
Cells(i, 3).Select
Exit Sub
End If
Next
end sub

nhung không được, mình mong các bạn điều chỉnh giúp mình
cảm ơn các bạn
 
Mình viết một đoạn code để nhập dữ liệu, nếu dữ liệu không phải là chữ "x" thì nó không cho nhập
mình viết như sau:
Private Sub Worksheet_Change(ByVal Target As Range)
Dim i
For i = 4 To 200
If Cells(i, 3) <> x Then
MsgBox "Ban phai nhap chu X"
Cells(i, 3).ClearContents
Cells(i, 3).Select
Exit Sub
End If
Next
end sub
nhung không được, mình mong các bạn điều chỉnh giúp mình
cảm ơn các bạn
Tại sao bạn không nghĩ đến Validation nhỉ? Việc này đơn giản hơn rất nhiều so với viết code đó bạn: Chọn vùng nhập liệu => Chọn Data\Validation => Chọn Allow là List và Source là x => OK
Còn trong code của bạn, trong sub có tham số Target nhưng trong nội dung sub không hề có Target nên nhập ở đâu cũng không được nếu vùng C4:C200 không chứa toàn chữ x.
 
Lần chỉnh sửa cuối:
Upvote 0
Vấn đề là mình đang muốn tìm hiểu và VBA nên mình mò mẫm viết , nếu mà sai thì mình lại hỏi các bạn trên diễn đàn để các bạn giúp họ mình
 
Upvote 0
Vấn đề là mình đang muốn tìm hiểu và VBA nên mình mò mẫm viết , nếu mà sai thì mình lại hỏi các bạn trên diễn đàn để các bạn giúp họ mình
Ít ra cũng phải vầy:
PHP:
Private Sub Worksheet_Change(ByVal Target As Range)
  On Error Resume Next
  If Not Intersect(Range("C4:C200"), Target) Is Nothing And Target.Count = 1 Then
    Application.EnableEvents = False
    If Target.Value <> "" Then
      If UCase(Target.Value) <> "X" Then
        MsgBox "Ban phai nhap chu X"
        Target.ClearContents
        Target.Select
      End If
    End If
    Application.EnableEvents = True
  End If
End Sub
 
Lần chỉnh sửa cuối:
Upvote 0
1. bác nDu cho em hỏi là cách làm tròn số trong VBA ntn? ở bảng cell là lệnh round còn trong VBA thì cách viết ra sao?

2. câu hỏi ban đầu của em em chỉnh lại là:
PHP:
Private Sub Worksheet_Change(ByVal Target As Range)
On Error Resume Next
Dim i
For i = 4 To 200

If Cells(i, 3) <> "" And Cells(i, 3) <> "x" Then
 MsgBox "Ban phai nhap chu (x)", 0
 Cells(i, 3).ClearContents
 Target.Select
 End If
end sub
 
Chỉnh sửa lần cuối bởi điều hành viên:
Upvote 0
câu hỏi ban đầu của em em chỉnh lại là:
Private Sub Worksheet_Change(ByVal Target As Range)
On Error Resume Next
Dim i
For i = 4 To 200

If Cells(i, 3) <> "" And Cells(i, 3) <> "x" Then
MsgBox "Ban phai nhap chu (x)", 0
Cells(i, 3).ClearContents
Target.Select
End If
end sub
Code này có For mà thiếu Next
Ngoài ra, điều quan trọng nhất là chẳng thấy dùng đến Target ---> Vậy đâu có được! Vì như thế thì dù bạn nhập liệu ở đâu code cũng chạy ---> Mất thời gian
Nguyên tắc: Phải xác định chính xác vùng hoạt động của Target (là cell mà ta gõ vào) ---> Chỉ khi ta gõ cell nằm trong vùng hoạt động thì code mới chạy, ngoài vùng thì thôi
 
Upvote 0
Bác NDU dịch nghĩa đọan này cho em với
If Not Intersect(Range("C4:C200"), Target) Is Nothing And Target.Count = 1 Then
Application.EnableEvents = False


UCase(Target.Value)
 
Upvote 0
Bác NDU dịch nghĩa đọan này cho em với
If Not Intersect(Range("C4:C200"), Target) Is Nothing And Target.Count = 1 Then
Application.EnableEvents = False


UCase(Target.Value)
Intersect(Range("C4:C200"), Target) ---> Là phần chung giữa C4:C200 với Target (chính là cell ta gõ)
If Not Intersect(Range("C4:C200"), Target) Is Nothing then --> Ý muốn nói chỉ khi nào cell tôi gõ nằm trong khu vực C4:C200 thì mới làm code ở dưới
If Not Intersect(Range("C4:C200"), Target) Is Nothing And Target.Count = 1 Then ---> Thêm cái Target.Count = 1 vào ý muốn ta phải tự tay gõ vào... nếu copy paste hàng loạt thì không cho phép
Application.EnableEvents = False ---> Suy nghĩ đến trường hợp nếu ta gõ sai thì code làm việc và xóa cell vừa gõ. đồng thời hiện thông báo ---> Khi cell được xóa thì sự kiện Change lại được kích hoạt và lại ra câu thông báo.... Cứ thế hoài hoài luôn ---> Vậy nên phải thêm dòng Application.EnableEvents = False vào đầu code và Application.EnableEvents = True vào cuối nhằm mục đích chỉ cho phép code hoạt động 1 lần duy nhất
UCase(Target.Value) ---> Phòng trường hợp gõ chữ thường hoặc chữ hoa
 
Upvote 0
Thử mày mò cải tiến code của ndu một chút xem sao (có vẻ gọn gàng hơn nhỉ?):
PHP:
Private Sub Worksheet_Change(ByVal Target As Range)
    On Error Resume Next
    If Intersect([C4:C200], Target) Is Nothing Or Target.Count > 1 Or Target.Value = "" Then Exit Sub
    If UCase(Target.Value) <> "X" Then
        MsgBox "Ban phai nhap chu X"
        Target.ClearContents
        Target.Select
    End If
End Sub
Rất cảm ơn ndu về chỗ này: Target.Count = 1, quả thật bây giờ mình mới biết cách viết gọn như vậy, hồi giờ phải thể hiện điều kiện này bởi cả biểu thức dài ngoằng như vầy đây: Target.Rows.Count + Target.Columns.Count = 2.
 
Lần chỉnh sửa cuối:
Upvote 0
Thử mày mò cải tiến code của ndu một chút xem sao (có vẻ gọn gàng hơn nhỉ?):
PHP:
Private Sub Worksheet_Change(ByVal Target As Range)
    On Error Resume Next
    If Intersect([C4:C200], Target) Is Nothing Or Target.Count > 1 Or Target.Value = "" Then Exit Sub
    If UCase(Target.Value) <> "X" Then
        MsgBox "Ban phai nhap chu X"
        Target.ClearContents
        Target.Select
    End If
End Sub
Rất cảm ơn ndu về chỗ này: Target.Count = 1, quả thật bây giờ mình mới biết cách viết gọn như vậy, hồi giờ phải thể hiện điều kiện này bởi cả biểu thức dài ngoằng như vầy đây: Target.Rows.Count + Target.Columns.Count = 2.

Code bạn sửa lại đâu phải cải tiến mà khác đấy chứ bạn . Còn khi bạn dồn Target.Value = "" lên một dòng thì nó vẫn có nghĩa khác đấy.
 
Upvote 0
Thử mày mò cải tiến code của ndu một chút xem sao (có vẻ gọn gàng hơn nhỉ?):
PHP:
Private Sub Worksheet_Change(ByVal Target As Range)
    On Error Resume Next
    If Intersect([C4:C200], Target) Is Nothing Or Target.Count > 1 Or Target.Value = "" Then Exit Sub
    If UCase(Target.Value) <> "X" Then
        MsgBox "Ban phai nhap chu X"
        Target.ClearContents
        Target.Select
    End If
End Sub
Rất cảm ơn ndu về chỗ này: Target.Count = 1, quả thật bây giờ mình mới biết cách viết gọn như vậy, hồi giờ phải thể hiện điều kiện này bởi cả biểu thức dài ngoằng như vầy đây: Target.Rows.Count + Target.Columns.Count = 2.

Code bạn sửa lại đâu phải cải tiến mà khác đấy chứ bạn . Còn khi bạn dồn Target.Value = "" lên một dòng thì nó vẫn có nghĩa khác đấy.
 
Upvote 0
thay vì bắt buộc phải nhập ký tự X, nếu bắt buộc phải nhập đủ 6 chữ số hoặc 6 ký tự thì chỉnh lại Code thế nào.
Xin ACE hướng dẫn
 
Upvote 0
thay vì bắt buộc phải nhập ký tự X, nếu bắt buộc phải nhập đủ 6 chữ số hoặc 6 ký tự thì chỉnh lại Code thế nào.<br>Xin ACE hướng dẫn
 
Upvote 0
thay vì bắt buộc phải nhập ký tự X, nếu bắt buộc phải nhập đủ 6 chữ số hoặc 6 ký tự thì chỉnh lại Code thế nào.
Xin ACE hướng dẫn
Thay hai câu:

If UCase(Target.Value) <> "X" Then
MsgBox
"Ban phai nhap chu X"

Thành như sau:

If Len(Target) <> 6 Then
MsgBox
"Ban nhap sai"

(Chỉ đúng khi ký tự không phải là tiếng việt có dấu, còn ngược lại thì chưa chắc)
 
Lần chỉnh sửa cuối:
Upvote 0
Mình đã thở làm theo thanhlanh hướng dẫn và đạt kết quả tốt
rất cảm ơn bạn
Chúc bạn khỏe-vui và hạnh phúc
 
Upvote 0
Web KT

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

Back
Top Bottom