Bắt lỗi nhập trùng STT trong Vba

Liên hệ QC

Thanhhoai00

Thành viên chính thức
Tham gia
19/7/20
Bài viết
58
Được thích
13
Mình có đoạn code như sau
Mỗi lần mình thêm dữ liệu từ Form xuống Excel gồm Số thứ tự và tên
Nhưng Code của mình vẫn chưa bắt được lỗi và vẫn nhập được Số thứ tự giống nhau !!!
Các bạn giúp mình xíu để bắt lỗi giúp mình nhé !!!! Không cho nhập STT trùng nhau
Mã:
Private Sub btn_Nhap_Click()
Dim Hovaten
Dim STT

STT = txt_STT.Value
Hovaten = txt_Hovaten.Value

LastRow = Cells(Rows.Count, "A").End(xlUp).Row

Range("A" & LastRow + 1).Value = STT
Range("B" & LastRow + 1).Value = Hovaten

txt_STT.Value = ""
txt_Hovaten.Value = ""

End Sub
 

File đính kèm

  • THEM.xlsm
    21.9 KB · Đọc: 4
Không cho nhập STT trùng nhau? Thế nếu hiện có 1, 2, 3 thì có cho nhập 5 không? Vì 5 thì dĩ nhiên là không trùng với 1, 2 và 3 rồi.

Đã là STT thì ngoài KHÔNG TRÙNG ra còn phải LIÊN TỤC. Nếu phải LIÊN TỤC thì txt_STT vô dụng. Chỉ cần:
- nếu là dòng đầu tiên thì nhập vào cột A giá trị 1.
- nếu hiện tại ở dòng cuối cùng ở cột A có giá trị xyz thì nhập ở dòng tiếp theo giá trị (xyz + 1).

Thế thôi. Bầy đặt txt_STT để làm gì khi mà không được phép (do tính LIÊN TỤC của STT) nhập bất cứ giá trị nào khác ngoài (xyz + 1)?
 
Upvote 0
Giả dụ danh sách cơ quan có 100 người; Người thứ 40 gì đó bỏ việc, (hay nghỉ hưu hoặc thuyên chuyển) thì có thể sẽ xóa dòng (40) này đi;
Như vậy STT cột A không nhất thiết là liên tục, mà là tăng hơn so với STT dòng trước là được.
Có nghĩa theo mình là số TT của người mới phải là STT người trước liền kề + 1
Còn trong quá trình vận hành CSDL ta có thể xóa bất cứ dòng nào trong CSDL.
Chủ bài đăng nghỉ sao (?)

Nếu đồng í thì khi tìm ra dòng cuối ta sẽ tương đương tìm ra STT của người cuối đã nhập; Vấn đề còn lại ta ta cộng thêm 1 & ấn vô làm STT cho người mới thôi!

Vui nha!
 
Upvote 0
Vấn đề ở chỗ: dùng STT để làm gì. Nếu STT không còn phục vụ cho mục đích đặt ra thì "bịa" ra cột STT để làm gì? Để trang trí?
Nếu không là những số liên tiếp thì sao gọi là "Thứ tự" được? Có lẽ nên gọi là "Số Tùy ý", "Số tăng dần", "Số chẳng để làm gì" thì đúng hơn. Nếu số STT là 1, 98, 300 ... thì cột số đó để làm gì? Để làm cảnh?

Mà cho dù là số gì chăng nữa thì tôi đã viết rồi. Không có chuyện dùng txt_STT. Vì dùng để làm gì? Nếu mục ̣đích là để tạo STT tăng dần nhưng không nhất thiết là liên tục? Dạng 1, 98, 300? Còn nếu chấp nhận đọc số ở dòng trước rồi + 1 thì không có chyện dùng txt_STT. Cái này tôi đã viết ngay bài đầu rồi.
 
Lần chỉnh sửa cuối:
Upvote 0
Đây là bài toán nhỏ để mình ghép vào bài lớn thôi ạ !! Bạn giúp mình xíu nhé
Ý mình là Làm sao không cho nhập dữ liệu bị trùng nhau tại cột A từ form xuống dữ liệu excel ??? Mình ví dụ ở đây là Số thứ tự !
cảm ơn bạn ạ !!


