Giá trị combobox lấy từ combobox khác. (1 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
 
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
Phải thế này mới thực hiện được phép toán:

Me.DATE_RELEASE = Format(CDate(COMBOBOXNGAY) + 1, "Short date")
 
Upvote 0
Trong form e sửa dữ liệu sheet bằng form load lên khi click vào listbox, nếu dòng bị khóa thì yêu cầu nhập password, nhập password sửa xong nhấp vào nút lệnh đưa dữ liệu sữa vào form thì bị lỗi.code của e là:
Private Sub listbox_nhaplieu_Click()
On Error Resume Next
Application.ScreenUpdating = False
Dim allow As Boolean
If listbox_nhaplieu.ListIndex > -1 Then
allow = listbox_nhaplieu.List(listbox_nhaplieu.ListIndex, 24) = "NOLOCK"
If Not allow Then allow = CheckPassword(mat_khau)
If allow Then

EditRow = listbox_nhaplieu.ListIndex + 2

DATE_RELEASE.Text = listbox_nhaplieu.List(EditRow - 2, 0)
COMBOBOXNGAY.Text = listbox_nhaplieu.List(EditRow - 2, 1)
TIME_RELEASE.Text = listbox_nhaplieu.List(EditRow - 2, 2)
SHIFT.Text = listbox_nhaplieu.List(EditRow - 2, 3)
ID.Text = listbox_nhaplieu.List(EditRow - 2, 4)
FGGCAS.Text = listbox_nhaplieu.List(EditRow - 2, 5)
LOT.Text = listbox_nhaplieu.List(EditRow - 2, 6)
NAMEFG.Text = listbox_nhaplieu.List(EditRow - 2, 7)
PKTIME.Text = listbox_nhaplieu.List(EditRow - 2, 8)
TIMESTAR.Text = listbox_nhaplieu.List(EditRow - 2, 9)
TIMEEND.Text = listbox_nhaplieu.List(EditRow - 2, 10)

Suadulieu.Enabled = True
ID.Locked = False
End If
End If
Application.ScreenUpdating = False
End Sub



Private Sub Suadulieu_Click()
'On Error Resume Next


Dim i As Long, Sua(1 To 11), a As String, b As String, c As String, d As String, e As String, f As String
Dim a1 As String, a2 As String, b1 As String, g As String, AA As String, AB As String
AA = DATE_RELEASE.Text
AB = COMBOBOXNGAY.Text
a = Trim(SHIFT.Text)
a1 = Trim(TIME_RELEASE.Text)
a2 = Trim(ID.Text)
b = Trim(FGGCAS.Text)
c = Trim(LOT.Text)
b1 = Trim(NAMEFG.Text)
d = Trim(PKTIME.Text)
e = Trim(TIMESTAR.Text)
f = Trim(TIMEEND.Text)
g = Trim(REMARK.Text)

If a = "" Or a1 = "" Or a2 = "" Or b = "" Or b1 = "" Or c = "" Or d = "" Or e = "" Or f = "" Then
MsgBox "Hay nhap day du du lieu", vbExclamation + vbOKOnly, "ERROR nhap lieu"
Else
With EditSheet
.Cells(EditRow, 1).Value = AA
.Cells(EditRow, 2).Value = AB
.Cells(EditRow, 3).Value = a1
.Cells(EditRow, 4).Value = a
.Cells(EditRow, 5).Value = a2
.Cells(EditRow, 6).Value = b
.Cells(EditRow, 7).Value = c
.Cells(EditRow, 8).Value = b1
.Cells(EditRow, 9).Value = d
.Cells(EditRow, 10).Value = e
.Cells(EditRow, 11).Value = f
.Cells(EditRow, 18).Value = g
listbox_nhaplieu.List(EditRow - 2, 0) = AA
listbox_nhaplieu.List(EditRow - 2, 1) = AB
listbox_nhaplieu.List(EditRow - 2, 2) = a1
listbox_nhaplieu.List(EditRow - 2, 3) = a
listbox_nhaplieu.List(EditRow - 2, 4) = a2
listbox_nhaplieu.List(EditRow - 2, 5) = b
listbox_nhaplieu.List(EditRow - 2, 6) = c
listbox_nhaplieu.List(EditRow - 2, 7) = b1
listbox_nhaplieu.List(EditRow - 2, 8) = d
listbox_nhaplieu.List(EditRow - 2, 9) = e
listbox_nhaplieu.List(EditRow - 2, 10) = f

End With
COMBOBOXNGAY = ""
DATE_RELEASE = ""
SHIFT = ""
ID = ""
TIME_RELEASE = ""
FGGCAS = ""
LOT = ""
NAMEFG = ""
PKTIME = ""
TIMESTAR = ""
TIMEEND = ""
REMARK = ""
ComboBox1.Text = ""
CheckBox15.Value = True
MsgBox "SUA DU LIEU XONG", vbInformation + vbOKOnly, "Thanh cong"
End If
Suadulieu.Enabled = False

End Sub

Báo lỗi dòng màu đỏ
 
Upvote 0
Có thể chưa khai báo biến này EditRow vi mình không thấy bạn khai báo!!!
 
Upvote 0
Trong form e sửa dữ liệu sheet bằng form load lên khi click vào listbox, nếu dòng bị khóa thì yêu cầu nhập password, nhập password sửa xong nhấp vào nút lệnh đưa dữ liệu sữa vào form thì bị lỗi.code của e là:
Báo lỗi dòng màu đỏ
Cơ bản thì thủ tục này nhìn vào không thấy lỗi nào.
Với sheet nào có Protect thì bạn mở khóa trước.

Với dạng ngày tháng để nhập vào sheet bạn nên khai báo là biến DATE.

Thay vì:

Dim AA As String, AB As String

Thì bạn sửa lại là:

Dim AA As Date, AB As Date

Có như thế thì trong quá trình nhập nó nhập đúng dạng ngày tháng trong sheet của bạn.

Muốn biết lỗi chính xác thì đưa file lên đi hoặc kiểm tra việc khai báo biến có còn sót gì nữa không!

Với thủ tục:

EditRow = listbox_nhaplieu.ListIndex + 2

Thì nếu bạn muốn dùng lại nó thì khai biến ngoài các thủ tục, khai trên cùng của module đại loại như thế này nhé:

Private EditRow As Long

Nhưng tôi nghĩ là không nên dùng lại, cái nào ra cái đó là tốt nhất vì đây là thủ tục nhập khác hoàn toàn với thủ tục chỉnh sửa và chúng chẳng có liên quan trước sau! Bạn phải khai báo biến cho thủ tục chỉnh sửa và tính giá trị cho nó thôi.
 
Lần chỉnh sửa cuối:
Upvote 0
Cơ bản thì thủ tục này nhìn vào không thấy lỗi nào.
Với sheet nào có Protect thì bạn mở khóa trước.

Với dạng ngày tháng để nhập vào sheet bạn nên khai báo là biến DATE.

Thay vì:

Dim AA As String, AB As String

Thì bạn sửa lại là:

Dim AA As Date, AB As Date

Có như thế thì trong quá trình nhập nó nhập đúng dạng ngày tháng trong sheet của bạn.

Muốn biết lỗi chính xác thì đưa file lên đi hoặc kiểm tra việc khai báo biến có còn sót gì nữa không!

Với thủ tục:

EditRow = listbox_nhaplieu.ListIndex + 2

Thì nếu bạn muốn dùng lại nó thì khai biến ngoài các thủ tục, khai trên cùng của module đại loại như thế này nhé:

Private EditRow As Long

Nhưng tôi nghĩ là không nên dùng lại, cái nào ra cái đó là tốt nhất vì đây là thủ tục nhập khác hoàn toàn với thủ tục chỉnh sửa và chúng chẳng có liên quan trước sau! Bạn phải khai báo biến cho thủ tục chỉnh sửa và tính giá trị cho nó thôi.

Bác xem dùm, file e lam có thể nhìn hoa mắt vì không chuyên nghiệp như các bác được nhưng vì nhu cầu nên gắng làm. Xem có gì tức giận bác bỏ qua cho.
 
Lần chỉnh sửa cuối:
Upvote 0
Upvote 0
Cơ bản thì thủ tục này nhìn vào không thấy lỗi nào.
Với sheet nào có Protect thì bạn mở khóa trước.

ah vậy code e vân chưa đúng hả bác,ý của e muốn làm là sheet của e luôn protect những cell có dữ liệu sau khi SAVE , nên e muốn lúc mới nhập dữ liệu vào, nếu nhập sai thì có thể sửa ngay. Code sẽ kiểm tra dòng vừa chọn trong listbox nằm trên sheet đó đã bị block chưa, nếu chưa thì load lên form sửa bình thường không bị hỏi password.
-Nếu dòng chọn đã bị block thì hỏi password, nếu có pass nhập vào thì mới load lên form, không có pass nhập vào thì thoát không cho chỉnh sửa.
Do không biết cách làm code kiểm tra dòng chọn đó lock không nên e mới làm thêm code kiểm tra giá trị cột a bị lock không, rồi điền vào vào "NOLOCK" hoặc "LOCK" ở cột [W].
 
Upvote 0
ah vậy code e vân chưa đúng hả bác,ý của e muốn làm là sheet của e luôn protect những cell có dữ liệu sau khi SAVE , nên e muốn lúc mới nhập dữ liệu vào, nếu nhập sai thì có thể sửa ngay. Code sẽ kiểm tra dòng vừa chọn trong listbox nằm trên sheet đó đã bị block chưa, nếu chưa thì load lên form sửa bình thường không bị hỏi password.
-Nếu dòng chọn đã bị block thì hỏi password, nếu có pass nhập vào thì mới load lên form, không có pass nhập vào thì thoát không cho chỉnh sửa.
Do không biết cách làm code kiểm tra dòng chọn đó lock không nên e mới làm thêm code kiểm tra giá trị cột a bị lock không, rồi điền vào vào "NOLOCK" hoặc "LOCK" ở cột [W].
Với cái form đó, code trên cùng của Form là:

Mã:
Option Explicit
Private EditSheet As Worksheet

Thủ tục nhập liệu:

Mã:
Private Sub listbox_nhaplieu_Click()
On Error Resume Next
Dim allow As Boolean
[COLOR=#ff0000]Dim EditRow As Long[/COLOR]

    If listbox_nhaplieu.ListIndex > -1 Then
        allow = listbox_nhaplieu.List(listbox_nhaplieu.ListIndex, 24) = "NOLOCK"
        If Not allow Then allow = CheckPassword(mat_khau)
        If allow Then
        
[COLOR=#ff0000]        EditRow = listbox_nhaplieu.ListIndex[/COLOR]
       
        DATE_RELEASE.Text = listbox_nhaplieu.List(EditRow, 0)
        COMBOBOXNGAY.Text = listbox_nhaplieu.List(EditRow, 1)
        TIME_RELEASE.Text = listbox_nhaplieu.List(EditRow, 2)
        SHIFT.Text = listbox_nhaplieu.List(EditRow, 3)
        ID.Text = listbox_nhaplieu.List(EditRow, 4)
        FGGCAS.Text = listbox_nhaplieu.List(EditRow, 5)
        LOT.Text = listbox_nhaplieu.List(EditRow, 6)
        NAMEFG.Text = listbox_nhaplieu.List(EditRow, 7)
        PKTIME.Text = listbox_nhaplieu.List(EditRow, 8)
        TIMESTAR.Text = listbox_nhaplieu.List(EditRow, 9)
        TIMEEND.Text = listbox_nhaplieu.List(EditRow, 10)
       
        Suadulieu.Enabled = True
        ID.Locked = False
         End If
    End If
End Sub

Thủ tục chỉnh sửa:

Mã:
Private Sub Suadulieu_Click()
'On Error Resume Next


Dim i As Long, Sua(1 To 11), a As String, b As String, c As String, d As String, e As String, f As String
Dim a1 As String, a2 As String, b1 As String, g As String


[COLOR=#0000cd]Dim AA As Date, AB As Date[/COLOR]
[COLOR=#ff0000]Dim EditRow As Long[/COLOR]

[COLOR=#0000cd]    AA = DATE_RELEASE.Text[/COLOR]
[COLOR=#0000cd]    AB = COMBOBOXNGAY.Text[/COLOR]

[COLOR=#ff0000]    EditRow = listbox_nhaplieu.ListIndex + 2[/COLOR]
    
    a = Trim(SHIFT.Text)
    a1 = Trim(TIME_RELEASE.Text)
    a2 = Trim(ID.Text)
    b = Trim(FGGCAS.Text)
    c = Trim(LOT.Text)
    b1 = Trim(NAMEFG.Text)
    d = Trim(PKTIME.Text)
    e = Trim(TIMESTAR.Text)
    f = Trim(TIMEEND.Text)
    g = Trim(REMARK.Text)
    
    If a = "" Or a1 = "" Or a2 = "" Or b = "" Or b1 = "" Or c = "" Or d = "" Or e = "" Or f = "" Then
        MsgBox "Hay nhap day du du lieu", vbExclamation + vbOKOnly, "ERROR nhap lieu"
    Else
        With EditSheet
                .Cells(EditRow, 1).Value = AA
                .Cells(EditRow, 2).Value = AB
                .Cells(EditRow + 1, 3).Value = a1
                .Cells(EditRow + 1, 4).Value = a
                .Cells(EditRow, 5).Value = a2
                .Cells(EditRow, 6).Value = b
                .Cells(EditRow, 7).Value = c
                .Cells(EditRow, 8).Value = b1
                .Cells(EditRow, 9).Value = d
                .Cells(EditRow, 10).Value = e
                .Cells(EditRow, 11).Value = f
                .Cells(EditRow, 18).Value = g
                    listbox_nhaplieu.List(EditRow - 2, 0) = AA
                    listbox_nhaplieu.List(EditRow - 2, 1) = AB
                    listbox_nhaplieu.List(EditRow - 2, 2) = a1
                    listbox_nhaplieu.List(EditRow - 2, 3) = a
                    listbox_nhaplieu.List(EditRow - 2, 4) = a2
                    listbox_nhaplieu.List(EditRow - 2, 5) = b
                    listbox_nhaplieu.List(EditRow - 2, 6) = c
                    listbox_nhaplieu.List(EditRow - 2, 7) = b1
                    listbox_nhaplieu.List(EditRow - 2, 8) = d
                    listbox_nhaplieu.List(EditRow - 2, 9) = e
                    listbox_nhaplieu.List(EditRow - 2, 10) = f
          
        End With
        COMBOBOXNGAY = ""
        DATE_RELEASE = ""
        SHIFT = ""
        ID = ""
        TIME_RELEASE = ""
        FGGCAS = ""
        LOT = ""
        NAMEFG = ""
        PKTIME = ""
        TIMESTAR = ""
        TIMEEND = ""
        REMARK = ""
        ComboBox1.Text = ""
        CheckBox15.Value = True
        MsgBox "SUA DU LIEU XONG", vbInformation + vbOKOnly, "Thanh cong"
    End If
    Suadulieu.Enabled = False
    
End Sub

Tôi chỉ sửa cho hợp lý, bạn copy về và thay thế rồi test xem có còn lỗi nữa không nhé!
 
Lần chỉnh sửa cuối:
Upvote 0
Vẫn không được bác, báo lỗi chỗ màu đỏ. E chọn FHC_KWT2 (chỗ combobox chọn line sửa)->nhập pass "GPE" chọn dòng đã lock ->load form ->chỉnh sửa-> click nút "sua du lieu" thì báo lỗi.
......
With EditSheet
.Cells(EditRow, 1).Value = AA
.Cells(EditRow, 2).Value = AB
.....
 
Upvote 0
Vẫn không được bác, báo lỗi chỗ màu đỏ. E chọn FHC_KWT2 (chỗ combobox chọn line sửa)->nhập pass "GPE" chọn dòng đã lock ->load form ->chỉnh sửa-> click nút "sua du lieu" thì báo lỗi.
Cho tôi hỏi, cách bạn chỉnh sửa là như thế nào? Phải chăng đặt con trỏ vào hàng nào đó trên listbox?
 
Upvote 0
Đúng là đặt con trỏ để chọn trên listbox bác.
Khi tôi tải file bạn về, tôi không thấy listbox nó hoạt động? Tôi thử nút Input và nhập hết những gì trên các testbox và nó cũng không hiển thị dữ liệu nhập trên listbox, vậy sao nó có thể chỉnh sửa cho bạn được? Tôi cũng hoàn toàn không biết nguyên lý hoạt động của form nữa! hic hic.

Tôi cũng không biết sao bạn lại lưu file dưới dạng:

Microsoft Excel Binary Worksheet (.xlsb)
 
Lần chỉnh sửa cuối:
Upvote 0
Khi tôi tải file bạn về, tôi không thấy listbox nó hoạt động? Tôi thử nút Input và nhập hết những gì trên các testbox và nó cũng không hiển thị dữ liệu nhập trên listbox, vậy sao nó có thể chỉnh sửa cho bạn được? Tôi cũng hoàn toàn không biết nguyên lý hoạt động của form nữa! hic hic.

Tôi cũng không biết sao bạn lại lưu file dưới dạng:

Microsoft Excel Binary Worksheet (.xlsb)
Bác phải làm thế này thì mới hiện:

1. mở file form hiện lên->Bỏ chọn check box "sửa dữ liệu" ->trong text box "chọn line sửa" chọn FHC_KWT2 -> click vào dòng trong listbox ->check nếu ở cột [W]="nolock" -> load lên form ->chỉnh sửa dữ liệu -> nhấp "Edit data" -> CHƯA LÀM ĐƯỢC

2. mở file form hiện lên->Bỏ chọn check box "sửa dữ liệu" ->trong text box "chọn line sửa" chọn FHC_KWT2 -> click vào dòng trong listbox ->check nếu ở cột [W]="lock" ->yêu cầu nhập password : password = GPE-> load lên form ->chỉnh sửa dữ liệu -> nhấp "Edit data"


E lưu file dưới dạng đó vì được cao thủ GPE chỉ điểm cho, như vậy vừa sử dụng macro được, vừa nhẹ file và tốc độ xử lý nhanh .
 
Upvote 0
Bác phải làm thế này thì mới hiện:

1. mở file form hiện lên->Bỏ chọn check box "sửa dữ liệu" ->trong text box "chọn line sửa" chọn FHC_KWT2 -> click vào dòng trong listbox ->check nếu ở cột [W]="nolock" -> load lên form ->chỉnh sửa dữ liệu -> nhấp "Edit data" -> CHƯA LÀM ĐƯỢC

2. mở file form hiện lên->Bỏ chọn check box "sửa dữ liệu" ->trong text box "chọn line sửa" chọn FHC_KWT2 -> click vào dòng trong listbox ->check nếu ở cột [W]="lock" ->yêu cầu nhập password : password = GPE-> load lên form ->chỉnh sửa dữ liệu -> nhấp "Edit data"


E lưu file dưới dạng đó vì được cao thủ GPE chỉ điểm cho, như vậy vừa sử dụng macro được, vừa nhẹ file và tốc độ xử lý nhanh .

OK, bạn hướng dẫn vậy tôi mới tìm ra được nguyên nhân:

Nói chung nguyên nhân chủ yếu là bạn không mở khóa sheet và sau đó không khóa lại sheet.

Đây là code tôi đã sửa lại. Bạn kiểm tra xem nhé!

Mã:
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 + 3
            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

Và:

Mã:
Private Sub Suadulieu_Click()

Dim i As Long, a As String, b As String, c As String, d As String, e As String, f As String
Dim a1 As String, a2 As String, b1 As String, g As String
Dim AA As Date, AB As Date
    AA = DATE_RELEASE.Text
    AB = COMBOBOXNGAY.Text
    a = Trim(SHIFT.Text)
    a1 = Trim(TIME_RELEASE.Text)
    a2 = Trim(ID.Text)
    b = Trim(FGGCAS.Text)
    c = Trim(LOT.Text)
    b1 = Trim(NAMEFG.Text)
    d = Trim(PKTIME.Text)
    e = Trim(TIMESTAR.Text)
    f = Trim(TIMEEND.Text)
    g = Trim(REMARK.Text)
    
    If a = "" Or a1 = "" Or a2 = "" Or b = "" Or b1 = "" Or c = "" Or d = "" Or e = "" Or f = "" Then
        MsgBox "Hay nhap day du du lieu", vbExclamation + vbOKOnly, "ERROR nhap lieu"
    Else
        With EditSheet
            .Unprotect "GPE"
            .Cells(EditRow, 1).Value = AA
            .Cells(EditRow, 2).Value = AB
            .Cells(EditRow, 3).Value = a1
            .Cells(EditRow, 4).Value = a
            .Cells(EditRow, 5).Value = a2
            .Cells(EditRow, 6).Value = b
            .Cells(EditRow, 7).Value = c
            .Cells(EditRow, 8).Value = b1
            .Cells(EditRow, 9).Value = d
            .Cells(EditRow, 10).Value = e
            .Cells(EditRow, 11).Value = f
            .Cells(EditRow, 18).Value = g
            .Protect "GPE"
        End With
        COMBOBOXNGAY = ""
        DATE_RELEASE = ""
        SHIFT = ""
        ID = ""
        TIME_RELEASE = ""
        FGGCAS = ""
        LOT = ""
        NAMEFG = ""
        PKTIME = ""
        TIMESTAR = ""
        TIMEEND = ""
        REMARK = ""
        ComboBox1.Text = ""
        CheckBox15.Value = True
        MsgBox "SUA DU LIEU XONG", vbInformation + vbOKOnly, "Thanh cong"
    End If
    Suadulieu.Enabled = False
    
End Sub

Nghĩ cũng lạ, tính luôn cột LOCK, NOLOCK thì có 23 cột, mà sao bạn cho Arr lên tới 24 cột là sao ta?
 
Upvote 0
View attachment 114672
OK, bạn hướng dẫn vậy tôi mới tìm ra được nguyên nhân:

Nói chung nguyên nhân chủ yếu là bạn không mở khóa sheet và sau đó không khóa lại sheet.

Đây là code tôi đã sửa lại. Bạn kiểm tra xem nhé!

Mã:
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 + 3
            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

Và:

Mã:
Private Sub Suadulieu_Click()

Dim i As Long, a As String, b As String, c As String, d As String, e As String, f As String
Dim a1 As String, a2 As String, b1 As String, g As String
Dim AA As Date, AB As Date
    AA = DATE_RELEASE.Text
    AB = COMBOBOXNGAY.Text
    a = Trim(SHIFT.Text)
    a1 = Trim(TIME_RELEASE.Text)
    a2 = Trim(ID.Text)
    b = Trim(FGGCAS.Text)
    c = Trim(LOT.Text)
    b1 = Trim(NAMEFG.Text)
    d = Trim(PKTIME.Text)
    e = Trim(TIMESTAR.Text)
    f = Trim(TIMEEND.Text)
    g = Trim(REMARK.Text)
    
    If a = "" Or a1 = "" Or a2 = "" Or b = "" Or b1 = "" Or c = "" Or d = "" Or e = "" Or f = "" Then
        MsgBox "Hay nhap day du du lieu", vbExclamation + vbOKOnly, "ERROR nhap lieu"
    Else
        With EditSheet
            .Unprotect "GPE"
            .Cells(EditRow, 1).Value = AA
            .Cells(EditRow, 2).Value = AB
            .Cells(EditRow, 3).Value = a1
            .Cells(EditRow, 4).Value = a
            .Cells(EditRow, 5).Value = a2
            .Cells(EditRow, 6).Value = b
            .Cells(EditRow, 7).Value = c
            .Cells(EditRow, 8).Value = b1
            .Cells(EditRow, 9).Value = d
            .Cells(EditRow, 10).Value = e
            .Cells(EditRow, 11).Value = f
            .Cells(EditRow, 18).Value = g
            .Protect "GPE"
        End With
        COMBOBOXNGAY = ""
        DATE_RELEASE = ""
        SHIFT = ""
        ID = ""
        TIME_RELEASE = ""
        FGGCAS = ""
        LOT = ""
        NAMEFG = ""
        PKTIME = ""
        TIMESTAR = ""
        TIMEEND = ""
        REMARK = ""
        ComboBox1.Text = ""
        CheckBox15.Value = True
        MsgBox "SUA DU LIEU XONG", vbInformation + vbOKOnly, "Thanh cong"
    End If
    Suadulieu.Enabled = False
    
End Sub

Nghĩ cũng lạ, tính luôn cột LOCK, NOLOCK thì có 23 cột, mà sao bạn cho Arr lên tới 24 cột là sao ta?
E đếm nhầm rồi...
Vẫn lỗi bác ạ, e chọn click dòng trong listbox thì báo lỗi code dòng màu đỏ bác:

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 + 3
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
E đếm nhầm rồi...Vẫn lỗi bác ạ, e chọn click dòng trong listbox thì báo lỗi code dòng màu đỏ bác:
Trong thủ tục:

Private Sub ComboBox1_Change()

Cái nào có 24 thì sửa lại 23.

------------------------------------------------
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ế.
 
Lần chỉnh sửa cuối:
Upvote 0
Trong thủ tục:

Private Sub ComboBox1_Change()

Cái nào có 24 thì sửa lại 23.

------------------------------------------------
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ế.
Hic để e xem lại, vì e mới biết làm nên chắp vá , đúng là mỗi lần nhập liệu code e chạy cũng hơi lâu.Bác mà giúp thì còn gì bằng.Đành hỏi bác giỏi hơn e nhờ giúp đỡ khắc phục thôi code e thôi.Bác chịu giúp vậy là e cảm ơn lắm rồi.(Ai cũng có việc của mình ma)
 
Lần chỉnh sửa cuối:
Upvote 0
Hic để e xem lại, vì e mới biết làm nên chắp vá , đúng là mỗi lần nhập liệu code e chạy cũng hơi lâu.Bác mà giúp thì còn gì bằng.Đành hỏi bác giỏi hơn e nhờ giúp đỡ khắc phục thôi code e thôi.Bác chịu giúp vậy là e cảm ơn lắm rồi.(Ai cũng có việc của mình ma)
Mà tôi kiểm tra lại code tôi gửi lên, có thấy bị lỗi đó nữa đâu?
 

File đính kèm

Upvote 0
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
Câu hỏi thêm: Bạn thêm & Left(f, 1) để làm gì?
e kí hiệu mã theo sheet nhưng trong sheet đó lại chạy theo nhiều sản phẩm khác nhau, mà mỗi sãn phẩm có phương pháp tét khác nhau nên e lấy kí hiệu theo sheet (1 sheet là 1 máy) kết hợp sản phẩm để phân biệt bác ạ.
 
Upvote 0
e kí hiệu mã theo sheet nhưng trong sheet đó lại chạy theo nhiều sản phẩm khác nhau, mà mỗi sãn phẩm có phương pháp tét khác nhau nên e lấy kí hiệu theo sheet (1 sheet là 1 máy) kết hợp sản phẩm để phân biệt bác ạ.

Trả lời bạn rất mất thời gian vì bạn không mô tả gì cả nên cứ phải mất vài bài để xác định ý định của bạn. Vì tôi đoán có thể đúng mà cũng có thể sai. Tôi cũng biết đoán mò nhưng tôi là người không chơi trò "đoán ý đồng đội". Nhiều khi mất thời gian lắm
Nếu còn kiểu như vậy thì ở mỗi thời điểm bất kỳ tôi sẽ chấm dứt.

Mô tả? Tôi lấy vd. sheet FHC_KWT2 được gán cho mã là KF (do KWT2. Caption = FHC_KWT2 và KWT2.Tag = "KF"). Với code cũ thì trên sheet FHC_KWT2 sẽ có: KF1, KF2, ..., KFn. Bây giờ bạn bịa thêm NAMEFG. Vậy:

1. Dạng của NAMEFG.Text là thế nào?
2. Cho vài vd. cái gọi là "kết hợp sản phẩm" và kết quả trên sheet. Lúc này không còn là KF1, KF2, ..., KFn nữa vậy thì nó sẽ thế nào? Tóm lại hãy miêu tả kiểu như: Ta chọn sheet FHC_KWT2 bằng cách check vào combobox KWT2 --> nhập vào NAMEFG là "..." --> nhập các dữ liệu khác --> nhấn INPUT --> kết quả trên sheet FHC_KWT2 phải là "...". Tiếp theo vẫn sheet FHC_KWT2 được chọn --> nhập vào NAMEFG là "..." --> nhập các dữ liệu khác --> nhấn INPUT --> kết quả trên sheet FHC_KWT2 phải là "..." ...

Hãy mô tả.
 
Lần chỉnh sửa cuối:
Upvote 0
1. Dạng của NAMEFG.Text là thế nào?

1. NAMEFG Là dạng chuỗi được nhập vào dò theo checkbox "GCAS", nằm trong sheet "Gcas list" đó bác, bác chọn mã số bất kì ở checkbox "GCAS" sẽ thấy tên bên checkbox "NAMEFG".
2. Cho vài vd. cái gọi là "kết hợp sản phẩm" và kết quả trên sheet. Lúc này không còn là KF1, KF2, ..., KFn nữa vậy thì nó sẽ thế nào? Tóm lại hãy miêu tả kiểu như: Ta chọn sheet FHC_KWT2 bằng cách check vào combobox KWT2 --> nhập vào NAMEFG là "..." --> nhập các dữ liệu khác --> nhấn INPUT --> kết quả trên sheet FHC_KWT2 phải là "...". Tiếp theo vẫn sheet FHC_KWT2 được chọn --> nhập vào NAMEFG là "..." --> nhập các dữ liệu khác --> nhấn INPUT --> kết quả trên sheet FHC_KWT2 phải là "..." ...
2. lần 1: chọn sheet FHC_KWT2 bằng cách check vào combobox KWT2 --> nhập vào GCAS là 82153560 thì NAMEFG hiện là "DOWNY FBEN LIQ 330MLX24 INNOCENCE RFL TH" --> nhập các dữ liệu khác --> nhấn INPUT --> kết quả mã ID trên sheet FHC_KWT2 phải là "KFD1".

lần 2: chọn sheet FHC_KWT2 bằng cách check vào combobox KWT2 --> nhập vào GCAS là 82204717 thì NAMEFG hiện là "FEB AMBI FR 370MLX12 B&B BTL MYSG STK" --> nhập các dữ liệu khác --> nhấn INPUT --> kết quả mã ID trên sheet FHC_KWT2 phải là "KFF1".

lần 3: chọn sheet FHC_KWT2 bằng cách check vào combobox KWT2 --> nhập vào GCAS là 82204717 thì NAMEFG hiện là "FEB AMBI FR 370MLX12 B&B BTL MYSG STK" --> nhập các dữ liệu khác --> nhấn INPUT --> kết quả mã ID trên sheet FHC_KWT2 phải là "KFF2".

lần 4: chọn sheet FHC_KWT2 bằng cách check vào combobox KWT2 --> nhập vào GCAS là 82153560 thì NAMEFG hiện là "DOWNY FBEN LIQ 330MLX24 INNOCENCE RFL TH" --> nhập các dữ liệu khác --> nhấn INPUT --> kết quả mã ID trên sheet FHC_KWT2 phải là "KFD2".
....
Qua ngày mới thì các kí hiệu phần số đếm lại từ đầu là 1.
 
Upvote 0
1. NAMEFG Là dạng chuỗi được nhập vào dò theo checkbox "GCAS", nằm trong sheet "Gcas list" đó bác, bác chọn mã số bất kì ở checkbox "GCAS" sẽ thấy tên bên checkbox "NAMEFG".

2. lần 1: chọn sheet FHC_KWT2 bằng cách check vào combobox KWT2 --> nhập vào GCAS là 82153560 thì NAMEFG hiện là "DOWNY FBEN LIQ 330MLX24 INNOCENCE RFL TH" --> nhập các dữ liệu khác --> nhấn INPUT --> kết quả mã ID trên sheet FHC_KWT2 phải là "KFD1".

lần 2: chọn sheet FHC_KWT2 bằng cách check vào combobox KWT2 --> nhập vào GCAS là 82204717 thì NAMEFG hiện là "FEB AMBI FR 370MLX12 B&B BTL MYSG STK" --> nhập các dữ liệu khác --> nhấn INPUT --> kết quả mã ID trên sheet FHC_KWT2 phải là "KFF1".

lần 3: chọn sheet FHC_KWT2 bằng cách check vào combobox KWT2 --> nhập vào GCAS là 82204717 thì NAMEFG hiện là "FEB AMBI FR 370MLX12 B&B BTL MYSG STK" --> nhập các dữ liệu khác --> nhấn INPUT --> kết quả mã ID trên sheet FHC_KWT2 phải là "KFF2".lần 4: chọn sheet FHC_KWT2 bằng cách check vào combobox KWT2 --> nhập vào GCAS là 82153560 thì NAMEFG hiện là "DOWNY FBEN LIQ 330MLX24 INNOCENCE RFL TH" --> nhập các dữ liệu khác --> nhấn INPUT --> kết quả mã ID trên sheet FHC_KWT2 phải là "KFD2".
....
Qua ngày mới thì các kí hiệu phần số đếm lại từ đầu là 1.

Như bạn đã thấy tới bây giờ khi bạn miêu tả thì mới thấy rõ: Các số trong cùng ngày nó không liên tục như trước đó với code cũ mà phụ thuộc vào mã "bổ sung". Tức mã không phải là KF như trước mà là những mã "bổ sung" KFD, KFF, ..., và sang ngày mới thì số được đánh từ 1 cho từng mã "bổ sung" KFD, KFF, ...
Tôi sẽ sửa cho bạn sớm nhất có thể khi có thời gian.
 
Upvote 0
Như bạn đã thấy tới bây giờ khi bạn miêu tả thì mới thấy rõ: Các số trong cùng ngày nó không liên tục như trước đó với code cũ mà phụ thuộc vào mã "bổ sung". Tức mã không phải là KF như trước mà là những mã "bổ sung" KFD, KFF, ..., và sang ngày mới thì số được đánh từ 1 cho từng mã "bổ sung" KFD, KFF, ...
Tôi sẽ sửa cho bạn sớm nhất có thể khi có thời gian.
Chờ code của bác sửa giúp.
 
Lần chỉnh sửa cuối:
Upvote 0
Chờ code của bác sửa giúp.

Tôi sửa chay thôi vì tôi cũng chả biết phiên bản tập tin mới nhất của bạn là phiên bản nào.
Trong phiên bản tôi có thì làm quái gì có vd. GCAS = 82204717. Toàn GCAS bắt đầu bằng 821* và NAMEFG bắt đầu bằng D. Không test được nên nhìn mắt rồi sửa thôi. Hi vọng là được.

1. Trong Sub Com_INPUT_Click thêm 2 biến k và Ma như sau

Mã:
Private Sub Com_INPUT_Click()

Dim ..., [COLOR=#ff0000]k As Long, Ma As String[/COLOR]

2. Tìm trong Sub Com_INPUT_Click đoạn

Mã:
If .Row > [COLOR=#ff0000]2[/COLOR] Then
    If .Offset(-1, -3) = ngay Then
        index = Replace(.Offset(-1).Value, currCode, "") 
    End If
End If

và thay bằng đoạn

Mã:
If .Row > [COLOR=#ff0000]3[/COLOR] Then
    k = -1
    Do While .Offset(k, -3) = ngay
        Ma = .Offset(k).Value
        If Left(Ma, Len(currCode)) = currCode Then
            index = Replace(Ma, currCode, "")
            Exit Do
        Else
            k = k - 1
        End If
    Loop
End If
 
Upvote 0
Tôi sửa chay thôi vì tôi cũng chả biết phiên bản tập tin mới nhất của bạn là phiên bản nào.
Trong phiên bản tôi có thì làm quái gì có vd. GCAS = 82204717. Toàn GCAS bắt đầu bằng 821* và NAMEFG bắt đầu bằng D. Không test được nên nhìn mắt rồi sửa thôi. Hi vọng là được.

1. Trong Sub Com_INPUT_Click thêm 2 biến k và Ma như sau

Mã:
Private Sub Com_INPUT_Click()

Dim ..., [COLOR=#ff0000]k As Long, Ma As String[/COLOR]

2. Tìm trong Sub Com_INPUT_Click đoạn

Mã:
If .Row > [COLOR=#ff0000]2[/COLOR] Then
    If .Offset(-1, -3) = ngay Then
        index = Replace(.Offset(-1).Value, currCode, "") 
    End If
End If

và thay bằng đoạn

Mã:
If .Row > [COLOR=#ff0000]3[/COLOR] Then
    k = -1
    Do While .Offset(k, -3) = ngay
        Ma = .Offset(k).Value
        If Left(Ma, Len(currCode)) = currCode Then
            index = Replace(Ma, currCode, "")
            Exit Do
        Else
            k = k - 1
        End If
    Loop
End If
Xin lỗi bác, 1 số mã hàng mới e chưa update vào, file cấu trúc như thực tế luôn đó bác.E test thấy ok rồi cảm ơn bác.
E muốn nhờ bác test kiểm tra dùm e trên sheet "Tong hop", ->chọn ngày cell [E2]->sheet sẽ tự động lọc theo giá trị "end" cột [L] ở các sheet sang sheet tổng hợp. Lúc trươc cũng file này e chạy được, nhưng trong quá trình mấy bữa nay thêm sửa code không biết có bị xung đột gì không mà code ở module 1 không chạy. Chọn ngày xong mà không thấy code đả động gì, làm lại thì có lúc báo lỗi dòng màu xanh.

Option ExplicitPublic Sub TongHop()
Application.ScreenUpdating = False
Dim tu As Date, ShList(), Res(1 To 8000, 1 To 20), Tm, i, J, n, m
tu = Sheet4.[E2].Value
If Not IsDate(tu) Then
MsgBox "Sai ngay"
Exit Sub
End If
ShList = Array("Sheet8", "Sheet9", "Sheet10", "Sheet11", "Sheet12", "Sheet13", "Sheet14", "Sheet15", "Sheet16", "Sheet17", "Sheet18", "Sheet25", "Sheet23", "Sheet24")
Application.ScreenUpdating = False
For i = LBound(ShList) To UBound(ShList)
Tm = MySh(ShList(i)).Range("A3:R" & MySh(ShList(i)).[a65000].End(xlUp).Row)
For J = 1 To UBound(Tm, 1)
If Format(Tm(J, 1), "dd/mm/yyyy") Like Format(tu, "dd/mm/yyyy") And Tm(J, 12) = "END" Then
n = n + 1
For m = 1 To 20
Res(n, m) = Tm(J, m)
Next m
End If
Next J
Next i
Sheet4.[A6:R8000].ClearContents
Sheet4.[A6:R8000] = Res
Application.ScreenUpdating = True
End Sub

Bác xem trên file bác đã tải về dùm e nha.
 
Lần chỉnh sửa cuối:
Upvote 0
Xin lỗi bác, 1 số mã hàng mới e chưa update vào, file cấu trúc như thực tế luôn đó bác.E test thấy ok rồi cảm ơn bác.
E muốn nhờ bác test kiểm tra dùm e trên sheet "Tong hop", ->chọn ngày cell [E2]->sheet sẽ tự động lọc theo giá trị "end" cột [L] ở các sheet sang sheet tổng hợp. Lúc trươc cũng file này e chạy được, nhưng trong quá trình mấy bữa nay thêm sửa code không biết có bị xung đột gì không mà code ở module 1 không chạy. Chọn ngày xong mà không thấy code đả động gì, làm lại thì có lúc báo lỗi dòng màu xanh.



Bác xem trên file bác đã tải về dùm e nha.

Tôi đã nói với bạn là tôi không có phiên bản mới nhất vậy bạn phải đính kèm vào bài này thôi. Tôi không test trên phiên bản mà tôi cho là không có code mới nhất vì chỉ mất công thôi
 
Upvote 0
Tôi đã nói với bạn là tôi không có phiên bản mới nhất vậy bạn phải đính kèm vào bài này thôi. Tôi không test trên phiên bản mà tôi cho là không có code mới nhất vì chỉ mất công thôi
Bác xem dùm, e làm đêm về giờ mới tỉnh.
 
Upvote 0
Bác xem dùm, e làm đêm về giờ mới tỉnh.

1. Bạn chạy được sub TongHop thì đúng là gặp may. Tại sao? Đọc tiếp

2. Giúp bạn mệt quá. Code của bạn hoặc sai hoặc chưa chuẩn. Có rất nhiều "bông hoa" như thế nên dò tìm để sửa rất khó và mệt. Tôi cho vd.
Mã:
Private Sub Workbook_SheetSelectionChange(ByVal Sh As Object, ByVal Target As Range)
' kiem tra cot [A] neu locked=true dien vao cot [W]=lock
Dim cls As Range
Application.ScreenUpdating = False
Application.EnableEvents = False
    Const ApplyToSheet As String = 

".FHC_TOYO3.FHC_MP1.FHC_KWT2.FHC_KWT1.FHC_CHAMMELEON.FHC_MESPACK.FHC_TOYO4.FHC_TOYO1.FHC_TOYO2.FHC_ELGIE1.FHC_ELGIE2.FHC_ELGIE3.FHC_ELGIE4.FH
C_ELGIE5.FHC_RETEST&OTHERS."
 If InStr(1, ApplyToSheet, "." & Sh.Name & ".", 1) = 0 Then Exit Sub
 
For Each cls In Range("A3:A400")
    If cls.Locked = True Then
        cls.Offset(, 22) = "LOCK"
    Else
        cls.Offset(, 22) = "NOLOCK"
    End If
Next
Application.EnableEvents = True
Application.ScreenUpdating = True
End Sub

Thế này thì toi rồi. Nếu tôi chọn sheet không có trong ApplyToSheet rồi chọn 1 ô nào đó thì Exit Sub, tức từ lúc này sẽ không có sự kiện nào được phục vụ rồi. Mọi sự kiên trong mọi sheet.
Đã chơi trò chơi "Application.EnableEvents = False" thì trước khi dọn đồ chơi phải chơi trò "Application.EnableEvents = True". Tức trước khi Exit Sub phải "trả lại". Trong th này thì chuyển
Mã:
Application.ScreenUpdating = False
Application.EnableEvents = False

xuống sau dòng Exit Sub. Vì chả lý gì bầy đồ chơi ra để khi gặp Exit Sub lại phải dọn đồ chơi. Phải là: nếu đi tiếp, tức không sẩy ra Exit Sub, thì mới bầy đồ chơi ra. Cái gì cũng có lôgíc của nó.

3. Vì test cái code của bạn hơi mệt nên tôi phân tích chay code thử xem. Tôi lấy một đoạn trong sub TongHop
Mã:
For i = LBound(ShList) To UBound(ShList)
    Tm = MySh(ShList(i)).Range("A3:R" & MySh(ShList(i)).[a65000].End(xlUp).Row)
    For J = 1 To UBound(Tm, 1)
        If Format(Tm(J, 1), "dd/mm/yyyy") Like Format(tu, "dd/mm/yyyy") And Tm(J, [COLOR=#ff0000]12[/COLOR]) = "END" Then
            n = n + 1
            For m = 1 To 20
                Res(n, m) = Tm(J, m)
            Next m
        End If
    Next J
Next i

Trong tập tin bạn đính kèm thì chỗ đỏ đỏ là 13. Tại sao lại thế? Trong bài #47 tôi thấy bạn ghi đúng (12) cơ mà. Hay tập tin đính kèm chưa phải là mới nhất?. Tôi cũng đã sửa lại thành 12.
Theo tôi đoán thì lý do thỉnh thoảng bạn mới gặp lỗi là do: khi đk
If Format(Tm(J, 1), "dd/mm/yyyy") Like Format(tu, "dd/mm/yyyy") And Tm(J, 12) = "END" Then

không thỏa thì không có lỗi. Thế khi thỏa thì sao? Tm là mảng lấy từ cột A tới R, tức có 18 cột. Vậy thì với m = 19 (chưa cần xét m = 20 vì với m = 19 đã có lỗi) thì Res(n, m) = Tm(J, m) = Tm(J, 19) <-- chết đột ngột.

4. Không chỉ code có lỗi mà dữ liệu của bạn cũng có lỗi. Như ở code trích ngay trên bạn so sánh cột A là cột ngày tháng trong khi dữ liệu vd. ở sheet FHC_KWT2 có A3 = "04.01.2014"

5. Tôi thiết nghĩ có lẽ không có ai sẽ có đủ kiên nhẫn để dò từng dữ liệu, từng dòng code của bạn để phát hiện chỗ sai đâu. Bạn nên tự dò lại từng dữ liệu, từng code để sửa thôi. Nếu căn bản còn nhiều lỗ hổng thì nên tự học hoặc theo học một khóa học. GPE không phải là chỗ để giảng một khóa VBA đâu. Mà bạn phải có căn bản đã. Không thể đốt cháy giai đoạn được.
 
Lần chỉnh sửa cuối:
Upvote 0
1. Bạn chạy được sub TongHop thì đúng là gặp may. Tại sao? Đọc tiếp

2. Giúp bạn mệt quá. Code của bạn hoặc sai hoặc chưa chuẩn. Có rất nhiều "bông hoa" như thế nên dò tìm để sửa rất khó và mệt. Tôi cho vd.
Mã:
Private Sub Workbook_SheetSelectionChange(ByVal Sh As Object, ByVal Target As Range)
' kiem tra cot [A] neu locked=true dien vao cot [W]=lock
Dim cls As Range
Application.ScreenUpdating = False
Application.EnableEvents = False
    Const ApplyToSheet As String = 

".FHC_TOYO3.FHC_MP1.FHC_KWT2.FHC_KWT1.FHC_CHAMMELEON.FHC_MESPACK.FHC_TOYO4.FHC_TOYO1.FHC_TOYO2.FHC_ELGIE1.FHC_ELGIE2.FHC_ELGIE3.FHC_ELGIE4.FH
C_ELGIE5.FHC_RETEST&OTHERS."
 If InStr(1, ApplyToSheet, "." & Sh.Name & ".", 1) = 0 Then Exit Sub
 
For Each cls In Range("A3:A400")
    If cls.Locked = True Then
        cls.Offset(, 22) = "LOCK"
    Else
        cls.Offset(, 22) = "NOLOCK"
    End If
Next
Application.EnableEvents = True
Application.ScreenUpdating = True
End Sub

Thế này thì toi rồi. Nếu tôi chọn sheet không có trong ApplyToSheet rồi chọn 1 ô nào đó thì Exit Sub, tức từ lúc này sẽ không có sự kiện nào được phục vụ rồi. Mọi sự kiên trong mọi sheet.
Đã chơi trò chơi "Application.EnableEvents = False" thì trước khi dọn đồ chơi phải chơi trò "Application.EnableEvents = True". Tức trước khi Exit Sub phải "trả lại". Trong th này thì chuyển
Mã:
Application.ScreenUpdating = False
Application.EnableEvents = False

xuống sau dòng Exit Sub. Vì chả lý gì bầy đồ chơi ra để khi gặp Exit Sub lại phải dọn đồ chơi. Phải là: nếu đi tiếp, tức không sẩy ra Exit Sub, thì mới bầy đồ chơi ra. Cái gì cũng có lôgíc của nó.

3. Vì test cái code của bạn hơi mệt nên tôi phân tích chay code thử xem. Tôi lấy một đoạn trong sub TongHop
Mã:
For i = LBound(ShList) To UBound(ShList)
    Tm = MySh(ShList(i)).Range("A3:R" & MySh(ShList(i)).[a65000].End(xlUp).Row)
    For J = 1 To UBound(Tm, 1)
        If Format(Tm(J, 1), "dd/mm/yyyy") Like Format(tu, "dd/mm/yyyy") And Tm(J, [COLOR=#ff0000]12[/COLOR]) = "END" Then
            n = n + 1
            For m = 1 To 20
                Res(n, m) = Tm(J, m)
            Next m
        End If
    Next J
Next i

Trong tập tin bạn đính kèm thì chỗ đỏ đỏ là 13. Tại sao lại thế? Trong bài #47 tôi thấy bạn ghi đúng (12) cơ mà. Hay tập tin đính kèm chưa phải là mới nhất?. Tôi cũng đã sửa lại thành 12.
Theo tôi đoán thì lý do thỉnh thoảng bạn mới gặp lỗi là do: khi đk


không thỏa thì không có lỗi. Thế khi thỏa thì sao? Tm là mảng lấy từ cột A tới R, tức có 18 cột. Vậy thì với m = 19 (chưa cần xét m = 20 vì với m = 19 đã có lỗi) thì Res(n, m) = Tm(J, m) = Tm(J, 19) <-- chết đột ngột.

4. Không chỉ code có lỗi mà dữ liệu của bạn cũng có lỗi. Như ở code trích ngay trên bạn so sánh cột A là cột ngày tháng trong khi dữ liệu vd. ở sheet FHC_KWT2 có A3 = "04.01.2014"

5. Tôi thiết nghĩ có lẽ không có ai sẽ có đủ kiên nhẫn để dò từng dữ liệu, từng dòng code của bạn để phát hiện chỗ sai đâu. Bạn nên tự dò lại từng dữ liệu, từng code để sửa thôi. Nếu căn bản còn nhiều lỗ hổng thì nên tự học hoặc theo học một khóa học. GPE không phải là chỗ để giảng một khóa VBA đâu. Mà bạn phải có căn bản đã. Không thể đốt cháy giai đoạn được.
Cảm ơn bác Siwtom, giờ e sửa được rồi. Đúng là e chưa được học VB, e chỉ tự học trên mạng, Từ trước giờ cũng chỉ tự học Excel trên mạng à chứ có được đi học ngày nào về excel bài bản đâu. Mong bác thông cảm, đang cố gắng học tìm hiểu và thực hành.
 
Upvote 0

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

Back
Top Bottom