Giá trị combobox lấy từ combobox khác. (3 người xem)

Liên hệ QC

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

phongkiemtinh

Thành viên thường trực
Tham gia
22/7/09
Bài viết
224
Được thích
5
E có code sau không biết lỗi tại sao nhờ các cao thủ chỉ giúp. (dòng màu đỏ)

Private Sub SHIFT_change()
On Error Resume Next
If Me.SHIFT = "31" And Hour(Now) >= 21 And Hour(Now) < 24 Then
Me.COMBOBOXNGAY = Format(Now + 1, "Short date")
Me.DATE_RELEASE = Format(COMBOBOXNGAY + 2, "Short date")
Else
Me.COMBOBOXNGAY = Format(Now, "Short date")
Me.DATE_RELEASE = Format(COMBOBOXNGAY + 1, "Short date")


End If


TIME_RELEASE = Format(SHIFT.Column(1), "short time")
End Sub
 
Mà tôi kiểm tra lại code tôi gửi lên, có thấy bị lỗi đó nữa đâu?
E kiểm tra đúng là chưa sửa Private Sub ComboBox1_Change() giờ thì đúng ý rồi, chỉ có hơi chậm chút thôi, không biết có bị gì nữa không, nhưng được vậy e cũng mừng rồi.Cảm ơn bác giúp đở thêm.Nếu còn lỗi gì e nhờ bác sau vậy.Chúc bác cuối tuần vui vẻ
 
Upvote 0
Bác Nghĩa ơi, có một chút lỗi bác xem dùm e tý. Khi e click sửa dữ liệu trêng listbox, thay vì click chọn dòng dữ liệu thì e click vào dòng trống kế tiếp ngay phía dưới dòng có dữ liệu thì bị lỗi load lên form vì không có dữ liệu ở code sau (dòng màu xanh). Ah có cách nào hiển thị thông tin trên listbox đúng theo định dạng trên form không bác, Thời gian trong listbox hiển thị không đúng ở dạng hh:mm mà dạng số thập phân nên không biết mấy giờ khi nhìn trực tiếp.

Private Sub listbox_nhaplieu_Click()
With listbox_nhaplieu
If .ListCount = 0 Then Exit Sub
Dim allow As Boolean
allow = .List(.ListIndex, 22) = "NOLOCK"
If Not allow Then allow = CheckPassword(mat_khau)
If allow Then
EditRow = .ListIndex + 2
DATE_RELEASE.Text = .Value
COMBOBOXNGAY.Text = .List(, 1)
TIME_RELEASE.Text = .List(, 2)
SHIFT.Text = .List(, 3)
ID.Text = .List(, 4)
FGGCAS.Text = .List(, 5)
LOT.Text = .List(, 6)
NAMEFG.Text = .List(, 7)
PKTIME.Text = .List(, 8)
TIMESTAR.Text = .List(, 9)
TIMEEND.Text = .List(, 10)
REMARK.Text = .List(, 17)
Suadulieu.Enabled = True
ID.Locked = False
End If
End With
End Sub
 
Lần chỉnh sửa cuối:
Upvote 0
Bác Nghĩa ơi, có một chút lỗi bác xem dùm e tý. Khi e click sửa dữ liệu trêng listbox, thay vì click chọn dòng dữ liệu thì e click vào dòng trống kế tiếp ngay phía dưới dòng có dữ liệu thì bị lỗi load lên form vì không có dữ liệu ở code sau (dòng màu xanh). Ah có cách nào hiển thị thông tin trên listbox đúng theo định dạng trên form không bác, Thời gian trong listbox hiển thị không đúng ở dạng hh:mm mà dạng số thập phân nên không biết mấy giờ khi nhìn trực tiếp.
On Error Resume Next đi! Có những lỗi phải bỏ qua nó thôi cho trường hợp mình biết chắc là lỗi. Tốt nhất bạn nên ghi đầy đủ dữ liệu để không bị trống dòng là được.
 
Upvote 0
On Error Resume Next đi! Có những lỗi phải bỏ qua nó thôi cho trường hợp mình biết chắc là lỗi. Tốt nhất bạn nên ghi đầy đủ dữ liệu để không bị trống dòng là được.
Dữ liệu nhập vào thì luôn có dòng trống cuối cùng chứ bác, để còn nhập tiếp chứ.Thanks bác
 
