Code Nhập Dữ Liệu (1 người xem)

Liên hệ QC

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

letinnghia

Thành viên hoạt động
Tham gia
20/4/11
Bài viết
183
Được thích
20
Nhờ các anh, chị và các bạn GPE giúp giùm, mỗi tháng mình phải làm bang chấm công nhưng phải nhập nhân sự vào dưới dạng thủ công nên mất nhiều thời gian, mong các bạn của GPE giúp mình. Trong File của mình có 1 sheet "Nhan Su" và rất nhiều sheet tên chuyền như FI, TR1,2.... mình muốn lấy số người trong sheet "Nhan Su" có chuyền là FI bỏ vào sheet FI....Có 3 cột cần lấy là Chuyền Sản Xuất, MNV, Họ Và tên.
 

File đính kèm

Nhờ các anh, chị và các bạn GPE giúp giùm, mỗi tháng mình phải làm bang chấm công nhưng phải nhập nhân sự vào dưới dạng thủ công nên mất nhiều thời gian, mong các bạn của GPE giúp mình. Trong File của mình có 1 sheet "Nhan Su" và rất nhiều sheet tên chuyền như FI, TR1,2.... mình muốn lấy số người trong sheet "Nhan Su" có chuyền là FI bỏ vào sheet FI....Có 3 cột cần lấy là Chuyền Sản Xuất, MNV, Họ Và tên.
bạn tải file đính kèm, cho chạy Macro.
vào xem cách bố trí sheet ChuyenSX:
- sheet này được gộp lại từ các sheet FI, TR1,2 ...
- tại ô A2 bạn chọn Chuyền SX và click vào A1 để Link đến vị trí cần tìm.
- để thêm CNV vào sheet này, bạn qua sheet Nhan Su, Double click vào cột E tại các vị trí có giá trị là "chua co'" -> tự động cập nhật chèn row + chèn mã qua sheet ChuyenSX vào vị trí cuối của nhóm đó.

Link: https://www.mediafire.com/?nooy4lunu01dnn1
 
Lần chỉnh sửa cuối:
Upvote 0
bạn tải file đính kèm, cho chạy Macro.
vào xem cách bố trí sheet ChuyenSX:
- sheet này được gộp lại từ các sheet FI, TR1,2 ...
- tại ô A2 bạn chọn Chuyền SX và click vào A1 để Link đến vị trí cần tìm.
- để thêm CNV vào sheet này, bạn qua sheet Nhan Su, Double click vào cột E tại các vị trí có giá trị là "chua co'" -> tự động cập nhật chèn row + chèn mã qua sheet ChuyenSX vào vị trí cuối của nhóm đó.
Cảm ơn bạn nhé nhưng còn cách nào khác không bạn vì phải Double click vào cột E quá nhiều, với lại bang chấm công để riêng từng sheet có được không?
 
Upvote 0
Cảm ơn bạn nhé nhưng còn cách nào khác không bạn vì phải Double click vào cột E quá nhiều,
- việc cập nhật từng mã chắc chắn sẽ có.
- mình chưa rõ cách hoạt động của file đó --> vấn đề update mã khi sang 1 tháng mới có 2 trường hợp xảy ra:
1. các mã tại bảng chấm công được làm mới hoàn toàn?
2. vẫn lưu lại mã cũ, chỉ thêm các mã mới hoặc xóa các công nhân viên đã nghỉ việc?
với lại bang chấm công để riêng từng sheet có được không?
nếu cấu trúc các sheet đó đều giống nhau thì bạn nên gộp lại thành 1 vì các ưu điểm sau:
1. tìm kiếm nhanh 1 mã công nhân viên.
2. lập công thức liên kết với 1 sheet sẽ dễ dàng hơn khi liên kết với 10 sheet.
'-----
có thể bạn nghĩ sẽ bất tiện khi lại lọc riêng ra từng nhóm --> hãy yên tâm, lúc đó chỉ cần thêm 1 sheet lập báo cáo riêng (sẽ dùng đến Macro)
 
Upvote 0
Cách nhanh nhất là import số liệu từng shít vào một bảng trong CSDL, kiểu như SQL server rồi gọi các lệnh SQL inner join, lèfft join một phát là ra :D

Dóc tổ. Vấn đề của người ta là "tách ra". Join này join nọ tức là "nhập lại".
 
Upvote 0
Giải thuật như thế này:

1. Lập một bảng mẫu. Bảng này giống như sheet F1 của bạn. Chỉ khác là nó có 1 khoảng (5 dòng) để ghi NV thôi - cứ mỗi NV ghi vào thì lại insert thêm vào

2. Đọc sheet Nhan Su, cộng chuyền sản xuất, mã nhân viên, và tên lại. Và cho vào ArrayList

3. Sort ArrayList

4. Đọc list, cứ mỗi chuyền sản xuất thì lại mở một sheet bằng cách copy bảng mẫu ở bước 1. Cứ mỗi tên thì lại mở thêm một khoảng 5 dòng để ghi.

5. Hết

Lưu ý:
Bảng mẫu của bạn có merged cells. Để tránh rắc rối, khi tạo sheet không nên có merged cells. Ghi dữ liệu hết sheet rồi mới đem ra mà merge.
 
Upvote 0
Nhờ các anh, chị và các bạn GPE giúp giùm, mỗi tháng mình phải làm bang chấm công nhưng phải nhập nhân sự vào dưới dạng thủ công nên mất nhiều thời gian, mong các bạn của GPE giúp mình. Trong File của mình có 1 sheet "Nhan Su" và rất nhiều sheet tên chuyền như FI, TR1,2.... mình muốn lấy số người trong sheet "Nhan Su" có chuyền là FI bỏ vào sheet FI....Có 3 cột cần lấy là Chuyền Sản Xuất, MNV, Họ Và tên.

