Đánh giá chủ đề:
  • 0 Votes - 0 Average
  • 1
  • 2
  • 3
  • 4
  • 5
[Hàm] Demo_[Hàm] Tính thâm niên như BHXH (maidinhdan)
#1
Khu vực thư viện hàm trước đây có 1 bài viết của anh Xuân Thanh để tính thâm niên ( Link bài). Áp dụng ra nhưng vẫn chưa ưng ý theo nhu cầu lắm, nên xin chế ra 1 hàm mới để dùng

Bước 1: Tạo mới 1 Modules và chép đoạn code dưới đây vào:

Mã PHP:
Public Function Tinhthamnien(Ngaybatdau As DateNgayketthuc As Date) As String
' code by maidinhdan
Dim Sothang As Long
Dim Nam As String
Dim Thang As String
Sothang = DateDiff("m", Ngaybatdau, Ngayketthuc)
Nam = Int((Sothang) / 12) 
Thang = (Sothang) Mod 12 
Tinhthamnien = Nam & " Nam " & Thang & " tháng." 

End Function 


Bước 2: Khi nào cần sử dụng thì gõ Cú pháp sau:

Mã PHP:
Tinhthamnien([txt1],[txt2]) 

Trong đó:
- [txt1] là thời gian bắt đầu: ví dụ là ngày bắt đầu tham gia Bảo hiểm xã hội

- [txt2] là thời gian hiện tại cần tính.

=> cú pháp theo Demo của bài mình là: Tinhthamnien([NgaythamgiaBHXH],Date())
Hình minh họa: kết quả
[Hình: tinhthamnien.png]

Ghi chú: Hàm này không tính ngày nhé chỉ tính đến tháng thôi.

Link Demo của ongke ( tính năm, tháng, ngày): http://www.mediafire.com/download/nrpp41...amNien.mdb

Chúc các bạn thành công.


File đính kèm
.zip   ThamNien(Demo Ongke).zip (Kích cỡ: 18.6 KB / Tải về: 18)
Chữ ký của maidinhdan * Để được hỗ trợ tốt nhất, nhấn vào link dưới đây để xem.
1. [Hướng dẫn] Kiểu file gửi lên để được giúp đỡ
2. [Hướng dẫn] Nội quy diễn đàn
3. [Hướng dẫn] Cách Đưa file và hình vào diễn đàn
4.[Hướng dẫn] Để xây dựng một ứng dụng hoàn hảo và lời cảm tạ
5. Cần tìm Demo hay ứng dụng sử dụng thanh tìm kiếm phía trên cùng, bên phải của diễn đàn.
* Nếu muốn cảm ơn, hãy nhấn nút thank, không cần viết thêm bài nào nửa.



ღღღღღTài sản của maidinhdan (View All Items) ღღღღღ
Reply
Những người đã cảm ơn khải nguyên , bvchauthanh , Noname , alonhuynh
#2
Chúng ta có thể áp dụng code này cho một số lĩnh vực như sau:

- Tính tổng số năm tham gia bảo hiểm xã hội;
- Tính tổng số năm tham gia Đảng;
- Tính tổng số năm gia nhập công đoàn;
Chữ ký của maidinhdan * Để được hỗ trợ tốt nhất, nhấn vào link dưới đây để xem.
1. [Hướng dẫn] Kiểu file gửi lên để được giúp đỡ
2. [Hướng dẫn] Nội quy diễn đàn
3. [Hướng dẫn] Cách Đưa file và hình vào diễn đàn
4.[Hướng dẫn] Để xây dựng một ứng dụng hoàn hảo và lời cảm tạ
5. Cần tìm Demo hay ứng dụng sử dụng thanh tìm kiếm phía trên cùng, bên phải của diễn đàn.
* Nếu muốn cảm ơn, hãy nhấn nút thank, không cần viết thêm bài nào nửa.



ღღღღღTài sản của maidinhdan (View All Items) ღღღღღ
Reply
Những người đã cảm ơn bvchauthanh
#3
Nếu xem 1 tháng có 30 ngày thì code sau đây có thể tính ra ngày (mình xin sửa code của bạn tí nhé)
Mã PHP:
Public Function TinhThamNien(NgayBatDau As DateNgayKetThuc As Date) As String
    On Error Resume Next
   
   Dim SoNgay 
As Long
   Dim SoThang 
As Long
   Dim sNgay 
As String
   Dim sThang 