Không cho nhập STT trùng nhau? Thế nếu hiện có 1, 2, 3 thì có cho nhập 5 không? Vì 5 thì dĩ nhiên là không trùng với 1, 2 và 3 rồi.

Đã là STT thì ngoài KHÔNG TRÙNG ra còn phải LIÊN TỤC. Nếu phải LIÊN TỤC thì txt_STT vô dụng. Chỉ cần:
- nếu là dòng đầu tiên thì nhập vào cột A giá trị 1.
- nếu hiện tại ở dòng cuối cùng ở cột A có giá trị xyz thì nhập ở dòng tiếp theo giá trị (xyz + 1).

Thế thôi. Bầy đặt txt_STT để làm gì khi mà không được phép (do tính LIÊN TỤC của STT) nhập bất cứ giá trị nào khác ngoài (xyz + 1)?
 
Lần chỉnh sửa cuối:
Upvote 0
Macro này có thể chìu lòng bạn chăng:
PHP:
Private Sub btn_Nhap_Click()
Dim HoVaTen As String
Dim STT As Long, LastRow As Long
Dim Rng As Range, sRng As Range

STT = txt_STT.Value
HoVaTen = txt_Hovaten.Text
LastRow = Cells(Rows.Count, "A").End(xlUp).Row
Set Rng = [A1].Resize(LastRow)
Set sRng = Rng.Find(STT, , xlFormulas, xlWhole)
If sRng Is Nothing Then
    Range("A" & LastRow + 1).Value = STT
    Range("B" & LastRow + 1).Value = HoVaTen
    txt_STT.Value = Space(0)
    txt_Hovaten.Value = Space(0)
Else
    MsgBox "Có Rôi, " & STT, , "GPE.COM Xin Thông Báo!"
End If
End Sub
 
Upvote 0
Đây là bài toán nhỏ để mình ghép vào bài lớn thôi ạ !! Bạn giúp mình xíu nhé
Ý mình là Làm sao không cho nhập dữ liệu bị trùng nhau tại cột A từ form xuống dữ liệu excel ??? Mình ví dụ ở đây là Số thứ tự !
cảm ơn bạn ạ !!
Bạn thử xem. Tôi viết xong chỉ nhìn lướt qua thôi.
Mã:
Private Sub btn_Nhap_Click()
Dim Hovaten
Dim STT As Long, lastRow As Long
    On Error Resume Next
    STT = Abs(txt_STT.Value)
    If Err.Number Then
        MsgBox ("Hay nhap so")
        txt_STT.Value = ""
        txt_STT.SetFocus
        Exit Sub
    End If
    Hovaten = txt_Hovaten.Value
    With ThisWorkbook.Worksheets("Sheet1")
        lastRow = .Cells(Rows.Count, "A").End(xlUp).Row
        If .Range("A1").Resize(lastRow).Find(STT, .Range("A1"), xlValues, xlWhole, xlByColumns, xlNext) Is Nothing Then
            .Range("A" & lastRow + 1).Value = STT
            .Range("B" & lastRow + 1).Value = Hovaten
            txt_Hovaten.Value = ""
        Else
            MsgBox "STT da ton tai"
        End If
        txt_STT.Value = ""
        txt_STT.SetFocus
    End With
End Sub
 
Upvote 0
Cảm ơn thầy SA_DQ batman1 nhiều nhiều ạ !!! --=0
 
