Dùng VBA để xuất file và in dữ liệu có sẵn theo tháng

Liên hệ QC

abcanh121

Thành viên mới
Tham gia
17/1/18
Bài viết
5
Được thích
1
Giới tính
Nam
Hiện tại em phải xuất file và in phiếu làm thêm giờ cho từng người, dữ liệu thì nhập bảng chấm công tháng, và xuất kết quả theo mẫu, tuy nhiên nội dung công việc thì xuất từ phần Comment của từng ngày, việc làm này mất rất nhiều thời gian, em kính nhờ các bác các anh chị giúp đỡ. Em xin chân thành cảm ơn!
 

File đính kèm

  • themgio.xlsx
    27.1 KB · Đọc: 14
Hiện tại em phải xuất file và in phiếu làm thêm giờ cho từng người, dữ liệu thì nhập bảng chấm công tháng, và xuất kết quả theo mẫu, tuy nhiên nội dung công việc thì xuất từ phần Comment của từng ngày, việc làm này mất rất nhiều thời gian, em kính nhờ các bác các anh chị giúp đỡ. Em xin chân thành cảm ơn!
.
Bạn cần trình bày rõ thêm:

1. Không có "Comment" tức là không có nội dung công việc có xuất qua không?

2. Căn cứ vào đâu để điền vào 2 cột " Từ giờ" + "Đến giờ"?

3. Căn cứ vào đâu để biết "Ngày lễ,T7,CN " ?

.
 
Upvote 0
.
Bạn cần trình bày rõ thêm:

1. Không có "Comment" tức là không có nội dung công việc có xuất qua không?

2. Căn cứ vào đâu để điền vào 2 cột " Từ giờ" + "Đến giờ"?

3. Căn cứ vào đâu để biết "Ngày lễ,T7,CN " ?

.
Dạ báo cáo bác:
1. Những ngày làm thêm đều có Comment (trên file không có là em để ví dụ nên chưa nhập commnent ạ :D )
2. Phân biệt ngày thường và ngày lễ T7, CN thì em làm theo từng tháng sử dụng Hàm weekday ạ, cái này làm thủ công từng tháng.
3. Khi xác định được ngày thường và ngày lễ, Tết, T7, CN rồi thì những ngày này là thời gian từ 8 giờ; còn ngày thường thì sau 17 giờ ạ
Trân thành cảm ơn bác!
 
Upvote 0
Hiện tại em phải xuất file và in phiếu làm thêm giờ cho từng người, dữ liệu thì nhập bảng chấm công tháng, và xuất kết quả theo mẫu, tuy nhiên nội dung công việc thì xuất từ phần Comment của từng ngày, việc làm này mất rất nhiều thời gian, em kính nhờ các bác các anh chị giúp đỡ. Em xin chân thành cảm ơn!
Thiết kế dữ liệu dở quá
1. Không có MSNV (tên trùng nhau thì làm sao phân biệt ?)
2. Ngày trong tháng không nhập theo định dạng của date mà chỉ nhập 1->31 sẽ làm cho code rất phức tạp
3. Không có dòng thể hiện thứ trong tuần (để phân biệt ngày T7, CN là ngày làm thêm) nên code viết được cũng sẽ rất phức tạp
4. Cuối cùng là tổng thể cơ sở dữ liệu, khi nội dung công việc khi tính làm thêm không được thể hiện trên cells mà lại dưới dạng Comment
......
 
Upvote 0
Hiện tại em phải xuất file và in phiếu làm thêm giờ cho từng người, dữ liệu thì nhập bảng chấm công tháng, và xuất kết quả theo mẫu, tuy nhiên nội dung công việc thì xuất từ phần Comment của từng ngày, việc làm này mất rất nhiều thời gian, em kính nhờ các bác các anh chị giúp đỡ. Em xin chân thành cảm ơn!
Thử xem, hi vọng đúng.
Click chọn ở ô C8 /Sh GiayBao xem điều gì đã diễn ra.
Các ngày Thứ 7, CN tôi đã làm hàm cho, ngày nghỉ khác bạn tự xác định.
Chỉ cần gõ ngày 1/ tháng/năm các ô của dòng 5, 6 sẽ tự thay đổi.
 

