Nhờ anh/chị giúp sửa lỗi code bẫy rỗng trong Form có MultiPage (1 người xem)

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

Người dùng đang xem chủ đề này

tvquan41

Thành viên chính thức
Tham gia
8/1/11
Bài viết
62
Được thích
4
Xin anh/chị giúp em sửa lỗi code bẫy rỗng. Mỗi khi qua Page 2 là nó báo lỗi. Chân thành cảm ơn anh/chị đã giúp!
 

File đính kèm

Xin anh/chị giúp em sửa lỗi code bẫy rỗng. Mỗi khi qua Page 2 là nó báo lỗi. Chân thành cảm ơn anh/chị đã giúp!
Theo mình thì nên làm việc với các textbox trên từng page vì khi đang ở page này thì control không thể setforcus tới textbox trên page kia được. Nếu là mình mình làm như file gửi!
 

File đính kèm

Upvote 0
Cảm ơn bạn đã giúp, nhưng nếu có nhiều commanbutton, nhiều Page trên form thì việc tạo như vậy gặp rất nhiều khó khăn. Có cách nào biết là cái textbox, hay combobox hiện tại ở Page nào không bạn?
 
Upvote 0
Cảm ơn bạn đã giúp, nhưng nếu có nhiều commanbutton, nhiều Page trên form thì việc tạo như vậy gặp rất nhiều khó khăn. Có cách nào biết là cái textbox, hay combobox hiện tại ở Page nào không bạn?
Mỗi multipage theo mình biết thì chỉ có 2 page. Khi trên mỗi page có nhiều textbox và comman thì càng nên quản lý code riêng rẽ. Mình cũng thử nhưng cũng không đưa ra được combobox đang ở page nào bằng code! "Về trực quan bằng mắt thì đương nhiên là biết đúng không?"
 
Upvote 0
Xin anh/chị giúp em sửa lỗi code bẫy rỗng. Mỗi khi qua Page 2 là nó báo lỗi. Chân thành cảm ơn anh/chị đã giúp!

Không biết bạn định thiết kế cái gì nhưng nếu nói về cái nút "kia" thì

Mã:
Private Sub CommandButton1_Click()
Dim Ctrl As Control
    For i = 1 To 4
        With Me.Controls("textbox" & i)
            If .Value = "" Then
                MultiPage1.Value = .Parent.Index
                .SetFocus
                Exit Sub
            End If
        End With
    Next
End Sub

Tuy nhiên nếu là tôi thì tôi làm như sau:
1. Giả sử có k Page. Trong design time thiết lập cho tất cả các Page, trừ Page1, Visible = FALSE
2. Có 2 nút BACK và NEXT
3. code cho NEXT

Mã:
Private Sub NEXT_Click()
Dim Ctrl As Control, bad As Boolean
    For Each Ctrl In MultiPage1.Pages(MultiPage1.Value).Controls
        If TypeName(Ctrl) = "TextBox" Then
            If Ctrl.Value = "" Then
                MsgBox "Khong de trong du lieu tai day!"
                Ctrl.SetFocus
                bad = True
                Exit For
            End If
        End If
    Next
    If Not bad Then
        If MultiPage1.Value < MultiPage1.Pages.Count - 1 Then
'            chua la Page cuoi cung, vay sang Page tiep theo
            MultiPage1.Pages(MultiPage1.Value + 1).Visible = True
            MultiPage1.Value = MultiPage1.Value + 1
            MultiPage1.Pages(MultiPage1.Value - 1).Visible = False
        Else
            ' da la Page cuoi cung, xu ly du lieu
        End If
    End If
End Sub

4. Ở mỗi thời điểm chỉ hiện 1 Page. Nếu nhập đủ dữ liệu và nhến NEXT thì: Nếu chưa là Page cuối cùng thì hiện Page tiếp theo và chọn nó, sau đó ẩn Page trước nó. Nếu là Page cuối cùng thì xử lý các dữ liệu đã nhập.

5. Nút BACK bạn tự viết. Ẩn / hiện ngược lại.

6. Tôi không thích kiểu Exit Sub vì thế tôi dùng Exit For + flag bad.

7. Code chỉ là ví dụ.
 
Upvote 0
Không biết bạn định thiết kế cái gì nhưng nếu nói về cái nút "kia" thì

Mã:
Private Sub CommandButton1_Click()
Dim Ctrl As Control
    For i = 1 To 4
        With Me.Controls("textbox" & i)
            If .Value = "" Then
                MultiPage1.Value = .Parent.Index
                .SetFocus
                Exit Sub
            End If
        End With
    Next
End Sub

Tuy nhiên nếu là tôi thì tôi làm như sau:
1. Giả sử có k Page. Trong design time thiết lập cho tất cả các Page, trừ Page1, Visible = FALSE
2. Có 2 nút BACK và NEXT
3. code cho NEXT

Mã:
Private Sub NEXT_Click()
Dim Ctrl As Control, bad As Boolean
    For Each Ctrl In MultiPage1.Pages(MultiPage1.Value).Controls
        If TypeName(Ctrl) = "TextBox" Then
            If Ctrl.Value = "" Then
                MsgBox "Khong de trong du lieu tai day!"
                Ctrl.SetFocus
                bad = True
                Exit For
            End If
        End If
    Next
    If Not bad Then
        If MultiPage1.Value < MultiPage1.Pages.Count - 1 Then
