Khống chế cập nhật Dữ liệu từ Form

Liên hệ QC

namkhanh.dangtran

Thành viên mới
Tham gia
5/3/11
Bài viết
17
Được thích
8
Em có ví dụ này muốn nhờ các cao thủ xem và hoàn thiện dùm. Em không nghĩ được code phải viết thế nào nữa!
 

File đính kèm

  • FORM.rar
    80.3 KB · Đọc: 89
Em có ví dụ này muốn nhờ các cao thủ xem và hoàn thiện dùm. Em không nghĩ được code phải viết thế nào nữa!
Mình nghĩ bài viết của ban doomfootwear có thể giúp bạn:
http://www.giaiphapexcel.com/forum/...£nh-báo-khi-trùng-số-liệu-của-2-cá»™t
Khi 2 cột A,B có nhập trùng thì sẽ hiện lênh thông báo, đồng thời delele dòng mới nhập trùng. (mình lấy nguyên đoạn code của bạn doomfootwear).
Tác giả thông cảm nhé. Mình xin lỗi tác giã vì đã sửa một tí form của tác giả.
Mong nhận được đóng góp,

Thân
 

File đính kèm

  • FORM.rar
    85.3 KB · Đọc: 139
Lần chỉnh sửa cuối:
Upvote 0
Mình nghĩ bài viết của ban doomfootwear có thể giúp bạn:
http://www.giaiphapexcel.com/forum/...£nh-báo-khi-trùng-số-liệu-của-2-cá»™t
Khi 2 cột A,B có nhập trùng thì sẽ hiện lênh thông báo, đồng thời delele dòng mới nhập trùng. (mình lấy nguyên đoạn code của bạn doomfootwear).
Tác giả thông cảm nhé. Mình xin lỗi tác giã vì đã sửa một tí form của tác giả.
Mong nhận được đóng góp,

Thân

Rất cám ơn bạn nhiều! Nhưng ý mình muốn nó không chế luôn khi mình chọn vào nút cbSave cơ. Vì Trong bài tập lỡn của mình thì mình chỉ để Form nhập liệu hiện thui. Nên nếu áp dụng cách của bạn thì không thể được. Ý mình muốn là: Nếu nhập đầy đủ thông tin vào 2 ô: Mã và tên rùi chọn nút cbSave 1 lần thì nó lưu lại, nếu chọn đến lần thứ 2 nó sẽ cảnh báo là dữ liệu đã lưu và không cho lưu nữa!
Nhờ bạn và các cao thủ chỉ thêm nhé!
 
Upvote 0
Có rất nhiều cách để làm 2 việc: Tránh nhập trùng và nhấn 1 nút 2 lần:

1. Tránh nhập 1 mã đã có:
- Cách 1: đơn giản nhất là dùng find để tìm giá trị textbox mã trong cột mã. Nếu tìm thấy, thì là trùng, sửa mã lại (chỉ 1 vài câu lệnh)
- Cách 2: Dùng hàm đếm giá trị textbox mã trong cột mã, nếu >0 nghĩa là đã có, làm lại với mã khác (cũng chỉ 1 vài dòng lệnh và dùng countif của excel)
- Dùng code của vba_gpe: phức tạp quá. Nhập liệu mỗi 1 record mà tới 3 nút lệnh phải nhấn và 1 đống code.

2. Tránh việc nhấn nút save 2 lần:
- Cách 1: Để nguyên dữ liệu trên textbox (chả hiểu giữ lại làm quái gì và tự gây khó cho mình): Dùng 1 biến kiểm tra số lần nhấn nút save. Nếu lớn hơn 1 thì la lên
- Cách 2: Nhấn 1 lần, vô hiệu nút save, chỉ khi nhấn new, mới kích hoạt lại nút save
- Cách 3: Dễ nhất, đơn giản nhất, chỉ cần nghĩ đơn giản là làm được (đừng suy nghĩ kiểu bác học với pro priếc làm gì): Kiểm tra trùng mã xong, ghi xuống sheet, xoá phứt 2 textbox. Nhấn lần thứ 2, hoặc là chả còn cái quái gì để ghi, hoặc là bẫy textbox trống không cho ghi. Với cách này, có thể vứt quách cái nút new. Hết chuyện.
 
