Bạn có (bạn viết không có căn lề rất khó đọc) trong UserForm_Initialize
Mã:
If CheckBox1 = True Then
Me.listbox_nhaplieu.RowSource = Sheet4.Name & "!" & Sheet4.[A1:G11].Address
Else
If CheckBox2 = True Then
Me.listbox_nhaplieu.RowSource = Sheet3.Name & "!" & Sheet3.[A1:G11].Address
Else
If CheckBox3 = True Then
Me.listbox_nhaplieu.RowSource = Sheet2.Name & "!" & Sheet2.[A1:G11].Address
Else
Me.listbox_nhaplieu = ""
End If
End If
End If
trong khi trong design time bạn không cho checkbox nào được chọn. Vậy kết quả rút gọn là Me.listbox_nhaplieu = "". Nhưng cũng có thể bỏ đi vì ở thời điểm "chào buổi sáng" thì listbox_nhaplieu đang "rỗng" mà.
Bạn viết:
1. Ở cột " Mã Hàng" là kí hiệu tương ứng nhập vào khi nhập liệu chọn tương ứng với từng checkbox được chọn. Ví dụ: chọn nhập liệu stick checkbox "data1" thì Mả hàng nhập là "A" và kí hiệu số là đánh tăng dần theo ngày . qua ngày mới thì bắt đầu từ 1. như vậy khi stick vào checkbox "data1" và nhập liệu vào thì cột "ma hang" trong sheet data1 nhập vào là "A1". Nhập tiếp thì A2.....qua ngày mới trở lại A1. Tương tự sheet data2 là "B1", sheet "data3" là "C1".
2.Ở listbox_thongtin hiển thị thông tin của sheet mà chọn trong check box (được tick), có thể hiển thị theo thanh cuộn. nếu 2 checkbx được tick thì listbox_thongtin được chia làm 2 để hiển thị thông tin 2 sheet. Tương tự chọn 3 checkbox thì chia làm 3 để hiển thị (E mới chỉ làm hiển thị khi chọn 1 check box, còn 2 hay 3 cái trở lên thì chưa làm được)
3. sau khi list box hiển thị khi stick vào check box tương ứng, thì chúng ta bấm chọn vào dòng dữ liệu nào thì load dòng dữ liệu đó lên form,sau khi chỉnh sửa xong bấm nút lệnh "sua du lieu" để sửa. Lưu ý là chỉ cho sửa dữ liệu vừa nhập vào bị sai chưa bị khóa.(vì e làm code sau khi lưu là khóa cell có dữ liệu)
4.xem dùm code auto điền END không hoạt động
Và câu hỏi cuối cùng: lý do gì mà bạn cấm nhập dữ liệu trực tiếp trên sheet?
Vấn đề có thể khó mà cũng có thể dễ. Nhưng hiếm ai bỏ công ra giúp bạn khi có nhiều "dấu hỏi" đến thế.
Tôi bỏ công ra viết bài này cũng là quá phí thời gian. Nhiều khi đọc những bài như của bạn thì người ta "đi tiếp" chứ chả ai mất công như tôi. Tôi nói nhiều khi vì cũng có những người thích viết đi viết lại, thông tin mới thì lại sửa.
Bạn có (bạn viết không có căn lề rất khó đọc) trong UserForm_Initialize
Mã:
If CheckBox1 = True Then
Me.listbox_nhaplieu.RowSource = Sheet4.Name & "!" & Sheet4.[A1:G11].Address
Else
If CheckBox2 = True Then
Me.listbox_nhaplieu.RowSource = Sheet3.Name & "!" & Sheet3.[A1:G11].Address
Else
If CheckBox3 = True Then
Me.listbox_nhaplieu.RowSource = Sheet2.Name & "!" & Sheet2.[A1:G11].Address
Else
Me.listbox_nhaplieu = ""
End If
End If
End If
trong khi trong design time bạn không cho checkbox nào được chọn. Vậy kết quả rút gọn là Me.listbox_nhaplieu = "". Nhưng cũng có thể bỏ đi vì ở thời điểm "chào buổi sáng" thì listbox_nhaplieu đang "rỗng" mà.
Và câu hỏi cuối cùng: lý do gì mà bạn cấm nhập dữ liệu trực tiếp trên sheet?
Vấn đề có thể khó mà cũng có thể dễ. Nhưng hiếm ai bỏ công ra giúp bạn khi có nhiều "dấu hỏi" đến thế.
Tôi bỏ công ra viết bài này cũng là quá phí thời gian. Nhiều khi đọc những bài như của bạn thì người ta "đi tiếp" chứ chả ai mất công như tôi. Tôi nói nhiều khi vì cũng có những người thích viết đi viết lại, thông tin mới thì lại sửa.
"trong khi trong design time bạn không cho checkbox nào được chọn. Vậy kết quả rút gọn là Me.listbox_nhaplieu = "". Nhưng cũng có thể bỏ đi vì ở thời điểm "chào buổi sáng" thì listbox_nhaplieu đang "rỗng" mà."
Listbox_nhaplieu chỉ hiển thị thông tin khi mình chọn checkbox nào thì hiển thị thông tin sheet tương ứng, nếu chọn 2 or 3 checkbox thì listbõ nếu làm được thì giống như chia màn hình ra hiển thị thông tin 5 dòng cuối cùng của sheet tương ứng. Mình nghĩ có thể làm thuộc tính ẩn nhiều listbox tương ứng mỗi sheet, khi checkbox nào được stick vào thì hiện listbox đó lên.Không biết ý bạn sao.
"trong khi trong design time bạn không cho checkbox nào được chọn. Vậy kết quả rút gọn là Me.listbox_nhaplieu = "". Nhưng cũng có thể bỏ đi vì ở thời điểm "chào buổi sáng" thì listbox_nhaplieu đang "rỗng" mà."
Listbox_nhaplieu chỉ hiển thị thông tin khi mình chọn checkbox nào thì hiển thị thông tin sheet tương ứng, nếu chọn 2 or 3 checkbox thì listbõ nếu làm được thì giống như chia màn hình ra hiển thị thông tin 5 dòng cuối cùng của sheet tương ứng. Mình nghĩ có thể làm thuộc tính ẩn nhiều listbox tương ứng mỗi sheet, khi checkbox nào được stick vào thì hiện listbox đó lên.Không biết ý bạn sao.
- ngày ở đây không giảm, vì khi nhập là ngày auto theo hệ thống khi nhập liệu.(không phải sửa ngày).
- mỗi lần sửa chỉ cần sửa cho 1 sheet, nhưng khi sửa thì cho phép sửa mã hàng.
- ngày ở đây không giảm, vì khi nhập là ngày auto theo hệ thống khi nhập liệu.(không phải sửa ngày).
- mỗi lần sửa chỉ cần sửa cho 1 sheet, nhưng khi sửa thì cho phép sửa mã hàng.
Nếu thế thì bạn thiết kế lại Form cho thật chuẩn rồi hãy hỏi nhé. Bạn đùn nhiều việc cho mọi người và thậm chí bạn không tiết lộ ra. Tôi phải moi từng thông tin như thế này sao?
Nếu thế thì bạn thiết kế lại Form cho thật chuẩn rồi hãy hỏi nhé. Bạn đùn nhiều việc cho mọi người và thậm chí bạn không tiết lộ ra. Tôi phải moi từng thông tin như thế này sao?
Mình làm form xong rồi, nhưng vẫn chưa sửa được điền ID vào cột [E] , với cột ngày là cột , mình sửa code bạn thành thế này không biết đúng không??trong tag minh cũng đã điền rồi mà chạy code không nhập gì vào cột [E] cả.
.......... For Each chk In LINE_INPUT.Controls If chk.Value Then SheetSel = True Set currSheet = Sheets(chk.Caption) Set lastCell = currSheet.[A65536].End(xlUp).Offset(1) ngay1 = Format(Now, "Short Date") currCode = chk.Tag With lastCell index = 0 If .Row > 2 Then If .Offset(-1, 4) = ngay1 Then index = Replace(.Offset(1).Value, currCode, "") '??danh so tu dong theo ngay,ket hop Tag =ki hieu line End If End If .Value = currCode & index + 1 .Offset(0, 0).Value = a .Offset(0, 1).Value = ngay1 .Offset(0, 2).Value = b .Offset(0, 3).Value = c .Offset(0, 5).Value = d .Offset(0, 6).Value = Left(e, 4) & "0395" & Right(e, 2) .Offset(0, 7).Value = f .Offset(0, 8).Value = Format(g, "00h00") .Offset(0, 9).Value = Format(h, "00h00") .Offset(0, 10).Value = Format(l, "00h00") .Offset(0, 17).Value = m .Offset(0, 19).Value = Now
Public Const mat_khau = "hichic"
Function CheckPassword(ByVal pass As String) As Boolean
CheckPassword = InputBox("Hay nhap mat khau", "Mat khau") = pass
End Function
Hai sub thay đổi
Mã:
Private Sub ComboBox1_Change()
Dim lastCell As Range, Arr, r As Long, c As Long
On Error Resume Next
listbox_nhaplieu.Clear
If Not CheckBox4.Value Then
If ComboBox1.Text <> "" Then
Set EditSheet = Sheets(ComboBox1.Text)
If Not EditSheet Is Nothing Then
Set lastCell = EditSheet.[A65536].End(xlUp)
If lastCell.Row > 1 Then
If lastCell.Row >= 11 Then
Arr = lastCell.Offset(-9).Resize(10, [COLOR=#ff0000]8[/COLOR]).Value
Else
Arr = EditSheet.Range("A2").Resize(lastCell.Row - 1, [COLOR=#ff0000]8[/COLOR]).Value
End If
listbox_nhaplieu.List = Arr
End If
End If
End If
End If
End Sub
Private Sub listbox_nhaplieu_Click()
[COLOR=#0000ff]Dim allow As Boolean
[/COLOR]If listbox_nhaplieu.ListIndex > -1 Then[COLOR=#0000ff]
allow = listbox_nhaplieu.List(listbox_nhaplieu.ListIndex, 7) <> "PASS"
If Not allow Then allow = CheckPassword(mat_khau)
If allow Then[/COLOR]
EditRow = listbox_nhaplieu.ListIndex + 2
Textbox_gcas.Text = listbox_nhaplieu.List(EditRow - 2, 1)
Textbox_lot.Text = listbox_nhaplieu.List(EditRow - 2, 2)
Textbox_soluong.Text = listbox_nhaplieu.List(EditRow - 2, 3)
Suadulieu.Enabled = True
[COLOR=#0000ff]End If[/COLOR]
End If
End Sub
currCode = chk.Tag
With lastCell
index = 0
If .Row > 2 Then
If .Offset(-1, 4) = ngay Then
index = Replace(.Offset(-1).Value, currCode, "")
End If
End If
.Value = currCode & index + 1
Ta xét currCode = "A". Với currCode = "B", "C" tương tự.
Mình làm form xong rồi, nhưng vẫn chưa sửa được điền ID vào cột [E] , với cột ngày là cột , mình sửa code bạn thành thế này không biết đúng không??trong tag minh cũng đã điền rồi mà chạy code không nhập gì vào cột [E] cả.
.......... For Each chk In LINE_INPUT.Controls If chk.Value Then SheetSel = True Set currSheet = Sheets(chk.Caption) Set lastCell = currSheet.[A65536].End(xlUp).Offset(1) ngay1 = Format(Now, "Short Date") currCode = chk.Tag With lastCell index = 0 If .Row > 2 Then If .Offset(-1, 4) = ngay1 Then index = Replace(.Offset(1).Value, currCode, "") '??danh so tu dong theo ngay,ket hop Tag =ki hieu line End If End If .Value = currCode & index + 1 .Offset(0, 0).Value = a .Offset(0, 1).Value = ngay1 .Offset(0, 2).Value = b .Offset(0, 3).Value = c .Offset(0, 5).Value = d .Offset(0, 6).Value = Left(e, 4) & "0395" & Right(e, 2) .Offset(0, 7).Value = f .Offset(0, 8).Value = Format(g, "00h00") .Offset(0, 9).Value = Format(h, "00h00") .Offset(0, 10).Value = Format(l, "00h00") .Offset(0, 17).Value = m .Offset(0, 19).Value = Now
Public Const mat_khau = "hichic"
Function CheckPassword(ByVal pass As String) As Boolean
CheckPassword = InputBox("Hay nhap mat khau", "Mat khau") = pass
End Function
Hai sub thay đổi
Mã:
Private Sub ComboBox1_Change()
Dim lastCell As Range, Arr, r As Long, c As Long
On Error Resume Next
listbox_nhaplieu.Clear
If Not CheckBox4.Value Then
If ComboBox1.Text <> "" Then
Set EditSheet = Sheets(ComboBox1.Text)
If Not EditSheet Is Nothing Then
Set lastCell = EditSheet.[A65536].End(xlUp)
If lastCell.Row > 1 Then
If lastCell.Row >= 11 Then
Arr = lastCell.Offset(-9).Resize(10, [COLOR=#ff0000]8[/COLOR]).Value
Else
Arr = EditSheet.Range("A2").Resize(lastCell.Row - 1, [COLOR=#ff0000]8[/COLOR]).Value
End If
listbox_nhaplieu.List = Arr
End If
End If
End If
End If
End Sub
Private Sub listbox_nhaplieu_Click()
[COLOR=#0000ff]Dim allow As Boolean
[/COLOR]If listbox_nhaplieu.ListIndex > -1 Then[COLOR=#0000ff]
allow = listbox_nhaplieu.List(listbox_nhaplieu.ListIndex, 7) <> "PASS"
If Not allow Then allow = CheckPassword(mat_khau)
If allow Then[/COLOR]
EditRow = listbox_nhaplieu.ListIndex + 2
Textbox_gcas.Text = listbox_nhaplieu.List(EditRow - 2, 1)
Textbox_lot.Text = listbox_nhaplieu.List(EditRow - 2, 2)
Textbox_soluong.Text = listbox_nhaplieu.List(EditRow - 2, 3)
Suadulieu.Enabled = True
[COLOR=#0000ff]End If[/COLOR]
End If
End Sub
Nhưng bạn quên là lúc đó sheet data chưa lock mà nên sửa bình thường, câu hỏi của mình đã hỏi là nêu rõ sau khi nhập xong bạn SAVE thì cell có dữ liệu bị lock lại. Mình thêm code sau để lock dòng data vừa nhập vào sau khi save rồi thử chỉnh sửa dữ liệu như bạn làm thì mới có lỗi đó (Như mình đã hỏi để bạn sữa code là cell bi lock)
1. thêm vào module:
Function MySh(ByVal CodeName As String) As Worksheet
Dim Sh As Worksheet
For Each Sh In Worksheets
If Sh.CodeName = CodeName Then
Set MySh = Sh
Exit Function
End If
Next
Set MySh = Nothing
End Function
Sub LockSh()
Dim ShList(), I
Application.ScreenUpdating = False
ShList = Array("Sheet2", "Sheet3", "Sheet4")
For I = LBound(ShList) To UBound(ShList)
With MySh(ShList(I))
.Unprotect "hichic"
.Cells.Locked = False
.Range("A2:F400").SpecialCells(xlCellTypeConstants, 23).Locked = True
.Protect "hichic"
End With
Next
Application.ScreenUpdating = True
End Sub
2./ thêm vào thisworkbook:
Private Sub Workbook_BeforeSave(ByVal SaveAsUI As Boolean, Cancel As Boolean)
Nhưng bạn quên là lúc đó sheet data chưa lock mà nên sửa bình thường, câu hỏi của mình đã hỏi là nêu rõ sau khi nhập xong bạn SAVE thì cell có dữ liệu bị lock lại. Mình thêm code sau để lock dòng data vừa nhập vào sau khi save rồi thử chỉnh sửa dữ liệu như bạn làm thì mới có lỗi đó (Như mình đã hỏi để bạn sữa code là cell bi lock)
1. thêm vào module:
Function MySh(ByVal CodeName As String) As Worksheet
Dim Sh As Worksheet
For Each Sh In Worksheets
If Sh.CodeName = CodeName Then
Set MySh = Sh
Exit Function
End If
Next
Set MySh = Nothing
End Function
Sub LockSh()
Dim ShList(), I
Application.ScreenUpdating = False
ShList = Array("Sheet2", "Sheet3", "Sheet4")
For I = LBound(ShList) To UBound(ShList)
With MySh(ShList(I))
.Unprotect "hichic"
.Cells.Locked = False
.Range("A2:F400").SpecialCells(xlCellTypeConstants, 23).Locked = True
.Protect "hichic"
End With
Next
Application.ScreenUpdating = True
End Sub
2./ thêm vào thisworkbook:
Private Sub Workbook_BeforeSave(ByVal SaveAsUI As Boolean, Cancel As Boolean)
Rõ ràng mình có nói ở bài này mà, dòng màu đỏ, từ pass ở đây là mình nói password .Bạn lại hiểu nhầm. Code này trong form minh đưa lên mình bỏ đi chứ thêm gì, bạn chỉ cần giúp mình sửa code của bạn thôi, bạn chỉ cần protect sheet theo cách của bạn rồi bạn làm code dùm mình được không.coi như không có code protect mình đem lên, code đó file mình làm có lỗi gì đâu.Bạn không cần quan tâm cái đó đâu.
File mình gửi lên là sheet data1 có 3 dòng, data2 và data3 có 2 dòng dữ liệu, cột [Result] =PASS or Fail là kết quả dữ liệu của mình chứ mình đâu viết cho sửa theo đó đâu.Bạn hiểu nhầm ý mình ngay từ đâu rồi.