'            chua la Page cuoi cung, vay sang Page tiep theo
            MultiPage1.Pages(MultiPage1.Value + 1).Visible = True
            MultiPage1.Value = MultiPage1.Value + 1
            MultiPage1.Pages(MultiPage1.Value - 1).Visible = False
        Else
            ' da la Page cuoi cung, xu ly du lieu
        End If
    End If
End Sub

4. Ở mỗi thời điểm chỉ hiện 1 Page. Nếu nhập đủ dữ liệu và nhến NEXT thì: Nếu chưa là Page cuối cùng thì hiện Page tiếp theo và chọn nó, sau đó ẩn Page trước nó. Nếu là Page cuối cùng thì xử lý các dữ liệu đã nhập.

5. Nút BACK bạn tự viết. Ẩn / hiện ngược lại.

6. Tôi không thích kiểu Exit Sub vì thế tôi dùng Exit For + flag bad.

7. Code chỉ là ví dụ.
Cảm ơn anh, em định viết một chương trình làm hồ sơ vay vốn, với nhiều Page như, thông tin khách hàng, thông tin tiền vay, tài sản bảo đảm... Em định để các Page hiện lên cùng 1 lúc (trực quan cho người sử dụng, vì mấy cô chú trong cơ quan không rành về tin học lắm). Khi nhập thông tin xong click Save để lưu dữ liệu thì nếu ở textbox nào còn thiếu dữ liệu bắt buộc thì sẽ thông báo tại textbox đó cho người dùng dễ nhận biết cho mình nhập thiếu. Em chỉ nghĩ vậy thôi, rất mong anh góp ý thêm
Cảm ơn anh vì code trên, em làm cả mấy tháng trời mà không được +-+-+-+
 
Upvote 0
Cảm ơn anh, em định viết một chương trình làm hồ sơ vay vốn, với nhiều Page như, thông tin khách hàng, thông tin tiền vay, tài sản bảo đảm... Em định để các Page hiện lên cùng 1 lúc (trực quan cho người sử dụng, vì mấy cô chú trong cơ quan không rành về tin học lắm). Khi nhập thông tin xong click Save để lưu dữ liệu thì nếu ở textbox nào còn thiếu dữ liệu bắt buộc thì sẽ thông báo tại textbox đó cho người dùng dễ nhận biết cho mình nhập thiếu. Em chỉ nghĩ vậy thôi, rất mong anh góp ý thêm
Cảm ơn anh vì code trên, em làm cả mấy tháng trời mà không được +-+-+-+

Tôi phải giúp bạn cái gì nữa? Tôi đưa ra 2 code cho 2 phương án: phương án của bạn (hiện tất cả mọi Page) và phương án do tôi đề nghị (hiện 1 Page). Còn gì để nói nữa?
 
Upvote 0
Không biết bạn định thiết kế cái gì nhưng nếu nói về cái nút "kia" thì

Mã:
Private Sub CommandButton1_Click()
Dim Ctrl As Control
    For i = 1 To 4
        With Me.Controls("textbox" & i)
            If .Value = "" Then
                MultiPage1.Value = .Parent.Index
                .SetFocus
                Exit Sub
            End If
        End With
    Next
End Sub

Anh ơi cho em hỏi nếu có MultiPage1 này nằm trong MultiPage1 kia thì đoạn code trên phải sửa như thế nào ạ? Anh giúp em lần nữa nhé!
 
Upvote 0
Không biết bạn định thiết kế cái gì nhưng nếu nói về cái nút "kia" thì

Mã:
Private Sub CommandButton1_Click()
Dim Ctrl As Control
    For i = 1 To 4
        With Me.Controls("textbox" & i)
            If .Value = "" Then
                MultiPage1.Value = .Parent.Index
                .SetFocus
                Exit Sub
            End If
        End With
    Next
End Sub

Anh ơi cho em hỏi nếu có MultiPage1 này nằm trong MultiPage1 kia thì đoạn code trên phải sửa như thế nào ạ? Anh giúp em lần nữa nhé!

MultiPage2 nằm trong MultiPage1? Bạn làm thế để làm gì? Mà chắc ý bạn là đặt MultiPage2 lên Page? He he.
 
Lần chỉnh sửa cuối:
Upvote 0

Tôi có đặt cả câu hỏi: Bạn làm thế để làm gì?
Nếu xét thấy có lý thì bạn cũng phải làm UserForm hoàn chỉnh và gửi lên. Không nhất thiết có tất cả nhưng với MultiPage1 có Page nào đó chứa MultiPage2 thì phải làm hoàn chỉnh, kể cả Textbox, ComboBox nếu có. Tôi xem bạn định làm gì. Không phải là bạn cứ bịa mọi chuyện rồi sẽ có người làm theo ý bạn.
 
