Tìm ra period với ngày tháng cho sẵn

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

thunoka

Guest
Chảo các bạn,

Mình có 1 vấn đề này muốn nhờ các bạn giúp đỡ. Mình đính kèm file này để các bạn xem. Mình xin giải thích bảng trong file như vầy: Cut-off day là ngày cuối cùng của 1 period. 1 period được tính từ ngày sau của cut-off day trước đến cut-off day này. Ví du: Ngày 15.02.2006 thuộc Period P02/2006, hay ngày 04.02.2006 cũng thuộc P02/2006.

Mình muốn hỏi là mình nên viết code (hoặc hàm) thế nào để khi nhập 1 ngày vào cột H thì sẽ tự động có Period ở hàng tương ứng ở cột I?

Cảm ơn các bạn nhiều lắm! :)
 

File đính kèm

  • Cut-off.xls
    25.5 KB · Đọc: 12
Macro của bạn đây, xin mời!

PHP:
Option Explicit

Private Sub Worksheet_Change(ByVal Target As Range)
 If Not Intersect(Target, Range("H2:H99")) Is Nothing Then
   Dim Rng As Range, sRng As Range
   Dim Jj As Byte:               Dim Dat As Date
   
   Set Rng = Range([A1], [A1].End(xlDown))
   Set sRng = Rng.Find(Target.Value, , xlFormulas, xlWhole)
   If sRng Is Nothing Then
      
      Dat = Target.Value
      Do
         Jj = Jj + 1:               If Jj > 246 Then Exit Do
         Dat = Dat + 1
         Set sRng = Rng.Find(Dat, , xlFormulas)
         If Not sRng Is Nothing Then _
            GoTo GPE
      Loop
   Else
GPE:      Target.Offset(, 1).Value = sRng.Offset(, 1).Value
   End If
 End If

End Sub

Xem thêm thong file kèm theo!
Chú í: Hiện bạn chỉ có 97 ô để có thể tác động lên macro mà thôi
 

File đính kèm

  • GPE.rar
    9.7 KB · Đọc: 13
Có thể chỉ dùng công thức:
=INDEX($A$2:$B$49;MATCH(H2;$A$2:$A$49;1)+1;2)
 

File đính kèm

  • Cut-off.xls
    29.5 KB · Đọc: 13
Có thể viết thành hàm người dùng như sau

PHP:
Option Explicit
Function PeriodDate(CSDL As Range, sDat As Range)
 Dim Taget As Range, sRng As Range, Rng As Range
 Dim Jj As Byte:               Dim Dat As Date
   
 Set Rng = CSDL.Cells(1, 1).Resize(CSDL.Rows.Count)
 Set sRng = Rng.Find(sDat.Value, , xlFormulas, xlWhole)
 If sRng Is Nothing Then
      Dat = sDat.Value
      Do
         Jj = Jj + 1:                        Dat = Dat + 1
         If Jj > 246 Then
            PeriodDate = "Xem Lai Ngay":     Exit Do
         End If
         Set sRng = Rng.Find(Dat)
         If Not sRng Is Nothing Then GoTo GPE
      Loop
   Else
GPE:      PeriodDate = sRng.Offset(, 1).Value
   End If
End Function


Lúc đó tại [I2] ta nhập cú pháp sau:

=PeriodDate(A1:B49, H2)
Chúc vui!
 
Cảm ơn các bạn đã giúp đỡ! =)

Mình muốn làm 1 cách tổng quát với bài toán như vầy:

Period 1 được tính từ thứ bảy - tuần cuối cùng của năm trước đến thứ sáu - tuần 5 của năm nay (tức là Period 1 có 5 tuần); Period 2 được tính từ thứ bảy - tuần thứ 5 đến thứ sáu - tuần thứ 9 (Period 2 có 4 tuần); Period 3 được tính từ thứ 7 - tuần 9 đến thứ 6 tuần 13 (Period 3 có 4 tuần).
Period 4 đến Period 12 lần lượt được tính giống Period 1 đến 3 theo quy tắc 5-4-4 (tuần).

Các bạn có thể giúp mình code để khi nhập ngày vào thì sẽ có được period tương ứng không?

Mình cảm ơn các bạn nhiều! =)
 
Muốn tổng quát, có tổng quát đây, xin mời!

PHP:
Option Explicit

Private Sub Worksheet_Change(ByVal Target As Range)
 If Not Intersect([B1], Target) Is Nothing Then
   Dim Dat As Date:                 Dim Rng As Range
   Dim jJ As Byte
     
   Range("E2:E17").ClearContents
   Dat = DateSerial(Target.Value, 1, 1)
   For jJ = 1 To 8
      If Weekday(Dat - jJ) = 7 Then
         [e2].Value = Dat - jJ:        [e2].Interior.ColorIndex = 34 + jJ
         Exit For
      End If
   Next jJ
   For jJ = 1 To 13
      With [e65500].End(xlUp)
         If jJ Mod 3 = 1 Then
            .Offset(1).Value = .Value + 34 + IIf(jJ = 1, 0, 1)
         Else
            .Offset(1).Value = .Value + 28
         End If
      End With
   Next jJ
 End If
End Sub

Xem thêm tại 'S0' trong file đính kèm
 

File đính kèm

  • GPE.rar
    14.5 KB · Đọc: 10
Web KT
Back
Top Bottom