As String
   Dim sNam 
As String
   Dim k 
As String
   
   SoNgay 
DateDiff("d"NgayBatDauNgayKetThuc)
   SoThang DateDiff("m"NgayBatDauNgayKetThuc)
   k ""
   
   sNam 
Int(SoThang 12)
   sThang SoThang Mod 12
   sNgay 
SoNgay Mod 30
   
   If sNam 
0 Then k sNam " nam "
   If sThang 0 Then k sThang " tháng "
   If sNgay 0 Then k sNgay " ngày"
   
   TinhThamNien 
k
End 
Function 

Ai có cách nào khác để cái số ngày phù hợp hơn không? (tức có tháng 29, 30, 31 ngày ấy)
Chữ ký của bvchauthanh
rose"Luôn luôn lắng nghe
Lâu lâu mới.... hiểu." rose
Reply
Những người đã cảm ơn
#4
(23-07-15, 05:05 PM)bvchauthanh Đã viết: Ai có cách nào khác để cái số ngày phù hợp hơn không? (tức có tháng 29, 30, 31 ngày ấy)



Cảm ơn anh bvchauthanh đóng góp thêm 1 code, việc viết thêm để tính chính xác đến số ngày rất dể, chỉ cần 1 dòng nửa thôi là ra, không có gì phức tạp cả.

Có rất nhiều lý do em không đưa vào code của mình. Bởi tính BHXH, thâm niêm Đảng, Đoàn....không có ai yêu cầu tính chính xác đến ngày đâu. Chỉ cần năm + tháng là đủ rồi.

Ví thế em chỉ viết có bấy nhiêu thôi.
Chữ ký của maidinhdan * Để được hỗ trợ tốt nhất, nhấn vào link dưới đây để xem.
1. [Hướng dẫn] Kiểu file gửi lên để được giúp đỡ
2. [Hướng dẫn] Nội quy diễn đàn
3. [Hướng dẫn] Cách Đưa file và hình vào diễn đàn
4.[Hướng dẫn] Để xây dựng một ứng dụng hoàn hảo và lời cảm tạ
5. Cần tìm Demo hay ứng dụng sử dụng thanh tìm kiếm phía trên cùng, bên phải của diễn đàn.
* Nếu muốn cảm ơn, hãy nhấn nút thank, không cần viết thêm bài nào nửa.



ღღღღღTài sản của maidinhdan (View All Items) ღღღღღ
Reply
Những người đã cảm ơn bvchauthanh
#5
(23-07-15, 05:05 PM)bvchauthanh Đã viết: Nếu xem 1 tháng có 30 ngày thì code sau đây có thể tính ra ngày (mình xin sửa code của bạn tí nhé)
Mã PHP:
Public Function TinhThamNien(NgayBatDau As DateNgayKetThuc As Date) As String
   On Error Resume Next
   
   Dim SoNgay 
As Long
   Dim SoThang 
As Long
   Dim sNgay 
As String
   Dim sThang 
As String
   Dim sNam 
As String
   Dim k 
As String
   
   SoNgay 
DateDiff("d"NgayBatDauNgayKetThuc)
   SoThang DateDiff("m"NgayBatDauNgayKetThuc)
   k ""
   
   sNam 
Int(SoThang 12)
   sThang SoThang Mod 12
   sNgay 
SoNgay Mod 30
   
   If sNam 
0 Then k sNam " nam "
   If sThang 0 Then k sThang " tháng "
   If sNgay 0 Then k sNgay " ngày"
   
   TinhThamNien 
k
End 
Function 

Ai có cách nào khác để cái số ngày phù hợp hơn không? (tức có tháng 29, 30, 31 ngày ấy)

Tác giả kiểm tra lại nhé xem hình ( Dù điền ngày nào cũng thế, không chỉ có ngày 31 hay ngày 15, 20 đâu)

[Hình: Loi.png]
Chữ ký của maidinhdan * Để được hỗ trợ tốt nhất, nhấn vào link dưới đây để xem.
1. [Hướng dẫn] Kiểu file gửi lên để được giúp đỡ
2. [Hướng dẫn] Nội quy diễn đàn
3. [Hướng dẫn] Cách Đưa file và hình vào diễn đàn
4.[Hướng dẫn] Để xây dựng một ứng dụng hoàn hảo và lời cảm tạ
5. Cần tìm Demo hay ứng dụng sử dụng thanh tìm kiếm phía trên cùng, bên phải của diễn đàn.
* Nếu muốn cảm ơn, hãy nhấn nút thank, không cần viết thêm bài nào nửa.



