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

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

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

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

Lần chỉnh sửa cuối:
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
Nếu đặt tên các control theo quy tắc trên thì anh thay đoạn code trên bởi đoạn code này xem sao:
[GPECODE=vb]Dim i As Long
For i = 1 To 9
If Controls("Ctr" & i) = "" Then Exit For
Next
If i < 10 Then
MsgBox ("Ban phai nhap day du cac thong tin")
Controls("Ctr" & i).SetFocus
Exit Sub
End If[/GPECODE]
Khi thêm controls, anh chỉ cần thay đổi số 9 và số 10 trong đoạn code trên thôi.
 
Upvote 0
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
Anh xem lại file và cho ý kiến thêm nha
 

File đính kèm

Upvote 0
Chào viehoai, dạo này vẫn khỏe chứ...Cái Code của viehoai sửa chạy rất ok ,nhưng khi mình chèn vào đoạn Code nhập dữ liệu dưới đây nó lại ko chạy:

Private Sub Cmd_ok_Click()
Dim i, Rg As Range
For i = 1 To 51
If InStr(1, Right("00" & i, 2)) = 0 Then
DATA.Cells(Me.Ctr_dg, i) = Me.Controls("Ctr" & Right("00" & i, 2))
Else
DATA.Cells(Me.Ctr_dg, i) = Val(Format(Me.Controls("Ctr" & Right("00" & i, 2)), "0"))
End If
Next
DATA.Cells(Me.Ctr_dg, 52) = DATA.Cells(Me.Ctr_dg, 52).Value & User & "~" & Format(Now(), "dd/mm/yy hh:mm") & ";"
xem
Naplist
End Sub

Nhờ viehoai xem và chèn thêm Code bẫy lỗi cho với.
 
Upvote 0
Chào viehoai, dạo này vẫn khỏe chứ...Cái Code của viehoai sửa chạy rất ok ,nhưng khi mình chèn vào đoạn Code nhập dữ liệu dưới đây nó lại ko chạy:

Private Sub Cmd_ok_Click()
Dim i, Rg As Range
For i = 1 To 51
If InStr(1, Right("00" & i, 2)) = 0 Then
DATA.Cells(Me.Ctr_dg, i) = Me.Controls("Ctr" & Right("00" & i, 2))
Else
DATA.Cells(Me.Ctr_dg, i) = Val(Format(Me.Controls("Ctr" & Right("00" & i, 2)), "0"))
End If
Next
DATA.Cells(Me.Ctr_dg, 52) = DATA.Cells(Me.Ctr_dg, 52).Value & User & "~" & Format(Now(), "dd/mm/yy hh:mm") & ";"
xem
Naplist
End Sub

Nhờ viehoai xem và chèn thêm Code bẫy lỗi cho với.
Anh đưa file lại cho em, chưa đọc kỹ code nhưng có khả năng tên của button là Cmd_ok mới thực thi code được
 
Upvote 0
Viehoai xem file và giúp nhé.
 

File đính kèm

Upvote 0
Viehoai xem file và giúp nhé.
Anh giải thích cho em mục đích anh nhấn nút lệnh Save (Cmd_ok)
Trong code anh có lệnh
[GPECODE=vb]
For i = 1 To 51
If InStr(1, Right("00" & i, 2)) = 0 Then
DATA.Cells(Me.Ctr_dg, i) = Me.Controls("Ctr" & Right("00" & i, 2))
Else
DATA.Cells(Me.Ctr_dg, i) = Val(Format(Me.Controls("Ctr" & Right("00" & i, 2)), "0"))
End If
Next[/GPECODE]
Nghĩa là:
i=1: Right("00" & i,2)= Right("001", 2)= "01"=> InStr(1, Right("00" & i, 2)) =0 mà đáng lẽ là InStr( Right("00" & i, 2),1)???
i=2: Right("00" & i,2)= Right("002", 2)= "02"=> InStr(1, Right("00" & i, 2)) =0
.....
i=15: Right("00" & i,2)= Right("0015", 2)= "15"=> InStr(1, Right("00" & i, 2)) =0
Em không hiểu ý anh làm gì nữa
 
Lần chỉnh sửa cuối:
Upvote 0
mình cần bẫy lỗi để trống dữ liệu,tức là khi chưa nhập dữ liệu vào các Ctr thì khi bấm nút cmd_ok thì sẽ ko cho save và hiện lên thông báo chưa nhập dữ liệu đầy đủ.
 
