Nhờ viết code cho File Excel tính lương.

Liên hệ QC

phuongc5

Thành viên hoạt động
Tham gia
26/10/07
Bài viết
146
Được thích
71
Nghề nghiệp
Kế toán
Chào các thành viên!
Mình tham gia diễn đàn cũng đã lâu nhưng đến bây giờ cũng chưa tự tay mình viết được code (hổ thẹn quá!). Nên mình nhờ việc này rất mong được giúp đỡ chứ không muốn bị nói: trong diễn đàn có nhiều rồi mà (tủi thân lắm).
Trong file đính kèm, tại Sheet!DATA, mình muốn khi nhập tên nhân viên thì ở các cột kế tiếp sẽ hiện số tài khoản, mã số thuế cá nhân, phòng ban (tên NV, phòng ban, số TK, MSTCN đã có tại Sheet!MA). Mình muốn dùng VBA để làm điều này chứ không muốn dùng công thức Vlookup vì nó nặng file và khi lọc nó chậm lắm. Chắc mọi người sẽ nói là tại sao không điền mã số để nó hiện tên nhân viên. Cơ quan mình có hơn 100 người, không ai trùng tên ai, và copy dữ liệu từ các file khác (ngườ khác làm) vào chỉ có tên chứ không có mã nên mình mới làm thế.
Rất mong được giúp đỡ!
Xin chân thành cảm ơn!
 

File đính kèm

  • VD.rar
    1 MB · Đọc: 186
Góp về cái bạn đã có cái đã

Hàm của bạn có thể rút gọn lại
Mã:
Function pitfromgross(Gross_Salary, Optional dependance = 0)
    TI = Gross_Salary - 4000000 - dependance * 1600000
    
    If TI < 0 Then
        pitfromgross = 0
    ElseIf TI < 5000000 Then
        pitfromgross = TI * 0.05
    ElseIf TI < 10000000 Then
        pitfromgross = (TI - 5000000) * 0.1 + 250000
    ElseIf TI < 18000000 Then
        pitfromgross = (TI - 10000000) * 0.15 + 750000
    ElseIf TI < 32000000 Then
        pitfromgross = (TI - 18000000) * 0.2 + 1950000
    ElseIf TI < 52000000 Then
        pitfromgross = (TI - 32000000) * 0.25 + 4750000
    ElseIf TI < 80000000 Then
        pitfromgross = (TI - 52000000) * 0.3 + 9750000
    Else
        pitfromgross = (TI - 80000000) * 0.35 + 18150000
    End If
End Function
Như sau:

PHP:
Function PitFromGross_(Gross_Salary, Optional dependance = 0)
 Const Tr As Double = 10 ^ 6
 
    TI = Gross_Salary / Tr - 4 - dependance * 1.6
    
    If TI < 0 Then
        PitFromGross_ = 0
    ElseIf TI < 5 Then
        PitFromGross_ = TI * 0.05
    ElseIf TI < 10 Then
        PitFromGross_ = (TI - 5) * 0.1 + 0.25
    ElseIf TI < 18 Then
        PitFromGross_ = (TI - 10) * 0.15 + 0.75
    ElseIf TI < 32 Then
        PitFromGross_ = (TI - 18) * 0.2 + 1.95
    ElseIf TI < 52 Then
        PitFromGross_ = (TI - 32) * 0.25 + 4.75
    ElseIf TI < 80 Then
        PitFromGross_ = (TI - 52) * 0.3 + 9.75
    Else
        PitFromGross_ = (TI - 80) * 0.35 + 18.15
    End If
   PitFromGross_ = PitFromGross_ * Tr
End Function
 
Upvote 0
Tại ô họ tên cần nhập nhấn F4 rồi gõ 1 vài ký tự họ người cần nhập, bạn thử xem.
 

File đính kèm

  • VD.rar
    1 MB · Đọc: 205