Upvote 0
Dữ liệu nhập vào thì luôn có dòng trống cuối cùng chứ bác, để còn nhập tiếp chứ.Thanks bác

Bạn nói như vậy chưa phải, tôi nói dòng trống xen kẻ chứ không nói cuối dòng, nhưng ở thủ tục này:

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 CheckBox15.Value Then
        If ComboBox1.Text <> "" Then
            Set EditSheet = Sheets(ComboBox1.Text)
            If Not EditSheet Is Nothing Then
                [COLOR=#ff0000][B]Set lastCell = EditSheet.[A65536].End(xlUp)[/B][/COLOR]
                If lastCell.Row > 1 Then
                    If lastCell.Row >= 11 Then
                        Arr = lastCell.Offset(-9).Resize(10, 23).Value
                    Else
                        Arr = EditSheet.Range("A3").Resize(lastCell.Row - 1, 23).Value
                    End If
                    listbox_nhaplieu.List = Arr
                End If
            End If
        End If
    End If
End Sub

Với dòng màu đỏ, nó đã loại trừ dòng trống cuối cùng rồi bạn!
 
Upvote 0
Bạn nói như vậy chưa phải, tôi nói dòng trống xen kẻ chứ không nói cuối dòng, nhưng ở thủ tục này:

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 CheckBox15.Value Then
        If ComboBox1.Text <> "" Then
            Set EditSheet = Sheets(ComboBox1.Text)
            If Not EditSheet Is Nothing Then
                [COLOR=#ff0000][B]Set lastCell = EditSheet.[A65536].End(xlUp)[/B][/COLOR]
                If lastCell.Row > 1 Then
                    If lastCell.Row >= 11 Then
                        Arr = lastCell.Offset(-9).Resize(10, 23).Value
                    Else
                        Arr = EditSheet.Range("A3").Resize(lastCell.Row - 1, 23).Value
                    End If
                    listbox_nhaplieu.List = Arr
                End If
            End If
        End If
    End If
End Sub

Với dòng màu đỏ, nó đã loại trừ dòng trống cuối cùng rồi bạn!
Sao lúc load vào listbox lại có dòng trống cuối nhỉ, e chỉ nhập 1 dòng dữ liệu rồi bấm váo listbox thì có dòng cuối này bác.
 
Upvote 0
Bạn nói như vậy chưa phải, tôi nói dòng trống xen kẻ chứ không nói cuối dòng, nhưng ở thủ tục này:

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 CheckBox15.Value Then
        If ComboBox1.Text <> "" Then
            Set EditSheet = Sheets(ComboBox1.Text)
            If Not EditSheet Is Nothing Then
                [COLOR=#ff0000][B]Set lastCell = EditSheet.[A65536].End(xlUp)[/B][/COLOR]
                If lastCell.Row > 1 Then
                    If lastCell.Row >= 11 Then
                        Arr = lastCell.Offset(-9).Resize(10, 23).Value
                    Else
                        Arr = EditSheet.Range("A3").Resize(lastCell.Row - 1, 23).Value
                    End If
                    listbox_nhaplieu.List = Arr
                End If
            End If
        End If
    End If
End Sub

Với dòng màu đỏ, nó đã loại trừ dòng trống cuối cùng rồi bạn!

Dòng đỏ đỏ thì liên quan gì hả bạn?

Dòng 2 là tiêu đề. Dữ liệu bắt đầu từ dòng 3.
1. Giả sử đây là lần nhập liệu đầu tiên, tức sheet chỉ có dòng tiêu đề. Vậy lastCell.Row = 2
tức thực hiện Arr = EditSheet.Range("A3").Resize(lastCell.Row - 1, 23).Value, tức
Arr = EditSheet.Range("A3").Resize(1, 23).Value, tức trong ListBox có 1 dòng dữ liệu là dòng thứ 3 trên sheet. Rõ ràng dòng này là trống.

2. Nếu giả sử hiện hành có 8 dòng dữ liệu từ A3 tới A10. Vậy lastCell.Row = 10
tức thực hiện Arr = EditSheet.Range("A3").Resize(lastCell.Row - 1, 23).Value, tức
Arr = EditSheet.Range("A3").Resize(9, 23).Value, tức trong ListBox có 9 dòng dữ liệu là dòng từ thứ 3 đến dòng thứ 11 trên sheet. Rõ ràng dòng 11 này là trống.

Phải sửa thành
Mã:
                If lastCell.Row > [B][COLOR=#ff0000]2[/COLOR][/B] Then
                    If lastCell.Row >= 1[B][COLOR=#ff0000]2[/COLOR][/B] Then
                        Arr = lastCell.Offset(-9).Resize(10, 23).Value
                    Else
                        Arr = EditSheet.Range("A3").Resize(lastCell.Row - [B][COLOR=#ff0000]2[/COLOR][/B], 23).Value
                    End If
                    listbox_nhaplieu.List = Arr
                End If
 
Upvote 0
Sao lúc load vào listbox lại có dòng trống cuối nhỉ, e chỉ nhập 1 dòng dữ liệu rồi bấm váo listbox thì có dòng cuối này bác.
Như tôi đã nói, có những lỗi phát sinh ngoài ý muốn, còn file của bạn, nếu làm lại hết mới hết lỗi "vặt" mà thôi, nhưng hic ... hic ... bạn cứ "chịu đựng" một thời gian đi, khi nào thật sự rảnh rỗi tôi xem lại file bạn và "cải tạo" lại toàn bộ cho bạn, nhưng phải cao hứng mới làm được! hehehe.
 
Upvote 0
Dòng đỏ đỏ thì liên quan gì hả bạn?

Dòng 2 là tiêu đề. Dữ liệu bắt đầu từ dòng 3.
1. Giả sử đây là lần nhập liệu đầu tiên, tức sheet chỉ có dòng tiêu đề. Vậy lastCell.Row = 2
tức thực hiện Arr = EditSheet.Range("A3").Resize(lastCell.Row - 1, 23).Value, tức
Arr = EditSheet.Range("A3").Resize(1, 23).Value, tức trong ListBox có 1 dòng dữ liệu là dòng thứ 3 trên sheet. Rõ ràng dòng này là trống.

2. Nếu giả sử hiện hành có 8 dòng dữ liệu từ A3 tới A10. Vậy lastCell.Row = 10
tức thực hiện Arr = EditSheet.Range("A3").Resize(lastCell.Row - 1, 23).Value, tức
Arr = EditSheet.Range("A3").Resize(9, 23).Value, tức trong ListBox có 9 dòng dữ liệu là dòng từ thứ 3 đến dòng thứ 11 trên sheet. Rõ ràng dòng 11 này là trống.

Phải sửa thành
Mã:
                If lastCell.Row > [B][COLOR=#ff0000]2[/COLOR][/B] Then
                    If lastCell.Row >= 1[B][COLOR=#ff0000]2[/COLOR][/B] Then
                        Arr = lastCell.Offset(-9).Resize(10, 23).Value
                    Else
                        Arr = EditSheet.Range("A3").Resize(lastCell.Row - [B][COLOR=#ff0000]2[/COLOR][/B], 23).Value
                    End If
                    listbox_nhaplieu.List = Arr
                End If

Sao biết được Thầy, đó là code của chủ nhân, em có rớ tới và tìm hiểu kỹ đâu, nếu có em chỉ kêu tác giả sửa 24 thành 23 mà thôi! Hỏi lỗi chỗ nào thì vá lỗi chỗ đó thôi. Thà làm mới chứ mò từng chút một code của người khác nhức đầu lắm luôn!
 
Upvote 0
Như tôi đã nói, có những lỗi phát sinh ngoài ý muốn, còn file của bạn, nếu làm lại hết mới hết lỗi "vặt" mà thôi, nhưng hic ... hic ... bạn cứ "chịu đựng" một thời gian đi, khi nào thật sự rảnh rỗi tôi xem lại file bạn và "cải tạo" lại toàn bộ cho bạn, nhưng phải cao hứng mới làm được! hehehe.

Mong bác sớm cao hứng, e cảm ơn nhiều.File làm đang xài nên e cố gắng sửa ah.
 
Upvote 0
Với file code chấp vá như file bạn nếu bỏ On Error Resume Next đi thì lỗi còn dài dài bạn ơi. Tôi chỉ có thể nói là "vá lỗi" cho bạn, chứ nếu phải làm thì file bạn phải làm lại từ đầu theo kiểu của tôi sẽ ngắn gọn hơn, nhanh hơn, nhưng thật tình tôi không có đủ kiên nhẫn và thời gian để thực hiện toàn bộ như thế.

Theo tôi lỗi là do bạn thôi. Bạn luôn có lựa chọn. Nếu bạn đã quyết định giúp thì bạn phải kiểm tra toàn bộ code hiện có chứ không thể chỉ xem mỗi code "có vấn đề". Tôi không nói thì bạn cũng hiểu là mọi cái ốc trong một cỗ máy phải đồng bộ, ăn khớp với nhau. Chúng có tương quan ràng buộc.

Nhiều khi thay một cái ốc hỏng thì cũng phải thay một cái ốc khác mặc dù ốc đó không hỏng. Vì tất cả phải đồng bộ với nhau.
Ngoài ra nhiều khi code phụ thuộc vào vùng dữ liệu, vào cấu trúc của Form, của các dòng cột trên sheet. Ai đó viết code khi mà bảng xyz bắt đầu từ dòng 2, cột 3 nhưng sau đó chủ tập tin chuyển sang dòng 5, cột 6 rồi vẫn cứ bê nguyên code mà bạn lại không xem hết code thì khi bạn sửa ở chỗ khác thì cái chỗ "kia" rõ ràng sai mà không được sửa.

Bạn nói code chắp vá là đúng vì nó bắt nguồn từ một chủ đề khác, được viết cho cấu trúc Form, sheet hoàn toàn khác. Không thể sau khi thay đổi cấu trúc Form, sheet rồi bê nguyên code cũ sang được. Nếu bạn đã quyết định giúp thì bạn phải đọc lại toàn bộ code, sửa sao cho chỗ sửa này phải đồng bộ với những code khác. Và xem lại code có đúng với cấu trúc hiện hành của Form, sheet hay không. Nếu bạn không có thời gian xem toàn bộ code thì không nên quyết định giúp. Vì cái kiểu chỉ sửa 1 chỗ thì rất có thể lại không khớp với những chỗ khác.

Không phải vô cớ mà trong chủ đề ở link dưới đây tôi viết lại code mới từ đầu chứ không dùng code của chủ chủ đề. Mục đích là để mọi phần của code đồng bộ hài hòa với nhau. Và cũng để code phù hợp với cấu trúc Form, sheet mà tôi đã sửa lại.
-------------

Bài #24 trong chủ đề

http://www.giaiphapexcel.com/forum/...de-nhập-liệu-bằng-form&p=551349#post551349

Trích
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

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, 8).Value
Else
Arr = EditSheet.Range("A2").Resize(lastCell.Row - 1, 8).Value
End If
listbox_nhaplieu.List = Arr
End If
End If
End If
End If
End Sub

Private Sub listbox_nhaplieu_Click()
Dim allow As Boolean
If listbox_nhaplieu.ListIndex > -1 Then
allow = listbox_nhaplieu.List(listbox_nhaplieu.ListIndex, 7) <> "PASS"
If Not allow Then allow = CheckPassword(mat_khau)
If allow Then
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
End If
End If
End Sub

Nếu bạn so sánh thì bạn sẽ thấy là Private Sub listbox_nhaplieu_Click() trong bài #4 của chủ đề này là được sửa lại từ code Private Sub listbox_nhaplieu_Click() của tôi ở trên.

Code Private Sub ComboBox1_Change() trong tập tin cũng chính là code như trên của tôi.

Bạn có biết tại sao tôi lại có If lastCell.Row > 1 Then? Vì trong tập tin ở chủ đề kia thì dòng tiêu đề là dòng 1. Đk trên có nghĩa là: "Nếu hiện thời đã có dữ liệu nhập từ trước thì ... đi tiếp". Vì nếu đây là lần nhập liệu đầu tiên thì sheet chỉ có mỗi dòng tiêu đề, tức lastCell.Row = 1, vậy "dọn đồ chơi" và không đi tiếp.

Nhưng trong tập tin mà bạn làm thì dòng tiêu đề là dòng 2, vậy phải là: If lastCell.Row > 2 Then
Đọc code mà không biết/không để ý tại sao chỗ đó là 1 thì là lỗi của người giúp rồi.

Trong bài #16 bạn viết: If .ListCount = 0 Then Exit Sub. Như thế là sai. ListBox có thể có 1000 dòng nhưng nếu user nhấn vào dòng trống ở cuối thì ListIndex = -1. Và lúc đó thì rõ ràng dòng allow = .List(.ListIndex, 22) = "NOLOCK" có lỗi rồi. Vậy thì phải kiểm tra ListIndex chứ không phải là ListCount, để quyết định dọn đồ chơi hay không.
Tất nhiên trong bài cụ thể này thì "cố gắng" nhập "vừa đủ" vào ListBox. Nhưng nên tạo thói quen kiểm tra ListIndex. Vì trong những th khác thì ListBox có thể có dòng trống. Nói chung ListIndex tốt hơn ListCount

Ngoài ra nếu ListBox có độ cao cho vd. 10 dòng mà hiện thời trong ListBox chỉ có vd. 4 dòng dữ liệu thì như thế dưới 4 dòng dữ liệu có một khoảng trống lớn. Và nếu user định nhấn vào dòng 4 mà lại trật xuống dòng 5, 6, 7, 8, 9, 10 thì ListIndex = -1. Và code của bạn tạo ra lỗi.

Trong code của mình tôi kiểm tra ListIndex. Trong code ở bài #4 cũng có kiểm tra ListIndex vì là sửa lại từ code của tôi.
Câu hỏi: bạn đã nghĩ thế nào mà lại đi thay bằng ListCount?
---------------
Như ở chủ đề trên khi tôi nhận giúp thì tôi tìm hiểu kỹ nhu cầu, đọc toàn bộ code và viết code sao cho các phần đồng bộ với nhau. Khi vì lý do nào đó tôi không thể giúp tiếp thì tôi nói chấm dứt.

Nếu bạn vẫn nhận giúp thì bạn cũng nên làm như thế. Tức tìm hiểu nhu cầu và duyệt lại toàn bộ code để đảm bảo là mọi code đều đúng và đông bộ với nhau.
 
Lần chỉnh sửa cuối:
Upvote 0
Thì đúng rồi. Đã làm thì phải duyệt lại tất cả, từ đầu. Tức không phải là "Thà" mà là "Phải". Trong bài #32 tôi có nói về vấn đề này

Bác siwtom , mạn phép hỏi bác chút được không?
Trong code đánh kí hiệu theo sheet (đoạn code auto đánh mã hàng phần số tăng theo ngày )
xét currCode = "A", e muốn mã này kết hợp lấy thêm phần 1 kí tự số bên trái đầu tiên của cột [H] theo form trên của e thì thế nào?như vậy mã sẽ là AH1 nếu sản phẩm chạy có chữ H đầu tiên.... xem dùm e thử code này đúng không?e thêm phần màu xanh, mã thì đúng những nó phần số không tăng lên mà cứ đếm 1 không ah.
currCode = chk.Tag & Left(f, 1) With lastCell
index = 0
If .Row > 2 Then
If .Offset(-1, 1) = ngay 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
......
 
Lần chỉnh sửa cuối:
Upvote 0
Bác siwtom , mạn phép hỏi bác chút được không?
Trong code đánh kí hiệu theo sheet (đoạn code auto đánh mã hàng phần số tăng theo ngày )
xét currCode = "A", e muốn mã này kết hợp lấy thêm phần 1 kí tự số bên trái đầu tiên của cột [H] theo form trên của e thì thế nào?như vậy mã sẽ là AH1 nếu sản phẩm chạy có chữ H đầu tiên.... xem dùm e thử code này đúng không?e thêm phần màu xanh, mã thì đúng những nó phần số không tăng lên mà cứ đếm 1 không ah.
ah e sửa được rồi...không làm phiền bác nữa.
 
Upvote 0
Các bác xem dùm e đoạn code sau bị lỗi gì dùm, khi e nhập dữ liệu click vào nút nhập thì báo lỗi dòng màu xanh, code trước đó chạy bình thường, e chỉ thêm dòng màu đỏ vào báo lỗi

Private Sub Com_INPUT_Click()

Dim a As String, b As String, c As String, currCode As String, d As String, e As String, f As String, g As String, h As String, l As String, m As String
Dim index As Long, ngay As Date, SheetSel As Boolean
Dim currSheet As Worksheet, lastCell As Range
Dim chk As MSForms.Control
a = Trim(DATE_RELEASE.Text)
b = Trim(TIME_RELEASE.Text)
c = Trim(SHIFT.Text)
d = Trim(FGGCAS.Text)
e = Trim(LOT.Text)
f = Trim(NAMEFG.Text)
g = Trim(PKTIME.Text)
h = Trim(TIMESTAR.Text)
l = Trim(TIMEEND.Text)
m = Trim(REMARK.Text)

Dim rng1 As Range
Set rng1 = Sheets("Gcas list").Range("M2:M20")

Application.ScreenUpdating = False
Application.EnableEvents = False


If a = "" Or b = "" Or c = "" Or Len(d) < 8 Or Len(e) < 6 Or f = "" Or g = "" Or h = "" Then
MsgBox "Ban chua nhap day du thong tin. Vui long nhap tiep!", , "THONG BAO !"

If Application.WorksheetFunction.CountIfs(rng1, Me.FGGCAS) > 0 Then
MsgBox "Mau test method 1/100, ghi method len nhan!", , "THONG BAO !"
End If
Set rng1 = Nothing

Else
For Each chk In LINE_INPUT.Controls
If chk.Value Then
SheetSel = True
Set currSheet = Sheets(chk.Caption)
Set lastCell = currSheet.[E65536].End(xlUp).Offset(1)
If Me.SHIFT = "31" And Hour(Now) >= 21 And Hour(Now) < 24 Then
ngay = Format(Now + 1, "Short Date")

Else
ngay = Format(Now, "Short Date")
End If
currCode = chk.Tag & Left(f, 1) ' code tu danh ID tang dan theo ngay, xem tag trong checkbox
With lastCell
index = 0
If .Row > 2 Then
If .Offset(-1, -3) = ngay 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, -4).Value = a 'SÔ´ COT (-4) TI´NH TANG GIAM DAN TU COT [E]
.Offset(0, -3).Value = ngay
.Offset(0, -2).Value = b
.Offset(0, -1).Value = c
.Offset(0, 1).Value = d
.Offset(0, 2).Value = Left(e, 4) & "0395" & Right(e, 2)
.Offset(0, 3).Value = f
.Offset(0, 4).Value = Format(g, "00h00")
.Offset(0, 5).Value = Format(h, "00h00")
.Offset(0, 6).Value = Format(l, "00h00")
.Offset(0, 13).Value = m
.Offset(0, 15).Value = Now

End With
End If
Next
If SheetSel Then
COMBOBOXNGAY = ""
DATE_RELEASE = ""
TIME_RELEASE = ""
SHIFT = ""
FGGCAS = ""
NAMEFG = ""
LOT = ""
PKTIME = ""
TIMESTAR = ""
TIMEEND = ""
REMARK = ""
CheckBox2 = False
CheckBox4 = False
CheckBox5 = False
CheckBox6 = False
CheckBox7 = False
CheckBox8 = False
CheckBox9 = False
CheckBox10 = False
CheckBox11 = False


CheckBox14 = False
'COMBOBOXNGAY .SetFocus
Else
MsgBox "Ban chua chon LINE nhap du lieu. Vui long chon!", , "THONG BAO !"
End If
End If
Application.ScreenUpdating = True
Application.EnableEvents = True
End Sub
 
Lần chỉnh sửa cuối:
Upvote 0
Các bác xem dùm e đoạn code sau bị lỗi gì dùm, khi e nhập dữ liệu click vào nút nhập thì báo lỗi dòng màu xanh, code trước đó chạy bình thường, e chỉ thêm dòng màu đỏ vào báo lỗi

Private Sub Com_INPUT_Click()
...
f = Trim(NAMEFG.Text)
...
For Each chk In LINE_INPUT.Controls
If chk.Value Then
SheetSel = True
Set currSheet = Sheets(chk.Caption)
Set lastCell = currSheet.[E65536].End(xlUp).Offset(1)
If Me.SHIFT = "31" And Hour(Now) >= 21 And Hour(Now) < 24 Then
ngay = Format(Now + 1, "Short Date")

Else
ngay = Format(Now, "Short Date")
End If
currCode = chk.Tag & Left(f, 1) ' code tu danh ID tang dan theo ngay, xem tag trong checkbox
With lastCell
index = 0
If .Row > 2 Then <-- A
If .Offset(-1, -3) = ngay Then <-- C
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 <-- B
...
End Sub

1. Bạn Hoàng Trọng Nghĩa đã hứa trong bài #28 thì bạn cố chờ đơi một chút.

2. Những ai giúp bạn bây giờ sẽ rất mệt. Bạn không thể bê nguyên code của tôi ở chủ đề khác vào chủ đề này mà không sửa lại. Còn nếu bạn tự sửa thì chưa chắc đã sửa hết những chỗ cần sửa. Ví dụ điển hình là bạn không sửa những chỗ đỏ đỏ như trong bài #27 của tôi.

Code ở bài kia tôi viết khi cấu trúc dòng cột trên sheet là hoàn toàn khác. Vd. ở "bên kia" dòng dữ liệu đầu tiên bắt đầu từ dòng 2 (tiêu đề là dòng 1), vì thế tôi có If lastCell.Row > 1 Then. Nhưng "ở đây" bạn có tiêu đề là dòng 2 nên phải sửa lại thành If lastCell.Row > 2 Then (và 2 chỗ tiếp theo như ở bài #27) nhưng bạn không sửa.

Bây giờ giúp bạn mệt vì cũng có nhiều chỗ bạn bê nguyên từ chủ đề kia mà không sửa, vd. chỗ <-- A
phải thành If .Row > 3 Then

3. Bạn đổi gì thì cũng phải suy nghĩ. Bạn hãy phân tích 2 trường hợp: code cũ, code mới.

Giả dụ với sheet nào đó thì checkbox được gán cho nó có chk.Tag = "XYZ". Tôi không biết bạn sẽ nhập gì trong textbox NAMEFG nhưng giả dụ là 1 text nào đó.

3a. code cũ với currCode = chk.Tag. Giả dụ hôm nay là ngày mới
1. Nhập dòng dữ liệu đầu tiên với NAMEFG.Text = "hichic".
Ta có currCode = chk.Tag = "XYZ". Tại dòng <-- B ta có: (lastCell).Value = currCode & index + 1 = "XYZ" & 1 = "XYZ1"

2. Nhập dòng dữ liệu thứ hai với NAMEFG.Text = "tenten".
Ta có currCode = chk.Tag = "XYZ"
Do cùng ngày nên đk tại dòng <-- C thỏa và dòng lệnh sau được thực hiện:
index = Replace(.Offset(-1).Value, currCode, "") = Replace("XYZ1", "XYZ", "") = 1
Tức index = 1 và tại dòng <-- B có: (lastCell).Value = currCode & index + 1 = "XYZ" & 2 = "XYZ2"

3b. code mới với currCode = chk.Tag & Left(f, 1) = chk.Tag & Left(NAMEFG.Text, 1) . Giả dụ hôm nay là ngày mới
1. Nhập dòng dữ liệu đầu tiên với NAMEFG.Text = "hichic".
Ta có currCode = "XYZh". Tại dòng <-- B ta có: (lastCell).Value = currCode & index + 1 = "XYZh" & 1 = "XYZh1"

2. Nhập dòng dữ liệu thứ hai với NAMEFG.Text = "tenten".
Ta có currCode = "XYZt"
Do cùng ngày nên đk tại dòng <-- C thỏa và dòng lệnh sau được thực hiện:
index = Replace(.Offset(-1).Value, currCode, "") = Replace("XYZh1", "XYZt", "") = "XYZh1" do chuỗi "XYZt" không có trong chuỗi "XYZh1".
Tức index = "XYZh1". Cái này không "qua mặt VBA" được là đúng vì làm sao có thể nhập chuỗi vào biến LONG được?
-----------------
Trong chủ đề này tôi không đọc toàn bộ code từ A --> Z. Tôi chỉ xét đoạn code mà bạn đưa lên thôi. Tôi đã 1 lần mất rất nhiều thời gian vô ích nên bây giờ không muốn "sa lầy" nữa.
-----------------
Ở chủ đề kia tôi đã quyết định viết code cho bạn từ đầu tới cuối vì thế tôi đã cố gắng moi hết thông tin. Nếu bạn đưa sheet, form thiết kế như trong thực tế, tức cấu trúc dòng, cột, bảng trên sheet, các controls trên form y như thực tế, thì bạn đã có code hoàn chỉnh rồi. Bây giờ để viết thêm hay sửa code của bạn thì phải kiểm tra lại từ đầu, sẽ rất mệt.

Bạn nên rút kinh nghiệm. Dữ liệu bạn cứ vô tư giả lập: tên, số lượng có thể bịa, xóa bớt. Nhưng đã là cả 1 project hoàn chỉnh thì khi đưa cho người khác giúp phải đưa cấu trúc hoàn chỉnh, y hệt như thực tế.
 
Upvote 0
Phần đánh kí hiệu này sẽ đánh tăng theo ngày nhưng phần số tăng theo phần phần chữ bác, nếu lần 1 là A thì là A1, lần 2 nhập A thì là A2. Còn lần 1 là A thì A1 và lần 2 là B thì là B1, lần 3 là A thì là A2.

Xin lỗi bác, không phải e không muốn đem file, mà file thực tế bác đã xem đó, qua nhiều code, nên không dám đem lên.Đem lên các bac GPE thấy nhiều lung tung thế này sẽ không có ai giúp, ai cũng ngại nên e mới làm file mô phỏng rồi hỏi sau đó mới sửa theo file mình. Chứ ai cũng nhiệt tình như bác e đem file thực tế bác xem từ đầu rồi.
 
Upvote 0
Phần đánh kí hiệu này sẽ đánh tăng theo ngày nhưng phần số tăng theo phần phần chữ bác, nếu lần 1 là A thì là A1, lần 2 nhập A thì là A2. Còn lần 1 là A thì A1 và lần 2 là B thì là B1, lần 3 là A thì là A2.
Cái này thì tôi biết. A, B chẳng qua là code. Code không phải nhập gì cả. Tôi chả đã cho các code vào Checkbox.Tag rồi còn gì? Và sau đó thì
Mã:
(lastCell).Value = currCode & index + 1 (currCode = chk.Tag)

Tức nếu code là A (B) thì sẽ có A1, A2, ..., An (B1, B2, ..., Bn)

Nhưng bây giờ bạn lại sửa lại code của tôi thành

Mã:
f = Trim(NAMEFG.Text)
...
currCode = chk.Tag & Left(f, 1)
index = Replace(.Offset(-1).Value, currCode, "")
...
.Value = currCode & index + 1

Nên tôi mới cho bạn vd. khi nào thì có lỗi
Bạn hãy nghĩ xem. Vẫn là code = A, tức chk.Tag = A

1. Bạn nhập lần đầu với NAMEFG.Text = "hichic"
thì bạn có currCode = "Ah" => (lastcell).Value = currCode & index + 1 = "Ah1"

Như thế là bạn ghi lên sheet là Ah1 chứ đâu có là A1????????????????

2. Bạn nhập tiếp với NAMEFG.Text = "tenten"
thì bạn có currCode = "At"
=> index = Replace(.Offset(-1).Value, currCode, "") = Replace("Ah1", "At", "") = "Ah1" do "At" không có trong "Ah1"

Mà gán chuỗi "Ah1" vào biến LONG index thì dĩ nhiên là lỗi rồi.

Tôi nói bạn phải suy nghĩ khi thên chỗ đỏ đỏ trong currCode = chk.Tag & Left(f, 1) là thế.

Câu hỏi thêm: Bạn thêm & Left(f, 1) để làm gì?

Xin lỗi bác, không phải e không muốn đem file, mà file thực tế bác đã xem đó, qua nhiều code, nên không dám đem lên.Đem lên các bac GPE thấy nhiều lung tung thế này sẽ không có ai giúp, ai cũng ngại nên e mới làm file mô phỏng rồi hỏi sau đó mới sửa theo file mình. Chứ ai cũng nhiệt tình như bác e đem file thực tế bác xem từ đầu rồi.

Tôi nói về chủ đề "kia". Lúc đó bạn có thể gửi dữ liệu giả lập, nhưng đã là project hoàn chỉnh thì cấu trúc sheet và form phải y như thực tế.
Ở chủ đề "kia" tôi nhiều lần "nài nỉ" mà bạn viết chỗ đỏ đỏ thì không đúng rồi
 
Upvote 0
Web KT

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

Back
Top Bottom