A e GPE giúp đỡ code mình có 1 form nhập liệu, mình tạo 1 các check box theo tên các sheet.
Khi nhập liệu mình chọn check box nào thì dữ liệu được nhập vào sheet tên của check box tương ứng. Có thể chọn đồng thời nhiều check box. cấu trúc gần như giống nhau, không nhập theo o liên tiếp trong dòng mà có khoảng cách cel trong dòng, vi dụ nhập vào cột B, D, F,G,I,J,L,M.
các cột khác có công thức sẵn.
Quan sát Form thì thấy tất cả các checkbox của bạn nằm trong Frame => sẽ lập Code lấy ra tên Checkbox nằm trong Frame nếu checkbox đó được tick. Khi đã có tên checkbox thì việc lựa chọn sheet là quá dễ dàng
Mã:
Sub TestGPE()
Dim Obj As Control
For Each Obj In Me.LINE_INPUT.Controls
If Obj.Value = True Then
[COLOR=#ff0000] Sheets(Obj.Caption).Select[/COLOR]
End If
Next
End Sub
2/
Có thể chọn đồng thời nhiều check box. cấu trúc gần như giống nhau, không nhập theo o liên tiếp trong dòng mà có khoảng cách cel trong dòng, vi dụ nhập vào cột B, D, F,G,I,J,L,M.
Gợi ý 1 sẽ cho bạn lựa chọn các sheet theo giá trị checkbox giờ việc còn lại là gán vào đâu thì bạ có thể làm theo dạng sau, thay đoạn màu đỏ bên trên bằng
Mã:
Sheets(Obj.Caption).[B65536].End(3).Offset(1, 0) = "Gia tri can dien"
Bạn đã viết được khá nhiều Code vậy chỉ cần gợi ý chắc bạn cũng sẽ làm được. Tôi gợi ý cho 2 thắc mắc của bạn
1/
Quan sát Form thì thấy tất cả các checkbox của bạn nằm trong Frame => sẽ lập Code lấy ra tên Checkbox nằm trong Frame nếu checkbox đó được tick. Khi đã có tên checkbox thì việc lựa chọn sheet là quá dễ dàng
Mã:
Sub TestGPE()
Dim Obj As Control
For Each Obj In Me.LINE_INPUT.Controls
If Obj.Value = True Then
[COLOR=#ff0000] Sheets(Obj.Caption).Select[/COLOR]
End If
Next
End Sub
2/
Gợi ý 1 sẽ cho bạn lựa chọn các sheet theo giá trị checkbox giờ việc còn lại là gán vào đâu thì bạ có thể làm theo dạng sau, thay đoạn màu đỏ bên trên bằng
Mã:
Sheets(Obj.Caption).[B65536].End(3).Offset(1, 0) = "Gia tri can dien"
Bạn đã viết được khá nhiều Code vậy chỉ cần gợi ý chắc bạn cũng sẽ làm được. Tôi gợi ý cho 2 thắc mắc của bạn
1/
Quan sát Form thì thấy tất cả các checkbox của bạn nằm trong Frame => sẽ lập Code lấy ra tên Checkbox nằm trong Frame nếu checkbox đó được tick. Khi đã có tên checkbox thì việc lựa chọn sheet là quá dễ dàng
Mã:
Sub TestGPE()
Dim Obj As Control
For Each Obj In Me.LINE_INPUT.Controls
If Obj.Value = True Then
[COLOR=#ff0000] Sheets(Obj.Caption).Select[/COLOR]
End If
Next
End Sub
2/
Gợi ý 1 sẽ cho bạn lựa chọn các sheet theo giá trị checkbox giờ việc còn lại là gán vào đâu thì bạ có thể làm theo dạng sau, thay đoạn màu đỏ bên trên bằng
Mã:
Sheets(Obj.Caption).[B65536].End(3).Offset(1, 0) = "Gia tri can dien"
Bạn xem dùng mình, khi điền dữ liệu nhập vào cell trong sheet nó không nhập theo 1 dòng dữ liệu trống mà nhập vào các dòng khác nhau, cell sau tăng lên.Bạn sửa code dùm mình dữ liệu nhập vào dòng trống tiep theo dòng cò dữ liệu được ko? code mình viết.
Private Sub Ok_Click()
Dim iRow As Long
Dim ws As Worksheet
Set ws = Worksheets("FORM INPUT")
If Ngay = "" Or ComboBox2 = "" Or TextBox3 = "" Or ComboBox1 = "" Or TextBox5 = "" Or TextBox6 = "" Or TextBox7 = "" Or TextBox8 = "" Then
MsgBox "Ban chua nhap day du thong tin. Vui long nhap tiep!", , "THONG BAO !"
Exit Sub
End If
'find first empty row in database
iRow = ws.Cells(Rows.Count, 12) _
.End(xlUp).Offset(1, 0).Row
'copy the data to the database
Dim Obj As Control
For Each Obj In Me.LINE_INPUT.Controls
If Obj.Value = True Then
Sheets(Obj.Caption).[B65536].End(3).Offset(1, 0) = Me.Ngay.Value
Sheets(Obj.Caption).[D65536].End(3).Offset(3, 0) = Me.ComboBox2.Value
Sheets(Obj.Caption).[F65536].End(3).Offset(4, 0) = Me.TextBox3.Value
Sheets(Obj.Caption).[G65536].End(3).Offset(5, 0) = Me.ComboBox1.Value
Sheets(Obj.Caption).[H65536].End(3).Offset(6, 0) = Me.TextBox5.Value
Sheets(Obj.Caption).[J65536].End(3).Offset(8, 0) = Me.TextBox6.Value
Sheets(Obj.Caption).[L65536].End(3).Offset(9, 0) = Me.TextBox7.Value
Sheets(Obj.Caption).[M65536].End(3).Offset(12, 0) = Me.TextBox8.Value
'clear the data
Ngay = ""
ComboBox2 = ""
TextBox3 = ""
ComboBox1 = ""
TextBox5 = ""
TextBox6 = ""
TextBox7 = ""
TextBox8 = ""
End If
Next
Me.Ngay.SetFocus
End Sub
Tôi cũng không xem hết File của bạn, nó quá dài nhưng có thể hướng dẫn bạn về hàm offset trong VBA.
Khi bạn dùng Offset trong VBA thì cấu trúc tương tự Offset trên cell
Mã:
.Offset (hàng, cột)
Hàng, cột là số hàng, cột bạn muốn di chuyển tương đối.
=> Như vậy khi dùng Sheets(Obj.Caption).[B65536].End(3) để lấy vị trí dòng cuối cùng thì để lấy dòng tiếp theo đó sẽ là di chuyển xuống 1 hàng tức
Khi bạn muốn ghi tất cả các dữ liệu theo 1 hàng thì bạn nên dùng 1 cell làm chuẩn các cột khác Offset theo khi đó yếu tố "Cột" trong Offset sẽ thay đổi (còn hàng bạn đã điền giá trị rồi thì sẽ trở lại 0)
Ví dụ: với lệnh (*), tiếp theo chuyển cho cột C sẽ là
Bạn xem dùng mình, khi điền dữ liệu nhập vào cell trong sheet nó không nhập theo 1 dòng dữ liệu trống mà nhập vào các dòng khác nhau, cell sau tăng lên.Bạn sửa code dùm mình dữ liệu nhập vào dòng trống tiep theo dòng cò dữ liệu được ko? code mình viết.
Private Sub Ok_Click()
Dim iRow As Long
Dim ws As Worksheet
Set ws = Worksheets("FORM INPUT")
If Ngay = "" Or ComboBox2 = "" Or TextBox3 = "" Or ComboBox1 = "" Or TextBox5 = "" Or TextBox6 = "" Or TextBox7 = "" Or TextBox8 = "" Then
MsgBox "Ban chua nhap day du thong tin. Vui long nhap tiep!", , "THONG BAO !"
Exit Sub
End If
'find first empty row in database
iRow = ws.Cells(Rows.Count, 12) _
.End(xlUp).Offset(1, 0).Row
'copy the data to the database
Dim Obj As Control
For Each Obj In Me.LINE_INPUT.Controls
If Obj.Value = True Then
Sheets(Obj.Caption).[B65536].End(3).Offset(1, 0) = Me.Ngay.Value
Sheets(Obj.Caption).[D65536].End(3).Offset(3, 0) = Me.ComboBox2.Value
Sheets(Obj.Caption).[F65536].End(3).Offset(4, 0) = Me.TextBox3.Value
Sheets(Obj.Caption).[G65536].End(3).Offset(5, 0) = Me.ComboBox1.Value
Sheets(Obj.Caption).[H65536].End(3).Offset(6, 0) = Me.TextBox5.Value
Sheets(Obj.Caption).[J65536].End(3).Offset(8, 0) = Me.TextBox6.Value
Sheets(Obj.Caption).[L65536].End(3).Offset(9, 0) = Me.TextBox7.Value
Sheets(Obj.Caption).[M65536].End(3).Offset(12, 0) = Me.TextBox8.Value
'clear the data
Ngay = ""
ComboBox2 = ""
TextBox3 = ""
ComboBox1 = ""
TextBox5 = ""
TextBox6 = ""
TextBox7 = ""
TextBox8 = ""
End If
Next
Me.Ngay.SetFocus
End Sub
Tôi cũng không xem hết File của bạn, nó quá dài nhưng có thể hướng dẫn bạn về hàm offset trong VBA.
Khi bạn dùng Offset trong VBA thì cấu trúc tương tự Offset trên cell
Mã:
.Offset (hàng, cột)
Hàng, cột là số hàng, cột bạn muốn di chuyển tương đối.
=> Như vậy khi dùng Sheets(Obj.Caption).[B65536].End(3) để lấy vị trí dòng cuối cùng thì để lấy dòng tiếp theo đó sẽ là di chuyển xuống 1 hàng tức
Khi bạn muốn ghi tất cả các dữ liệu theo 1 hàng thì bạn nên dùng 1 cell làm chuẩn các cột khác Offset theo khi đó yếu tố "Cột" trong Offset sẽ thay đổi (còn hàng bạn đã điền giá trị rồi thì sẽ trở lại 0)
Ví dụ: với lệnh (*), tiếp theo chuyển cho cột C sẽ là
Ah mà bạn ơi, sao mình chọn nhập dữ liệu vào 3 sheet, chọn 3 check box tương ứng nhưng khi chạy code chỉ nhập vào 1 check box đầu tiên ah.code của e
Private Sub Ok_Click()
Dim iRow As Long
Dim ws As Worksheet
Set ws = Worksheets("FORM INPUT")
If Ngay = "" Or ComboBox2 = "" Or TextBox3 = "" Or ComboBox1 = "" Or TextBox5 = "" Or TextBox6 = "" Or TextBox7 = "" Or TextBox8 = "" Then
MsgBox "Ban chua nhap day du thong tin. Vui long nhap tiep!", , "THONG BAO !"
Exit Sub
End If
'find SHEET THEO CHECK BOX
Dim Obj As Control
For Each Obj In Me.LINE_INPUT.Controls
If Obj.Value = True Then
Cảm ơn nhiều "dhn46", bạn chỉ dùm mình thêm muốn trong cột combobox chỉ giới hạn cho nhập vào những giá trị theo list thì chỗ style = 2, nhưng lúc đó mình không nhập bằng tay từ bàn phím được mà phải kéo chuột để chọn. Mà dữ liệu list cỡ 1000 dòng mà kéo chọn thì không được.Vậy có cách nào cho nhập từ bàn phím mà cũng giới hạn nằm trong list, ngoài list ko nhập vào được mà báo lỗi.
Cảm ơn nhiều "dhn46", bạn chỉ dùm mình thêm muốn trong cột combobox chỉ giới hạn cho nhập vào những giá trị theo list thì chỗ style = 2, nhưng lúc đó mình không nhập bằng tay từ bàn phím được mà phải kéo chuột để chọn. Mà dữ liệu list cỡ 1000 dòng mà kéo chọn thì không được.Vậy có cách nào cho nhập từ bàn phím mà cũng giới hạn nằm trong list, ngoài list ko nhập vào được mà báo lỗi.
Ah cho mình hõi thêm chút nữa:
1./code để xoá tick trong check box sau khi nhập dữ liệu được không ah.Vì mình sợ lần sau nhập dữ liệu người nhập quên chọn tick vào check box.
2./Code để bắt buộc người nhập chọn tick vào check box trước khi nhấp "ok", sau khi ok thì xoá trắng tick check box như câu hỏi 1.
Bạn nên quan sát và phỏng đoán Code một chút sẽ thấy cách làm. Bạn đã thấy có True thì sẽ có False. True để kiểm tra có tick thì False sẽ là không check.
Các dạng Code bắt lỗi thì cứ if mà bạn bắt thôi, nếu thỏa thì cho chạy không thì exit sub.
Nói chung học VBA bạn nên tích cực “đoán”, “tìm kiếm” và thực hành nhé. Có lẽ bạn cũng đã thỏa mãn câu hỏi cho topic này. Topic này nên đóng lại chứ nhỉ?
Bạn nên quan sát và phỏng đoán Code một chút sẽ thấy cách làm. Bạn đã thấy có True thì sẽ có False. True để kiểm tra có tick thì False sẽ là không check.
Các dạng Code bắt lỗi thì cứ if mà bạn bắt thôi, nếu thỏa thì cho chạy không thì exit sub.
Nói chung học VBA bạn nên tích cực “đoán”, “tìm kiếm” và thực hành nhé. Có lẽ bạn cũng đã thỏa mãn câu hỏi cho topic này. Topic này nên đóng lại chứ nhỉ?
Minh thử không được nhờ bạn tư vấn thêm,Code mình làm thế này mà ko đươc:
Private Sub UserForm_Initialize()
Me.Ngay = Format(Now, "dd.mm.yyyy")
Me.TextBox5 = Format(TextBox5, "####0395##")
End Sub
----------------------------------------------------------- Private Sub Ok_Click() Dim iRow As Long Dim ws As Worksheet
Set ws = Worksheets("FORM INPUT") If Ngay = "" Or ComboBox2 = "" Or TextBox3 = "" Or ComboBox1 = "" Or TextBox5 = "" Or TextBox6 = "" Or TextBox7 = "" Or TextBox8 = "" Then MsgBox "Ban chua nhap day du thong tin. Vui long nhap tiep!", , "THONG BAO !" Exit Sub End If
'find SHEET THEO CHECK BOX
Dim Obj As Control For Each Obj In Me.LINE_INPUT.Controls If Obj.Value = False Then MsgBox "Ban chua chon LINE can nhap mau. Vui long chon LINE!", , "THONG BAO !" Exit Sub End If
If Obj.Value = True Then
'copy the data to the database Sheets(Obj.Caption).[B65536].End(3).Offset(1, 0) = Me.Ngay.Value Sheets(Obj.Caption).[B65536].End(3).Offset(0, 2) = Me.ComboBox2.Value Sheets(Obj.Caption).[B65536].End(3).Offset(0, 4) = Me.TextBox3.Value Sheets(Obj.Caption).[B65536].End(3).Offset(0, 5) = Me.ComboBox1.Value Sheets(Obj.Caption).[B65536].End(3).Offset(0, 6) = Me.TextBox5.Value Sheets(Obj.Caption).[B65536].End(3).Offset(0, 8) = Me.TextBox6.Value Sheets(Obj.Caption).[B65536].End(3).Offset(0, 10) = Me.TextBox7.Value Sheets(Obj.Caption).[B65536].End(3).Offset(0, 11) = Me.TextBox8.Value End If Next 'clear the data Ngay = "" ComboBox2 = "" TextBox3 = "" ComboBox1 = "" TextBox5 = "" TextBox6 = "" TextBox7 = "" TextBox8 = "" Me.LINE_INPUT = "" Me.Ngay.SetFocus End Sub
1./ Do ID number nhập từ lần trước mà ko nhớ thi mình phải thoát form xem, vậy có cách nào khi minh tick vào check box sheet nào thì hiện thông tin ID number( kí hiệu) lần nhập gần nhất của sheet tương ứng kế bên không bạn)
2./Ah trong text box nhập vào mình muốn định dạng thành "22350395A1" khi nhập vào là "2235A1" thì thế nào bạn.mình muốn khi nhập vào 4 số 2235 trên form thì sẽ hiện thêm la 2235 0395 va 2mình nhập tiếp A1.
code mình làm được rồi, bạn xem đúng ko: Private Sub Ok_Click()
Dim iRow As Long
Dim ws As Worksheet
Dim Obj As Control
Set ws = Worksheets("FORM INPUT")
If Ngay = "" Or ComboBox2 = "" Or TextBox3 = "" Or ComboBox1 = "" Or TextBox5 = "" Or TextBox6 = "" Or TextBox7 = "" Or TextBox8 = "" Then
MsgBox "Ban chua nhap day du thong tin. Vui long nhap tiep!", , "THONG BAO !"
Exit Sub
End If
If KWT2 = False And CheckBox1 = False And CheckBox2 = False And CheckBox3 = False And CheckBox4 = False And CheckBox5 = False And CheckBox6 = False And CheckBox7 = False And CheckBox8 = False And CheckBox9 = False And CheckBox10 = False And CheckBox11 = False And CheckBox12 = False Then
MsgBox "Ban chua chon LINE nhap. Vui long chon!", , "THONG BAO !"
Exit Sub
End If
'find SHEET THEO CHECK BOX
For Each Obj In Me.LINE_INPUT.Controls
If Obj.Value = True Then
Sheets(Obj.Caption).[B65536].End(3).Offset(1, 0) = Me.Ngay.Value
Sheets(Obj.Caption).[B65536].End(3).Offset(0, 2) = Me.ComboBox2.Value
Sheets(Obj.Caption).[B65536].End(3).Offset(0, 4) = Me.TextBox3.Value
Sheets(Obj.Caption).[B65536].End(3).Offset(0, 5) = Me.ComboBox1.Value
Sheets(Obj.Caption).[B65536].End(3).Offset(0, 6) = Me.TextBox5.Value
Sheets(Obj.Caption).[B65536].End(3).Offset(0, 8) = Me.TextBox6.Value
Sheets(Obj.Caption).[B65536].End(3).Offset(0, 10) = Me.TextBox7.Value
Sheets(Obj.Caption).[B65536].End(3).Offset(0, 11) = Me.TextBox8.Value
End If
Next 'clear the data
Ngay = ""
ComboBox2 = ""
TextBox3 = ""
ComboBox1 = ""
TextBox5 = ""
TextBox6 = ""
TextBox7 = ""
TextBox8 = ""
KWT2 = False
CheckBox1 = False
CheckBox2 = False
CheckBox3 = False
CheckBox4 = False
CheckBox5 = False
CheckBox6 = False
CheckBox7 = False
CheckBox8 = False
CheckBox9 = False
CheckBox10 = False
CheckBox11 = False
CheckBox12 = False
Me.Ngay.SetFocus
End Sub
--->Giờ còn phần định dạng khi nhập "2233A2" thành "22330395A2" chưa được, mong giúp đỡ.Mình thử trên cell, form cũng không được.bí quá mò không ra
code mình làm được rồi, bạn xem đúng ko: Private Sub Ok_Click()
Dim iRow As Long
Dim ws As Worksheet
Dim Obj As Control
Set ws = Worksheets("FORM INPUT")
If Ngay = "" Or ComboBox2 = "" Or TextBox3 = "" Or ComboBox1 = "" Or TextBox5 = "" Or TextBox6 = "" Or TextBox7 = "" Or TextBox8 = "" Then
MsgBox "Ban chua nhap day du thong tin. Vui long nhap tiep!", , "THONG BAO !"
Exit Sub
End If
If KWT2 = False And CheckBox1 = False And CheckBox2 = False And CheckBox3 = False And CheckBox4 = False And CheckBox5 = False And CheckBox6 = False And CheckBox7 = False And CheckBox8 = False And CheckBox9 = False And CheckBox10 = False And CheckBox11 = False And CheckBox12 = False Then
MsgBox "Ban chua chon LINE nhap. Vui long chon!", , "THONG BAO !"
Exit Sub
End If
'find SHEET THEO CHECK BOX
For Each Obj In Me.LINE_INPUT.Controls
If Obj.Value = True Then
Sheets(Obj.Caption).[B65536].End(3).Offset(1, 0) = Me.Ngay.Value
Sheets(Obj.Caption).[B65536].End(3).Offset(0, 2) = Me.ComboBox2.Value
Sheets(Obj.Caption).[B65536].End(3).Offset(0, 4) = Me.TextBox3.Value
Sheets(Obj.Caption).[B65536].End(3).Offset(0, 5) = Me.ComboBox1.Value
Sheets(Obj.Caption).[B65536].End(3).Offset(0, 6) = Me.TextBox5.Value
Sheets(Obj.Caption).[B65536].End(3).Offset(0, 8) = Me.TextBox6.Value
Sheets(Obj.Caption).[B65536].End(3).Offset(0, 10) = Me.TextBox7.Value
Sheets(Obj.Caption).[B65536].End(3).Offset(0, 11) = Me.TextBox8.Value
End If
Next 'clear the data
Ngay = ""
ComboBox2 = ""
TextBox3 = ""
ComboBox1 = ""
TextBox5 = ""
TextBox6 = ""
TextBox7 = ""
TextBox8 = ""
KWT2 = False
CheckBox1 = False
CheckBox2 = False
CheckBox3 = False
CheckBox4 = False
CheckBox5 = False
CheckBox6 = False
CheckBox7 = False
CheckBox8 = False
CheckBox9 = False
CheckBox10 = False
CheckBox11 = False
CheckBox12 = False
Me.Ngay.SetFocus
End Sub
--->Giờ còn phần định dạng khi nhập "2233A2" thành "22330395A2" chưa được, mong giúp đỡ.Mình thử trên cell, form cũng không được.bí quá mò không ra