Lần chỉnh sửa cuối:
Upvote 0
Bài của ptm 0412 là khá đủ điều kiện để bảo đảm bộ mã chuẩn mực, mình tham gia thêm là viết toàn bộ các điều kiện vào 1 hàm để kiểm tra. bình thường nút save đwowcj set enabled=false. chỉ khi nào hàm kiểm tra đủ dièu kiện mới set thành true

xin lỗi mình gõ 1 tay lộn xộn quá
 
Upvote 0
ptm0412! Em mới nên chưa biết nhiều. Anh sửa giúp em theo cách nhấn nút Save 2 lần (theo cách 3 anh gợi ý) để em tham khảo nha.
Cám ơn ptm0412 nhiều!
 
Upvote 0
Upvote 0
Lấy 2 dòng lệnh của nút New, bỏ lên code của nút lệnh Save. Xoá nút New. Xong.

Cách này em biết. Nhưng nếu mở file đó lên và chỉ để hiện Form đó để nhập liệu thui thi lấy cách đó sẽ không ổn. Có thể có mã đã nhập mà mình không biết thì sẽ nhập lại nhiều lần.
Vậy nhờ ptm0412 xem thêm cho em nhé!
 
Upvote 0
Trời ạ. Xem cách 2 của mục 1 (Tránh nhập 1 mã đã có)
- Cách 2: Dùng hàm đếm giá trị textbox mã trong cột mã, nếu >0 nghĩa là đã có ...
Đừng nói là không biết dùng countif nha.
namkhanh đã viết:
nếu mở file đó lên và chỉ để hiện Form đó để nhập liệu thui thi lấy cách đó sẽ không ổn
- Ai biểu không kiểm tra trùng làm chi?
- Ai biểu dấu sheet đi làm chi? Đừng nghĩ là chỉ hiện form, không hiện sheet là Pro. Pro thực sự viết ứng dụng excel để bán mới dấu sheet. Amateur thì lỗi tùm lum tá la, dấu rồi lấy ra lại không được thì chết sớm.
 
Lần chỉnh sửa cuối:
Upvote 0
Cách này em biết. Nhưng nếu mở file đó lên và chỉ để hiện Form đó để nhập liệu thui thi lấy cách đó sẽ không ổn. Có thể có mã đã nhập mà mình không biết thì sẽ nhập lại nhiều lần.
Vậy nhờ ptm0412 xem thêm cho em nhé!
Tôi làm bài này theo nguyên tắc sau:
- UserForm được thiết kế gồm có: TextBox Mã, TextBox Tên, Nút Save và Nút Thoát (không có nút New)
- Khi bạn nhập mã vào TextBox Mã, nếu mã ấy tồn tại thì tên tự động hiện ra tại TextBox Tên... khi ấy, nếu bạn sửa tên và bấm nút Save thì đồng nghĩa là bạn sửa thông tin của mã vừa nhập
- Khi bạn nhập mã vào TextBox Mã, nếu mã ấy không tồn tại thì TextBox Tên sẽ rổng... khi ấy, nếu bạn nhập tên và bấm nút Save thì đồng nghĩa là bạn thêm thông tin của mã vừa nhập
- Như vậy thì chẳng bao giờ có chuyện nhập trùng cả
Code như sau:
PHP:
Dim fRng As Range
Private Sub cbQuit_Click()
  Unload Me
End Sub
PHP:
Private Sub cbSave_Click()
    Dim iR As Long
    iR = Sheets("Sheet1").Range("A1000").End(3).Offset(1, 0).Row
    If Trim(Me.txtMa.Value) = "" Then
        Me.txtMa.SetFocus
        MsgBox "Ma khong duoc de trong!", vbCritical + vbOKOnly
    Else
      fRng.Offset(, 0) = Me.txtMa.Value
      fRng.Offset(, 1) = Me.txtTen.Text
    End If
    Me.txtMa.SetFocus
End Sub
PHP:
Private Sub txtMa_Change()
  With Sheet1.Range("A1").CurrentRegion.Resize(, 1)
    Set fRng = .Find(txtMa.Text, , , xlWhole)
    If fRng Is Nothing Then Set fRng = .Parent.Cells(60000, .Column).End(xlUp).Offset(1)
    txtTen.Text = fRng.Offset(, 1).Value
  End With
End Sub
 

File đính kèm

  • FORM.xls
    27.5 KB · Đọc: 123
