Lọc phân đoạn lương tối thiểu

  • Thread starter Thread starter KVP
  • Ngày gửi Ngày gửi
Liên hệ QC

KVP

Thành viên thường trực
Tham gia
7/7/07
Bài viết
218
Được thích
301
Nghề nghiệp
Cộng đồng
Chào các bạn
Nhờ các bạn giúp giùm thuật toán để lọc ra phân đoạn lương tối thiểu theo tháng
Mình cố nhưng không upload được file nên diễn giải như sau:
Co bảng lương tối thiểu:

tháng hiệu lực LTT
04/1995 120000
01/1997 144000
01/2000 180000
01/2001 210000
01/2003 290000
10/2005 350000
10/2006 450000
01/2008 540000
04/2009 650000
Mỗi một lần Điều chỉnh lương sẽ có 02 mốc dữ liệu được nhập từ textbox vào 2 cột :
Từ tháng đến tháng
04/2003 12/2008

Cần đưa ra được phân đoạn lương như sau:
Phân đoạn lương: Mức LTT
04/2003 09/2005 290000
10/2005 09/2006 350000
10/2006 12/2007 450000
01/2008 12/2008 540000
Theo cách mình làm thì mình phải tạo ra 2 cột dữ liệu
04/1995 120000
05/1995 120000
........
04/2009 650000

rồi dùng vòng lặp để lọc ra. Rất khó khăn và thủ công
vì kiến thức của mình về VBA vẫn còn nhiều hạn chế
Dùng cách nào tối ưu để khi nhập dữ liệu 2 cột Từ tháng Đến tháng (từ textbox) thì lọc ra được phân đoạn lương và mức lương TT như trên mong được giúp đỡ?
 
Lần chỉnh sửa cuối:
Bạn xem thử file của mình.
Nếu bạn muốn trình bày đẹp hơn thì cũng làm tương tự.
Have fun;)
 

File đính kèm

Upvote 0
Lọc phân đoạn

Bạn dùng thử file này, chỉ đơn giản là các phép tìm kiếm.
Thân!
 

File đính kèm

Upvote 0
Bạn xem thử file của mình.
Nếu bạn muốn trình bày đẹp hơn thì cũng làm tương tự.
Have fun;)
Cám ơn bạn. Ý tưởng của bạn rất đúng ý mình. Nhưng có điều nếu dùng bằng công thức thì mình cũng làm được tuy không gọn như bạn. Mình muốn dùng bằng VBA để tăng tính linh hoạt trong ứng dụng của mình
Thân
 
Upvote 0
File của bạn rất hay, đơn giản và đúng ý mình, Mình sẽ cố gắng thử chuyển ý tưởng này sang VBA xem sao
Cám ơn bạn
Bạn dùng đỡ file của HoangVuLuan chép code này vào test thử nhé. Chưa test và chưa có trường hợp ngày đầu < 01/04/1995, cái này nếu c6àn thì làm tiếp. Tạm thời xem ngày min là 01/04/1995.
PHP:
Dim rngYear As Range, rngLg As Range
Dim Ftime As Date, Etime As Date, iNgay As Date, jNgay As Date
Dim vt1 As Long, i As Long, j As Long, vt2
Sub PhanDoan()
Sheet1.Select
[B15:E100].ClearContents
Set rngYear = [B5:B13]: Set rngLg = [C5:C13]
Ftime = [E5]: Etime = [F5]
iNgay = Ftime: i = 15
'****Xem Truong hop ngay dau < 01/04/1995 phan nay chua xu lý'
If iNgay <= rngYear(1) Then iNgay = rngYear(1)
vt1 = WorksheetFunction.Match(CLng(iNgay), rngYear, 1)
vt2 = WorksheetFunction.Match(CLng(Etime), rngYear, 1)
j = 15
Cells(j, 2) = iNgay
For i = vt1 To vt2
  Cells(j, 2) = rngYear(i)
  jday = rngYear(i + 1).Value
  If jday Then
    Cells(j, 3) = DateSerial(Year(jday), Month(jday) - 1, 1)
  Else
    Cells(j, 3) = Etime
  End If
  Cells(j, 4) = rngLg(i)
  j = j + 1
Next
Set rngYear = Nothing: Set rngLg = Nothing
End Sub
Bài ngó đơn giản mà chuyển sang VBA cũng thấy phức tạp.
 
Upvote 0
Cám ơn anh Thư Nghi,
Bảng lương này không có giai đoạn <04/1995 Em quên không đưa ĐK cột Từ tháng >=04/1995
Cái em không nghĩ được ra là dùng hàm Match với matchtype =1 để xác định vị trí gần nhất.
Đoạn code của anh chỉnh sửa lại một chút về Biến jday = jngay và đặt lại đk là được như ý muốn anh ạ.
 
Lần chỉnh sửa cuối:
Upvote 0
Web KT

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

Back
Top Bottom