File đính kèm

  • themgio.xlsm
    42.7 KB · Đọc: 11
Upvote 0
Dạ báo cáo bác:
1. Những ngày làm thêm đều có Comment (trên file không có là em để ví dụ nên chưa nhập commnent ạ :D )
2. Phân biệt ngày thường và ngày lễ T7, CN thì em làm theo từng tháng sử dụng Hàm weekday ạ, cái này làm thủ công từng tháng.
3. Khi xác định được ngày thường và ngày lễ, Tết, T7, CN rồi thì những ngày này là thời gian từ 8 giờ; còn ngày thường thì sau 17 giờ ạ
Trân thành cảm ơn bác!
Tốt nhất là xây dựng lại CSDL cho chuẩn rồi hẵng code sau. Code cho loại dữ liệu như vậy sẽ lãng phí, không hiệu quả, sử dụng lâu dài được.
 
Upvote 0
Tốt nhất là xây dựng lại CSDL cho chuẩn rồi hẵng code sau. Code cho loại dữ liệu như vậy sẽ lãng phí {1}, không hiệu quả {2}, sử dụng lâu dài {3} được.

{1} người không hiểu cách thiết kế CSDL sẽ không hiểu "lãng phí" chỗ nào. Đối với họ, có viết code đâu mà phí?

{2} hiệu quả ở đây có tính cách chủ quan. Đối với thớt, hiệu quả chỉ có nghĩa là "đạt kết quả". In được, và không mất thời gian làm thủ công là "hiệu quả".
(lỡ code chạy trên vài giây thì lại vòi "tăng tốc" - chả hiểu để làm gì)

{3} đồ này đòi hỏi sử dụng lâu dài mần chi. Mai kia công ty lại có kiểu trình bày bảng tính khác, viết code lại thôi.

:p:p:p
 
Upvote 0
Thử xem, hi vọng đúng.
Click chọn ở ô C8 /Sh GiayBao xem điều gì đã diễn ra.
Các ngày Thứ 7, CN tôi đã làm hàm cho, ngày nghỉ khác bạn tự xác định.
Chỉ cần gõ ngày 1/ tháng/năm các ô của dòng 5, 6 sẽ tự thay đổi.
Cảm ơn bạn rất nhiều, giải pháp của bạn rất phù hợp với mong muốn của mình!
Tuy nhiên giả sử mình muốn thêm những tháng khác (thêm sheet khác) hoặc năm khác (mục đích sử dụng lâu dài) có được không ạ.
Mong bạn giúp!
Mô tả như file sau ạ:
 

File đính kèm

  • themgio_13-11.xlsm
    51.1 KB · Đọc: 7
Lần chỉnh sửa cuối:
Upvote 0
Cảm ơn bạn rất nhiều, giải pháp của bạn rất phù hợp với mong muốn của mình!
Tuy nhiên giả sử mình muốn thêm những tháng khác (thêm sheet khác) hoặc năm khác (mục đích sử dụng lâu dài) có được không ạ.
Mong bạn giúp!
Mô tả như file sau ạ:
Code viết cho dữ liệu ở file như bài ra Tức là chỉ viết cho sheet Tháng 10 thôi. Trường hợp cho nhiều tháng, nhiều năm (thêm Sh tháng nữa) thì Hoàn toàn có thể nhưng phải sửa lại Code. Còn như bạn làm 1 cái data list tháng như vậy thì không cần sửa lại code, mà có sửa lại thì cũng sửa rất ít. Đây là ý kiến chủ quan của tôi.
Lưu ý bạn: Bạn chắc đã đọc bài #8 rồi chứ, có nghĩa là nếu trong danh sách có người trùng tên thì kết quả có thể không đúng. muốn xử lý tình huống này thì bạn phải có 1 cột MaNV để mỗi nhân viên chỉ có 1 mã số duy nhất. Ví dụ có 2 người tên Anh , 2 người tên Ánh thì một người Anh có mã A001, mội người Anh có mã A002, một người Ánh có mã A003,....
 