Upvote 0
Tôi làm bài này theo nguyên tắc sau:
- UserForm được thiết kế gồm có: TextBox Mã, TextBox Tên, Nút Save và Nút Thoát (không có nút New)
- Khi bạn nhập mã vào TextBox Mã, nếu mã ấy tồn tại thì tên tự động hiện ra tại TextBox Tên... khi ấy, nếu bạn sửa tên và bấm nút Save thì đồng nghĩa là bạn sửa thông tin của mã vừa nhập
- Khi bạn nhập mã vào TextBox Mã, nếu mã ấy không tồn tại thì TextBox Tên sẽ rổng... khi ấy, nếu bạn nhập tên và bấm nút Save thì đồng nghĩa là bạn thêm thông tin của mã vừa nhập
- Như vậy thì chẳng bao giờ có chuyện nhập trùng cả
Code như sau: ...

Vậy là làm hết cho tác giả còn gì?
Tuy vậy, viết như thế này, gọn thì có gọn thật, nhưng chỉ 1 mình người viết là biết cách xài. Đưa cho người khác xài phải viết thêm "file hướng dẫn sử dụng"

Thôi lỡ rồi làm luôn:

1. Nếu chỉ thêm mã mới mà không sửa mã cũ, thì chỉ cần thêm điều kiện If trước khi ghi xuống sheet:

File bài 1, không có nút New.
PHP:
        If Application.CountIf(Range("A2:A" & iR - 1), txtMa) = 0 Then
            With Sheets("Sheet1")
                .Cells(iR, 1).Value = Me.txtMa.Value
                .Cells(iR, 2).Value = Me.txtTen.Text
            End With
        Else
            MsgBox "Ma nay co roi ku!"
        End If
2. Nếu muốn vừa thêm mã mới vừa sửa mã cũ như ndu:

Nếu là tôi thì tôi tách ra 2 nút lệnh trên sheet: "Thêm" và "Sửa"
Nhưng chỉ dùng 1 form với tuỳ biến như sau:

Code module:

PHP:
Public EditMode As String
'-----------'
Sub Button1_Click() 'Sửa mã cũ'
EditMode = "Edit"
    FORM.Show
End Sub
'------------------'
Sub Button2_Click() 'Thêm mã mới'
EditMode = "Add"
    FORM.Show
End Sub
Code của form (không có nút New)

PHP:
'mở form'
Private Sub UserForm_Initialize()
Dim rng As Range, EndR As Long
If EditMode = "Edit" Then
    EndR = [a1000].End(xlUp).Row
    Set rng = Range("A2:B" & EndR)
    Me.Cb1.Visible = True
    Me.txtMa.Visible = False
    Me.Cb1.RowSource = rng.Address
Else
    Me.Cb1.Visible = False
    Me.txtMa.Visible = True
End If
End Sub
'-----------------
Code nhấn nút save'

Private Sub cbSave_Click()
    Dim iR As Long
    iR = Sheets("Sheet1").Range("A1000").End(xlUp).Row
    If EditMode = "Add" Then
        If Trim(Me.txtMa.Value) = "" Then
            Me.txtMa.SetFocus
            MsgBox "Ma khong duoc de trong!", vbCritical + vbOKOnly
            Exit Sub
        Else
            If Application.CountIf(Range("A2:A" & iR), txtMa) = 0 Then
                With Sheets("Sheet1")
                    .Cells(iR + 1, 1).Value = Me.txtMa.Value
                    .Cells(iR + 1, 2).Value = Me.txtTen.Text
                End With
            Else
                MsgBox "Ma nay co roi ku!" & Chr(10) & "Lam lai!"
                Me.txtMa.Value = ""
                Me.txtMa.SetFocus
                Exit Sub
            End If
        End If
    Else
        With Sheet1.Range("A1:A" & iR)
        Set fRng = .Find(Cb1.Text, , , xlWhole)
        fRng.Offset(, 1) = txtTen
        End With
    End If
    If MsgBox("Them nua hong nhoc?", vbYesNo) = vbYes Then
        Me.txtMa.Value = ""
        Me.txtTen.Text = ""
        If EditMode = "Edit" Then
            Me.Cb1.SetFocus
        Else
            Me.txtMa.SetFocus
        End If
    Else
        Unload Me
    End If
End Sub
Ghi chú:
Có mỗi chuyện lấy iR là dòng cuối mà mắc gì phải .End(xlUp).Offset(1,0).Row? End(xlUp).Row + 1 có phải đơn giản hơn và nhanh hơn không? Đừng tư duy bác học nữa.

