Tham chiếu giữa hợp đồng và bản chấm công

Liên hệ QC
Cả 2 sub trên mình đều dán vào modul1, rồi chạy macro....nhưng không có gì xảy ra. Chắc mình chưa biết sử dụng rồi...
Phải đứng trên trang họ "T" mà bạn muốn ẩn dòng trống.

[thongbao]Chú í: Công thức 2 hàm VLOOKUP() bạn chưa bẩy lỗi thì phải. [/thongbao]
- Ý bạn là có lỗi hả mình chưa hiểu lắm? mình thì thấy nó hiện đơn giá là chính xác.
Chuyện gì sẽ diễn ra nếu ta không cung cấp cho hàm VLOOKUP() trị cần đi tìm? (Ở đây sẽ là Mã NV trống)
 
Chuyện gì sẽ diễn ra nếu ta không cung cấp cho hàm VLOOKUP() trị cần đi tìm? (Ở đây sẽ là Mã NV trống)
cái này đúng là mình chưa có nghĩ tới --=0
Cả 2 sub trên mình đều dán vào modul1, rồi chạy macro....nhưng không có gì xảy ra. Chắc mình chưa biết sử dụng rồi...


Phải đứng trên trang họ "T" mà bạn muốn ẩn dòng trống.
Theo mình thấy thì vẫn phải lập hàm, cái macro này chỉ thay cho việc sao chép công thức ở 2 ô AJ8;AK8 xuống dưới phải không bạn
Mình cứ tưởng có macro thay hàm luôn...%#^#$

- Bài toán tính lương NV trong cả năm thì lời giả thế nào, bạn gợi ý cho mình nhé.

- Vấn đề tự động ẩn dòng trong bảng lương mình đã thực hiện như sau:
bước 1: Mình dùng auto filter và record macro thu lại được macro
Mã:
Sub an_dong_luong()'
' an_dong_luong Macro
'


'
Range("E4:E5").Select
Range("B4:N5").Select
Selection.AutoFilter
ActiveSheet.Range("$B$4:$N$50").AutoFilter Field:=4, Criteria1:="<>0", _
Operator:=xlAnd
Range("N7").Select
End Sub
bước 2: Tạo macro sự kiện active cho trang lương họ "L"cho tự chạy sub 'an_dong_luong' này.
Mình mới tập VBA nên dùng phương pháp sơ cấp là dễ ăn nhất--=0 (nói thật là mới đây nhờ có bạn mình mới biết macro sự kiện là cái gì đó, thanks!)
Bạn thấy phương pháp này có ổn không?
Chúc 1 buổi tối vui!
 
Lần chỉnh sửa cuối:
Theo mình thấy thì vẫn phải lập hàm, cái macro này chỉ thay cho việc sao chép công thức ở 2 ô AJ8;AK8 xuống dưới phải không bạn
Mình cứ tưởng có macro thay hàm luôn...
Viết hàm tự tạo thay cho hàm VLOOKUP() lồng nhau đó cũng được; Nhưng:
Hàm tự tạo không thể nhanh bằng hàm E. chính thống trong rất . . rất nhiều trường hợp.
Nhất là khi rất nhiều những ô hay vùng chứa hàm/công thức này
(& lúc nào bạn rỗi mình sẽ giúp bạn việc viết hàm này)


- Bài toán tính lương NV trong cả năm thì lời giả thế nào, bạn gợi ý cho mình nhé.
Nhìn mấy cái hình chưa thể nói lên điều gì để bắt tay vô hướng dẫn hay giúp bạn được gì
Cần có mô tả thật kỹ, nói như cách các nhà làm IZO í.
Thứ nhất: Danh sách trong hình đang thiếu trầm trọng là mã nhân viên. Cái này là xương sống của toàn bộ CSDL
Với mình, 1 khi không có nó thì không làm gì tiếp được sất!
Ngoài ra còn nói luôn: Là danh sách đó chứa thu nhập của người LĐ cả năm (mỗi người 1 hàng hay mỗi người 12 hàng?)
. . . . .