Chào bạn,
Mình đã viết xong code như ý bạn muốn ! Hãy chép file về và trải nghiệm...

* Ưu Điểm:
- Như ý bạn muốn, bạn chỉ cần tạo sẵn các shet mẫu FI,IN1,IN2,TR1,2...

* Nhược điểm:
- Cái cách bạn đang theo đuổi, ngoại trừ cái việc code auto làm ra.Thì bạn hoàn toàn làm thủ công, chưa hay ! Nếu cần thiết, mình sẽ phát triển thêm cho bạn. Thân ái !

Mã:
Sub test()
    Dim rng As Range: Set rng = Range("a5:d209")
    Dim arr() as String: Redim arr(1 To rng.Rows.Count, 1 To rng.Columns.Count)
    iRowFI = 3
    iRowIN1 = 3
    iRowIN2 = 3
    iRowPP = 3
    iRowTR12 = 3
    iRowTR34 = 3
    iRowTR56 = 3
    iRowTR78 = 3
    iRowTR910 = 3
    iRowTR1112 = 3
    
  [COLOR=#008000]  'Step 1: record into array[/COLOR]
    For Each cll In rng.Columns("d").Cells
        i = i + 1
        arr(i, 1) = cll.Offset(0, -2).Value 'MaNV
        arr(i, 2) = cll.Offset(0, -1).Value 'TenNV
        arr(i, 3) = cll.Offset(0, -0).Value 'Chuyen
    Next cll
    
[COLOR=#008000]    'Step 2: write into valid sheets[/COLOR]
    On Error Resume Next
    For i = 1 To UBound(arr)
        Select Case arr(i, 3)
            Case "FI"
                On Error Resume Next
                Worksheets("FI").Cells(iRowFI, 2).Value = arr(i, 3) '3=chuyen`
                Worksheets("FI").Cells(iRowFI, 3).Value = arr(i, 1) '1=ma~
                Worksheets("FI").Cells(iRowFI, 4).Value = arr(i, 2) '2=hoten
                iRowFI = iRowFI + 5
                On Error GoTo 0
            Case "IN1"
                On Error Resume Next
                Worksheets("IN1").Cells(iRowIN1, 2).Value = arr(i, 3) '3=chuyen`
                Worksheets("IN1").Cells(iRowIN1, 3).Value = arr(i, 1) '1=ma~
                Worksheets("IN1").Cells(iRowIN1, 4).Value = arr(i, 2) '2=hoten
                iRowIN1 = iRowIN1 + 5
                On Error GoTo 0
            Case "IN2"
                On Error Resume Next
                Worksheets("IN2").Cells(iRowIN2, 2).Value = arr(i, 3) '3=chuyen`
                Worksheets("IN2").Cells(iRowIN2, 3).Value = arr(i, 1) '1=ma~
                Worksheets("IN2").Cells(iRowIN2, 4).Value = arr(i, 2) '2=hoten
                iRowIN2 = iRowIN2 + 5
                On Error GoTo 0
            Case "PP"
                On Error Resume Next
                Worksheets("PP").Cells(iRowPP, 2).Value = arr(i, 3) '3=chuyen`
                Worksheets("PP").Cells(iRowPP, 3).Value = arr(i, 1) '1=ma~
                Worksheets("PP").Cells(iRowPP, 4).Value = arr(i, 2) '2=hoten
                iRowPP = iRowPP + 5
                On Error GoTo 0
            Case "TR1,2"
                On Error Resume Next
                Worksheets("TR1,2").Cells(iRowTR12, 2).Value = arr(i, 3) '3=chuyen`
                Worksheets("TR1,2").Cells(iRowTR12, 3).Value = arr(i, 1) '1=ma~
                Worksheets("TR1,2").Cells(iRowTR12, 4).Value = arr(i, 2) '2=hoten
                iRowTR12 = iRowTR12 + 5
                On Error GoTo 0
            Case "TR3,4"
                On Error Resume Next
                Worksheets("TR3,4").Cells(iRowTR34, 2).Value = arr(i, 3) '3=chuyen`
                Worksheets("TR3,4").Cells(iRowTR34, 3).Value = arr(i, 1) '1=ma~
                Worksheets("TR3,4").Cells(iRowTR34, 4).Value = arr(i, 2) '2=hoten
                iRowTR34 = iRowTR34 + 5
                On Error GoTo 0
            Case "TR5,6"
                On Error Resume Next
                Worksheets("TR5,6").Cells(iRowTR56, 2).Value = arr(i, 3) '3=chuyen`
                Worksheets("TR5,6").Cells(iRowTR56, 3).Value = arr(i, 1) '1=ma~
                Worksheets("TR5,6").Cells(iRowTR56, 4).Value = arr(i, 2) '2=hoten
                iRowTR56 = iRowTR56 + 5
                On Error GoTo 0
            Case "TR7,8"
                On Error Resume Next
                Worksheets("TR7,8").Cells(iRowTR78, 2).Value = arr(i, 3) '3=chuyen`
                Worksheets("TR7,8").Cells(iRowTR78, 3).Value = arr(i, 1) '1=ma~
                Worksheets("TR7,8").Cells(iRowTR78, 4).Value = arr(i, 2) '2=hoten
                iRowTR78 = iRowTR78 + 5
                On Error GoTo 0
            Case "TR9,10"
                On Error Resume Next
                Worksheets("TR9,10").Cells(iRowTR910, 2).Value = arr(i, 3) '3=chuyen`
                Worksheets("TR9,10").Cells(iRowTR910, 3).Value = arr(i, 1) '1=ma~
                Worksheets("TR9,10").Cells(iRowTR910, 4).Value = arr(i, 2) '2=hoten
                iRowTR910 = iRowTR910 + 5
                On Error GoTo 0
            Case "TR11,12"
                On Error Resume Next
                Worksheets("TR11,12").Cells(iRowTR1112, 2).Value = arr(i, 3) '3=chuyen`
                Worksheets("TR11,12").Cells(iRowTR1112, 3).Value = arr(i, 1) '1=ma~
                Worksheets("TR11,12").Cells(iRowTR1112, 4).Value = arr(i, 2) '2=hoten
                iRowTR1112 = iRowTR1112 + 5
                On Error GoTo 0
        End Select
    Next i
End Sub
 

File đính kèm

Lần chỉnh sửa cuối:
Upvote 0
...
Mã:
Sub test()
...
    For i = 1 To UBound(arr)
        Select Case arr(i, 3)
            Case "FI"
                On Error Resume Next
                Worksheets("FI").Cells(iRowFI, 2).Value = arr(i, 3) '3=chuyen`
                Worksheets("FI").Cells(iRowFI, 3).Value = arr(i, 1) '1=ma~
                Worksheets("FI").Cells(iRowFI, 4).Value = arr(i, 2) '2=hoten
                iRowFI = iRowFI + 5
                On Error GoTo 0
            Case "IN1"
                On Error Resume Next
                Worksheets("IN1").Cells(iRowIN1, 2).Value = arr(i, 3) '3=chuyen`
                Worksheets("IN1").Cells(iRowIN1, 3).Value = arr(i, 1) '1=ma~
                Worksheets("IN1").Cells(iRowIN1, 4).Value = arr(i, 2) '2=hoten
                iRowIN1 = iRowIN1 + 5
                On Error GoTo 0
            Case ...

Chưa biết kết quả đúng sai thế nào. Nhưng trước mắt là code của bạn dùng select-case như thế này là quá luộm thuộm.
Cần nghiên cứu cách dùng mảng và chỉ số.
 
Upvote 0
Chào bạn,
Mình đã viết xong code như ý bạn muốn ! Hãy chép file về và trải nghiệm...

* Ưu Điểm:
- Như ý bạn muốn, bạn chỉ cần tạo sẵn các shet mẫu FI,IN1,IN2,TR1,2...

* Nhược điểm:
- Cái cách bạn đang theo đuổi, ngoại trừ cái việc code auto làm ra.Thì bạn hoàn toàn làm thủ công, chưa hay ! Nếu cần thiết, mình sẽ phát triển thêm cho bạn. Thân ái !

Mã:
Sub test()
    Dim rng As Range: Set rng = Range("a5:d209")
    Dim arr(1 To 1000, 1 To 1000)
    iRowFI = 3
    iRowIN1 = 3
    iRowIN2 = 3
    iRowPP = 3
    iRowTR12 = 3
    iRowTR34 = 3
    iRowTR56 = 3
    iRowTR78 = 3
    iRowTR910 = 3
    iRowTR1112 = 3
    
  [COLOR=#008000]  'Step 1: record into array[/COLOR]
    For Each cll In rng.Columns("d").Cells
        i = i + 1
        arr(i, 1) = cll.Offset(0, -2).Value 'MaNV
        arr(i, 2) = cll.Offset(0, -1).Value 'TenNV
        arr(i, 3) = cll.Offset(0, -0).Value 'Chuyen
    Next cll
    
[COLOR=#008000]    'Step 2: write into valid sheets[/COLOR]
    On Error Resume Next
    For i = 1 To UBound(arr)
        Select Case arr(i, 3)
            Case "FI"
                On Error Resume Next
                Worksheets("FI").Cells(iRowFI, 2).Value = arr(i, 3) '3=chuyen`
                Worksheets("FI").Cells(iRowFI, 3).Value = arr(i, 1) '1=ma~
                Worksheets("FI").Cells(iRowFI, 4).Value = arr(i, 2) '2=hoten
                iRowFI = iRowFI + 5
                On Error GoTo 0
            Case "IN1"
                On Error Resume Next
                Worksheets("IN1").Cells(iRowIN1, 2).Value = arr(i, 3) '3=chuyen`
                Worksheets("IN1").Cells(iRowIN1, 3).Value = arr(i, 1) '1=ma~
                Worksheets("IN1").Cells(iRowIN1, 4).Value = arr(i, 2) '2=hoten
                iRowIN1 = iRowIN1 + 5
                On Error GoTo 0
            Case "IN2"
                On Error Resume Next
                Worksheets("IN2").Cells(iRowIN2, 2).Value = arr(i, 3) '3=chuyen`
                Worksheets("IN2").Cells(iRowIN2, 3).Value = arr(i, 1) '1=ma~
                Worksheets("IN2").Cells(iRowIN2, 4).Value = arr(i, 2) '2=hoten
                iRowIN2 = iRowIN2 + 5
                On Error GoTo 0
            Case "PP"
                On Error Resume Next
                Worksheets("PP").Cells(iRowPP, 2).Value = arr(i, 3) '3=chuyen`
                Worksheets("PP").Cells(iRowPP, 3).Value = arr(i, 1) '1=ma~
                Worksheets("PP").Cells(iRowPP, 4).Value = arr(i, 2) '2=hoten
                iRowPP = iRowPP + 5
                On Error GoTo 0
            Case "TR1,2"
                On Error Resume Next
                Worksheets("TR1,2").Cells(iRowTR12, 2).Value = arr(i, 3) '3=chuyen`
                Worksheets("TR1,2").Cells(iRowTR12, 3).Value = arr(i, 1) '1=ma~
                Worksheets("TR1,2").Cells(iRowTR12, 4).Value = arr(i, 2) '2=hoten
                iRowTR12 = iRowTR12 + 5
                On Error GoTo 0
            Case "TR3,4"
                On Error Resume Next
                Worksheets("TR3,4").Cells(iRowTR34, 2).Value = arr(i, 3) '3=chuyen`
                Worksheets("TR3,4").Cells(iRowTR34, 3).Value = arr(i, 1) '1=ma~
                Worksheets("TR3,4").Cells(iRowTR34, 4).Value = arr(i, 2) '2=hoten
                iRowTR34 = iRowTR34 + 5
                On Error GoTo 0
            Case "TR5,6"
                On Error Resume Next
                Worksheets("TR5,6").Cells(iRowTR56, 2).Value = arr(i, 3) '3=chuyen`
                Worksheets("TR5,6").Cells(iRowTR56, 3).Value = arr(i, 1) '1=ma~
                Worksheets("TR5,6").Cells(iRowTR56, 4).Value = arr(i, 2) '2=hoten
                iRowTR56 = iRowTR56 + 5
                On Error GoTo 0
            Case "TR7,8"
                On Error Resume Next
                Worksheets("TR7,8").Cells(iRowTR78, 2).Value = arr(i, 3) '3=chuyen`
                Worksheets("TR7,8").Cells(iRowTR78, 3).Value = arr(i, 1) '1=ma~
                Worksheets("TR7,8").Cells(iRowTR78, 4).Value = arr(i, 2) '2=hoten
                iRowTR78 = iRowTR78 + 5
                On Error GoTo 0
            Case "TR9,10"
                On Error Resume Next
                Worksheets("TR9,10").Cells(iRowTR910, 2).Value = arr(i, 3) '3=chuyen`
                Worksheets("TR9,10").Cells(iRowTR910, 3).Value = arr(i, 1) '1=ma~
                Worksheets("TR9,10").Cells(iRowTR910, 4).Value = arr(i, 2) '2=hoten
                iRowTR910 = iRowTR910 + 5
                On Error GoTo 0
            Case "TR11,12"
                On Error Resume Next
                Worksheets("TR11,12").Cells(iRowTR1112, 2).Value = arr(i, 3) '3=chuyen`
                Worksheets("TR11,12").Cells(iRowTR1112, 3).Value = arr(i, 1) '1=ma~
                Worksheets("TR11,12").Cells(iRowTR1112, 4).Value = arr(i, 2) '2=hoten
                iRowTR1112 = iRowTR1112 + 5
                On Error GoTo 0
        End Select
    Next i
End Sub
Mình cảm ơn bạn nhiều, bạn có nói là phát triển them, vậy bạn cứ thử đi.
 
Upvote 0
Chào bạn,
Mình đã viết xong code như ý bạn muốn ! Hãy chép file về và trải nghiệm...

* Ưu Điểm:
- Như ý bạn muốn, bạn chỉ cần tạo sẵn các shet mẫu FI,IN1,IN2,TR1,2...

* Nhược điểm:
- Cái cách bạn đang theo đuổi, ngoại trừ cái việc code auto làm ra.Thì bạn hoàn toàn làm thủ công, chưa hay ! Nếu cần thiết, mình sẽ phát triển thêm cho bạn. Thân ái !

Mã:
Sub test()
    Dim rng As Range: Set rng = Range("a5:d209")
    Dim arr(1 To 1000, 1 To 1000)
    iRowFI = 3
    iRowIN1 = 3
    iRowIN2 = 3
    iRowPP = 3
    iRowTR12 = 3
    iRowTR34 = 3
    iRowTR56 = 3
    iRowTR78 = 3
    iRowTR910 = 3
    iRowTR1112 = 3
    
  [COLOR=#008000]  'Step 1: record into array[/COLOR]
    For Each cll In rng.Columns("d").Cells
        i = i + 1
        arr(i, 1) = cll.Offset(0, -2).Value 'MaNV
        arr(i, 2) = cll.Offset(0, -1).Value 'TenNV
        arr(i, 3) = cll.Offset(0, -0).Value 'Chuyen
    Next cll
    
[COLOR=#008000]'Step 2: write into valid sheets[/COLOR]
    On Error Resume Next
    For i = 1 To UBound(arr)
        Select Case arr(i, 3)
            Case "FI"
                On Error Resume Next
                Worksheets("FI").Cells(iRowFI, 2).Value = arr(i, 3) '3=chuyen`
                Worksheets("FI").Cells(iRowFI, 3).Value = arr(i, 1) '1=ma~
                Worksheets("FI").Cells(iRowFI, 4).Value = arr(i, 2) '2=hoten
                iRowFI = iRowFI + 5
                On Error GoTo 0
            Case "IN1"
                On Error Resume Next
                Worksheets("IN1").Cells(iRowIN1, 2).Value = arr(i, 3) '3=chuyen`
                Worksheets("IN1").Cells(iRowIN1, 3).Value = arr(i, 1) '1=ma~
                Worksheets("IN1").Cells(iRowIN1, 4).Value = arr(i, 2) '2=hoten
                iRowIN1 = iRowIN1 + 5
                On Error GoTo 0
            Case "IN2"
                On Error Resume Next
                Worksheets("IN2").Cells(iRowIN2, 2).Value = arr(i, 3) '3=chuyen`
                Worksheets("IN2").Cells(iRowIN2, 3).Value = arr(i, 1) '1=ma~
                Worksheets("IN2").Cells(iRowIN2, 4).Value = arr(i, 2) '2=hoten
                iRowIN2 = iRowIN2 + 5
                On Error GoTo 0
            Case "PP"
                On Error Resume Next
                Worksheets("PP").Cells(iRowPP, 2).Value = arr(i, 3) '3=chuyen`
                Worksheets("PP").Cells(iRowPP, 3).Value = arr(i, 1) '1=ma~
                Worksheets("PP").Cells(iRowPP, 4).Value = arr(i, 2) '2=hoten
                iRowPP = iRowPP + 5
                On Error GoTo 0
            Case "TR1,2"
                On Error Resume Next
                Worksheets("TR1,2").Cells(iRowTR12, 2).Value = arr(i, 3) '3=chuyen`
                Worksheets("TR1,2").Cells(iRowTR12, 3).Value = arr(i, 1) '1=ma~
                Worksheets("TR1,2").Cells(iRowTR12, 4).Value = arr(i, 2) '2=hoten
                iRowTR12 = iRowTR12 + 5
                On Error GoTo 0
            Case "TR3,4"
                On Error Resume Next
                Worksheets("TR3,4").Cells(iRowTR34, 2).Value = arr(i, 3) '3=chuyen`
                Worksheets("TR3,4").Cells(iRowTR34, 3).Value = arr(i, 1) '1=ma~
                Worksheets("TR3,4").Cells(iRowTR34, 4).Value = arr(i, 2) '2=hoten
                iRowTR34 = iRowTR34 + 5
                On Error GoTo 0
            Case "TR5,6"
                On Error Resume Next
                Worksheets("TR5,6").Cells(iRowTR56, 2).Value = arr(i, 3) '3=chuyen`
                Worksheets("TR5,6").Cells(iRowTR56, 3).Value = arr(i, 1) '1=ma~
                Worksheets("TR5,6").Cells(iRowTR56, 4).Value = arr(i, 2) '2=hoten
                iRowTR56 = iRowTR56 + 5
                On Error GoTo 0
            Case "TR7,8"
                On Error Resume Next
                Worksheets("TR7,8").Cells(iRowTR78, 2).Value = arr(i, 3) '3=chuyen`
                Worksheets("TR7,8").Cells(iRowTR78, 3).Value = arr(i, 1) '1=ma~
                Worksheets("TR7,8").Cells(iRowTR78, 4).Value = arr(i, 2) '2=hoten
                iRowTR78 = iRowTR78 + 5
                On Error GoTo 0
            Case "TR9,10"
                On Error Resume Next
                Worksheets("TR9,10").Cells(iRowTR910, 2).Value = arr(i, 3) '3=chuyen`
                Worksheets("TR9,10").Cells(iRowTR910, 3).Value = arr(i, 1) '1=ma~
                Worksheets("TR9,10").Cells(iRowTR910, 4).Value = arr(i, 2) '2=hoten
                iRowTR910 = iRowTR910 + 5
                On Error GoTo 0
            Case "TR11,12"
                On Error Resume Next
                Worksheets("TR11,12").Cells(iRowTR1112, 2).Value = arr(i, 3) '3=chuyen`
                Worksheets("TR11,12").Cells(iRowTR1112, 3).Value = arr(i, 1) '1=ma~
                Worksheets("TR11,12").Cells(iRowTR1112, 4).Value = arr(i, 2) '2=hoten
                iRowTR1112 = iRowTR1112 + 5
                On Error GoTo 0
        End Select
    Next i
End Sub

Bạn sửa lại như sau cho nó chuyên nghiệp
Mã:
Sub chamcom()
Dim a(), R As Range
Set R = Sheets("Nhan su").[D3:D210]
H = R.Rows.Count
ReDim a(1 To H, 1 To 3)
i = 1
j = 1
Do
    If R(i) Like ActiveSheet.Name Then
        For k = 1 To 3
            a(j, k) = R(i).Offset(, k Mod 2 + Int(k / 3) - k)
        Next
        j = j + 5
    End If
        i = i + 1
Loop Until i > H
Rows(8).Resize(j - 6).Insert
[A3:D7].AutoFill [A3:D3].Resize(j - 1)
[E3:E7].AutoFill [E3].Resize(j - 1)
[B3].Resize(j, 3) = a
End Sub
- Cách làm :
Tạo các sheet theo chuyền sản xuất FI, TR1,2...,lưu ý chỉ để 5 dòng làm mẫu như file đính kèm
Muốn lọc danh sách của chuyền nào thì chọn sheet tương ứng rồi chạy macro ở trên
 
Lần chỉnh sửa cuối:
Upvote 0
...
... mình sẽ phát triển thêm cho bạn...

Mã:
Sub test()
...
       Select Case arr(i, 3)
            Case "FI"
                On Error Resume Next
                Worksheets("FI").Cells(iRowFI, 2).Value = arr(i, 3) '3=chuyen`
                Worksheets("FI").Cells(iRowFI, 3).Value = arr(i, 1) '1=ma~
                Worksheets("FI").Cells(iRowFI, 4).Value = arr(i, 2) '2=hoten
                iRowFI = iRowFI + 5
                On Error GoTo 0
            Case ...
End Sub

Bạn muốn "phát triển thêm" nên tôi chỉ cho một vài mẹo nhỏ của người lập trình.

Lệnh "On Error..." không phải là lệnh có thể dùng bừa bãi chỗ nào tiện thì dùng. Nhất là trong trường hợp đọc và ghi dữ liệu.
Nếu có gì trục trặc trong lúc đọc/ghi, lệnh này sẽ bỏ qua chỗ trục trặc đó. Và kết quả là dữ liệu bị thiếu. Loại code này vô cùng nguy hiểm. Đối với người ghi dữ liệu, đó là điều không thể chấp nhận.

Bạn sửa lại như sau cho nó chuyên nghiệp
Mã:
Sub chamcom()
i = 1
j = 1
...
[COLOR=#ff0000]Do[/COLOR]
    If R(i) Like ActiveSheet.Name Then
        For k = 1 To 3
            a(j, k) = R(i).Offset(, k Mod 2 + Int(k / 3) - k)
        Next
        j = j + 5
    End If
        i = i + 1
[COLOR=#ff0000]Loop Until i > H[/COLOR]
...
End Sub
...
Tạo các sheet theo chuyền sản xuất FI, TR1,2...,lưu ý chỉ để 5 dòng làm mẫu như file đính kèm
Muốn lọc danh sách của chuyền nào thì chọn sheet tương ứng rồi chạy macro ở trên​

Muc đích của cái loop này là cho i đi từ 1 đến H + 1. Trước khi vào vòng lặp, H +1 không thể nhỏ hơn 1. Bên trong vòng lặp, i luôn luôn nhảy 1, H không hề thay đổi. Thế thì nó có khác gì For i = 1 To H+1

Vả lại, dùng giải pháp "lọc danh sách chuyền nào thì chọn sheet tương ứng rồi chạy macro" là giải pháp tương đối luộm thuộm. Cỡ 20 sheets, chạy chừng 10 rồi quên mất cái nào chạy rồi, cái nào chưa.
 
Upvote 0
Chưa biết kết quả đúng sai thế nào. Nhưng trước mắt là code của bạn dùng select-case như thế này là quá luộm thuộm.
Cần nghiên cứu cách dùng mảng và chỉ số.

Xin cảm ơn bạn VetMini, và các bạn khác đã quan tâm theo dõi

Bạn VetMini nói rất chính xác,

Nhưng mình mới học VBA chỉ có thể viết được vậy, xin được chỉ giáo thêm !

Mong bạn VetMini hãy chuyển code select...case thành mảng cho chuyên nghiệp nhé ! Thân !
 
Upvote 0
Xin cảm ơn bạn VetMini, và các bạn khác đã quan tâm theo dõi

Bạn VetMini nói rất chính xác,

Nhưng mình mới học VBA chỉ có thể viết được vậy, xin được chỉ giáo thêm !

Mong bạn VetMini hãy chuyển code select...case thành mảng cho chuyên nghiệp nhé ! Thân !
Cảm ơn các bạn đã quan tâm. nhưng kết quả cuối cùng thì code nào là tối ưu nhất chỉ cho mình đi.
 
Upvote 0
Cảm ơn các bạn đã quan tâm. nhưng kết quả cuối cùng thì code nào là tối ưu nhất chỉ cho mình đi.

Chào bạn,
Hiện tại, code mình viết cho bạn đã đáp ứng được y/c của bạn.
Bạn có thể dùng thoải mái. Còn vấn đề ae đang bàn ở đây là cách viết code.
Bạn không cần quan tâm !
Thân !
 
Upvote 0
Chào bạn,
Hiện tại, code mình viết cho bạn đã đáp ứng được y/c của bạn.
Bạn có thể dùng thoải mái. Còn vấn đề ae đang bàn ở đây là cách viết code.
Bạn không cần quan tâm !
Thân !
- phải xem lại dòng đỏ đỏ đó +-+-+-+,
- khi được nhiều "thầy" giúp thì có 1 câu rất nổi tiếng là: "Phước chủ may thầy" :-=
 
Upvote 0
Bạn sửa lại như sau cho nó chuyên nghiệp
Mã:
Sub chamcom()
Dim a(), R As Range
Set R = Sheets("Nhan su").[D3:D210]
H = R.Rows.Count
ReDim a(1 To H, 1 To 3)
i = 1
j = 1
Do
    If R(i) Like ActiveSheet.Name Then
        For k = 1 To 3
            a(j, k) = R(i).Offset(, k Mod 2 + Int(k / 3) - k)
        Next
        j = j + 5
    End If
        i = i + 1
Loop Until i > H
Rows(8).Resize(j - 6).Insert
[A3:D7].AutoFill [A3:D3].Resize(j - 1)
[E3:E7].AutoFill [E3].Resize(j - 1)
[B3].Resize(j, 3) = a
End Sub
- Cách làm :
Tạo các sheet theo chuyền sản xuất FI, TR1,2...,lưu ý chỉ để 5 dòng làm mẫu như file đính kèm
Muốn lọc danh sách của chuyền nào thì chọn sheet tương ứng rồi chạy macro ở trên
Hình như bạn gởi nhầm file
 
Upvote 0
...
Mong bạn VetMini hãy chuyển code select...case thành mảng cho chuyên nghiệp nhé ! Thân !

Tôi lười viết code lắm. Bạn thử làm đi. Đến chỗ nào bí sẽ có người mách nước.

Cảm ơn các bạn đã quan tâm. nhưng kết quả cuối cùng thì code nào là tối ưu nhất chỉ cho mình đi.

"tối ưu" có tính cách tương đối và chủ quan.
Chỉ có "kết quả đúng hay sai" là khách quan.
 
Upvote 0
Xin lỗi, bạn tải lại file sau[/QUOTE
Code của bạn hay quá như mình vẫn gặp một khó khăn ở dòng: tỷ lệ đi làm, giờ công sản xuất, tổng giờ tăng ca.
Tỷ lệ đi làm =G/F(nếu G=0,0,G/F)
Tổng giờ công sản xuất= tổng số giờ công(có bao nhiêu người thì lấy bấy nhiêu) của các dòng có chữ SX tại cộtE, tổng số giờ công tăng ca cũng tương tự như vậy như lấy dòng TC. Bạn có thể nghiên cứu tiếp dùm mình nhé. Tính theo từng ngày
VD ngày 1
 

File đính kèm

  • VD.jpg
    VD.jpg
    18 KB · Đọc: 70
Upvote 0
Xin lỗi, bạn tải lại file sau[/QUOTE
Code của bạn hay quá như mình vẫn gặp một khó khăn ở dòng: tỷ lệ đi làm, giờ công sản xuất, tổng giờ tăng ca.
Tỷ lệ đi làm =G/F(nếu G=0,0,G/F)
Tổng giờ công sản xuất= tổng số giờ công(có bao nhiêu người thì lấy bấy nhiêu) của các dòng có chữ SX tại cộtE, tổng số giờ công tăng ca cũng tương tự như vậy như lấy dòng TC. Bạn có thể nghiên cứu tiếp dùm mình nhé. Tính theo từng ngày
VD ngày 1
Các công thức trên sửa lại như sau :
=SUMPRODUCT(($E$3:$E$172="SX")*F$3:F$172)

=SUMPRODUCT(($E$3:$E$172="TC")*F$3:F$172)
 
Upvote 0
Các công thức trên sửa lại như sau :
=SUMPRODUCT(($E$3:$E$172="SX")*F$3:F$172)

=SUMPRODUCT(($E$3:$E$172="TC")*F$3:F$172)
Cảm ơn bạn nhiều! công thức này có chèn vào trong code được không bạn, mình thấy bạn viết code mỗi chuyền có bao nhiêu người sao khi chạy code thì lấy đúng bấy nhiêu người, còn công thức thì cố định thì phải làm sao. Nếu được thì đưa công thức vào trong Code sẽ tiện hơn cho người sử dung.
 
Upvote 0
Cảm ơn bạn nhiều! công thức này có chèn vào trong code được không bạn, mình thấy bạn viết code mỗi chuyền có bao nhiêu người sao khi chạy code thì lấy đúng bấy nhiêu người, còn công thức thì cố định thì phải làm sao. Nếu được thì đưa công thức vào trong Code sẽ tiện hơn cho người sử dung.
Bạn ơi, nghiêng cứu dùm mình chỗ này đi
 
Upvote 0
Upvote 0
Bạn bỏ công thức này vào code dùm mình nhé, số người có bao nhiêu mỗi sheet thì công thức chạy theo đến đó. cảm ơn nhiều.

Trong file đính kèm bài #20, tại các sheet FI, TR1,2 bạn đặt các công thức sau
Mã:
F10=SUMPRODUCT((OFFSET($E$3,,,ROWS($E$3:$E10)-3)="SX")*OFFSET(F$3,,,ROWS($E$3:$E10)-3))
Merge F10:G10, kéo qua BO10

Mã:
F11=SUMPRODUCT((OFFSET($E$3,,,ROWS($E$3:$E11)-4)="TC")*OFFSET(F$3,,,ROWS($E$3:$E11)-4))
Merge F11:G11, kéo qua BO11
Sau khi chạy macro thì các công thức trên sẽ tự điều chỉnh vùng tính tổng
 
Upvote 0
Trong file đính kèm bài #20, tại các sheet FI, TR1,2 bạn đặt các công thức sau
Mã:
F10=SUMPRODUCT((OFFSET($E$3,,,ROWS($E$3:$E10)-3)="SX")*OFFSET(F$3,,,ROWS($E$3:$E10)-3))
Merge F10:G10, kéo qua BO10

Mã:
F11=SUMPRODUCT((OFFSET($E$3,,,ROWS($E$3:$E11)-4)="TC")*OFFSET(F$3,,,ROWS($E$3:$E11)-4))
Merge F11:G11, kéo qua BO11
Sau khi chạy macro thì các công thức trên sẽ tự điều chỉnh vùng tính tổng
Cảm ơn bạn nhé, để mình làm xem nó thế nào.
 
Upvote 0
Trong file đính kèm bài #20, tại các sheet FI, TR1,2 bạn đặt các công thức sau
Mã:
F10=SUMPRODUCT((OFFSET($E$3,,,ROWS($E$3:$E10)-3)="SX")*OFFSET(F$3,,,ROWS($E$3:$E10)-3))
Merge F10:G10, kéo qua BO10

Mã:
F11=SUMPRODUCT((OFFSET($E$3,,,ROWS($E$3:$E11)-4)="TC")*OFFSET(F$3,,,ROWS($E$3:$E11)-4))
Merge F11:G11, kéo qua BO11
Sau khi chạy macro thì các công thức trên sẽ tự điều chỉnh vùng tính tổng
Công thức này hay thật nhưng các ô ở cột F8:G8, H8:I8.... trở xuống không được Merge khi chạy code, Tại ô F9 đặt công thức như thế nào để tự động như ô F10, F11. F9=F8/G8(IF(F8=0,0,F8/G8)
Cảm ơn bạn nhiều
 
Upvote 0
Upvote 0
Bạn cứ gõ bình thường F9=F8/G8
Tôi chưa hiểu F8 và G8 bạn muốn tính sao?[/QUOTE
Ở bài #20 có đoạn code , sau khi chạy code thì khi đó không phải là F9=F8/G8(F8 là muc tiêu, G8 là thực tích)
vấn đề thứ 2 là các ô không được Merge cho các dòng tự động Insert khi chạy code(Merge going bài mẫu #20 là OK.
 
Upvote 0
Bạn cứ gõ bình thường F9=F8/G8
Tôi chưa hiểu F8 và G8 bạn muốn tính sao?[/QUOTE
Ở bài #20 có đoạn code , sau khi chạy code thì khi đó không phải là F9=F8/G8(F8 là muc tiêu, G8 là thực tích)
vấn đề thứ 2 là các ô không được Merge cho các dòng tự động Insert khi chạy code(Merge going bài mẫu #20 là OK.
Nhờ các anh/ chị và các bạn của GPE tiếp dùm mình đoạn code. Sau khi chạy code các ô được Merge giong bài mẫu, đặt công thức các ô F9, F10, F11 vào trong code.
 

File đính kèm

Upvote 0
Nhờ các anh/ chị và các bạn của GPE tiếp dùm mình đoạn code. Sau khi chạy code các ô được Merge giong bài mẫu, đặt công thức các ô F9, F10, F11 vào trong code.

trong sheet FI, bạn gõ ct cho F9
=F8/G8
sau khi run macro thì ct của F9 tự thay đổi thành
=F143/G143
Không hiểu bạn muốn thế nào nữa ?
 
Upvote 0
Upvote 0
Upvote 0
sau khi chạy code xong bạn muốn merge ô nào với ô nào, ở cột nào, hàng nào ?

Cảm ơn bạn đã giúp đở. sau khi chạy Code thì cột F và G của từng dòng Merge lại từ ngày 1 đến ngày 31, số dòng Merge thì phụ thuộc vào số người của sheet sau khi chạy code và đóng khung lại going như bài mẫu mình gửi đính kèm. Bạn xem file đính kèm của mình nhé.
 

File đính kèm

Upvote 0
Cảm ơn bạn đã giúp đở. sau khi chạy Code thì cột F và G của từng dòng Merge lại từ ngày 1 đến ngày 31, số dòng Merge thì phụ thuộc vào số người của sheet sau khi chạy code và đóng khung lại going như bài mẫu mình gửi đính kèm. Bạn xem file đính kèm của mình nhé.
Bạn thêm đoạn sau vào ngay trước End Sub
Mã:
[F3:BO7].Copy
[F3:BO7].Offset(5).Resize(j - 6).PasteSpecial Paste:=xlPasteFormats
Cells(j + 2, "F").Select
Application.CutCopyMode = False
 
Upvote 0
Upvote 0
Cảm ơn bạn nhiều nhé.[/QUOTE
Hôm nay mình gặp một vấn đề nhờ các bạn giúp dùm.
Mình sửa code #37 phần copy từ F3:BO7 thành F3:BQ7 kết quả thì chạy code OK, tuy nhiên cột BP, BQ có công thức nhưng sau khi chạy code thì phần công thức không chạy theo mình sửa code hoài không được nhờ bạn xem giúp dùm mình chổ này.
Cảm ơn bạn.
 
Lần chỉnh sửa cuối:
Upvote 0
Cảm ơn bạn nhiều nhé.[/QUOTE
Hôm nay mình gặp một vấn đề nhờ các bạn giúp dùm.
Mình sửa code #37 phần copy từ F3:BO7 thành F3:BQ7 kết quả thì chạy code OK, tuy nhiên cột BP, BQ có công thức nhưng sau khi chạy code thì phần công thức không chạy theo mình sửa code hoài không được nhờ bạn xem giúp dùm mình chổ này.
Cảm ơn bạn.
Có cao thủ nào xem dùm mình nội dung của bài #39 nhé, cảm ơn nhiều
 
Upvote 0
Bạn thêm đoạn sau vào ngay trước End Sub
Mã:
[F3:BO7].Copy
[F3:BO7].Offset(5).Resize(j - 6).PasteSpecial Paste:=xlPasteFormats
Cells(j + 2, "F").Select
Application.CutCopyMode = False
Bạn ơi mình đang bí chổ này quá nhờ bạn giúp dùm.
Mình sửa code để copy vùng F3:BO7 thành F3:BQ7 kết quả thì code chạy đúng theo yêu cầu. Tuy nhiên cột BP, BQ có công thức sau khi chạy code thì phần công thức này phải chạy theo, mình không biết sửa code như thế nào nhờ các bạn xem dùm.
Các bạn xem file đính kèm nhé
 

File đính kèm

Upvote 0
Bạn ơi mình đang bí chổ này quá nhờ bạn giúp dùm.
Mình sửa code để copy vùng F3:BO7 thành F3:BQ7 kết quả thì code chạy đúng theo yêu cầu. Tuy nhiên cột BP, BQ có công thức sau khi chạy code thì phần công thức này phải chạy theo, mình không biết sửa code như thế nào nhờ các bạn xem dùm.
Các bạn xem file đính kèm nhé
Bạn thêm dòng này vô đoạn AutoFill
Mã:
[BP3:BQ7].AutoFill [BP3].Resize(j - 1, 2)
 
Upvote 0

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

Back
Top Bottom