ღღღღღTài sản của maidinhdan (View All Items) ღღღღღ
Reply
Những người đã cảm ơn bvchauthanh , Noname , ongke0711
#6
Chắc bạn maidinhdan hiểu nhầm ý của mình rồi.
Thứ nhất: biết là các ứng dụng nếu cần tính ra thâm niên thì không cần đến ngày, nhưng ở đây mình chỉ mở rộng ra thôi, ai có ứng dụng được thì ứng dụng, do tôi muốn nghiên cứu, học hỏi nên tiện viết thế thôi. (code còn dỡ, mong ae bỏ qua)
Thứ hai: code trên do trong tháng có 29, 30, 31 ngày nhưng do tính số ngày còn dư (sau khi tính tháng) xem 30 ngày là 1 tháng (chứ không có xem 1 tháng là 31 ngày đối với những tháng có 31 ngày)
Mã PHP:
sNgay SoNgay Mod 30 


File đính kèm
.zip   TinhThamNien.zip (Kích cỡ: 22.57 KB / Tải về: 13)
Chữ ký của bvchauthanh
rose"Luôn luôn lắng nghe
Lâu lâu mới.... hiểu." rose
Reply
Những người đã cảm ơn
#7
Chào các bác,

Không biết mình có nhập sai định dạng ngày tháng không mà thấy sai kết quả cho khoảng thời gian giữa ngày: 31/01/2015 và 01/03/2015. KQ: 2 tháng 29 ngày.?
Chữ ký của ongke0711 If you BORN poor, it's not your mistake. But if you DIE poor, It's your mistake!
ღღღღღTài sản của ongke0711 (View All Items) ღღღღღ
Reply
Những người đã cảm ơn bvchauthanh
#8
Mình đã sữa lại code mọi người test thử nhé! anh em sửa code lại như sau nhé
Mã PHP:
Public Function TinhThamNien(NgayBD As DateNgayKT As Date) As String
   Dim sNgay 
As DoublesThang As DoublesNam As Double
   
   sThang 
0
   sNam 
0
   
   sNgay 
DateDiff("d"NgayBDNgayKT)
   If sNgay 30 Then
       sThang 
Int(sNgay 30)
       If sThang 12 Then
           sNam 
Int(sThang 12)
           sThang sThang Mod 12
       End 
If
       sNgay sNgay Mod 30
   End 
If
   
   TinhThamNien 
IIf(sNam 0""sNam " nam ") & IIf(sThang 0""sThang " tháng ") & sNgay " ngày"
End Function 

hoặc down file đính kèm


File đính kèm
.zip   TinhThamNien_Fix.zip (Kích cỡ: 16 KB / Tải về: 16)
Chữ ký của bvchauthanh
rose"Luôn luôn lắng nghe
Lâu lâu mới.... hiểu." rose
Reply
Những người đã cảm ơn
#9
(23-07-15, 10:49 PM)bvchauthanh Đã viết: Mình đã sữa lại code mọi người test thử nhé! anh em sửa code lại như sau nhé
Mã PHP:
Public Function TinhThamNien(NgayBD As DateNgayKT As Date) As String
   Dim sNgay 
As DoublesThang As DoublesNam As Double
   
   sThang 
0
   sNam 
0
   
   sNgay 
DateDiff("d"NgayBDNgayKT)
   If sNgay 30 Then
       sThang 
Int(sNgay 30)
       If sThang 12 Then
           sNam 
Int(sThang 12)
           sThang sThang Mod 12
       End 
If
       sNgay sNgay Mod 30
   End 
If
   
   TinhThamNien 
IIf(sNam 0""sNam " nam ") & IIf(sThang 0""sThang " tháng ") & sNgay " ngày"
End Function 

hoặc down file đính kèm

Code này còn nguy hiểm hơn code trên nửa....anh viết code xong phải test từ ngày 1,2,3,4,.....đến ...30..31 chứ
Hình test code: Phần tô đỏ được tính bằng tay
[Hình: loi2.jpg]