Xem file, nếu tự làm được hơn vậy hoặc hơn file của ndu, thì hãy nghĩ đến chuyện dấu sheet. Bản thân tôi chưa dám nghĩ đến dấu sheet vì còn phải xài thử rồi sửa cho đến khi hết lỗi. Và cũng không thích dấu làm gì, vì có bán cho ai đâu. Code còn để mở là khác.
 

File đính kèm

  • Formptm.xls
    44 KB · Đọc: 114
Lần chỉnh sửa cuối:
Upvote 0
Tư vấn dùm Form nhập liệu

Em đang bối rối không biết nên thiết Form nhập liệu như thế nào? Em đưa lên đây nhờ các AC xem và tư vấn thêm có em cách tạo Form đó cho hợp lý với các thông tin đã cho trong Excel.
 

File đính kèm

  • GPEb.rar
    2.4 KB · Đọc: 33
Upvote 0
Em đang bối rối không biết nên thiết Form nhập liệu như thế nào? Em đưa lên đây nhờ các AC xem và tư vấn thêm có em cách tạo Form đó cho hợp lý với các thông tin đã cho trong Excel.
Hay là vầy đi: Bạn cứ thử tự mình tạo ra Form theo cách mà bạn cho là tối ưu nhất, đưa lên đây rồi mọi người sẽ góp ý sau
 
Upvote 0
Hay là vầy đi: Bạn cứ thử tự mình tạo ra Form theo cách mà bạn cho là tối ưu nhất, đưa lên đây rồi mọi người sẽ góp ý sau

Em mới chỉ nghĩ là làm được thế này thui ah. Anh không biết có thể làm bằng cách khác không? Anh xem dùm cho em với nhé!
 

File đính kèm

  • GPEb_1.rar
    10.5 KB · Đọc: 52
Upvote 0
Em mới chỉ nghĩ là làm được thế này thui ah. Anh không biết có thể làm bằng cách khác không? Anh xem dùm cho em với nhé!
Dear NGọc
Tôi không được học VBA gì cả .mình nghĩ nếu đơn giản thì chúng ta nên chọn cách đơn giản,nếu dữ liệu phức tạp và đồ sộ thì hãy nên dùng form, nhưng với dữ liệu chỉ đơn giản như vậy thì dùng form làm gì cho thêm phức tạp vậy Ngọc
 
Upvote 0
Viết thêm cho code không cho nhập dữ liệu trùng từ Form

Tôi có ví dụ nhỏ này, nhờ các anh em viết dùm thêm code cảnh báo nếu có dữ liệu nhập trùng (nếu trùng không cho nhập).
 

File đính kèm

  • vidu.rar
    9.7 KB · Đọc: 35
Upvote 0
Dear NGọc
Tôi không được học VBA gì cả .mình nghĩ nếu đơn giản thì chúng ta nên chọn cách đơn giản,nếu dữ liệu phức tạp và đồ sộ thì hãy nên dùng form, nhưng với dữ liệu chỉ đơn giản như vậy thì dùng form làm gì cho thêm phức tạp vậy Ngọc

Cám ơn anh Thường nhiều! Đó chỉ là ví dụ để em làm một chương trình khác có khối lượng dữ liệu nhiều mà?
 
Upvote 0
Thực ra mình muốn làm vậy để có thể khống chế việc nhập trùng số phiếu và mỗi phiếu có dữ liệu nhiều chỉ nhập 1 lần thui. Không biết còn có cách nào khác tạo nó không?
 
Upvote 0
Xài tạm cái ni

PHP:
Private Sub CommandButton1_Click()
    Dim iJ As Long, Rng As Range, sRng As Range
    With Sheet1
        Set Rng = Range([A1], [A65500].End(xlUp))
        iJ = Rng.Rows.Count + 1
        If Me.MaNV.Value = "" Then Exit Sub
        Set sRng = Rng.Find(UCase$(Me.MaNV.Value), , xlFormulas, xlWhole)
        If sRng Is Nothing Then
            .Cells(iJ, 1).Value = UCase$(Me.MaNV.Value)
            .Cells(iJ, 2).Value = Me.Ten.Text
        Else
            MsgBox "Ma Nay Da Co"
        End If
        Me.MaNV.Value = "":         Me.Ten.Text = ""
    End With
    Me.MaNV.SetFocus
End Sub
 
Upvote 0
Web KT
Back
Top Bottom