Một bài toán về ngày tháng khó giải, cần a/c giúp đỡ

Liên hệ QC

hunglao

Thành viên hoạt động
Tham gia
30/8/09
Bài viết
115
Được thích
17
moz-screenshot-1.png
sieuthiNHANH2009090925137njm0mjk2yj63435.jpeg


Em xin nêu ngắn gọn, bảng tính của em, ở cột D có các giá trị
- approved
- Close
-on production
- sent & waiting

1,Em muốn rằng khi 1ô ở cột D - TEST status( ví dụ là D4) có giá trị on production thì ô B2( ở cột B- Day product) sẽ nhảy ra nggày hiện tại và ngày đó sẽ giữ nguyên( giá trị cố đinh) có tới khi em muốn thay đổi trực tiếp vào ô B4- giả sử là ngày 2/9 ( đây là điều mà hàm TODAY() không làm được- vì qua ngày mới sẽ nhảy ngày khác)
2, Giả sử em có thay một giá trị khác vào ô D4 thì ở ô B4 vẫn lưu ngày 2/9 mà không nhảy ngày khác

3. Tiếp nữa nếu giá trị D1 đổi sang sent & waiting ( giá ssử vào ngày 5/9) thì ở ô C4(Day sent to sale) sẽ nhảy ngày nhập giá trị sent & waiting( c4= ngày 5/9), và ngày đó giữ nguyên như đối với trường hợp trên ( ô B4 vẫn "đóng băng" ngày 2/9 nhé)

4. Và điều cuối cùng là em muốn áp dụng công thức này cho toàn bộ chứ không chỉ riêng 1 ô

CẢM ƠN ANH CHỊ NHIỀU NHÉ
 

File đính kèm

  • date.rar
    4.9 KB · Đọc: 16
Lần chỉnh sửa cuối:
Không biết có đúng ý bạn không nhỉ ? Chúc bạn may mắn%#^#$
 

File đính kèm

  • date.xls
    41 KB · Đọc: 20
cảm ơn bạn nhưng cái này nó khác với ý mình

mình muốn tự động nhảy ngày onproduct và sent
và nó sẽ "ĐÓng băng" luôn ( nếu muốn thay đổi phải nhập Manual)
 
cảm ơn bạn nhưng cái này nó khác với ý mình

mình muốn tự động nhảy ngày onproduct và sent
và nó sẽ "ĐÓng băng" luôn ( nếu muốn thay đổi phải nhập Manual)

Nếu bạn đã muốn tự động nhảy, vậy bạn phải dùng công thức để nó tự tính. sau đó bạn muốn đóng băng, vậy bạn phải bỏ công thức đi.
Hai cái này hơi trái ngược nhau. Bạn thử nghĩ thêm xem. Không biết bro nào có ý kiến khác không nhỉ ?
 
mình cũng chẳng biết nữa, tức là nó sẽ xuất hiện date một lần sau đó không thay đổi nữa , không biết có làm dc kô
 
Nếu bạn đã muốn tự động nhảy, vậy bạn phải dùng công thức để nó tự tính. sau đó bạn muốn đóng băng, vậy bạn phải bỏ công thức đi.
Hai cái này hơi trái ngược nhau. Bạn thử nghĩ thêm xem. Không biết bro nào có ý kiến khác không nhỉ ?
Cái này phải dùng VBA thôi bạn à!Bạn thử file này xem sao?
(Sorry Box này là hàm và công thức, nếu được MOD chuyển bài dùm, thanks in advance)

Code này chưa phải tối ưu, nhưng tạm ổn, chép thẳng vào "sheet1"
[highlight=VB]
Private Sub Worksheet_Change(ByVal Target As Range)
On Error GoTo cadafi
If Not Intersect(Target, [D2:D65536]) Is Nothing Then
For Each Cll In Target
Select Case Cll.Value
Case "On Production"
Cll.Offset(0, -2).Value = Now()
Case "Sent & Waiting"
Cll.Offset(0, -1).Value = Now() + 1
Case ""
Cll.Offset(0, -1).ClearContents
Cll.Offset(0, -2).ClearContents
Case Else
Exit Sub
End Select
Next Cll
End If

