Nhờ sửa Code bẫy lỗi để trống dữ liệu trên UserForm.

Liên hệ QC

khamha

Không có việc gì khó...
Tham gia
4/6/10
Bài viết
662
Được thích
846
Nghề nghiệp
CNVC Laos
Chào các bạn...Như tiêu đề: Nhờ các bạn sửa (Rút gọn) cái Code bẫy lỗi để trống dữ liệu.

If Ctr1 = "" Or Ctr2 = "" Or Ctr3 = "" Or Ctr4 = "" Or Ctr5 = "" Or Ctr6 = "" Or Ctr7 = "" Or Ctr8 = "" Or Ctr9 = "" Then
MsgBox ("Ban phai nhap day du cac thong tin")
Ctr1.SetFocus

Vì nếu có nhiều Ctr thì đoạn Code trên quá dài.
Các bạn xem file đính kèm và sửa giúp mình nhé,Thank
 

File đính kèm

  • SuaCodeBayLoi.xls
    55.5 KB · Đọc: 19
Lần chỉnh sửa cuối:
Đã giải quyết xong vụ này...Cảm ơn các bạn nhiều.
Còn về giải thích Code trong File thì ko phải làm bây giờ đâu, ý là khi nào viehoai có thời gian rảnh thì giải thích một hai hàng ,sau đó gộp lại thôi.
Chúc anh tiến nhanh vào "con đường đau khổ" này
 
Upvote 0
[info1]Một kinh nghiệm của tôi khi bẩy lỗi các trường hợp bị rỗng trên TextBox hoặc ComboBox như sau:

Tôi thường có thói quen đặt tên cho mỗi TextBox hay ComboBox theo giá trị nhập vào của nó để khi kiểm tra tôi dễ dàng nhận ra nếu có phát sinh lỗi.

Vì thế nó không thể tuân thủ quy tắc kiểu "Ctrl" & I được.[/info1]
Cho nên tôi sẽ thực hiện như sau:

Đặt một biến mảng bên ngoài và chạy thủ tục load form để nhập giá trị lên mảng:

[GPECODE=vb]Option Explicit
Private MyCtrl As Variant, iCtrl As Long

Private Sub UserForm_Initialize()
MyCtrl = Array("tbxGiai", "tbxPhap", "tbxExcel", "tbxForum", "tbxCong", _
"tbxCu", "tbxTuyet", "tbxVoi", "tbxCua", "tbxBan", _
"cbxGiai", "cbxPhap", "cbxExcel", "cbxForum", "cbxCong", _
"cbxCu", "cbxTuyet", "cbxVoi", "cbxCua", "cbxBan")
End Sub
[/GPECODE]

Từ đó mới triển khai các thủ tục liên quan đến mảng đó:

PHP:
Private Sub cmdKiemTra_Click()
    For iCtrl = 0 To UBound(MyCtrl)
        With Me(MyCtrl(iCtrl))
            If .Text = "" Then
                MsgBox "Ban chua nhap du lieu vao muc " & .Name
                    .SetFocus
                Exit Sub
            End If
        End With
    Next
    Sheet1.Range("A65535").End(xlUp).Offset(1).Resize(, 20) = MyCtrl
End Sub

Private Sub cmdNhapNhanh_Click()
    For iCtrl = 0 To UBound(MyCtrl)
        With Me(MyCtrl(iCtrl))
            .Text = .Name
        End With
    Next
End Sub

Private Sub cmdXoa_Click()
    For iCtrl = 0 To UBound(MyCtrl)
        Me(MyCtrl(iCtrl)) = ""
    Next
End Sub

Thực hiện như trên sẽ rất tiện lợi cho các bạn khi bẩy lỗi hay nhập trên form!

[TIP]Khi dùng mảng cho các Controls thì lúc đó bạn nhập vô sheet rất nhanh mà không bị sai sót:
Mã:
Sheet1.Range("A65535").End(xlUp).Offset(1).Resize(, 20) = MyCtrl
[/TIP]
 