Upvote 0
mình cần bẫy lỗi để trống dữ liệu,tức là khi chưa nhập dữ liệu vào các Ctr thì khi bấm nút cmd_ok thì sẽ ko cho save và hiện lên thông báo chưa nhập dữ liệu đầy đủ.
Ý tưởng của anh em đọc khó hiểu thật, đọc file tìm hiểu hơi khó
1. Anh trình mày mục đích anh đưa câu lệnh If InStr(1, Right("00" & i, 2)) = 0 Then để làm gì
2. Với sự kiện Cmd_ok_Click() có liên quan gì câu nói ở trên của anh đâu?
Anh nói thêm khi nào thì Me.Cmd_ok.Visible = True vậy, em rà theo code lâu quá
 
Lần chỉnh sửa cuối:
Upvote 0
Cái File trên là của bác sealand làm,mình có cắt bớt đi vài đoạn nên nó như vậy,đoạn code trên đầy đủ như thế này:

Private Sub Cmd_ok_Click()
Dim i, ch, Rg As Range
ch = "11;12;13;14;15;16;17;18;19;20;21;22;23;24;25;26;27;28;29;31;37;38;39;40;41"
For i = 1 To 51
If InStr(1, ch, Right("00" & i, 2)) = 0 Then
HS.Cells(Me.Ctr_dg, i) = Me.Controls("Ctr" & Right("00" & i, 2))
Else
HS.Cells(Me.Ctr_dg, i) = Val(Format(Me.Controls("Ctr" & Right("00" & i, 2)), "0"))
End If
Next
HS.Cells(Me.Ctr_dg, 52) = HS.Cells(Me.Ctr_dg, 52).Value & User & "~" & Format(Now(), "dd/mm/yy hh:mm") & ";"
xem
Naplist
End Sub
 
Upvote 0
Cái File trên là của bác sealand làm,mình có cắt bớt đi vài đoạn nên nó như vậy,đoạn code trên đầy đủ như thế này:

Private Sub Cmd_ok_Click()
Dim i, ch, Rg As Range
ch = "11;12;13;14;15;16;17;18;19;20;21;22;23;24;25;26;27;28;29;31;37;38;39;40;41"
For i = 1 To 51
If InStr(1, ch, Right("00" & i, 2)) = 0 Then
HS.Cells(Me.Ctr_dg, i) = Me.Controls("Ctr" & Right("00" & i, 2))
Else
HS.Cells(Me.Ctr_dg, i) = Val(Format(Me.Controls("Ctr" & Right("00" & i, 2)), "0"))
End If
Next
HS.Cells(Me.Ctr_dg, 52) = HS.Cells(Me.Ctr_dg, 52).Value & User & "~" & Format(Now(), "dd/mm/yy hh:mm") & ";"
xem
Naplist
End Sub
Về logic thì code này hợp lý, anh sử dụng hàm InStr() không đúng rồi, InStr(Start,String1,String2) tìm String2 trong chuỗi String1. Anh tự thay đổi thử rồi có gì nói tiếp nhé
 