- Vấn đề tự động ẩn dòng trong bảng lương mình đã thực hiện như sau:
1./ . . . .
2./ . . . .
Tùy thuộc vô cấu trúc trang tính nữa; Ví dụ các bảng họ "T" thì không có dòng trống xen kẻ. Như vậy chi3 việc tìm dòng cuối có dữ liệu cho ẩn đến dòng chứa dữ liệu cuối (tạm gọi là footer) mà thôi;
Còn có xen dòng trống trong đám dòng dữ liệu thì làm cách như bạn là đúng.
Bạn muốn cô gọn đứa con tinh thần của mình thì:
Thử vô hiệu hóa hay thay thế từng địa chỉ ghi trong các dòng lệnh & so sánh kết quả với lần chạy trước mà tự tìm ra kết luận cho mình . . .
Tự học thì phải mất công vậy thôi!
Nếu được người khác chỉ thì bạn không bao giờ nhớ chu trình này để làm vốn cho riêng mình đâu!

Thân!
 
Lần chỉnh sửa cuối:
...
(& lúc nào bạn rỗi mình sẽ giúp bạn việc viết hàm này)
...
Cần có mô tả thật kỹ, nói như cách các nhà làm IZO í.
. . . . .
- Thật xin lỗi bạn vì để bạn nhắc thêm lần nữa về tầm quan trọng của mã NV trong CSDL. Mình hoàn toàn hiểu điều này và bảng tính lập ra chỉ để in ấn báo cáo, bên thuế họ đòi bảng công, bảng lương phải thể hiện rõ tên họ. Làm theo IZO thì mình rất khoái--=0
- Mục đích cuối cùng của vấn đề là kê khai thu nhập người LĐ để báo cáo, bảng tính đầy đủ gồm 4 cột, mỗi NV 1 hàng như sau:
SốTT Họ Tên Số CMND Thu nhập năm
1 Nguyễn Văn A 123456 18.980.000
2 Nguyễn Văn B xxxxxx xxxxxxxxx
...........

Tùy thuộc vô cấu trúc trang tính nữa; Ví dụ các bảng họ "T" thì không có dòng trống xen kẻ. Như vậy chi3 việc tìm dòng cuối có dữ liệu cho ẩn đến dòng chứa dữ liệu cuối (tạm gọi là footer) mà thôi;
Còn có xen dòng trống trong đám dòng dữ liệu thì làm cách như bạn là đúng.
Trang tính của mình xen kẽ, mình dùng thử macro này thấy cung ổn%#^#$

Bạn muốn cô gọn đứa con tinh thần của mình thì:
Thử vô hiệu hóa hay thay thế từng địa chỉ ghi trong các dòng lệnh & so sánh kết quả với lần chạy trước mà tự tìm ra kết luận cho mình . . .
cám ơn bạn chỉ bảo, mình hiểu rồi, mình sẽ cố gắng.
Chúc ngày tốt lành.
 
bạn nhắc thêm lần nữa về tầm quan trọng của mã NV trong CSDL. Mình hoàn toàn hiểu điều này
và bảng tính lập ra chỉ để in ấn báo cáo, bên thuế họ đòi bảng công, bảng lương phải thể hiện rõ tên họ.

- Mục đích cuối cùng của vấn đề là kê khai thu nhập người LĐ để báo cáo, bảng tính đầy đủ gồm 4 cột, mỗi NV 1 hàng như sau:
SốTT Họ Tên Số CMND Thu nhập năm
1 Nguyễn Văn A 123456 18.980.000
2 Nguyễn Văn B xxxxxx xxxxxxxxx
...........

