Đánh mã hàng

  • Thread starter Thread starter mitna
  • Ngày gửi Ngày gửi
Liên hệ QC

mitna

Thành viên mới
Tham gia
24/11/06
Bài viết
1
Được thích
0
Mình làm nhập xuất tồn bằng excel đơn giản thôi, nhưng việc đánh mã hàng để tránh trùng và tiện theo giõi thì chẳng biết phải làm sao. Mỗi lần đánh mã mình lại phải căng mắt lên xem có cái nào như thế k .
Giúp mình với.................................
 
Tạm thời bạn dùng code này nhé!
(Khi bạn thay đổi dữ liệu ở cột A ---> sẽ có thông báo...)
Nhấn phải chuột vào tên sheet (sheet1 chẳng hạn), chọn View code rồi thêm đoạn code sau:
Mã:
Private Sub Worksheet_Change(ByVal Target As Range)
On Error GoTo thoat
If Target.Value = "" Then End
If Target.Column = 1 Then
    If IsNumeric(WorksheetFunction.Match(Target.Value, _ 
        Range("A1:A" & Target.Row - 1), 0)) Then
        MsgBox "Da co roi"
        Cells(ActiveCell.Row - 1, 1).Select
        ActiveCell.ClearContents
    End If
End If
thoat:
End Sub
 
Chỉnh sửa lần cuối bởi điều hành viên:
Dear all,
--------
Theo em đơn giản nhất là dùng hàm COUNTIF(<Danh sách mã hàng đã nhập>,<Mã hàng kiểm tra>). Nếu hàm trả về lớn hơn hoặc bằng 1 thì mã hàng đã có. Cách này tiết kiệm được việc phải viết một thủ tục, phù hợp với bạn không biết về VBA.
If Target.Value = "" Then End
Theo em thì thay End bởi Exit Sub thì đúng hơn. Là vì End có hiệu lực cho cả Application, trong đó có cả User Forms. Còn Exit Sub chỉ hiệu lực cho Sub đang thực thi.
 
Giả dụ ta có mã hàng rồi, bây giờ mã cần sửa không phải dòng cuối mà là dòng i , a b c d -> a d c d thì nó không báo, vậy bạn sửa Sub trên thành coutif hộ
Cám ơn NVSON! Bạn rất super!
 
Lần chỉnh sửa cuối:
Vậy mình sửa lại code theo ý các bạn:
Mã:
Private Sub Worksheet_Change(ByVal Target As Range)
On Error GoTo thoat
If Target.Value = "" Then Exit Sub
If Target.Column = 1 Then
    If WorksheetFunction.CountIf(Columns("A:A"), Target.Value) > 1 Then
        MsgBox "Da co roi"
        Target.Select
        ActiveCell.ClearContents
    End If
End If
thoat:
End Sub
 
Dear nvson,
-----------
Em muốn nói thêm một chút về kỹ thuật xử lý lỗi trong Sub này:
Phát biểu On Error có tác dụng "bật" trình quản lý lỗi hệ thống. Nghĩa là khi có lỗi phát sinh, với khai báo này, người lập trình có thể biết được lỗi thông qua thuộc tính Number của đối tượng Err (Debug.Print Err.Number). Cú pháp của On Error có thể viết ở các dạng sau:
Syntax
On Error GoTo line
On Error Resume Next
On Error GoTo 0
The On Error statement syntax can have any of the following forms:
StatementDescription
On Error GoTo line Enables the error-handling routine that starts at line specified in the required line argument. The line argument is any line label or line number. If a run-time error occurs, control branches to line, making the error handler active. The specified line must be in the same procedure as the On Error statement; otherwise, a compile-time error occurs.
On Error Resume NextSpecifies that when a run-time error occurs, control goes to the statement immediately following the statement where the error occurred where execution continues. Use this form rather than On Error GoTo when accessing objects.
On Error GoTo 0 Disables any enabled error handler in the current procedure.

(Trong code của bạn select phát biểu On Error rồi ấn F1 để biết thêm chi tiết).
Nếu bạn không khái báo On Error thì khi có lỗi phát sinh trong khi thực thi một thông điệp hệ thống sẽ đưa ra mã lỗi và mô tả lỗi (bằng tiếng Anh). Một điều đáng nói ở đây là nếu bạn đang có ý định điều hướng chương trình bằng việc sử dụng Goto <Label>: (trong đó Label là một nhãn được đặt trước dòng lệnh bắt đầu xử lý lỗi) thì bạn phải khai báo một phát biểu Exit Sub/Function/Property (tuỳ thuộc dạng thủ tục) ngay trước <Label>:
Có thể minh hoạ cấu trúc xử lý lỗi như sau:
Sub InitializeMatrix(Var1, Var2, Var3, Var4)
On Error GoTo ErrorHandler
. . .
Exit Sub
ErrorHandler:
. . .
Resume Next
End Sub
Để các bạn dễ hiểu hơn, thủ tục Worksheet_Change có thể được viết lại như sau:
Mã:
[LEFT]Private Sub Worksheet_Change(ByVal Target As Range)
On Error GoTo thoat
If Target.Value = "" Then Exit Sub
If Target.Column = 1 Then
If WorksheetFunction.CountIf(Columns("A:A"), Target.Value) > 1 Then
    MsgBox "Da co roi"
    Target.Select
    ActiveCell.ClearContents
End If
End If
Exits Sub[COLOR=darkgreen]' Cần chèn thêm khai báo này trước nhãn thoat[/COLOR]
thoat:
[COLOR=darkgreen]' Các xử lý lỗi của bạn, ví dụ:[/COLOR]
MsgBox "Loi: " & Err.Number & " - " & Err.Description, vbExclamation, "Loi he thong"
End Sub[/LEFT]

Hoặc nếu bạn không muốn xử lý lỗi mà muốn ngưng mọi thực thi khi có lỗi phát sinh thì sử dụng phát biểu Resume Next như sau:

Mã:
[LEFT]Private Sub Worksheet_Change(ByVal Target As Range)[/LEFT]
On Error [B]Resume Next[/B] [COLOR=darkgreen]'Thay phát biểu [B]GoTo [/B]bằng [B]Resume Next[/B][/COLOR]
If Target.Value = "" Then Exit Sub
If Target.Column = 1 Then
If WorksheetFunction.CountIf(Columns("A:A"), Target.Value) > 1 Then

[LEFT]    MsgBox "Da co roi"
[LEFT]    Target.Select
    ActiveCell.ClearContents
End If
End If
End Sub[/LEFT]

[/LEFT]



Các bạn tham khảo bài viết này!
 
Lần chỉnh sửa cuối:
Web KT

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

Back
Top Bottom