cadafi:
Exit Sub
End Sub
[/highlight]
 

File đính kèm

  • date.rar
    10.6 KB · Đọc: 16
Lần chỉnh sửa cuối:
dc 90% mong đợi của mình rồi, chỉ còn 1 cái là nếu như cùng 1 ô qua ngày khác mà mình lỡ tay chọn lại onproduct thì nó sẽ bị nhảy ngày Product đúng kô( nếu khóa dc giá trị này cố định thì tốt qua,\
à cho mình hỏi thêm 1 câu hơi ngu ngốc: cái này add vào kiểu sao vậy mà mình tìm kô thấy
 
dc 90% mong đợi của mình rồi, chỉ còn 1 cái là nếu như cùng 1 ô qua ngày khác mà mình lỡ tay chọn lại onproduct thì nó sẽ bị nhảy ngày Product đúng kô( nếu khóa dc giá trị này cố định thì tốt qua,\
à cho mình hỏi thêm 1 câu hơi ngu ngốc: cái này add vào kiểu sao vậy mà mình tìm kô thấy

Vậy sửa lại code chút xíu, thêm điều kiện kiểm tra xem cột B và C đã có dữ liệu hay chưa, nếu có rồi thì không tự động update nữa.
[highlight=VB]
Private Sub Worksheet_Change(ByVal Target As Range)
On Error GoTo cadafi
If Not Intersect(Target, [D2:D65536]) Is Nothing Then
For Each Cll In Target
Select Case Cll.Value
Case "On Production"
Cll.Offset(0, -2).Value = IIf(Cll.Offset(0, -2).Value = "", Now(), Cll.Offset(0, -2).Value)
Case "Sent & Waiting"
Cll.Offset(0, -1).Value = IIf(Cll.Offset(0, -1).Value = "", Now() + 1, Cll.Offset(0, -2).Value)
Case ""
Cll.Offset(0, -1).ClearContents
Cll.Offset(0, -2).ClearContents
Case Else
Exit Sub
End Select
Next Cll
End If

cadafi:
Exit Sub
End Sub
[/highlight]

Từ excel, bạn ấn Alt+F11 để vào trình soạn thảo VBA nhé!

attachment.php
 

File đính kèm

  • Pic02.jpg
    Pic02.jpg
    111.9 KB · Đọc: 145
  • date2.rar
    10.5 KB · Đọc: 25
Lần chỉnh sửa cuối:
thật không biết nói gì hơn để cảm ơn bác nữa, à còn chút xíu nữa thôi bác cố giúp em với
giả sử ngày 9/9 ở D3 em để onproduct thì B3 nhảy là 9/9 (OK), qua 11/9( em tự chỉnh đồng hồ) em chuyển D3 thành sent&wating thì C3 nhảy thành 11/09 (0k), nhưng
- Giả sử vào ngày 11/09 em CLICK lại thành ONpro... thì B3 vẫn giữ nguyên là9/9 (OK) nhưng C3 bỗng dưng nhảy lại thành 9/9 ( bác xem lại em cái này cái, lẽ ra nó phải giữ nguyên chứ)
**** à bác để em code này là NOW() nha, không +1 đâu, thank bác

Case "Sent & Waiting"
Cll.Offset(0, -1).Value = IIf(Cll.Offset(0, -1).Value = "", Now() + 1, Cll.Offset(0, -2).Value)
 
giả sử ngày 9/9 ở D3 em để onproduct thì B3 nhảy là 9/9 (OK), qua 11/9( em tự chỉnh đồng hồ) em chuyển D3 thành sent&wating thì C3 nhảy thành 11/09 (0k), nhưng
- Giả sử vào ngày 11/09 em CLICK lại thành ONpro... thì B3 vẫn giữ nguyên là9/9 (OK) nhưng C3 bỗng dưng nhảy lại thành 9/9 ( bác xem lại em cái này cái, lẽ ra nó phải giữ nguyên chứ)

Bạn sửa lại code chút xíu, do đánh nhanh nên sai chỗ hàm Offset ở Case "Sent & Waiting", tải lại file tại bài dưới nha bạn.
[highlight=VB]
Private Sub Worksheet_Change(ByVal Target As Range)
On Error GoTo cadafi
If Not Intersect(Target, [D2:D65536]) Is Nothing Then
For Each Cll In Target
Select Case Cll.Value
Case "On Production"
Cll.Offset(0, -2).Value = IIf(Cll.Offset(0, -2).Value = "", Now(), Cll.Offset(0, -2).Value)
Case "Sent & Waiting"
'Sửa chỗ này: Offset(0, -1) mới đúng:
Cll.Offset(0, -1).Value = IIf(Cll.Offset(0, -1).Value = "", Now(), Cll.Offset(0, -1).Value)
Case ""
Cll.Offset(0, -1).ClearContents
Cll.Offset(0, -2).ClearContents
Case Else
Exit Sub
End Select
Next Cll
End If

cadafi:
Exit Sub
End Sub

[/highlight]
 
Lần chỉnh sửa cuối:
thank a nhiều a, nếu không phiền lắm anh có thể cho em xin Mail hoặc Y! dc không ạ
 
Bạn sửa lại code chút xíu, do đánh nhanh nên sai chỗ hàm Offset ở Case "Sent & Waiting", tải lại file tại bài dưới nha bạn.
[highlight=VB]
Private Sub Worksheet_Change(ByVal Target As Range)
On Error GoTo cadafi
If Not Intersect(Target, [D2:D65536]) Is Nothing Then
For Each Cll In Target
Select Case Cll.Value
Case "On Production"
Cll.Offset(0, -2).Value = IIf(Cll.Offset(0, -2).Value = "", Now(), Cll.Offset(0, -2).Value)
Case "Sent & Waiting"
'Sửa chỗ này: Offset(0, -1) mới đúng:
Cll.Offset(0, -1).Value = IIf(Cll.Offset(0, -1).Value = "", Now(), Cll.Offset(0, -1).Value)
Case ""
Cll.Offset(0, -1).ClearContents
Cll.Offset(0, -2).ClearContents
Case Else
Exit Sub
End Select
Next Cll
End If

cadafi:
Exit Sub
End Sub

[/highlight]



a/c giúp e thêm chút xiu nữa là em muốn khi Cột B nhảy ngày ( ví bụ B5) thì cột F( F5) sẽ nhảy số tuần và cột G( G5) se nhảy tháng của giá trị B5 ( tường tự cho các cell còn lại )
Vì trong VBA em không xài được WEEKNUM và MONTH
 
a/c giúp e thêm chút xiu nữa là em muốn khi Cột B nhảy ngày ( ví bụ B5) thì cột F( F5) sẽ nhảy số tuần và cột G( G5) se nhảy tháng của giá trị B5 ( tường tự cho các cell còn lại )
Vì trong VBA em không xài được WEEKNUM và MONTH
Hình như tôi đã tạo hàm WEEKNUM cho bạn rồi tại đây:
http://www.giaiphapexcel.com/forum/showthread.php?t=28058
Bạn chưa xem à?
 
Function WeekNumUDF(DateValue As Date, Optional TypeValue As Byte = 1) As Long
Dim FirstDay As Date
If TypeValue > 0 And TypeValue < 3 Then
FirstDay = DateSerial(Year(DateValue), 1, 1)
WeekNumUDF = Int((DateValue - FirstDay - Weekday(DateValue - (2 - TypeValue) * 6, 2) + 8) / 7) - (Weekday(FirstDay) <> TypeValue)
End If
End Function

Dạ , em đọc qua rồi nhưng chưa biết cách áp dụng vào bài toán của e
 
a/c nào giúp em hoàn thành bài toán này với ạ
 
Web KT
Back
Top Bottom