Em gợi ý cho anh sửa lại cái hàm trên:
1. Tối thiếu phải có 2 hàm: DateDiff + DateAdd
2. Cách tìm ra số ngày chính xác: gọi X là ngày tham gia BHXH
+ Tính ra tổng số tháng...đến ngày đầu tiền, tức là ngày 01 tây của tháng hiện hành. tạm gọi là Tongthang1
+ Dùng hàm DateAdd xác định ngày đầu tiên của tháng dựa vào Tongthang1 tạm gọi là N1
+ Dùng hàm DateDiff: tính thời gian từ X đến N1 _______Ở đây cho ra Tổngngay: tạm gọi là A1
+ Dùng hàm DateDiff: tính thời gian từ X đến Date()_______Ở đây cho ra Tổngngay: tạm gọi là A2

Cuối cùng: lấy A2-A1: đây là kết quả anh cần tìm.

Bây nhiêu đó anh viết thêm 1 dòng là đủ. Anh lấy code của em rồi anh viết 1 hàm tính ngày thôi trên cột riêng rồi test thử xem. Rất ok.hihi
Khi áp dụng được, anh không cần phải lo chuyện 1 tháng có 30 hay 31 ngày. Nó tính ra hết. Chỉ là, khi nó ra số âm anh phải bắt nó lấy đi 1 tháng của tháng cuối cùng, rồi trừ ngược thôi.

Chúc anh thành công.
Chữ ký của maidinhdan * Để được hỗ trợ tốt nhất, nhấn vào link dưới đây để xem.
1. [Hướng dẫn] Kiểu file gửi lên để được giúp đỡ
2. [Hướng dẫn] Nội quy diễn đàn
3. [Hướng dẫn] Cách Đưa file và hình vào diễn đàn
4.[Hướng dẫn] Để xây dựng một ứng dụng hoàn hảo và lời cảm tạ
5. Cần tìm Demo hay ứng dụng sử dụng thanh tìm kiếm phía trên cùng, bên phải của diễn đàn.
* Nếu muốn cảm ơn, hãy nhấn nút thank, không cần viết thêm bài nào nửa.



ღღღღღTài sản của maidinhdan (View All Items) ღღღღღ
Reply
Những người đã cảm ơn
#10
Không biết bác maidinhdan có viết nhầm tên hàm không? Mình dùng DateDiff + DateSerial. Code này mình lục lại mấy file trước đây. Do trí nhớ kém nên ghi chú hơi bị nhiều ở các dòng code, nhìn hơi rối chút  007

Mã PHP:
Function ThamNien(NgayBatDau As DateNgayKetThuc As Date)
   
    
    
' Hàm cho ket qua: X nam, Y tháng, Z ngày
    ' "Tròn tháng"
là sô ngày cua NKT >= sô ngày cua NBD hoac NBD va NKT la ngay cuoi cua thang tuong ung.
    ' Khac phuc hàm cho ket qua sai doi voi truong hop tháng có 28,29,31 ngày.
    
   Dim Nam As Long, Thang As Long, Ngay As Long
   Dim NgayXL As Date, NgayCuoiThang1 As Date, NgayCuoiThang2 As Date
    
    ' 