Trong các trang họ "T" & "L" bạn đã tiến hành ẩn dòng; thì trang nầy bạn ẩn cột thì có làm sao đâu nhỉ?
Cách này chỉ làm cho bạn thuận tiện hơn mà thôi.

Như vậy trang 'Bảng Kê TN' có 5 cột (cột trước cột 'Họ Tên' sẽ là cột 'MaNV' bị ẩn)
Trong đó cột 'STT' không quan trọng lắm, xử sao cũng được;
03 Cột kế tiếp lấy gián tiếp hay trực tiếp từ trang 'Data'
cột cuối hoặc lấy từ trang họ "T" hay họ 'L" đều được. Mà nên là họ "T" vì họ 'L' có những dòng trống xen kẻ.

Để lấy số liệu lương 12 tháng của từng người từ các trang họ 'T', ta phải điền đủ số liệu vô các cột [AK] của chúng.

Quan trọng nhất trong các công đoạn tạo bảng báo cáo này sẽ là lập danh sách duy nhất mã NV từ các trang họ 'T'
Ở đây sẽ có vài biện pháp thực hiện từ đơn giản đến phức tạp;
Nhưng dù sao chí ít bạn cũng làm được 1 cách, phải vậy không?

Hãy bắt tay làm thử & chúc bạn thành công!
 
Trong các trang họ "T" & "L" bạn đã tiến hành ẩn dòng; thì trang nầy bạn ẩn cột thì có làm sao đâu nhỉ?
.....
Nhưng dù sao chí ít bạn cũng làm được 1 cách, phải vậy không?

