Chuyên mục xử lý, gỡ rối code VBA

Liên hệ QC
Status
Không mở trả lời sau này.

ndu96081631

Huyền thoại GPE
Thành viên BQT
Super Moderator
Tham gia
5/6/08
Bài viết
30,703
Được thích
53,930
Anh thử như thế này xem sao:
PHP:
Private Sub CommandButton1_Click()
    Dim Tb
For Each Tb In UserForm1.Controls
    If UCase(TypeName(Tb)) = "TEXTBOX" Then
        If Tb = "" Then
            Tb.BackStyle = 1
            Tb.BackColor = RGB(255, 128, 128)
            MsgBox "KHONG DUOC DE TRONG"       
        End If
    End If
Next Tb
End Sub

ủa em thấy ở trên có mấy chữ Exit Sub mà, sao xuống đây mất tiu rồi chị ơi ?
 
Upvote 0
Nếu form của bạn nhiều textbox, có cái yêu cầu không để trống, cái có thể để trống thì bạn có thể dùng đoạn code dưới.
Chịu khó test từng textbox không được để trống thôi.
Mã:
Private Sub CheckTextBoxEmpty(txt As MSForms.TextBox)
    If Len(Trim$(txt.Text)) = 0 Then
        txt.BackStyle = 1
        txt.BackColor = RGB(255, 128, 128)
        txt.SetFocus
        Err.Raise vbObjectError + 1, "", "KHONG DUOC DE TRONG " & txt.Name
    End If
End Sub

Private Sub CommandButton1_Click()
    On Error GoTo ErrHandler
 
    CheckTextBoxEmpty TextBox1
    CheckTextBoxEmpty TextBox2
    CheckTextBoxEmpty TextBox3
 
    MsgBox "All textboxes OK :)"
 
    ' Your code here
    Exit Sub

ErrHandler:
    MsgBox Err.Description, vbCritical Or vbOKOnly, "Error"
End Sub
Đoạn code của bạn PacificPR sẽ bị lỗi là nếu có bao nhiêu textbox rỗng thì Excel sẽ quăng MsgBox bao nhiêu lần.
MsgBox này tôi đã cố tránh trong code của tôi. Lúc đầu dùng function return Boolean thì do Excel VBA không có tính năng kiểm tra tắt điều kiện logic nên bị MsgBox nhiều lần. Vì vậy tôi mới dùng cách raise Err.

Mạo muội code lại code của bạn PacificPR như sau, dùng cách duyệt qua các TextBox, TextBox nào có Tag property khác rỗng thì check nó có empty hay không. Cách dùng Tag property này chúng tôi hay dùng hồi xưa.
Mã:
Private Function CheckTextBoxEmptyByTag(frm As MSForms.UserForm) As Boolean
    Dim ctl As Control
  
    CheckTextBoxEmptyByTag = False
  
    For Each ctl In frm.Controls
        If TypeName(ctl) Like "TextBox" And Len(ctl.Tag) <> 0 Then
            If Len(Trim$(ctl.Text)) = 0 Then
                ctl.BackStyle = 1
                ctl.BackColor = RGB(255, 128, 128)
                ctl.SetFocus

                MsgBox "KHONG DUOC DE TRONG TEXTBOX " & ctl.Tag, vbCritical Or vbOKOnly, "Error"

                CheckTextBoxEmptyByTag = True
                Exit Function
            End If
        End If
    Next
End Function

Private Sub CommandButton1_Click()
    If CheckTextBoxEmptyByTag(UserForm1) = True Then Exit Sub
  
    MsgBox "All textboxes OK :)"
End Sub

Vãi, bao nhiêu năm rồi mới ngồi gõ lại code, mà là code Vê Bê mới ngán chứ, báo lỗi tùm lum :)
Có gì bỏ qua, đừng cười em nhé
 
Lần chỉnh sửa cuối:
Upvote 0
Em không biết. Chắc nó đi chơi mất rồi " Chị " à. Hì hì ......

Không đơn giản là câu hỏi "nó đâu mất tiu" đâu bạn ạ. Đấy là bài học kinh nghiệm cho bạn đấy. Bài ở trên có người đã nói cho bạn biết rồi. Hi vọng bạn hiểu.
 
Upvote 0
Anh thử như thế này xem sao:
PHP:
Private Sub CommandButton1_Click()
    Dim Tb
For Each Tb In UserForm1.Controls
    If UCase(TypeName(Tb)) = "TEXTBOX" Then
        If Tb = "" Then
            Tb.BackStyle = 1
            Tb.BackColor = RGB(255, 128, 128)
            MsgBox "KHONG DUOC DE TRONG"      
        End If
    End If