Lần chỉnh sửa cuối:
Upvote 0
Hàm của bạn có thể rút gọn lại
Mã:
Function pitfromgross(Gross_Salary, Optional dependance = 0)
    TI = Gross_Salary - 4000000 - dependance * 1600000
    
    If TI < 0 Then
        pitfromgross = 0
    ElseIf TI < 5000000 Then
        pitfromgross = TI * 0.05
    ElseIf TI < 10000000 Then
        pitfromgross = (TI - 5000000) * 0.1 + 250000
    ElseIf TI < 18000000 Then
        pitfromgross = (TI - 10000000) * 0.15 + 750000
    ElseIf TI < 32000000 Then
        pitfromgross = (TI - 18000000) * 0.2 + 1950000
    ElseIf TI < 52000000 Then
        pitfromgross = (TI - 32000000) * 0.25 + 4750000
    ElseIf TI < 80000000 Then
        pitfromgross = (TI - 52000000) * 0.3 + 9750000
    Else
        pitfromgross = (TI - 80000000) * 0.35 + 18150000
    End If
End Function
Như sau:

PHP:
Function PitFromGross_(Gross_Salary, Optional dependance = 0)
 Const Tr As Double = 10 ^ 6
 
    TI = Gross_Salary / Tr - 4 - dependance * 1.6
    
    If TI < 0 Then
        PitFromGross_ = 0
    ElseIf TI < 5 Then
        PitFromGross_ = TI * 0.05
    ElseIf TI < 10 Then
        PitFromGross_ = (TI - 5) * 0.1 + 0.25
    ElseIf TI < 18 Then
        PitFromGross_ = (TI - 10) * 0.15 + 0.75
    ElseIf TI < 32 Then
        PitFromGross_ = (TI - 18) * 0.2 + 1.95
    ElseIf TI < 52 Then
        PitFromGross_ = (TI - 32) * 0.25 + 4.75
    ElseIf TI < 80 Then
        PitFromGross_ = (TI - 52) * 0.3 + 9.75
    Else
        PitFromGross_ = (TI - 80) * 0.35 + 18.15
    End If
   PitFromGross_ = PitFromGross_ * Tr
End Function
Cái này mình cũng lấy từ diễn đàn xuống (của anh OVerAC) chứ mình đã biết cách viết code đâu. Không có nền tảng tin học, học mấy khoản này thấy khó quá
 
Upvote 0
Tại ô cần nhập nhấn F4 rồi gõ 1 vài ký tự họ người cần nhập, bạn thử xem.
Wow, rất pro, cảm ơn anh. Nhưng như thế này thì nhập từng tên một, em muốn copy từ 1 file khác 10 tên nhân viên (hoặc hơn nữa chẳng hạn) để dán vào file này thì vẫn ra kết quả mong muốn cơ. Giúp em tiếp nhé!
 
Upvote 0
Chào các thành viên!
Mình tham gia diễn đàn cũng đã lâu nhưng đến bây giờ cũng chưa tự tay mình viết được code (hổ thẹn quá!). Nên mình nhờ việc này rất mong được giúp đỡ chứ không muốn bị nói: trong diễn đàn có nhiều rồi mà (tủi thân lắm).
Trong file đính kèm, tại Sheet!DATA, mình muốn khi nhập tên nhân viên thì ở các cột kế tiếp sẽ hiện số tài khoản, mã số thuế cá nhân, phòng ban (tên NV, phòng ban, số TK, MSTCN đã có tại Sheet!MA). Mình muốn dùng VBA để làm điều này chứ không muốn dùng công thức Vlookup vì nó nặng file và khi lọc nó chậm lắm. Chắc mọi người sẽ nói là tại sao không điền mã số để nó hiện tên nhân viên. Cơ quan mình có hơn 100 người, không ai trùng tên ai, và copy dữ liệu từ các file khác (ngườ khác làm) vào chỉ có tên chứ không có mã nên mình mới làm thế.
Rất mong được giúp đỡ!
Xin chân thành cảm ơn!

Sử dụng sự kiện WorkSheet_Change của cột Tên Nhân viên và câu lệnh WorkSheetFunction.Vlookup trong VBA thay cho hàm Vlookup trong Excel
Thân
 