File đính kèm

  • BayLoiRong.xls
    43 KB · Đọc: 39
Upvote 0
[info1]Một kinh nghiệm của tôi khi bẩy lỗi các trường hợp bị rỗng trên TextBox hoặc ComboBox như sau:

Tôi thường có thói quen đặt tên cho mỗi TextBox hay ComboBox theo giá trị nhập vào của nó để khi kiểm tra tôi dễ dàng nhận ra nếu có phát sinh lỗi.


Vì thế nó không thể tuân thủ quy tắc kiểu "Ctrl" & I được.[/info1]
Cho nên tôi sẽ thực hiện như sau:

Đặt một biến mảng bên ngoài và chạy thủ tục load form để nhập giá trị lên mảng:

[GPECODE=vb]Option Explicit
Private MyCtrl As Variant, iCtrl As Long

Private Sub UserForm_Initialize()
MyCtrl = Array("tbxGiai", "tbxPhap", "tbxExcel", "tbxForum", "tbxCong", _
"tbxCu", "tbxTuyet", "tbxVoi", "tbxCua", "tbxBan", _
"cbxGiai", "cbxPhap", "cbxExcel", "cbxForum", "cbxCong", _
"cbxCu", "cbxTuyet", "cbxVoi", "cbxCua", "cbxBan")
End Sub
[/GPECODE]

Từ đó mới triển khai các thủ tục liên quan đến mảng đó:

PHP:
Private Sub cmdKiemTra_Click()
    For iCtrl = 0 To UBound(MyCtrl)
        With Me(MyCtrl(iCtrl))
            If .Text = "" Then
                MsgBox "Ban chua nhap du lieu vao muc " & .Name
                    .SetFocus
                Exit Sub
            End If
        End With
    Next
    Sheet1.Range("A65535").End(xlUp).Offset(1).Resize(, 20) = MyCtrl
End Sub

Private Sub cmdNhapNhanh_Click()
    For iCtrl = 0 To UBound(MyCtrl)
        With Me(MyCtrl(iCtrl))
            .Text = .Name
        End With
    Next
End Sub

Private Sub cmdXoa_Click()
    For iCtrl = 0 To UBound(MyCtrl)
        Me(MyCtrl(iCtrl)) = ""
    Next
End Sub

Thực hiện như trên sẽ rất tiện lợi cho các bạn khi bẩy lỗi hay nhập trên form!

[TIP]Khi dùng mảng cho các Controls thì lúc đó bạn nhập vô sheet rất nhanh mà không bị sai sót:
Mã:
Sheet1.Range("A65535").End(xlUp).Offset(1).Resize(, 20) = MyCtrl
[/TIP]

Anh ơi, sao em chép file về nhập thử thì dữ liệu ở sheet1 toàn là lấy giá trị là tên của của các control chứ không lấy giá trị mà mình nhập vào vậy anh?
 
Upvote 0
Anh ơi, sao em chép file về nhập thử thì dữ liệu ở sheet1 toàn là lấy giá trị là tên của của các control chứ không lấy giá trị mà mình nhập vào vậy anh?

Thì bạn nhìn

MyCtrl = Array("tbxGiai", "tbxPhap", "tbxExcel", "tbxForum", "tbxCong", _
"tbxCu", "tbxTuyet", "tbxVoi", "tbxCua", "tbxBan", _
"cbxGiai", "cbxPhap", "cbxExcel", "cbxForum", "cbxCong", _
"cbxCu", "cbxTuyet", "cbxVoi", "cbxCua", "cbxBan"
)

thì thấy MyCtrl là mảng các tên của các control mà. Nó đâu phải là các giá trị trong các control?