Hãy bắt tay làm thử & chúc bạn thành công!
Cám ơn bạn đã giúp đỡ. Bạn nói đúng, muốn nắm được thì phải thử thôi...)(&&@@
1./ Bạn cho mình hỏi, tạo sao mấy dòng cuối trang ( người lập bảng, kế toán,....ký tên...) toàn bị ẩn khi chạy macro các trang họ "T", có trang lại không sao
và có cách nào khắc phục không bạn?
2./ 1 vấn đề nữa mình tạo macro bằng record giống như nói ở bài trước. Thì tậm tịt nghĩa là macro lúc thì mở sheet lên là chạy ngon, lúc khác cũng mở trang đó lên thì báo lỗi. Đó có phải là khuyết điểm chung của macro tạo bằng cách record..?
 
Lần chỉnh sửa cuối:
"Mấy dòng cuối" đó nên đẩy xuống đến dòng 100

Macro sẽ làm ẩn các dòng không dữ liệu cho đến dòng 99.

Đó là con số đã khai báo Const có tên là "SoNV"
 
Cám ơn bạn, lúc trước bạn có nói rồi mà mình quên mất.
CHúc vui.
 
Xin chào bạn Hoang2013. Đã lâu rồi không thảo luận với bạn, hi vọng bạn vẫn tràn đầy năng lượng;)
Mình cũng xin lỗi là đã đào lại cuộc thảo luận đã cũ này... chắc bạn cũng mất một chút thời gian để tìm lại mạch suy nghĩ, để bớt chút thời gian của bạn lục tìm lại file cũ, mình gửi lên đây file cuối cùng chúng ta thảo luận.
Báo cáo bạn thời gian qua mình đã làm xong bộ chứng từ nhân công công trường năm 2016 rồi, đúng tinh thần file chấm công tự động, tuy nhiên chỉ có chấm công tự động còn bảng lương mình vẫn phải làm thủ công.
Bây giờ mình làm tiếp nhân công năm 2015, mình nghĩ phải tìm cách thông minh hơn cho những vấn đề, mong bạn giúp đỡ:
1. số nhân viên đã lên tới vài trăm người... vấn đề này mình đã tìm ra thông số SNV và đã chỉnh xong.
2*. Ở file cũ chỉ có 1 mức lương/ngày cho toàn bộ nhân viên, điều này không đúng với chứng từ mình phải làm là mỗi nhân viên 1 mức lương khác nhau ( điều này cũng ko hợp lý lắm, nhưng số liệu báo cáo đã fix nên mình phải làm theo:() . Ý tưởng của mình là tạo thêm cột mức lương cho mỗi nhân viên ở trang DATA, sau đó khi chạy macro thì ở trang CTLg xuất hiện mức lương tương ứng cho mỗi nhân viên .
Một lần nữa xin bạn thông cảm vì sự bất tiện mình gây ra. Chúc ngày chủ nhật vui vẻ.
 

File đính kèm

  • Tự Tạo BCC-FINAL2.1.xls
    522 KB · Đọc: 9
Lần chỉnh sửa cuối:
Hiện tại mức lương ngày ở trang 'CTLg' được tạo ra từ dòng lệnh
Mã:
  dArr(W, 3) = Sheets("FuTro").Range("DGCg")

Nếu bạn muốn điền từ những số liệu khác nhau của mức lương mỗi người từ trang 'Data' thì bạn thực hiện các bước sau:

(1) Đến trang 'Data' & cắt toàn bộ dữ liệu cột [Q:q] sang dòng tương ứng của cột [S:s];
Làm điều này để đảm bảo rằng không có gì chung chạ với CSDL của ta (đảm bảo tính toàn vẹn của nó là tối ưu

(2) Bạn thêm mức lương từng người vô cột [P: p] của trang này

Sau đó đưa trang tính hay file mới chỉnh sửa này lên. Chỉ sau đó ta sẽ tiếp tục . . . .
 
Hi bạn.
mình đã thêm cột lương, ta tiếp tục nào. i can't wait%$$
 

File đính kèm

  • Tự Tạo BCC.xls
    514 KB · Đọc: 5
Lần chỉnh sửa cuối:
Bạn Copy cái này & chép đè lên toàn bộ các câu lệnh hiện có tại cửa sổ VBE của trang 'CTLg' & chạy thử macro sự kiện mới này;
PHP:
Option Explicit
Private Sub Worksheet_Change(ByVal Target As Range)
 If Not Intersect(Target, [O2]) Is Nothing Then
    Dim ShName As String
    Dim Sh As Worksheet, Arr(), Rng As Range, sRng As Range '*'
    Dim J As Long, Rws As Long, W As Long
 
    ShName = "T" & Right("0" & Target.Value, 2)
    Set Sh = ThisWorkbook.Worksheets(ShName)
    Rws = Sh.[c8].CurrentRegion.Rows.Count
    Arr() = Sh.[c8].Resize(Rws, 33).Value
    ReDim dArr(1 To SNV, 1 To 4)
    [b6].Resize(SNV, 4).Value = dArr()
    Rows("6:" & SNV).Hidden = False
    With Sheets("Data")                                     '**'
        Set Rng = .Range(.[b4], .[b4].End(xlDown))
    End With                                                '**'
    For J = 1 To UBound(Arr())
        If Arr(J, 1) = "" Then Exit For
        If Arr(J, 33) > 0 And Arr(J, 33) < 53 Then
            W = W + 1:                  dArr(W, 1) = W
            dArr(W, 2) = Arr(J, 1):     dArr(W, 4) = Arr(J, 33)
            Set sRng = Rng.Find(Arr(J, 1), , xlFormulas, xlWhole)   '**'
            If Not sRng Is Nothing Then
                dArr(W, 3) = sRng.Offset(, 14).Value
            End If                                                  '**'
        End If
    Next J
    If W Then
        [b6].Resize(W, 4).Value = dArr()
        Rows(W + 6 & ":" & SNV).Hidden = True
    End If
 End If
End Sub

Sau đó tất nhiên bạn tiếp tục "chạy" hết các macro trong bảng tính của bạn xem có gì bất thường sau khi hiệu chỉnh hay không?

Chúc thành công!
 
Tuyệt vời! chắc bạn cũng hình dung được kết quả rồi đó-=.,,. Cám ơn bạn rất nhiều.
Bạn đã giải quyết cho mình khúc mắc mình không thể giải quyết được...

Còn có vấn đề mình xoay sở bằng hàm tuy cũng chấp nhận được nhưng nhìn "nông dân" lắm, làm file chạy chậm nữa, mong bạn chỉ thêm cho vài chiêu hen:
-bài toán: mình muốn tính tổng số công cả năm của từng nhân viên
-Cách lập hàm của mình:
1. lập 12 cột tương ứng với số công 12 tháng của mỗi NV, và cột tổng ở trang Data
2. dùng hàm =VLOOKUP($B4;[ bảng chấm công tháng 1];33;FALSE) cho ra tổng số công NV ở ô B4 trong tháng 1 (lúc này sẽ có xuất hiện lỗi #NA ở những NV ko có tên trong tháng 1)
3. ở cột tổng mình dùng hàm bẫy lỗi =SUM(IFERROR(Q4:AB4;0))

như vậy thì cũng ra nhưng không thông minh chút nào.
Bạn có thể giúp mình CODE 1 cột tổng số công hiện luôn trên trang Data không.
 
Lần chỉnh sửa cuối:
Bài toán: Tính tổng số công cả năm của từng nhân viên
-Cách lập hàm của mình:
1. lập 12 cột tương ứng với số công 12 tháng của mỗi NV, và cột tổng ở trang Data
2. dùng hàm =VLOOKUP($B4;[ bảng chấm công tháng 1];33;FALSE) cho ra tổng số công NV ở ô B4 trong tháng 1 (lúc này sẽ có xuất hiện lỗi #NA ở những NV ko có tên trong tháng 1)
3. ở cột tổng mình dùng hàm bẫy lỗi =SUM(IFERROR(Q4:AB4;0))
Bạn có thể giúp mình CODE 1 cột tổng số công hiện luôn trên trang Data không.

Thứ nhất trang 'Data' là quả tim của CSDL của bạn & không nên lúc nào cũng thao tác trên nó dù bằng tay hay bằng macro.
Như vậy bạn cần chọn 1 trang tính khác để ghi kết quả công các tháng của nhân viên;
Trang tính có thể trưng dụng việc này có thể là 'FuTro', 'T12' hay 1 trang mới,. . . tùy bạn chọn;

Lúc đó mình sẽ giúp bạn 1 macro để tổng hợp số liệu công này trong năm.
 
Thứ nhất trang 'Data' là quả tim của CSDL của bạn & không nên lúc nào cũng thao tác trên nó dù bằng tay hay bằng macro.
Như vậy bạn cần chọn 1 trang tính khác để ghi kết quả công các tháng của nhân viên;
Trang tính có thể trưng dụng việc này có thể là 'FuTro', 'T12' hay 1 trang mới,. . . tùy bạn chọn;
Cám ơn bạn nhắc nhở, mình sẽ cẩn thận hơn với CSDL
Trang "Luong" ko ý nghĩa cho lắm nên mình trưng dụng luôn để tổng hợp.
Bạn sẽ thấy trong file đính kèm là cách mình làm thủ công. Bạn giúp mình nhé.
 

File đính kèm

  • Tự Tạo BCC.xls
    565 KB · Đọc: 5
Bạn phải chuột vô thanh trang tính 'Luong' ; chọn dòng 'View Code' & chép macro sự kiện này vô CS VBE vừa xuất hiện:
PHP:
Private Sub Worksheet_Activate()
 Dim Sh As Worksheet, Cls As Range, Rng As Range, sRng As Range
 Dim Rws As Long, Thg As Byte, Tmp As Double
 Application.ScreenUpdating = False
 For Each Cls In Range([c7], [c7].End(xlDown))
    For Each Sh In ThisWorkbook.Worksheets
        If Left(Sh.Name, 1) = "T" And IsNumeric(Right(Sh.Name, 2)) Then
            Thg = CByte(Right(Sh.Name, 2))
            Rws = Sh.[c8].CurrentRegion.Rows.Count
            Set Rng = Sh.[c8].Resize(Rws)
            Set sRng = Rng.Find(Cls.Value, , xlFormulas, xlWhole)
            If sRng Is Nothing Then
                Tmp = 0
            Else
                Tmp = Sh.Cells(sRng.Row, "AI").Value
            End If
            Cls.Offset(, Thg).Value = Tmp
        End If
    Next Sh
 Next Cls
 Randomize
 Application.ScreenUpdating = True
 [d6].Resize(, 12).Interior.ColorIndex = 34 + 9 / Rnd() \ 1
End Sub
 
Hi bạn,Chép macro sự kiện vào thì chạy tốt...với cơ sở dữ liệu "hiên tại" bạn à...

như mình nói từ trước là số công của cả năm đã được kế toán fix, bây giờ mình phải lập bảng công hàng tháng sao cho cộng lại khớp với số tổng

Ý đồ của mình từ đầu là chấm công đầy đủ cả tháng không thiếu ngày nào, rồi xóa bớt (vì số công kế toán fix thường là ít hơn số công đầy đủ 1 chút- cột S:s trang 'Luong')

nhưng khi thay đổi trong bảng chấm công (xóa bớt bằng thủ công-lại là thủ công:''"), sau đó mở trang 'Luong" thì phát sinh lỗi ở dòng:
[d6].Resize(, 12).Interior.ColorIndex = 34 + 9 / Rnd() \ 1

Bạn làm ơn xem lại giúp mình,
Nhân tiện bạn có ý tưởng nào giải quyết (việc khớp tổng số công cả ngàn nhân viên),giúp giải thoát công việc chỉnh thủ công rất mất thời gian và nhàm chán này hãy giúp mình nhé.
Trân trọng cám ơn.
 

File đính kèm

  • Tự Tạo BCC.xls
    537 KB · Đọc: 10
Câu lệnh mà bạn nói là đang lỗi thực ra là câu lệnh tô màu nền cho vui thôi. & mình đã đánh sai: Lí ra là dấu nhân "*" mình lại nhập đấu chia "/"
Bạn sửa lại cái nha.

Còn chuyện chỉnh công, đưa về số đã định thì chắc thế này:

Lấy 1 ô trống nào đó để hiện tổng toàn bộ công trong 12 tháng của công ti bạn;
Căn cứ vô đó mà chỉnh những người có công cao hay thấp theo xu hướng ngược lại là được.

Mcro chưa thể điều chỉnh số liệu công đâu bạn. Chỉ là cần tìm ra cách chỉnh sao cho nhanh nhất mà thôi.
 
Câu lệnh mà bạn nói là đang lỗi thực ra là câu lệnh tô màu nền cho vui thôi. & mình đã đánh sai: Lí ra là dấu nhân "*" mình lại nhập đấu chia "/"
Bạn sửa lại cái nha.
mình đã sửa rồi bạn, vụ tô màu đúng là vui thật+-+-+-+

Hihi đúng là công cụ siêu cỡ nào thì cũng có giới hạn bạn nhỉ, vụ chỉnh công này đúng là vượt quá khả năng của macro thật rồi, mình đành phải chỉnh thủ công thôi chứ biết sao giờ.-+*/

Ngày chủ nhật để dành nghỉ ngơi với gia đình và nạp lại năng lượng mà mình làm phiền bạn nhiều quá. Bạn đúng là "người cho đi" đó.
Một lần nữa cám ơn bạn, chúc bạn luôn khỏe. ?><???
 
À mình nhớ ra rằng: Trong Exc. có công cụ "What-If Analysis" có thể xử cái vụ này; Bạn ngâm cứu xem thử!
 
Web KT
Back
Top Bottom