Lần chỉnh sửa cuối:
Upvote 0
Tôi có đặt cả câu hỏi: Bạn làm thế để làm gì?
Nếu xét thấy có lý thì bạn cũng phải làm UserForm hoàn chỉnh và gửi lên. Không nhất thiết có tất cả nhưng với MultiPage1 có Page nào đó chứa MultiPage2 thì phải làm hoàn chỉnh, kể cả Textbox, ComboBox nếu có. Tôi xem bạn định làm gì. Không phải là bạn cứ bịa mọi chuyện rồi sẽ có người làm theo ý bạn.

Dạ, em giử file em đã bỏ bớt một số phần do file tự tạo dung lượng lớn quá. Mong anh giúp đỡ!
 

File đính kèm

Chỉnh sửa lần cuối bởi điều hành viên:
Upvote 0
Dạ, em giử file em đã bỏ bớt một số phần do file tự tạo dung lượng lớn quá. Mong anh giúp đỡ!
1> số control nằm trên các mutilpage trong lúc thiết kế là biết
2> kiểm tra sem control nằm trên multipage nào
3> sét tới multipage đó và setforcus control
Mình dùng lại file ban lúc đầu của bạn và tùy biến lại code của bạn và SIWTOM mong rằng ý tưởng của mình giúp được cho bạn!!
Mã:
Private Sub CommandButton1_Click()
Dim Ctrl
Dim k As Long
Ch = Sheet1.[E2]
For Each Ctrl In Me.Controls
k = k + 1
If (TypeOf Ctrl Is MSForms.TextBox) Or (TypeOf Ctrl Is MSForms.ComboBox) Then
    If InStr(1, Ch, Ctrl.Name) = 0 Then
        With Ctrl
            If .Value = "" Then
                MsgBox "Chua nhap"
                [COLOR=#ff0000]If k <= 5 Then
                    MultiPage1.Value = .Parent.Index
                    .SetFocus
                Else
                    MultiPage2.Value = .Parent.Index
                    .SetFocus[/COLOR]
                End If
                Exit Sub
            End If
        End With
    End If
End If
Next
End Sub
thêm cách khác để chọn multipage
Mã:
Private Sub CommandButton1_Click()
Dim Ctrl
Dim k As Long
Ch = Sheet1.[E2]
For Each Ctrl In Me.Controls
k = k + 1
If (TypeOf Ctrl Is MSForms.TextBox) Or (TypeOf Ctrl Is MSForms.ComboBox) Then
    If InStr(1, Ch, Ctrl.Name) = 0 Then
        With Ctrl
            If .Value = "" Then
                MsgBox "Chua nhap"
                   [COLOR=#ff0000] If .Parent.Parent.Name = "MultiPage2" Then
                        MultiPage1.Value = .Parent.Index + 1
                        MultiPage2.Value = .Parent.Index
                        .SetFocus
                    Else
                        MultiPage1.Value = .Parent.Index
                        .SetFocus
                    End If[/COLOR]
                Exit Sub
            End If
        End With
    End If
End If
Next
End Sub
 

File đính kèm

Lần chỉnh sửa cuối:
Upvote 0
1> số control nằm trên các mutilpage trong lúc thiết kế là biết
2> kiểm tra sem control nằm trên multipage nào
3> sét tới multipage đó và setforcus control
Mình dùng lại file ban lúc đầu của bạn và tùy biến lại code của bạn và SIWTOM mong rằng ý tưởng của mình giúp được cho bạn!!
Mã:
Private Sub CommandButton1_Click()
Dim Ctrl
Dim k As Long
Ch = Sheet1.[E2]
For Each Ctrl In Me.Controls
k = k + 1
If (TypeOf Ctrl Is MSForms.TextBox) Or (TypeOf Ctrl Is MSForms.ComboBox) Then
    If InStr(1, Ch, Ctrl.Name) = 0 Then
        With Ctrl
            If .Value = "" Then
                MsgBox "Chua nhap"
                [COLOR=#ff0000]If k <= 5 Then
                    MultiPage1.Value = .Parent.Index
                    .SetFocus
                Else
                    MultiPage2.Value = .Parent.Index
                    .SetFocus[/COLOR]
                End If
                Exit Sub
            End If
        End With
    End If
End If
Next
End Sub
thêm cách khác để chọn multipage
Mã:
Private Sub CommandButton1_Click()
Dim Ctrl
Dim k As Long
Ch = Sheet1.[E2]
For Each Ctrl In Me.Controls
k = k + 1
If (TypeOf Ctrl Is MSForms.TextBox) Or (TypeOf Ctrl Is MSForms.ComboBox) Then
    If InStr(1, Ch, Ctrl.Name) = 0 Then
        With Ctrl
            If .Value = "" Then
                MsgBox "Chua nhap"
                   [COLOR=#ff0000] If .Parent.Parent.Name = "MultiPage2" Then
                        MultiPage1.Value = .Parent.Index + 1
                        MultiPage2.Value = .Parent.Index
                        .SetFocus
                    Else
                        MultiPage1.Value = .Parent.Index
                        .SetFocus
                    End If[/COLOR]
                Exit Sub
            End If
        End With
    End If
End If
Next
End Sub


1. Bạn đếm rồi cho là 5 controls đầu thuộc MultiPage1 còn lại thuộc MultiPage2?
Đây mới chỉ là UserForm giả lập. Số controls có thể thay đổi. Vả lại trong quá trình thiết kế nhiều khi ta xóa control này, thêm control kia rồi sẽ có tình huống vd. 3 control đầu thuộc MPG1, 2 control tiếp thuộc MPG2, 2 control tiếp thuộc MPG1, ...

2. Chỉ có 2 MPG? Thế nếu trong project thực người ta thêm MPG thì có phải rách việc không. Hoặc là xét đơn đề nghị nhưng không cho phép MPG lồng nhau hoặc đã cho phép lồng thì không giới hạn cụ thể là 2, 3, ...

3. Bạn thử như sau: show UserForm --> chọn Page2 nếu chưa chọn --> nhập dữ liệu vào 2 textbox ở trên (textbox trong Page3 để trống) --> chọn Page4 để giấu Page3 --> chọn Page1 để giấu Page2 --> nhập dữ liệu vào 2 textbox --> nhấn Save --> LỖI

4. Ngoài ra bây giờ người ta có cả Frame lồng vào chứ có còn đơn giản như bài đầu đâu?
 
Chỉnh sửa lần cuối bởi điều hành viên:
Upvote 0
Dạ, em giử file em đã bỏ bớt một số phần do file tự tạo dung lượng lớn quá. Mong anh giúp đỡ!


1. Tôi thay biến toàn cục Variant Ch của bạn bằng biến cục bộ ControlsString As String

2. Chỗ xanh xanh tôi hiểu là trong ô HS.[E2] bạn liệt kê tên những control (phân cách bởi ký tự nào đó) cho phép bỏ trống.

3. Bạn viết: "Em áp dụng đoạn code của anh vào nó vẫn báo lỗi". Code tôi viết khi không có MultiPage nằm trong MultiPage. Bây giờ bạn có vài MultiPage và cả vài Frame "lồng nhau" tới chóng mặt thì báo lỗi là đương nhiên. Cái bài soạn để tán gái tơ mà lại đem ra để cưa gái đã qua một lần đò và có vài "nghé" thì sao có tác dụng? Mà dữ liệu nhiều thế thì nhập xong có lẽ phải làm vài viên gì đó.

Nhưng không sao cả. Bạn cứ lồng Frame, MultiPage thoải mái, bao nhiêu cũng được, mấy level cũng chơi.

4. Chỗ đỏ đỏ là cần thiết vì không thể SetFocus khi vd. Textbox ẩn, mà bạn có vd. txtLNVonXinVayChu.Visible = FALSE.

5. Code

Mã:
Private Sub CmdSave_Click()
Dim ctrl As Control, tmp As Object, bad As Boolean, pg As MSForms.Page, ControlsString As String
    [B][COLOR=#0000ff]ControlsString = HS.[E2][/COLOR][/B]
    For Each ctrl In Me.Controls
        If TypeOf ctrl Is MSForms.TextBox Or TypeOf ctrl Is MSForms.ComboBox Then
            [B][COLOR=#0000ff]If InStr(1, ControlsString, ctrl.Name) = 0 Then[/COLOR][/B]
                If ctrl.Value = "" [B][COLOR=#ff0000]And ctrl.Visible[/COLOR][/B] Then
                    MsgBox "Khong de trong du lieu tai day!"
                    Set tmp = ctrl
                    Do
                        If TypeOf tmp.Parent Is MSForms.Page Then
                            Set pg = tmp.Parent
                            pg.Parent.Value = pg.Index
                        End If
                        Set tmp = tmp.Parent
                        If tmp Is Me Then Exit Do
                    Loop
                    ctrl.SetFocus
                    bad = True
                    Exit For
                End If
            End If
        End If
    Next
    If Not bad Then
'        xu ly du lieu
        MsgBox "good"
    End If
End Sub

Tôi test không thấy lỗi. Nhưng bạn thấy lỗi thì phải nói rõ lỗi thế nào, và liệt kê tất cả các thao tác tuần tự để có được cái lỗi đó. Nếu chỉ là một câu: "không chạy, có lỗi" thì tôi sẽ không bỏ công sức, thời gian để trả lời.
 
Chỉnh sửa lần cuối bởi điều hành viên:
Upvote 0
Tôi test không thấy lỗi. Nhưng bạn thấy lỗi thì phải nói rõ lỗi thế nào, và liệt kê tất cả các thao tác tuần tự để có được cái lỗi đó. Nếu chỉ là một câu: "không chạy, có lỗi" thì tôi sẽ không bỏ công sức, thời gian để trả lời.

Dạ, em đã test code chạy rất êm, nhưng nó báo lỗi Ctrl.SetFocus khi 1 Page (hoặc Frame) nào đó ẩn đi. Ví dụ nếu ẩn Page Tiền Vay đi, code sẽ báo lỗi. Mong anh giúp đỡ.
attachment.php
 

File đính kèm

  • Loi.jpg
    Loi.jpg
    14.8 KB · Đọc: 92
Lần chỉnh sửa cuối:
Upvote 0
Dạ, em đã test code chạy rất êm, nhưng nó báo lỗi Ctrl.SetFocus khi 1 Page (hoặc Frame) nào đó ẩn đi. Ví dụ nếu ẩn Page Tiền Vay đi, code sẽ báo lỗi. Mong anh giúp đỡ.
attachment.php

Tôi biết về cái đó.
Bạn có 2 lựa chọn

1. Nếu bạn bắt buộc phải nhập vào textbox xyz, không cho phép để trống, thì bạn phải để hiện Frame hoặc Page mà trên đó có textbox xyz. Vì ẩn đi thì người nhập liệu bằng cách nào nhập vào xyz??? Bạn đừng nói là khi đó code hiển thị lại Frame hay Page nhé. Vì nếu bạn bắt nhập vào cả textbox xyz thì trước sau Frame hay Page cũng phải hiển thị. Vậy tại sao bạn lại ẩn nó đi?

2. Nếu textbox xyz có thể bỏ trống thì bạn cho nó vào "danh sách" không bắt buộc, tức vào ô HS.[E2]

Tôi chỉ làm cho bạn những cái mà tôi cho là hợp lý.
 
Upvote 0
Tôi biết về cái đó.
Bạn có 2 lựa chọn

1. Nếu bạn bắt buộc phải nhập vào textbox xyz, không cho phép để trống, thì bạn phải để hiện Frame hoặc Page mà trên đó có textbox xyz. Vì ẩn đi thì người nhập liệu bằng cách nào nhập vào xyz??? Bạn đừng nói là khi đó code hiển thị lại Frame hay Page nhé. Vì nếu bạn bắt nhập vào cả textbox xyz thì trước sau Frame hay Page cũng phải hiển thị. Vậy tại sao bạn lại ẩn nó đi?

2. Nếu textbox xyz có thể bỏ trống thì bạn cho nó vào "danh sách" không bắt buộc, tức vào ô HS.[E2]

Tôi chỉ làm cho bạn những cái mà tôi cho là hợp lý.

Dạ, đúng như anh nói, ban đầu em cũng suy nghĩ như vậy.
Nhưng sau khi đem ứng dụng vào công việc em mới thấy nó chưa được phù hợp. Vì khách hàng có thể: 1 là đi vay, 1 là đi bảo lãnh mà mỗi yếu tố của tiền vay, và bảo lãnh có phần chung, có phần riêng. Nên em nghĩ là tùy vào trường hợp khác nhau thì mình cho ẩn, hiện hoặc enable những Ctrl không cần thiết để phần Form được ngọn hơn
Cũng như vậy, nếu khách hàng vay tiêu dùng những yếu tố trên mẫu hồ sơ sẽ khác 1 một ít với khách hàng vay sản xuất, vay kinh doanh mà không cần thiết là phải nhập hết thông tin.
Do em mới học VBA, mà chủ yếu là học qua mạng lên kiến thức còn non yếu, hiểu chưa sâu, nếu có gì anh bỏ qua nhé. Mong anh giúp đỡ.
 
Upvote 0
Dạ, đúng như anh nói, ban đầu em cũng suy nghĩ như vậy.
Nhưng sau khi đem ứng dụng vào công việc em mới thấy nó chưa được phù hợp. Vì khách hàng có thể: 1 là đi vay, 1 là đi bảo lãnh mà mỗi yếu tố của tiền vay, và bảo lãnh có phần chung, có phần riêng. Nên em nghĩ là tùy vào trường hợp khác nhau thì mình cho ẩn, hiện hoặc enable những Ctrl không cần thiết để phần Form được ngọn hơn
Cũng như vậy, nếu khách hàng vay tiêu dùng những yếu tố trên mẫu hồ sơ sẽ khác 1 một ít với khách hàng vay sản xuất, vay kinh doanh mà không cần thiết là phải nhập hết thông tin.
Do em mới học VBA, mà chủ yếu là học qua mạng lên kiến thức còn non yếu, hiểu chưa sâu, nếu có gì anh bỏ qua nhé. Mong anh giúp đỡ.

Thôi được, bạn hãy chọn cách xử lý:

Khi gặp control.Value = "" thì:

1. Nếu có "tiền bối" nào đó của "nó" bị ẩn - vd. ctrl --> Frame (hiển thị) --> Page (ẩn) - thì HIỂN THỊ "tiền bối" đó để SetFocus cho nhập liệu.

2. Nếu có "tiền bối" nào đó của "nó" bị ẩn - vd. ctrl --> Frame (hiển thị) --> Page (ẩn) - thì BỎ QUA, KHÔNG XÉT, COI NHƯ KHÔNG CÓ control đó, GIẢ VỜ KHÔNG NHÌN THẤY "nó" ...

Giải pháp 1 hay 2? Và bạn đính kèm tập tin, và cho biết bạn đã ẩn Frame, Page nào để tôi test thử

Thực ra chỉ sửa chút chút thôi nhưng có tập tin vẫn tốt hơn.
 
Upvote 0
Thôi được, bạn hãy chọn cách xử lý:

Khi gặp control.Value = "" thì:

1. Nếu có "tiền bối" nào đó của "nó" bị ẩn - vd. ctrl --> Frame (hiển thị) --> Page (ẩn) - thì HIỂN THỊ "tiền bối" đó để SetFocus cho nhập liệu.

2. Nếu có "tiền bối" nào đó của "nó" bị ẩn - vd. ctrl --> Frame (hiển thị) --> Page (ẩn) - thì BỎ QUA, KHÔNG XÉT, COI NHƯ KHÔNG CÓ control đó, GIẢ VỜ KHÔNG NHÌN THẤY "nó" ...

Giải pháp 1 hay 2? Và bạn đính kèm tập tin, và cho biết bạn đã ẩn Frame, Page nào để tôi test thử

Thực ra chỉ sửa chút chút thôi nhưng có tập tin vẫn tốt hơn.
Dạ, anh xem giúp em :-=
 

File đính kèm

Upvote 0

Giúp thế nào? Theo phương án nào? Bạn có đọc bài của tôi không?

bạn hãy chọn cách xử lý:

Khi gặp control.Value = "" thì:

1. Nếu có "tiền bối" nào đó của "nó" bị ẩn - vd. ctrl --> Frame (hiển thị) --> Page (ẩn) - thì HIỂN THỊ "tiền bối" đó để SetFocus cho nhập liệu.

2. Nếu có "tiền bối" nào đó của "nó" bị ẩn - vd. ctrl --> Frame (hiển thị) --> Page (ẩn) - thì BỎ QUA, KHÔNG XÉT, COI NHƯ KHÔNG CÓ control đó, GIẢ VỜ KHÔNG NHÌN THẤY "nó" ...

Giải pháp 1 hay 2? Và bạn đính kèm tập tin, và cho biết bạn đã ẩn Frame, Page nào để tôi test thử

Bạn viết: "Anh chọn loại hình khách hàng và chọn loại hình vay sẽ tự enable, Visible tương ứng với yêu cầu thông tin của từng loại hồ sơ vay vốn".

Như thế là như thế nào? Là luôn 1 hay luôn 2? Hay có lúc chọn 1 có lúc chọn 2 phụ thuộc vào "tương ứng với yêu cầu thông tin của từng loại hồ sơ vay vốn"?

Nếu thế có nghĩa là bạn bắt tôi phải dò, phải đoán là "tương ứng với yêu cầu thông tin của từng loại hồ sơ vay vốn" trong trường hợp này là thế này trong trường hợp khác là thế kia?

Hoặc bạn nói phương án nào hoặc nếu tùy theo tình huống mà chọn 1 hay 2 thì phải diễn giải cụ thể. Bạn đừng nghĩ là tôi sẽ bỏ công ra để đoán bạn thiết kế project của mình thế nào. Miêu tả cụ thể, cho ví dụ ...

Có thông tin thì đi tiếp, ngược lại thì tôi dừng ở đây.
 
Upvote 0
Giúp thế nào? Theo phương án nào? Bạn có đọc bài của tôi không?



Bạn viết: "Anh chọn loại hình khách hàng và chọn loại hình vay sẽ tự enable, Visible tương ứng với yêu cầu thông tin của từng loại hồ sơ vay vốn".

Như thế là như thế nào? Là luôn 1 hay luôn 2? Hay có lúc chọn 1 có lúc chọn 2 phụ thuộc vào "tương ứng với yêu cầu thông tin của từng loại hồ sơ vay vốn"?

Nếu thế có nghĩa là bạn bắt tôi phải dò, phải đoán là "tương ứng với yêu cầu thông tin của từng loại hồ sơ vay vốn" trong trường hợp này là thế này trong trường hợp khác là thế kia?

Hoặc bạn nói phương án nào hoặc nếu tùy theo tình huống mà chọn 1 hay 2 thì phải diễn giải cụ thể. Bạn đừng nghĩ là tôi sẽ bỏ công ra để đoán bạn thiết kế project của mình thế nào. Miêu tả cụ thể, cho ví dụ ...

Có thông tin thì đi tiếp, ngược lại thì tôi dừng ở đây.
Dạ, tùy vào tình huống mà chọn cách 1, hay cách 2. Giải pháp của em là nếu Page nào hay Frame nào bị ẩn hay bị enabled thì các Ctrl trong đó sẽ không được xét (bỏ qua, không cần SetFocus). Nhưng không biết viết code thế nào để biết Ctrl đó thuộc Page đó, hay Frame đó đã bị enabled hay visible mà loại nó ra khỏi vòng lặp.
Giống như khi anh chọn cbo loại khách hàng là cá nhân/ cbo loại hình vay vốn là thấu chi thì các Fra Thông tin người thừa kế và Page Tài sản bảo đảm sẽ không cần thiết nên em cho enabled và ẩn hết, khi đó nếu dùng vòng lặp duyệt qua, nếu thấy các Ctrl thuộc Page hay Fra bị ẩn/enabled thì sẽ bỏ qua không cần xét nữa, ngược lại sẽ xét để các Ctrl khác không bỏ trống.
 
Lần chỉnh sửa cuối:
Upvote 0
Dạ, tùy vào tình huống mà chọn cách 1, hay cách 2. Giải pháp của em là nếu Page nào hay Frame nào bị ẩn hay bị enabled thì các Ctrl trong đó sẽ không được xét (bỏ qua, không cần SetFocus). Nhưng không biết viết code thế nào để biết Ctrl đó thuộc Page đó, hay Frame đó đã bị enabled hay visible mà loại nó ra khỏi vòng lặp.
Giống như khi anh chọn cbo loại khách hàng là cá nhân/ cbo loại hình vay vốn là thấu chi thì các Fra Thông tin người thừa kế và Page Tài sản bảo đảm sẽ không cần thiết nên em cho enabled và ẩn hết, khi đó nếu dùng vòng lặp duyệt qua, nếu thấy các Ctrl thuộc Page hay Fra bị ẩn/enabled thì sẽ bỏ qua không cần xét nữa, ngược lại sẽ xét để các Ctrl khác không bỏ trống.

Nếu thế - xanh xanh - thì giải pháp 2 rồi chứ sao lại: "tùy vào tình huống mà chọn cách 1, hay cách 2"???

Hai giải pháp đều nói về ctrl có "tiền bối" bị ẩn cơ mà. Bạn đọc tiếng Việt không hiểu à?
--------------------
Chỗ đỏ đỏ là mới thêm vào. Nếu cần thì bạn sửa lại căn lề trong code vì GPE làm thay đổi mà tôi không muốn bỏ công để sửa. Sửa trong VBE thoải mái hơn nhiều

Mã:
Private Sub CmdSave_Click()
Dim Ctrl As Control, tmp As Object, bad As Boolean, pg As MSForms.Page, ControlsString As String, [B][COLOR=#ff0000]NotSetFocus As Boolean[/COLOR][/B]
    ControlsString = HS.[e2]
    For Each Ctrl In Me.Controls
        If TypeOf Ctrl Is MSForms.TextBox Or TypeOf Ctrl Is MSForms.ComboBox Then
            If InStr(1, ControlsString, Ctrl.Name) = 0 And Ctrl.Visible And Ctrl.Enabled Then
                If Ctrl.Value = "" Then
                   MsgBox "Khong de trong du lieu tai day!"
                    Set tmp = Ctrl
                    Do
                        [SIZE=2][B][COLOR=#ff0000]If Not tmp.Parent.Visible Then
                              NotSetFocus = True
                              Exit Do
                        End If[/COLOR][/B][/SIZE]
                        
                        If TypeOf tmp.Parent Is MSForms.Page Then
                            Set pg = tmp.Parent
                            pg.Parent.Value = pg.Index
                            End If
                        Set tmp = tmp.Parent
                        If tmp Is Me Then Exit Do
                    Loop
                    [B][COLOR=#ff0000]If Not NotSetFocus Then[/COLOR][/B]
                        Ctrl.SetFocus
                        bad = True
                        Exit For
                    [B][COLOR=#ff0000]End If[/COLOR][/B]
                End If
            End If
        End If
    Next
    
   ' If Not bad Then
'        xu ly du lieu
   '     MsgBox "good"
   ' End If
End Sub
 
Lần chỉnh sửa cuối:
Upvote 0
Nếu thế - xanh xanh - thì giải pháp 2 rồi chứ sao lại: "tùy vào tình huống mà chọn cách 1, hay cách 2"???

Hai giải pháp đều nói về ctrl có "tiền bối" bị ẩn cơ mà. Bạn đọc tiếng Việt không hiểu à?
--------------------
Chỗ đỏ đỏ là mới thêm vào. Nếu cần thì bạn sửa lại căn lề trong code vì GPE làm thay đổi mà tôi không muốn bỏ công để sửa. Sửa trong VBE thoải mái hơn nhiều

[/CODE]

Rất cảm ơn anh trong thời gian qua đã chỉ bảo tận tình. Em có thể hiểu được sự nóng giận của anh khi xem code và cách hỏi của em. Có thể nói lời diễn đạt qua ý hỏi không hay, không chuẩn dẫn đến anh không hiểu. Em, cũng như nhiều người khác cũng bị cái này nhiều lần khi hỏi các anh IT trên TW. Mấy anh đó cũng nóng tính, trả lời cộc lốc dẫn đến anh em trong diễn đàn sợ không dám hỏi nữa, đôi khi lại tranh cãi gay gắt với nhau dẫn đến mất tình đoàn kết. Nhưng cũng rất vui là sau khi được nhận được sự góp ý của anh em trong diễn đàn, các anh IT đã sửa lại thái độ khi trả lời, từ đó diễn đàn sôi nổi hẳn lên, anh em cũng rất vui, và đoàn kết.

Cũng như ông bà ta nói "chim khôn kêu tiếng rảnh rang người khôn nói tiếng dịu dàng dễ nghe", lời nó đâu có mất tiền, nhưng nó có thể giết chết người! Là người tri thức, có người này giỏi về phần này, có người giỏi về phần kia, không ai toàn mỹ cả do đó mới có thầy có thợ, thầy tốt là người nói cho mọi người hiểu chứ không phải nói để cho 1 ít người hiểu. Vì vậy sao không nói dễ chịu một chút. Đây là đôi lời em xin góp ý cùng anh. Nếu có gì không hài lòng xin anh bỏ qua cho em.
Còn về code anh hỗ trợ. Mặc dù rất hay và qua đây em cũng học được rất nhiều, nhưng khi em test lại nó vẫn báo lỗi.

Một lần nữa em xin cảm anh rất nhiều.}}}}}
 
Lần chỉnh sửa cuối:
Upvote 0
Rất cảm ơn anh trong thời gian qua đã chỉ bảo tận tình. Em có thể hiểu được sự nóng giận của anh khi xem code và cách hỏi của em. Có thể nói lời diễn đạt qua ý hỏi không hay, không chuẩn dẫn đến anh không hiểu. Em, cũng như nhiều người khác cũng bị cái này nhiều lần khi hỏi các anh IT trên TW. Mấy anh đó cũng nóng tính, trả lời cộc lốc dẫn đến anh em trong diễn đàn sợ không dám hỏi nữa, đôi khi lại tranh cãi gay gắt với nhau dẫn đến mất tình đoàn kết. Nhưng cũng rất vui là sau khi được nhận được sự góp ý của anh em trong diễn đàn, các anh IT đã sửa lại thái độ khi trả lời, từ đó diễn đàn sôi nổi hẳn lên, anh em cũng rất vui, và đoàn kết.

Cũng như ông bà ta nói "chim khôn kêu tiếng rảnh rang người khôn nói tiếng dịu dàng dễ nghe", lời nó đâu có mất tiền, nhưng nó có thể giết chết người! Là người tri thức, có người này giỏi về phần này, có người giỏi về phần kia, không ai toàn mỹ cả do đó mới có thầy có thợ, thầy tốt là người nói cho mọi người hiểu chứ không phải nói để cho 1 ít người hiểu. Vì vậy sao không nói dễ chịu một chút. Đây là đôi lời em xin góp ý cùng anh. Nếu có gì không hài lòng xin anh bỏ qua cho em.

Tôi muốn giúp bạn nên hỏi cặn kẽ, nhưng bạn thường không trả lời những câu hỏi tôi đặt ra, vd. Bài #19 tôi đặt ra câu hỏi rõ ràng trong khi ở bài #20 bạn làm 1 câu ngắn gọn: "Dạ, anh xem giúp em". Tôi muốn bạn chọn phương án 1 hay 2 để viết code cho đúng nhưng bạn không quyết định. Phải thêm một bài nữa để tôi moi thông tin, nhưng bạn cũng lại: "tùy vào tình huống mà chọn cách 1, hay cách 2". Thế mà theo ý bạn thì đó là phương án 2 chứ đâu có "tùy vào tình huống mà chọn cách 1, hay cách 2"?

Vấn đề là của bạn mà tôi phải nài nỉ để bạn chiếu cố trả lời. Cứ như là việc của tôi còn bạn là người thích thì giúp một tí để tôi "cầy", để tôi giải quyết việc của tôi.

Bạn viết: "Là người tri thức, có người này giỏi về phần này, có người giỏi về phần kia, không ai toàn mỹ cả do đó mới có thầy có thợ, thầy tốt là người nói cho mọi người hiểu chứ không phải nói để cho 1 ít người hiểu". Nói gì ở đây hả bạn để bạn hiểu? Tôi cho rằng tôi đã viết trong bài #19 rất rõ ràng. Bằng tiếng Việt và rất rõ ràng. Nếu bạn đọc không hiểu thì nói "Bạn đọc tiếng Việt không hiểu à?" là không đúng? Phải ngọt ngào như thế nào hả bạn?

Tôi bỏ công sức, thời gian ra moi từng thông tin nhưng bạn hoặc không trả lời câu hỏi hoặc không trình bầy rõ ràng. Bạn không nghĩ như thế là bạn không tôn trọng tôi, thời gian và công sức của tôi?

Bạn nói trả lời "cộc lốc"? Thế thì bạn không hiểu từ "cộc lốc" rồi. Bạn đọc câu hỏi của tôi mà không hiểu, hoặc không thèm đọc kỹ, nhưng bạn nghĩ là không được góp ý? Góp ý thì lại là "nóng tính", "thái độ" ...? Tức nếu không giúp thì thôi còn muốn cầy hộ tôi thì khóa mõm lại?

Rất tiếc là bây giờ bạn mới nói những lời này.

Còn về code anh hỗ trợ. Mặc dù rất hay và qua đây em cũng học được rất nhiều, nhưng khi em test lại nó vẫn báo lỗi.

Một lần nữa em xin cảm anh rất nhiều.}}}}}

Tôi không hiểu lỗi là gì. Lỗi là "không làm đúng ý", là "treo máy", là "bị mất dữ liệu"? Tôi không bao giờ thích chơi trò "đoán ý đồng đội".

Mà cứ cho là bạn sẽ nói rõ: khi nhấn cái này, xong nhập vào kia, rồi chuyển sang nọ thì có cửa sổ nhẩy ra thông báo xyz", cứ cho là thế đi thì tôi cũng đã kết thúc với bạn rồi. Bạn tự làm nhé.

Đây là bài cuối cùng của tôi trong chủ đề này.
Tôi đã quyết chấm dứt thì nhất định sẽ chấm dứt.
 
Upvote 0

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

Back
Top Bottom