Lần chỉnh sửa cuối:
Upvote 0
Code viết cho dữ liệu ở file như bài ra Tức là chỉ viết cho sheet Tháng 10 thôi. Trường hợp cho nhiều tháng, nhiều năm (thêm Sh tháng nữa) thì Hoàn toàn có thể nhưng phải sửa lại Code. Còn như bạn làm 1 cái data list tháng như vậy thì không cần sửa lại code, mà có sửa lại thì cũng sửa rất ít. Đây là ý kiến chủ quan của tôi.
Lưu ý bạn: Bạn chắc đã đọc bài #8 rồi chứ, có nghĩa là nếu trong danh sách có người trùng tên thì kết quả có thể không đúng. muốn xử lý tình huống này thì bạn phải có 1 cột MaNV để mỗi nhân viên chỉ có 1 mã số duy nhất. Ví dụ có 2 người tên Anh , 2 người tên Ánh thì một người Anh có mã A001, mội người Anh có mã A002, một người Ánh có mã A003,....
Mình hiểu, mình sẽ tiếp thu và sẽ sửa csdl.
Còn hiện tại bên mình nếu có người trùng tên sẽ gán A, B sau tên người đó (ví Anh A, Anh B).
Nhờ bạn Code giùm cho nhiều tháng được không ạ!
Trân thành cảm ơn!
 
Upvote 0
Còn hiện tại bên mình nếu có người trùng tên sẽ gán A, B sau tên người đó (ví Anh A, Anh B).
Nhờ bạn Code giùm cho nhiều tháng được không ạ!
Đã muốn dùng dài hạn mà lại cứ cấu trúc ngắn hạn, sau này sửa cơ sở dữ liệu lại xin code lại thì không nên chút nào. Nên thêm cột mã nhân viên rồi viết code thì hơn.
 
Upvote 0
Mình hiểu, mình sẽ tiếp thu và sẽ sửa csdl.
Còn hiện tại bên mình nếu có người trùng tên sẽ gán A, B sau tên người đó (ví Anh A, Anh B).
Nhờ bạn Code giùm cho nhiều tháng được không ạ!
Trân thành cảm ơn!
Thích thì chiều.
Sửa lại code cũ bằng code mới.
Mã:
Option Explicit

Sub LamThem()
Dim i&, j&, Lr&, T&, k&, N&
Dim Sh As Worksheet, Ws As Worksheet
Dim Arr(), Res()
Dim Endate, Ten As String, Com As String
Set Ws = Sheets("GiayBao"): Ten = Trim(Ws.[C8]): T = Trim(Ws.[D5]): N = Trim(Ws.[F5])
For Each Sh In Worksheets
    If Sh.Name <> "Bangluong" Or Sh.Name <> "GiayBao" Then
        If Sh.[Q3] = T And Sh.[U3] = N Then
            Endate = Day(WorksheetFunction.EDate(Sh.[C5], 1) - 1)
            Lr = Sh.Cells(100000, 1).End(3).Row
            Arr = Sh.Range("A5:AG" & Lr).Value
            ReDim Res(1 To Endate, 1 To 7)
            On Error Resume Next
            For i = 3 To UBound(Arr)
                If Trim(Arr(i, 2)) Like Ten Then
                    For j = 3 To Endate + 2
                        If Len(Arr(i, j)) > 0 Then
                            k = k + 1
                            Res(k, 1) = k: Res(k, 2) = Arr(1, j)
                            Com = Trim(Sh.Cells(i + 4, j).Comment.Text)
                            If Len(Com) > 0 Then Res(k, 3) = Split(Com, Chr(10))(1)
                            If Arr(2, j) = 7 Or Arr(2, j) = "CN" Then
                                Res(k, 4) = 8
                                Res(k, 6) = Arr(i, j)
                                If Res(k, 6) < 1 Then
                                   Res(k, 5) = Res(k, 4) & Ws.[H1] & Res(k, 6) * 60
                                Else
                                    Res(k, 5) = Res(k, 4) + Res(k, 6)
                                End If
                            Else
                                Res(k, 4) = 17
                                Res(k, 7) = Arr(i, j)
                                If Res(k, 7) < 1 Then
                                   Res(k, 5) = Res(k, 4) & Ws.[H1] & Res(k, 7) * 60
                                Else
                                    Res(k, 5) = Res(k, 4) + Res(k, 7)
                                End If
                            End If
                         End If
                    Next j
                    Exit For
                End If
            Next i
        End If
    End If