Cat bo phan thoi gian (timetheo sau NgayBatDauNgayKetThuc
   NgayBatDau 
Int(NgayBatDau)
   NgayKetThuc Int(NgayKetThuc)
    
    
' Kiem tra xem ngày có hop le không?
   If NgayBatDau > NgayKetThuc Then
       ThamNien = ""
       Exit Function
   End If
    
   '
#Tìm thông sô NAM truoc, den THANG, den NGAY
   
    
' Kiem tra xem có cùng Nam giua 2 ngày can tìm thâm niên
   If Year(NgayKetThuc) > Year(NgayBatDau) Then
        
        ' 
Neu khác Nam -> Kiem tra xem Tháng có giong nhau không? -> Neu cùng Tháng
        
' -> Ktra Ngày de xem dã tròn Nam hay chua du Nam. VD: 2014/7/23 và 2015/7/20 => chua du Nam
        
       If Month(NgayKetThuc) = Month(NgayBatDau) Then
           If Day(NgayKetThuc) >= Day(NgayBatDau) Then
               Nam = DateDiff("yyyy", NgayBatDau, NgayKetThuc)
           Else
               Nam = DateDiff("yyyy", NgayBatDau, NgayKetThuc) - 1   '
Loai bo truong hop chua tròn NAMhàm DateDiff 'yyyy" vãn cho gtri = 1
           End If
            
       ' 
Truong hop nay chac chan da qua tròn NAM
       ElseIf Month
(NgayKetThuc) > Month(NgayBatDauThen
           Nam 
DateDiff("yyyy"NgayBatDauNgayKetThuc)
            
       
' Truong hop nay chua tròn NAM
       Else
           Nam = DateDiff("yyyy", NgayBatDau, NgayKetThuc) - 1
       End If
        
   ' 
Truong hop nay NAM giong nhau -> chac chan chua tròn NAM
   Else
       Nam 
0
   End 
If
    
   
' Tính xem bao nhiêu THÁNG. Chi lay phan Tháng chua tròn NAM (mod 12).
   Thang = (DateDiff("m", DateSerial(Year(NgayBatDau), Month(NgayBatDau), 1), _
   DateSerial(Year(NgayKetThuc), Month(NgayKetThuc), 1)) + IIf(Day(NgayKetThuc) >= _
   Day(NgayBatDau), 0, -1)) Mod 12
    
   ' 
Tính xem bao nhiêu Ngày da quaTruong hop NKT >= NBD.
   If Day(NgayKetThuc) >= Day(NgayBatDauThen
       Ngay 
Day(NgayKetThuc) - Day(NgayBatDau)
        
   
' Truong hop NKT<NBD -> phai kiem tra ngày cuôi cua Tháng
   ' 
NgayCuoiThang1Ngày cuôi tháng truoc NgayKetThuc
   
' NgayCuoiThang2: Ngày cuôi cua tháng NgayKetThuc
   ' 
NgayXLQui ve Tháng truoc cua NKT voi Ngày cua NBD
   Else
       NgayCuoiThang1 
DateSerial(Year(NgayKetThuc), Month(NgayKetThuc), 0)
       NgayCuoiThang2 DateSerial(Year(NgayKetThuc), Month(NgayKetThuc) + 10)
       NgayXL DateSerial(Year(NgayKetThuc), Month(NgayKetThuc) - 1Day(NgayBatDau))
       
       If NgayCuoiThang2 
NgayKetThuc Then   'NKT la ngày cuoi thang
           If Thang = 11 Then
               Thang = 0
               Nam = Nam + 1
           Else
               Thang = Thang + 1
           End If
       Else
           Ngay = DateDiff("d", IIf(NgayXL > NgayCuoiThang1, NgayCuoiThang1, NgayXL), NgayKetThuc)
       End If
   End If
    
   If Nam >= 1 Then
       ThamNien = Nam & " nam, " & Thang & " tháng, " & Ngay & " ngày"
   Else
       If Thang >= 1 Then
           ThamNien = Thang & " tháng, " & Ngay & " ngày"
       Else
           ThamNien = Ngay & " ngày"
       End If
   End If
    
End Function 

Mượn tạm file .mdb của bạn bvchauthanh làm demo
Chữ ký của ongke0711 If you BORN poor, it's not your mistake. But if you DIE poor, It's your mistake!
ღღღღღTài sản của ongke0711 (View All Items) ღღღღღ
Reply
Những người đã cảm ơn maidinhdan , bvchauthanh


Có thể liên quan đến chủ đề
Chủ đề: Tác giả Trả lời: Xem: Bài mới nhất
  Hướng Dẫn Tổng hợp các hàm Toán học nâng cao: thống kê, xác xuất, tuyến tính..(Ví dụ) maidinhdan 0 175 16-04-16, 01:15 PM
Bài mới nhất: maidinhdan
  Dùng VBA để tính tồn kho Xuân Thanh 4 1,962 23-07-15, 04:15 PM
Bài mới nhất: bvchauthanh
  [Hàm] Một số hàm liên quan đến ngày tháng và tính toán Xuân Thanh 2 936 20-03-15, 11:36 AM
Bài mới nhất: Xuân Thanh
  [Hàm] Hàm HenNgay để tính ngày kẻ từ ngày bắt đầu đến ngày có số ngày hẹn cho trước Xuân Thanh 8 1,820 15-05-14, 09:46 AM
Bài mới nhất: cawboy
  [Hàm] Hàm Work_Days để tính thời gian làm việc giữa BegDate và EndDate Xuân Thanh 1 2,335 20-03-13, 11:37 AM
Bài mới nhất: hoaiitktv

Chuyển nhanh:


User(s) browsing this thread: 1 Guest(s)
Diễn Đàn Thơ Văn Thi Ẩm Lâu|Nhà Hàng Sông Thơ