Upvote 0
Anh Khamha làm được chưa?
Theo em hiểu trong các Ctr* (từ A1 đến A51) thì cái nào nhập dữ liệu text thì "*" năm trong chuỗi text "ch", còn không là dữ liệu dạng số, nếu có nhập chuỗi thì nó sẽ chuyển bằng 0. Vậy chuỗi ch thì chỉ có anh biết mà đặt
Như trên anh đã nhằm là InStr(1,String1, String2): số 1 là vị trí bắt đầu tìm Start, tìm chuỗi String2 trong chuỗi String1
Còn công thức của anh:
InStr(1, Right("00" & i, 2)) hiểu là tìm chuỗi Right("00" & i, 2) trong chuỗi "1" là không đúng
(Lưu ý nếu chỉ tối đa 51 thì chỉ cần Right("0" & i, 2) 1 số 0 là đủ
 
Lần chỉnh sửa cuối:
Upvote 0
Còn cách tạo đoạn Code bẫy lỗi ko cho lưu dữ liệu từ Form vào bảng tính thì phải tạo và chèn vào đâu?
* Nhờ viehoai giải thích nội dung Code trong File trên để mình ngâm cứu với...Còn rất nhiều chỗ chưa hiểu.Thank
 
Upvote 0
Còn cách tạo đoạn Code bẫy lỗi ko cho lưu dữ liệu từ Form vào bảng tính thì phải tạo và chèn vào đâu?

Không hiểu lắm đoạn màu đỏ. Bạn nói rõ hơn được không? Nếu lưu thì lưu cái gì và không lưu như thế nào? Và lỗi gì phát sinh mà cần bẫy lỗi?
 
Upvote 0
Còn cách tạo đoạn Code bẫy lỗi ko cho lưu dữ liệu từ Form vào bảng tính thì phải tạo và chèn vào đâu?
* Nhờ viehoai giải thích nội dung Code trong File trên để mình ngâm cứu với...Còn rất nhiều chỗ chưa hiểu.Thank
Anh chưa hiểu ở đâu thì em giải thích (nếu được) chứ file trên code nhiều thế giải thích hết sao nổi
Ý màu đỏ trên của anh là nếu Control nào trống thì chưa cho nhập vào bảng tính? Nếu vậy thì anh kiểm tra control nào còn trống thì phang "Exit Sub" là nó thoát lệnh nhập dữ liệu ngay mà
 
Upvote 0
Khi ta tạo dữ liệu mới hoặc sửa dữ liệu ,nếu trong các TextBox hay ComboBox "Ctr" chưa nhập dữ liệu thì khi ta bấm nút Save sẽ có thông báo là: "Ban phai nhap day du cac thong tin"
 
Upvote 0
Khi ta tạo dữ liệu mới hoặc sửa dữ liệu ,nếu trong các TextBox hay ComboBox "Ctr" chưa nhập dữ liệu thì khi ta bấm nút Save sẽ có thông báo là: "Ban phai nhap day du cac thong tin"
Đúng như trên đã nói và trong file SuaCodeBayLoi.xls em có đoạn code kiểm tra Control nào chưa nhập thì la làng lên "Ban phai nhap day du cac thong tin" và sau đó là Exit Sub
[GPECODE=vb]For i = 1 To 9
If Me.Controls("Ctr" & i) = "" Then
Me.Controls("Ctr" & i).SetFocus
MsgBox "Ban phai nhap day du cac thong tin"
Exit Sub
End If
Next[/GPECODE]
Chú ý đoạn mã này phải đưa đầu thủ tục
 
Upvote 0
Khi ta tạo dữ liệu mới hoặc sửa dữ liệu ,nếu trong các TextBox hay ComboBox "Ctr" chưa nhập dữ liệu thì khi ta bấm nút Save sẽ có thông báo là: "Ban phai nhap day du cac thong tin"


Đơn giản thế này thôi, chỉ thêm các dòng từ 4 đến 10 sau vào Sub Cmd_ok_Click() là được kiểm soát khoảng trắng-- các code khác vẫn giữ nguyên (sai đúng không bit - vì code cũ)

[GPECODE=vb]Private Sub Cmd_ok_Click()
Dim i, Rg As Range

For i = 1 To 51
If Me.Controls("Ctr" & Format(i, "00")) = "" Then
MsgBox "Ban Phai NHAP DAY DU DL"
Me.Controls("Ctr" & Format(i, "00")).SetFocus
Exit Sub
End If
Next

For i = 1 To 51
If InStr(1, Right("00" & i, 2)) = 0 Then
DATA.Cells(Me.Ctr_dg, i) = Me.Controls("Ctr" & Right("00" & i, 2))
Else
DATA.Cells(Me.Ctr_dg, i) = Val(Format(Me.Controls("Ctr" & Right("00" & i, 2)), "0"))
End If
Next

DATA.Cells(Me.Ctr_dg, 52) = DATA.Cells(Me.Ctr_dg, 52).Value & User & "~" & Format(Now(), "dd/mm/yy hh:mm") & ";"
xem
Naplist

End Sub[/GPECODE]
 
Upvote 0
Nếu muốn thông báo chi tiết hơn, là tại cotrol nào đang kiểm soát phát hiện là không dữ liệu, thì thay đoạn code dòng 4-10 trên bằng đoạn code sau (nhớ vẫn đặt vào Sub Cmd_ok_Click() ) :

[GPECODE=vb]For i = 1 To 51
If Me.Controls("Ctr" & Format(i, "00")) = "" Then
MsgBox "Ban Phai NHAP DAY DU DL" & Chr(13) & _
"Tai " & Me.Controls("L" & Format(i, "00")) & _
" (" & Me.Controls("Ctr" & Format(i, "00")).Name & ") dang KHONG CO DL"
Me.Controls("Ctr" & Format(i, "00")).SetFocus
Exit Sub
End If
Next[/GPECODE]
 
Upvote 0
Đã 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.
 
Upvote 0
Đã 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

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

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

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

Back
Top Bottom