Upvote 0
Đây là bài toán nhỏ để mình ghép vào bài lớn thôi ạ !! Bạn giúp mình xíu nhé
Ý mình là Làm sao không cho nhập dữ liệu bị trùng nhau tại cột A từ form xuống dữ liệu excel ??? Mình ví dụ ở đây là Số thứ tự !
cảm ơn bạn ạ !!
Ví dụ kiểu như vậy rất khó trả lời.
Mỗi mã có một cách xử lý khác nhau.
Khi nói chuyện về số thứ tự, người ta thường có thêm một hàm để tìm những số có thể dùng được. Hàm này, tuỳ theo chính sách của cơ quan mà sẽ tìm một số nằm trong lỗ hổng hoặc số lớn nhất + 1
MsgBox "Số " & STT & " đã được dùng. Số " & COTHEDUNG & " hiện chưa xài tới"
 
Lần chỉnh sửa cuối:
Upvote 0
Các bạn cho mình hỏi xíu ạ !!
mình có đoạn code sửa dữ liệu từ Form xuống excel. Không biết mình bị lỗi gì chỉ sửa được Hai cột đầu tiên là cột STT(A) và Cột Tên (B)
CÒN cột C là Giới Tinh , Cột D là Nơi sinh Mình không sửa được ????
Các bạn xem giúp mình sửa lỗi này 1 xíu nhé hoặc có code nào hay hơn để sửa được Dữ liệu từ Form xuống eXcel giống bài của mình các bạn cho mình tham khảo nhé
cảm ơn các bạn nhiều ạ !!!

Mã:
Private Sub CommandButton1_Click()
On Error Resume Next
    g = 0
    Do
    DoEvents
    g = g + 1
    p = Sheet1.Range("A" & g)
    If p = TextBox1.Text Then
        Sheet1.Range("B" & g) = TextBox2.Text
        Sheet1.Range("C" & g) = TextBox3.Text
        Sheet1.Range("D" & g) = TextBox4.Text
            End If
    Loop Until p = ""
    UserForm1.TextBox1.SetFocus
End Sub

Private Sub ListBox1_Click()
Me.TextBox1.Text = ListBox1.List(ListBox1.ListIndex, 0)
Me.TextBox2.Text = ListBox1.List(ListBox1.ListIndex, 1)
Me.TextBox3.Text = ListBox1.List(ListBox1.ListIndex, 2)
Me.TextBox4.Text = ListBox1.List(ListBox1.ListIndex, 3)
End Sub

Private Sub UserForm_Click()

End Sub

Ví dụ kiểu như vậy rất khó trả lời.
Mỗi mã có một cách xử lý khác nhau.
Khi nói chuyện về số thứ tự, người ta thường có thêm một hàm để tìm những số có thể dùng được. Hàm này, tuỳ theo chính sách của cơ quan mà sẽ tìm một số nằm trong lỗ hổng hoặc số lớn nhất + 1
MsgBox "Số " & STT & " đã được dùng. Số " & COTHEDUNG & " hiện chưa xài tới"
 

File đính kèm

  • Book1.xlsm
    18.5 KB · Đọc: 7
  • Untitled.png
    Untitled.png
    26.1 KB · Đọc: 8
Upvote 0
. . . .
mình có đoạn code sửa dữ liệu từ Form xuống excel. Không biết mình bị lỗi gì chỉ sửa được Hai cột đầu tiên là cột STT(A) và Cột Tên (B)
CÒN cột C là Giới Tinh , Cột D là Nơi sinh Mình không sửa được
Đầu tiên mình muốn nói với bạn là hình như bạn đang thiếu 1 vài trường mà tuyệt đối không thể nhập sai đrể rồi tiến hành sửa;
Đó là các trường [Mã NV],mã này phải là duy nhất cho mỗi người & tồn tại tối thiểu 15 năm
Trường [Ho Tên], [Giới tính], [Số căn cước]
Các trường còn lại có thể sửa hay phải được sửa theo thời gian phát triển CSDL
 
Upvote 0
Thầy giúp em xíu được không ạ ! Code của em bị lỗi ở đâu em tìm hoài từ sáng giờ mà không sửa được !
Đầu tiên mình muốn nói với bạn là hình như bạn đang thiếu 1 vài trường mà tuyệt đối không thể nhập sai đrể rồi tiến hành sửa;
Đó là các trường [Mã NV],mã này phải là duy nhất cho mỗi người & tồn tại tối thiểu 15 năm
Trường [Ho Tên], [Giới tính], [Số căn cước]
Các trường còn lại có thể sửa hay phải được sửa theo thời gian phát triển CSDL
 
