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!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!
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?"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?
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!
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
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
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êmKhô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![]()
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é!
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.
Dạ đúng rồi!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.![]()
Dạ đúng rồi!![]()
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.
1> số control nằm trên các mutilpage trong lúc thiết kế là biếtDạ, 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 đỡ!
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
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> 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!!thêm cách khác để chọn multipageMã: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
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
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 đỡ!
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.
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 đỡ.
![]()
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 đỡ.
Dạ, anh xem giúp emThô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.