Next Tb
End Sub
Nếu form của bạn nhiều textbox, có cái yêu cầu không để trống, cái có thể để trống thì bạn có thể dùng đoạn code dưới.
Chịu khó test từng textbox không được để trống thôi.
Mã:
Private Sub CheckTextBoxEmpty(txt As MSForms.TextBox)
    If Len(Trim$(txt.Text)) = 0 Then
        txt.BackStyle = 1
        txt.BackColor = RGB(255, 128, 128)
        txt.SetFocus
        Err.Raise vbObjectError + 1, "", "KHONG DUOC DE TRONG " & txt.Name
    End If
End Sub

Private Sub CommandButton1_Click()
    On Error GoTo ErrHandler
 
    CheckTextBoxEmpty TextBox1
    CheckTextBoxEmpty TextBox2
    CheckTextBoxEmpty TextBox3
 
    MsgBox "All textboxes OK :)"
 
    ' Your code here
    Exit Sub

ErrHandler:
    MsgBox Err.Description, vbCritical Or vbOKOnly, "Error"
End Sub
Đoạn code của bạn PacificPR sẽ bị lỗi là nếu có bao nhiêu textbox rỗng thì Excel sẽ quăng MsgBox bao nhiêu lần.
MsgBox này tôi đã cố tránh trong code của tôi. Lúc đầu dùng function return Boolean thì do Excel VBA không có tính năng kiểm tra tắt điều kiện logic nên bị MsgBox nhiều lần. Vì vậy tôi mới dùng cách raise Err.

Mạo muội code lại code của bạn PacificPR như sau, dùng cách duyệt qua các TextBox, TextBox nào có Tag property khác rỗng thì check nó có empty hay không. Cách dùng Tag property này chúng tôi hay dùng hồi xưa.
Mã:
Private Function CheckTextBoxEmptyByTag(frm As MSForms.UserForm) As Boolean
    Dim ctl As Control
 
    CheckTextBoxEmptyByTag = False
 
    For Each ctl In frm.Controls
        If TypeName(ctl) Like "TextBox" And Len(ctl.Tag) <> 0 Then
            If Len(Trim$(ctl.Text)) = 0 Then
                ctl.BackStyle = 1
                ctl.BackColor = RGB(255, 128, 128)
                ctl.SetFocus

                MsgBox "KHONG DUOC DE TRONG TEXTBOX " & ctl.Tag, vbCritical Or vbOKOnly, "Error"

                CheckTextBoxEmptyByTag = True
                Exit Function
            End If
        End If
    Next
End Function

Private Sub CommandButton1_Click()
    If CheckTextBoxEmptyByTag(UserForm1) = True Then Exit Sub
 
    MsgBox "All textboxes OK :)"
End Sub

Vãi, bao nhiêu năm rồi mới ngồi gõ lại code, mà là code Vê Bê mới ngán chứ, báo lỗi tùm lum :)
Có gì bỏ qua, đừng cười em nhé
Không đơn giản là câu hỏi "nó đâu mất tiu" đâu bạn ạ. Đấy là bài học kinh nghiệm cho bạn đấy. Bài ở trên có người đã nói cho bạn biết rồi. Hi vọng bạn hiểu.

Cám ơn các Anh chị nhiều !
 
Upvote 0
Em chào anh chị, em có một vấn đề cần anh, chị giúp đỡ ạ. Hiện tại em có danh sách khoảng 15 xưởng, hàng ngày em đều phải cập nhập kế hoạch xuống cho các xưởng, mỗi lần cập nhật mất khá nhiều thời gian. Phương pháp hiện tại em đang dùng là chọn lần lượt tên các xưởng trong listbox và đẩy dữ liệu đi. Em muốn hỏi anh chị là có cách nào chỉ cần chạy marco 1 lần dữ liệu tự động đẩy lần lượt đến các xưởng mà không phải chọn lần lượt trong listbox không ạ. Mong anh chị gợi ý phương pháp làm cho em ạ. Em cảm ơn.
 
Upvote 0
Anh thử như thế này xem sao:
PHP:
Private Sub CommandButton1_Click()
    Dim Tb
For Each Tb In UserForm1.Controls
    If UCase(TypeName(Tb)) = "TEXTBOX" Then
        If Tb = "" Then
            Tb.BackStyle = 1
            Tb.BackColor = RGB(255, 128, 128)
            MsgBox "KHONG DUOC DE TRONG"       
        End If
    End If
Next Tb
End Sub

Muốn đi qua controls thì dùng tên của nó, dễ điều khiển hơn:

For Each cNme In Array("TextBox1", "TextBox2", ...)
Set ctrl = UserForm1.Controls(ctrl)
If ctrl.Text = "" Then
...
End If
Next ctrl
 
Upvote 0
Muốn đi qua controls thì dùng tên của nó, dễ điều khiển hơn:

For Each cNme In Array("TextBox1", "TextBox2", ...)
Set ctrl = UserForm1.Controls(ctrl)
If ctrl.Text = "" Then
...
End If
Next ctrl
Chỗ em bôi đỏ phải là cNme chứ a nhỉ
 