Next Sh
If k Then
    Ws.Range("A14:H53").AutoFilter
    Ws.Range("A15").Resize(31, 7).ClearContents
    Ws.Range("A15").Resize(k + 1, 7) = Res
    Ws.Range("$A$14:$H$53").AutoFilter Field:=1, Criteria1:="<>"
End If
MsgBox " Done"
End Sub
Lưu ý các Sh tháng phải có format giống nhau. Trong file đính kèm tôi đã chỉnh lại format thang11 cho giống với format Sh thang10.
Các công thức của cột AH và AI của các Sh thang không đúng. Bạn tự sửa lại.
chúc thành công.
 

File đính kèm

  • themgio_13-11.xlsm
    48.4 KB · Đọc: 15
Upvote 0
Thích thì chiều.
Sửa lại code cũ bằng code mới.
Mã:
Option Explicit

Sub LamThem()
Dim i&, j&, Lr&, T&, k&, N&
Dim Sh As Worksheet, Ws As Worksheet
Dim Arr(), Res()
Dim Endate, Ten As String, Com As String
Set Ws = Sheets("GiayBao"): Ten = Trim(Ws.[C8]): T = Trim(Ws.[D5]): N = Trim(Ws.[F5])
For Each Sh In Worksheets
    If Sh.Name <> "Bangluong" Or Sh.Name <> "GiayBao" Then
        If Sh.[Q3] = T And Sh.[U3] = N Then
            Endate = Day(WorksheetFunction.EDate(Sh.[C5], 1) - 1)
            Lr = Sh.Cells(100000, 1).End(3).Row
            Arr = Sh.Range("A5:AG" & Lr).Value
            ReDim Res(1 To Endate, 1 To 7)
            On Error Resume Next
            For i = 3 To UBound(Arr)
                If Trim(Arr(i, 2)) Like Ten Then
                    For j = 3 To Endate + 2
                        If Len(Arr(i, j)) > 0 Then
                            k = k + 1
                            Res(k, 1) = k: Res(k, 2) = Arr(1, j)
                            Com = Trim(Sh.Cells(i + 4, j).Comment.Text)
                            If Len(Com) > 0 Then Res(k, 3) = Split(Com, Chr(10))(1)
                            If Arr(2, j) = 7 Or Arr(2, j) = "CN" Then
                                Res(k, 4) = 8
                                Res(k, 6) = Arr(i, j)
                                If Res(k, 6) < 1 Then
                                   Res(k, 5) = Res(k, 4) & Ws.[H1] & Res(k, 6) * 60
                                Else
                                    Res(k, 5) = Res(k, 4) + Res(k, 6)
                                End If
                            Else
                                Res(k, 4) = 17
                                Res(k, 7) = Arr(i, j)
                                If Res(k, 7) < 1 Then
                                   Res(k, 5) = Res(k, 4) & Ws.[H1] & Res(k, 7) * 60
                                Else
                                    Res(k, 5) = Res(k, 4) + Res(k, 7)
                                End If
                            End If
                         End If
                    Next j
                    Exit For
                End If
            Next i
        End If
    End If
Next Sh
If k Then
    Ws.Range("A14:H53").AutoFilter
    Ws.Range("A15").Resize(31, 7).ClearContents
    Ws.Range("A15").Resize(k + 1, 7) = Res
    Ws.Range("$A$14:$H$53").AutoFilter Field:=1, Criteria1:="<>"
End If
MsgBox " Done"
End Sub
Lưu ý các Sh tháng phải có format giống nhau. Trong file đính kèm tôi đã chỉnh lại format thang11 cho giống với format Sh thang10.
Các công thức của cột AH và AI của các Sh thang không đúng. Bạn tự sửa lại.
chúc thành công.
Cảm ơn bạn! Mình đã làm được rồi!
Trân thành cảm ơn bạn và các ace đã quan tâm giúp đỡ cũng như đưa ra những lời khuyên, em sẽ rút exp và lĩnh hội các ý kiến của các ace.
Cảm ơn rất nhiều!
 
Upvote 0
Web KT

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

Back
Top Bottom