Upvote 0
Nếu là mình thì nên là vầy:
 

File đính kèm

  • GPE.rar
    19.7 KB · Đọc: 6
Upvote 0
Các bạn cho mình hỏi xíu ạ !!
mình có đoạn code sửa dữ liệu từ Form xuống excel. Không biết mình bị lỗi gì chỉ sửa được Hai cột đầu tiên là cột STT(A) và Cột Tên (B)
CÒN cột C là Giới Tinh , Cột D là Nơi sinh Mình không sửa được ????
Nếu bạn chỉ muốn biết sai ở đâu thì hãy nhìn vào code, tôi sẽ giải thích.
Khi nhấn nút Lưu thì khi tìm được dòng p thỏa p = TextBox1.Text thì 3 dòng code được thực hiện
Mã:
    Sheet1.Range("B" & g) = TextBox2.Text    (A)
        Sheet1.Range("C" & g) = TextBox3.Text    (B)
        Sheet1.Range("D" & g) = TextBox4.Text    (C)

Sau khi thực hiện (A) thì vùng dữ liệu heocon2 (A2: D11) thay đổi do có 1 ô ở cột B thay đổi. Do heocon2 là RowSource cho ListBox1 nên ngay lập tức nó được làm mới. Nếu ở thời điểm cần làm mới mà ListBox.ListIndex > -1, tức có 1 mục nào đó được chọn thì sẽ có 3 thao tác được thực hiện:
- Nếu có ListBox1_Click thì nó được thực hiện.
- ListBox được làm mới.
- Nếu có ListBox1_Click thì nó được thực hiện.

Bạn đã có tình huống như trên. Tức sau khi thực hiện (A) thì ListBox1_Click được thực hiện - nó sẽ ghi các giá trị hiện hành ở dòng đang được chọn ra các TextBox (là các giá trị cũ) -> làm mới ListBox, tức trong ListBox cột TEN được làm mới, còn GIOITINH và NƠI SINH vẫn như cũ -> thực hiện ListBox1_Click, tức ghi các giá trị ra các TextBox. Ở thời điểm ghi này thì chỉ có giá trị TEN là mới (ghi ra TextBox2), còn GIOITINH và NƠI SINH vẫn là cũ nên TextBox3 và TextBox4 sẽ có giá trị cũ. Vì thế khi thực hiện (B) và (C) thì các giá trị cũ từ TextBox3 và TextBox4 được nhập vào sheet nên không có thay đổi.

Trong vấn đề của bạn tốt hơn là:
- bỏ RowSource cho ListBox1
- dùng ListBox.List để load dữ liệu vào ListBox, vd. ListBox1.List = Sheet1.Range("heocon2").Value, hoặc ListBox1.List = Sheet1.Range("A2:D" & lastRow).Value
- mỗi khi vùng dữ liệu thay đổi thì code phải tự làm mới ListBox.
 
Upvote 0
Dạ em cảm ơn Thầy ạ, nhưng Vẫn Không sửa được Giới tính và Nơi sinh ạ !! và bị Lỗi OUT of MEMORY !! o_O
Mã:
Private Sub CmsLuu_Click()
Dim Rng As Range, sRng As Range
Dim Rws As Long

Rws = [B2].CurrentRegion.Rows.Count
Set Rng = [B2].Resize(Rws)
Set sRng = Rng.Find(Me!tbMa.Text, , xlFormulas, xlWhole)
If Not sRng Is Nothing Then
    Cells(sRng.Row, "C").Value = Me!tbHT.Text
    Cells(sRng.Row, "D").Value = Me!tbGT.Text
    Cells(sRng.Row, "E").Value = Me!tbNSinh.Text
    MsgBox "Xong Ròi!", , "GPE.COM Thông Báo!"
    Me!tbHT.Text = Space(0)
    Me!tbGT.Text = ""
    Me!tbNSinh.Text = Space(0)