Upvote 0
E có 1 form, và các TextBox trong đó, dùng 1 button để kiểm tra xem TextBox nào để trống thì báo. Nhưng chẳng nhẽ bao nhiu TextBox là bấy nhiêu Code. Xin nhờ các A/c giúp cho code gọn hơn ạ. E xin cảm ơn !
Mã:
Private Sub CommandButton1_Click()
If TextBox1 = "" Then
        TextBox1.BackStyle = 1
        TextBox1.BackColor = RGB(255, 128, 128)
        MsgBox "KHONG DUOC DE TRONG"
        Exit Sub
End If
If TextBox2 = "" Then
        TextBox2.BackStyle = 1
        TextBox2.BackColor = RGB(255, 128, 128)
        MsgBox "KHONG DUOC DE TRONG"
        Exit Sub
End If
If TextBox3 = "" Then
        TextBox3.BackStyle = 1
        TextBox3.BackColor = RGB(255, 128, 128)
        MsgBox "KHONG DUOC DE TRONG"
        Exit Sub
End If
End Sub
Gợi ý thêm một khả năng mới.

Giả sử có 2 textbox, và chúng đều rỗng, khi click phát textbox1 đỏ choét, sau đó người dùng nhập liệu textbox1. Click phát nữa thì cả hai textbox cùng đỏ choet ( do textbox2 lúc này vẫn rỗng). Có nên chăng ta phải khôi phục màu của các textbox trước khi tô màu cho cái textbox rỗng đầu tiền?
 
Upvote 0
Gợi ý thêm một khả năng mới.

Giả sử có 2 textbox, và chúng đều rỗng, khi click phát textbox1 đỏ choét, sau đó người dùng nhập liệu textbox1. Click phát nữa thì cả hai textbox cùng đỏ choet ( do textbox2 lúc này vẫn rỗng). Có nên chăng ta phải khôi phục màu của các textbox trước khi tô màu cho cái textbox rỗng đầu tiền?
Em đoán nhà họ đặt cái màu đỏ choét đó để kiểm soát. Nhưng có bài #1367 thì không cần cái đó nữa. Chị #1368 chả mắng cho còn rồi( Mà cái Bà đó khó tính mà vẫn đẹp gái thế mới sợ chứ ... :D:D:D)
 
Upvote 0
Gợi ý thêm một khả năng mới.

Giả sử có 2 textbox, và chúng đều rỗng, khi click phát textbox1 đỏ choét, sau đó người dùng nhập liệu textbox1. Click phát nữa thì cả hai textbox cùng đỏ choet ( do textbox2 lúc này vẫn rỗng). Có nên chăng ta phải khôi phục màu của các textbox trước khi tô màu cho cái textbox rỗng đầu tiền?

Chỉ 1 lúc đủ 100% ngừoi ta hổng nhớ đâu. Cứ để đỏ toét loét một thời gian rồi tự động nhớ nguyên tắc "khi tô màu phải nghĩ đến lúc cần xoá đi."

Nhưng mà biết đâu người ta đã có chuyện khôi phục trong cái sự kiện focus hay change gì gì đó rồi.
 
Upvote 0
Nhờ anh chị giúp!
Em có 02 combobox trong sheet FORMNHAPLIEU, trong đó 1 combobox ở ô $B$5 và 1 ở ô $B$8.
Hiện em muốn combobox ở ô B5 có chức năng giống ở ô B8 với linkrange sheet CONGTHUC! A3:B
linkedcell tại B5: Tendonvi, B13: madonvi
Cám ơn nhiều ạ!
 

File đính kèm

  • QLBM1.xlsm
    163.4 KB · Đọc: 3
Upvote 0
Mình dùng lệnh "ActiveSheet.PrintPreview" thì nó ra cái form như thế này Reality.JPG
Có lệnh nào để cho nó hiện ra form "Print" giống như ở trong tab "File" không Wanted.JPG
Mình dùng Excel 2000.
 
Upvote 0
Gợi ý thêm một khả năng mới.

Giả sử có 2 textbox, và chúng đều rỗng, khi click phát textbox1 đỏ choét, sau đó người dùng nhập liệu textbox1. Click phát nữa thì cả hai textbox cùng đỏ choet ( do textbox2 lúc này vẫn rỗng). Có nên chăng ta phải khôi phục màu của các textbox trước khi tô màu cho cái textbox rỗng đầu tiền?
Cái đó mình tạo 1 form nhỏ để lấy hướng test và nhờ các a/c giúp đỡ. Còn sau mình áp dụng vào của mình thì đã dùng sự kiện để bỏ cái đỏ choét đó rùi ý, k nó ngứa mắt chết luôn :D
 
Upvote 0
Upvote 0
Status
Không mở trả lời sau này.
Web KT
Back
Top Bottom