Upvote 0
Sử dụng sự kiện WorkSheet_Change của cột Tên Nhân viên và câu lệnh WorkSheetFunction.Vlookup trong VBA thay cho hàm Vlookup trong Excel
Thân
Như mình đã nói, mình chưa biết viết code, vì thế bạn gợi ý như thế mình không thể phát triển nó ra được. Bạn có thể bớt chút thời gian giúp mình được không?
 
Upvote 0
Wow, rất pro, cảm ơn anh. Nhưng như thế này thì nhập từng tên một, em muốn copy từ 1 file khác 10 tên nhân viên (hoặc hơn nữa chẳng hạn) để dán vào file này thì vẫn ra kết quả mong muốn cơ. Giúp em tiếp nhé!
Không ai hoàn thiện giúp theo yêu cầu của mình sao?
 
Upvote 0
Không ai hoàn thiện giúp theo yêu cầu của mình sao?
Theo tôi, bạn nên cắt nhỏ phần yêu cầu của mình ra. Từ Sh nào => Sh nào, nhìn vào nhiều quá, rối.
Còn muốn copy 1 list tên vào Data, sau đó select và điền các thông tin khác thì không khó. Cơ bản là dùng Vlookup sau đó dùng .value=.value.
Bạn hãy cắt ra đi!
 
Upvote 0
Theo tôi, bạn nên cắt nhỏ phần yêu cầu của mình ra. Từ Sh nào => Sh nào, nhìn vào nhiều quá, rối.
Còn muốn copy 1 list tên vào Data, sau đó select và điền các thông tin khác thì không khó. Cơ bản là dùng Vlookup sau đó dùng .value=.value.
Bạn hãy cắt ra đi!
Thì yêu cầu của em chỉ là nhập tên ở cột A của Sheet!DATA thì cột B, C, D sẽ tự động được điền vào thôi mà. Anh Sealand đã giúp em rồi, nhưng chỉ là nhập từng tên một thôi, ở đây em muốn khi copy khoảng 10 tên nhân viên ở 1 file khác rồi dán vào cột A, thì tương ứng với các cột B, C, D sẽ điền số liệu vào.
 
Lần chỉnh sửa cuối:
Upvote 0
Theo tôi, bạn nên cắt nhỏ phần yêu cầu của mình ra. Từ Sh nào => Sh nào, nhìn vào nhiều quá, rối.
Còn muốn copy 1 list tên vào Data, sau đó select và điền các thông tin khác thì không khó. Cơ bản là dùng Vlookup sau đó dùng .value=.value.
Bạn hãy cắt ra đi!
Thì yêu cầu của em chỉ là nhập tên ở cột A của Sheet!DATA thì cột B, C, D sẽ tự động được điền vào thôi mà (Danh sách tham chiếu thì em để ở Sheet!MA). Anh Sealand đã giúp em rồi, nhưng chỉ là nhập từng tên một thôi, ở đây em muốn khi copy khoảng 10 tên nhân viên, thì tương ứng với các cột B, C, D sẽ điền số liệu vào.
 
Lần chỉnh sửa cuối:
Upvote 0
Thì yêu cầu của em chỉ là nhập tên ở cột A của Sheet!DATA thì cột B, C, D sẽ tự động được điền vào thôi mà (Danh sách tham chiếu thì em để ở Sheet!MA). Anh Sealand đã giúp em rồi, nhưng chỉ là nhập từng tên một thôi, ở đây em muốn khi copy khoảng 10 tên nhân viên, thì tương ứng với các cột B, C, D sẽ điền số liệu vào.
Dùng thử code sau.
PHP:
Sub GanThongSo()
With Application
  .ScreenUpdating = False