End If
    UserForm1.tbHT.SetFocus
End Sub




Private Sub LBds_Click()
Me.tbSTT.Text = lbDS.List(lbDS.ListIndex, 0)
Me.tbMa.Text = lbDS.List(lbDS.ListIndex, 1)
Me.tbHT.Text = lbDS.List(lbDS.ListIndex, 2)
Me.tbGT.Text = lbDS.List(lbDS.ListIndex, 3)
Me.tbNSinh.Text = lbDS.List(lbDS.ListIndex, 4)
End Sub



Private Sub UserForm_Click()

End Sub

Nếu là mình thì nên là vầy:
 

File đính kèm

  • QQ.png
    QQ.png
    325.4 KB · Đọc: 3
  • SChua.xlsm
    22.2 KB · Đọc: 6
Upvote 0
cảm ơn bạn đã trả lời ạ
Bạn có code cho mình xin tham khảo nhé....mình tìm code load ListBox.List mãi mà không làm được !!!!
Nếu bạn chỉ muốn biết sai ở đâu thì hãy nhìn vào code, tôi sẽ giải thích.
Khi nhấn nút Lưu thì khi tìm được dòng p thỏa p = TextBox1.Text thì 3 dòng code được thực hiện
Mã:
    Sheet1.Range("B" & g) = TextBox2.Text    (A)
        Sheet1.Range("C" & g) = TextBox3.Text    (B)
        Sheet1.Range("D" & g) = TextBox4.Text    (C)

Sau khi thực hiện (A) thì vùng dữ liệu heocon2 (A2: D11) thay đổi do có 1 ô ở cột B thay đổi. Do heocon2 là RowSource cho ListBox1 nên ngay lập tức nó được làm mới. Nếu ở thời điểm cần làm mới mà ListBox.ListIndex > -1, tức có 1 mục nào đó được chọn thì sẽ có 3 thao tác được thực hiện:
- Nếu có ListBox1_Click thì nó được thực hiện.
- ListBox được làm mới.
- Nếu có ListBox1_Click thì nó được thực hiện.

Bạn đã có tình huống như trên. Tức sau khi thực hiện (A) thì ListBox1_Click được thực hiện - nó sẽ ghi các giá trị hiện hành ở dòng đang được chọn ra các TextBox (là các giá trị cũ) -> làm mới ListBox, tức trong ListBox cột TEN được làm mới, còn GIOITINH và NƠI SINH vẫn như cũ -> thực hiện ListBox1_Click, tức ghi các giá trị ra các TextBox. Ở thời điểm ghi này thì chỉ có giá trị TEN là mới (ghi ra TextBox2), còn GIOITINH và NƠI SINH vẫn là cũ nên TextBox3 và TextBox4 sẽ có giá trị cũ. Vì thế khi thực hiện (B) và (C) thì các giá trị cũ từ TextBox3 và TextBox4 được nhập vào sheet nên không có thay đổi.

Trong vấn đề của bạn tốt hơn là:
- bỏ RowSource cho ListBox1
- dùng ListBox.List để load dữ liệu vào ListBox, vd. ListBox1.List = Sheet1.Range("heocon2").Value, hoặc ListBox1.List = Sheet1.Range("A2:D" & lastRow).Value
- mỗi khi vùng dữ liệu thay đổi thì code phải tự làm mới ListBox.
 
Upvote 0
cảm ơn bạn đã trả lời ạ
Bạn có code cho mình xin tham khảo nhé....mình tìm code load ListBox.List mãi mà không làm được !!!!
Tôi viết rồi mà.
Trích
vd. ListBox1.List = Sheet1.Range("heocon2").Value, hoặc ListBox1.List = Sheet1.Range("A2: D" & lastRow).Value
Tất nhiên phải xác định lastRow, nhưng bạn đã biết cách.

Dùng lastRow khi vùng dữ liệu luôn thay đổi.
 
Upvote 0
Web KT

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

Back
Top Bottom