Tôi cũng thấy lạ là bạn Nghĩa định biểu diễn cái gì khi
Mã:
[COLOR=#ff0000]nhập vô sheet rất nhanh mà không bị sai sót[/COLOR]

Sheet1.Range("A65535").End(xlUp).Offset(1).Resize(, 20) = MyCtrl

Bạn có nhập dữ liệu gì vào controls thì code trên cũng chỉ đâp xuống sheet cái mà tôi tô đỏ ở trên. Thế thôi
 
Upvote 0
Thì bạn nhìn

Bạn có nhập dữ liệu gì vào controls thì code trên cũng chỉ đâp xuống sheet cái mà tôi tô đỏ ở trên. Thế thôi
Cảm ơn anh đã giải thích. Nhưng do em mới học VBA nên còn nhiều phần chưa biết. Anh giúp em viết code để có thể nhập giá trị của các control vào sheet với.
 
Upvote 0
Cảm ơn anh đã giải thích. Nhưng do em mới học VBA nên còn nhiều phần chưa biết. Anh giúp em viết code để có thể nhập giá trị của các control vào sheet với.

Nếu bạn có tập tin thì gửi lên chứ làm sao tôi biết được bạn định nhập từ đâu (control?) xuống ô nào ở trên sheet nào?

Tổng quát thì để nhập giá trị vào vd. ô C11 trên sheet1 thì:

sheet1.Range("C11").value = giá trị

Giá trị có thể là vd. 5 hoặc "hichic". Nếu giá trị là Text trong TextBox1 thì

sheet1.Range("C11").value = TextBox1.Text

Nhiều khi dữ liệu cần nhập xuống các ô nằm rải rác trên sheet nhưng cũng có lúc bạn cần nhập xuống 1 vùng "hình chữ nhật" mà bằng một cách nào đấy bạn có mảng dữ liệu với số dòng và cột bằng kích thước của vùng thì "đập" cả mảng xuống sheet thôi.

Ví dụ bạn có nút "NhapLieu"

Mã:
Private Sub NhapLieu_Click()
Dim Arr(), r As Long, c As Long
    Sheet1.Range("C11").Value = tbxGiai.Text
    Sheet1.Range("C12").Value = cbxGiai.Text
    ReDim Arr(1 To 2, 1 To 3)
    For c = 1 To 3
        Arr(1, c) = "gia tri " & c
    Next c
    For c = 1 To 3
        Arr(2, c) = 100 + c
    Next c
    Sheet1.Range("A65535").End(xlUp).Offset(1).Resize(UBound(Arr, 1), UBound(Arr, 2)).Value = Arr
    
'    [COLOR=#0000ff]dap xuong vung E4:G5[/COLOR]
    Sheet1.Range("E4:G5").Value = Arr
'    [COLOR=#0000ff]dap xuong vung 2 dong 3 cot bat dau tu o F10[/COLOR]
    Sheet1.Range("F10").Resize(2, 3).Value = Arr
End Sub
 
Upvote 0
Nếu bạn có tập tin thì gửi lên chứ làm sao tôi biết được bạn định nhập từ đâu (control?) xuống ô nào ở trên sheet nào?

[/CODE]
Dạ, sẵn đây em xin nhờ anh luôn. Tại vì em có làm 1 ứng dụng nhỏ phục vụ cho công việc mà em đang vướng phải vấn đề nhập dữ liệu từ form xuống sheet. Hiện tại em dùng cách đặt các control có dạng là Ctrl(i) để nhập dữ liệu xuống sheet nhưng mỗi lần muốn thêm bớt hay sắp xếp lại các control thì lại phải đặt lại tên, sửa code nên rất mất thời gian. Khi tìm kiếm trên diễn đàn em thấy cách tạo mảng kiểu này rất hay, nhưng không biết làm sao để nhập dữ liệu xuống sheet. Mong anh chỉ giúp. Một lần nữa cảm ơn anh rất nhiều!
 

File đính kèm

  • GPE.rar
    34.4 KB · Đọc: 4
Lần chỉnh sửa cuối:
Upvote 0
Anh ơi, sao em chép file về nhập thử thì dữ liệu ở sheet1 toàn là lấy giá trị là tên của của các control chứ không lấy giá trị mà mình nhập vào vậy anh?

Oh, xin lỗi các bạn, tôi làm xong (chủ yếu là test phần bẫy lỗi rỗng) nên khi thêm phần nhập vào mà không thử vài trường hợp tự ghi để thấy nó bị sai.

Bây giờ, bạn thay tất cả các thủ tục trong form bằng các thủ tục dưới đây thì sẽ không bị vậy nữa!

Mã:
Option Explicit
Private [COLOR=#ff0000][B]MyCtrl()[/B][/COLOR], iCtrl As Long


Private Sub UserForm_Initialize()
    
    MyCtrl = Array(tbxGiai, tbxPhap, tbxExcel, tbxForum, tbxCong, _
             tbxCu, tbxTuyet, tbxVoi, tbxCua, tbxBan, _
             cbxGiai, cbxPhap, cbxExcel, cbxForum, cbxCong, _
             cbxCu, cbxTuyet, cbxVoi, cbxCua, cbxBan)
End Sub


Private Sub cmdKiemTra_Click()
    For iCtrl = 0 To UBound(MyCtrl)
        With [B][COLOR=#ff0000]MyCtrl(iCtrl)[/COLOR][/B]
            If .Text = "" Then
                MsgBox "Ban chua nhap du lieu vao muc " & .Name
                    .SetFocus
                Exit Sub
            End If
        End With
    Next
[COLOR=#0000cd]    Sheet1.Range("A65535").End(xlUp).Offset(1).Resize(, 20) = [B]MyCtrl[/B][/COLOR]
End Sub


Private Sub cmdNhapNhanh_Click()
    For iCtrl = 0 To UBound(MyCtrl)
        With [COLOR=#ff0000][B]MyCtrl(iCtrl)[/B][/COLOR]
            .Text = .Name
        End With
    Next
End Sub


Private Sub cmdXoa_Click()
    For iCtrl = 0 To UBound(MyCtrl)
        [B][COLOR=#ff0000]MyCtrl(iCtrl).Text[/COLOR][/B] = ""
    Next
End Sub
 
Upvote 0
Bây giờ, bạn thay tất cả các thủ tục trong form bằng các thủ tục dưới đây thì sẽ không bị vậy nữa!

Mã:
Option Explicit

Anh ơi cho em hỏi nếu ta có mảng thứ nhất Ctrl01=Array(a,b,c,d) và mảng thứ hai Ctrl02=Array(e,f,g,h)
thì có công thức ghép mảng nào sao cho Ctrl=Array(a,b,c,d,e,f,g,f) không anh? Cho em xin công thức với!
 
Upvote 0
Anh ơi cho em hỏi nếu ta có mảng thứ nhất Ctrl01=Array(a,b,c,d) và mảng thứ hai Ctrl02=Array(e,f,g,h)
thì có công thức ghép mảng nào sao cho Ctrl=Array(a,b,c,d,e,f,g,f) không anh? Cho em xin công thức với!

Tôi nghĩ phải dùng vòng lặp để ghép mảng thôi.

Nhưng ta có thể ghép chúng lại bằng hàm tự tạo của Anh Nguyễn Duy Tuân:

http://www.giaiphapexcel.com/forum/...rong-bộ-nhớ-Tốc-độ-nhanh!&p=479565#post479565
 
Lần chỉnh sửa cuối:
Upvote 0
Anh ơi cho em hỏi nếu ta có mảng thứ nhất Ctrl01=Array(a,b,c,d) và mảng thứ hai Ctrl02=Array(e,f,g,h)
thì có công thức ghép mảng nào sao cho Ctrl=Array(a,b,c,d,e,f,g,f) không anh? Cho em xin công thức với!

À, bây giờ bạn có thể ghép mảng này lại với nhau chỉ bằng thủ tục đơn giản này thôi:

Mã:
Ctrl= Split(Join(Ctrl01, ",") & "," & Join(Ctrl02, ","), ",")
 
Lần chỉnh sửa cuối:
Upvote 0
Web KT

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

Back
Top Bottom