End With
Dim endR1 As Long, endR2 As Long
With Sheets("data")
  endR1 = .Cells(65000, 1).End(xlUp).Row 'Ten'
  endR2 = .Cells(65000, 3).End(xlUp).Row 'So TK'
  With .Range("B" & endR2 & ":B" & endR1)
    .FormulaR1C1 = "=VLOOKUP(RC1,MA!R2C1:R147C5,4,0)"
    .Value = .Value
  End With
  With .Range("C" & endR2 & ":C" & endR1)
    .FormulaR1C1 = "=VLOOKUP(RC1,MA!R2C1:R147C5,3,0)"
    .Value = .Value
  End With
  With .Range("D" & endR2 & ":D" & endR1)
    .FormulaR1C1 = "=VLOOKUP(RC1,MA!R2C1:R147C5,2,0)"
    .Value = .Value
  End With
End With
With Application
  .ScreenUpdating = True
End With
 
Upvote 0
Bạn test thử code này nhé:
Mã:
Sub look_val()
Dim rg As Range
Set rg = Sheet4.Range("A5:D" & Sheet4.[A65536].End(xlUp).Row).SpecialCells(xlCellTypeBlanks)
For Each cel In rg.Cells
If Trim(cel.Text) = "" Then
tim = Sheet4.Cells(cel.Row, 1)
Set cll = Sheet6.Columns("A").Find(what:=tim)
If Not cll Is Nothing Then
Sheet4.Range(cel.Address) = IIf(cel.Column = 2, cll.Offset(, 3), IIf(cel.Column = 3, cll.Offset(, 2), cll.Offset(, 1)))
End If
End If
Next
End Sub
 
Upvote 0
Em đã Test cả 2 code của bác ThuNghiSealand, chạy êm ru. Chân thành cảm ơn 2 anh!
---------
Với số liệu hiện tại của em là 2.000 dòng, khi đó code của bác ThuNghi chạy nhanh hơn. Nhưng khi đã điền kín rồi, em xóa thử 1 số dòng ở cột B hoặc C hoặc D thì nó không điền vào nữa, chỉ có dòng cuối cùng nó mới điền. Còn code của bác Sealand thì làm được hết nhưng chậm hơn. Xét về tốc độ: Bác Thunghi 1s, bác Sealand: 10s
 
Lần chỉnh sửa cuối:
Upvote 0
Dẫu sao mình vẫn thích phương thức chọn nhập hơn vì bạn không dùng mã mà dùng tên e sai chính tả hoặc không đồng nhất thì các công thức tổng hợp về sau có vấn đề.
Mình sửa lại Form nhập:
-Bạn có thể tìm bằng nhấn ký tự họ để tìm
-Chọn theo phòng
Cách chọn:
-Nhấn chuột hay phím SpaceBar
-Chọn cả danh sách được lọc nhấn chon All
-Bỏ các lựa chọn nhấn bo chon
Khi chọn xong nhan chấp nhận nhâp (CN nhap)
 

File đính kèm

  • VD1.rar
    1 MB · Đọc: 97
Upvote 0
Dẫu sao mình vẫn thích phương thức chọn nhập hơn vì bạn không dùng mã mà dùng tên e sai chính tả hoặc không đồng nhất thì các công thức tổng hợp về sau có vấn đề.
Mình sửa lại Form nhập:
-Bạn có thể tìm bằng nhấn ký tự họ để tìm
-Chọn theo phòng
Cách chọn:
-Nhấn chuột hay phím SpaceBar
-Chọn cả danh sách được lọc nhấn chon All
-Bỏ các lựa chọn nhấn bo chon
Khi chọn xong nhan chấp nhận nhâp (CN nhap)
Bảng sửa đổi này của anh rất đúng ý em rồi. Mình đứng ở Sheet nào để gọi form nhập liệu và bấm chấp nhận thì nó cũng tìm đến dòng cuối cùng của Sheet!DATA để điền vào đó. Cảm ơn anh nhiều nhé!
 
Upvote 0
Web KT

Group

DIỄN ĐÀN GIẢI PHÁP EXCEL Group 1
DIỄN ĐÀN GIẢI PHÁP EXCEL Group 2
Back
Top Bottom