Remove công thức tại cell nếu thỏa mãn điều kiện

Liên hệ QC

hadoan-pap

Thành viên tiêu biểu
Tham gia
8/7/15
Bài viết
453
Được thích
18
Em chào mọi người!

Dạ em có 1 file dạng như kế hoạch sản xuất, rất nhiều dòng và nhiều cột ạ... file như đính kèm và em chỉ để lại 1 vài dòng tượng trưng.

Yêu cầu bài toán như sau ạ:

- Khi chạy chương trình, sẽ lấy ra ngày chạy dạng M/dd để đối chiếu với các ngày của dòng 6 em mà em có bôi Đỏ. Nó sẽ đối chiếu lấy đúng ô ngày chạy ( 11/18 ) và sẽ lấy ra thêm 2 ngày kế tiếp so với ngày chạy. Ví dụ hôm nay 11/18 thì sẽ kiểm tra 3 ngày e bôi đỏ 11/18, 11/19, 11/20
- Nó sẽ tìm các dòng ( Quantity và Store ) được bôi Tím... Nếu số lượng ( Được bôi màu xanh lá cây ) mà >= 0 thì tại ô đó nó sẽ remove công thức và chỉ giữ lại giá trị. Nếu giá trị < 0 thi giữ nguyên không làm gì ạ... Ví dụ ô T12 có giá trị >0 nên nó sẽ remove công thức đi và chỉ giữ lại giá trị ( giống như kiểu Paste Value ạ )

Rất mong mọi người giúp ạ.

Em xin chân thành cảm ơn!
 

File đính kèm

  • Book2.xlsx
    16 KB · Đọc: 6
Em chào mọi người!

Dạ em có 1 file dạng như kế hoạch sản xuất, rất nhiều dòng và nhiều cột ạ... file như đính kèm và em chỉ để lại 1 vài dòng tượng trưng.

Yêu cầu bài toán như sau ạ:

- Khi chạy chương trình, sẽ lấy ra ngày chạy dạng M/dd để đối chiếu với các ngày của dòng 6 em mà em có bôi Đỏ. Nó sẽ đối chiếu lấy đúng ô ngày chạy ( 11/18 ) và sẽ lấy ra thêm 2 ngày kế tiếp so với ngày chạy. Ví dụ hôm nay 11/18 thì sẽ kiểm tra 3 ngày e bôi đỏ 11/18, 11/19, 11/20
- Nó sẽ tìm các dòng ( Quantity và Store ) được bôi Tím... Nếu số lượng ( Được bôi màu xanh lá cây ) mà >= 0 thì tại ô đó nó sẽ remove công thức và chỉ giữ lại giá trị. Nếu giá trị < 0 thi giữ nguyên không làm gì ạ... Ví dụ ô T12 có giá trị >0 nên nó sẽ remove công thức đi và chỉ giữ lại giá trị ( giống như kiểu Paste Value ạ )

Rất mong mọi người giúp ạ.

Em xin chân thành cảm ơn!
Thử code này.
Mã:
Sub GPE()
Dim I%, J%, sRow%
Dim aDay As Date
aDay = Date
    With Sheet1
        sRow = .Range("Y10000").End(xlUp).Row
        For I = 9 To sRow
            If .Range("P" & I).Value = "Quantity" Or .Range("P" & I).Value = "Store" Then
                For J = 20 To 25
                    If (.Cells(6, J).Value >= aDay) And (.Cells(6, J).Value <= aDay + 2) Then
                        If .Cells(I, J).Value > 0 Then
                            .Cells(I, J).Value = .Cells(I, J).Value
                        End If
                    End If
                Next J
            End If
        Next I
    End With
    MsgBox "Da thuc hien xong", , "---GPE---"
End Sub
 
Upvote 0
Thử code này.
Mã:
Sub GPE()
Dim I%, J%, sRow%
Dim aDay As Date
aDay = Date
    With Sheet1
        sRow = .Range("Y10000").End(xlUp).Row
        For I = 9 To sRow
            If .Range("P" & I).Value = "Quantity" Or .Range("P" & I).Value = "Store" Then
                For J = 20 To 25
                    If (.Cells(6, J).Value >= aDay) And (.Cells(6, J).Value <= aDay + 2) Then
                        If .Cells(I, J).Value > 0 Then
                            .Cells(I, J).Value = .Cells(I, J).Value
                        End If
                    End If
                Next J
            End If
        Next I
    End With
    MsgBox "Da thuc hien xong", , "---GPE---"
End Sub
Dạ em cảm ơn anh.

Em xin lỗi vì có logic chưa nói đúng. Em sửa lại như dưới ạ.

Nếu Value tại ngày chạy và 2 ngày kế tiếp phải cùng >=0 khi đó mới remove công thức ạ. Nếu có 1 trong 3 cái là <0 thì sẽ vẫn giữ nguyên không làm gì. Ví dụ hôm nay 19/11 thì nó sẽ check value tại U12, V12, W12 nếu cả 3 cùng dương thì mới remove công thức tại 3 ô, nếu có 1 cái âm bất kỳ thì sẽ giữ nguyên cả 3 ô không thay đổi gì ạ.

Hơn nữa số lượng cột rất nhiều nên có cách cho chạy đến cột cuối cùng mà có dữ liệu định dạng ngày ( M/dd ) ạ.

Ví dụ như trong file thì sẽ chạy đến cột 11/30 ạ.

Em xin cảm ơn!
 

File đính kèm

  • Book2.xlsm
    24.6 KB · Đọc: 4
Lần chỉnh sửa cuối:
Upvote 0
Thử code này.
Mã:
Sub GPE()
Dim I%, J%, sRow%
Dim aDay As Date
aDay = Date
    With Sheet1
        sRow = .Range("Y10000").End(xlUp).Row
        For I = 9 To sRow
            If .Range("P" & I).Value = "Quantity" Or .Range("P" & I).Value = "Store" Then
                For J = 20 To 25
                    If (.Cells(6, J).Value >= aDay) And (.Cells(6, J).Value <= aDay + 2) Then
                        If .Cells(I, J).Value > 0 Then
                            .Cells(I, J).Value = .Cells(I, J).Value
                        End If
                    End If
                Next J
            End If
        Next I
    End With
    MsgBox "Da thuc hien xong", , "---GPE---"
End Sub
Gửi anh.

Dạ đoạn tìm đủ 3 ô nếu có 1 ô bất kỳ là âm thì sẽ remove công thức em có chỉnh lại thêm từ code của anh đã ok rồi ạ.

Tuy nhiên có 1 điểm là file dữ liệu chính rất nhiều hàng và cột... Nên như em mong muốn là nó cứ loop từ dòng đầu đến dòng cuối cùng có dữ liệu và cột cũng sẽ loop đến cột cuối cùng có dữ liệu dạng date (M/dd) ạ.

Như trong code thì đang để là sRow = .Range("Y10000").End(xlUp).Row

Em xin cảm ơn!

Dim I%, J%, sRow%
Dim aDay As Date
Dim Match As Boolean
aDay = Date
With Sheet1
sRow = .Range("Y500000").End(xlUp).Row
For I = 9 To sRow
If .Range("P" & I).Value = "Quantity" Or .Range("P" & I).Value = "Store" Then
Match = True
For J = 20 To 25
If (.Cells(6, J).Value >= aDay) And (.Cells(6, J).Value <= aDay + 2) Then
If .Cells(I, J).Value < 0 Then
'.Cells(I, J).Value = .Cells(I, J).Value
Match = False
Exit For
End If
End If
Next J

If Match = True Then '''' Remove cong thuc
For J = 20 To 25
If (.Cells(6, J).Value >= aDay) And (.Cells(6, J).Value <= aDay + 2) Then
.Cells(I, J).Value = .Cells(I, J).Value
End If
Next J
End If

End If
Next I
End With
MsgBox "Da thuc hien xong"
 
Upvote 0
Dạ em cảm ơn anh.

Em xin lỗi vì có logic chưa nói đúng. Em sửa lại như dưới ạ.

Nếu Value tại ngày chạy và 2 ngày kế tiếp phải cùng >=0 khi đó mới remove công thức ạ. Nếu có 1 trong 3 cái là <0 thì sẽ vẫn giữ nguyên không làm gì. Ví dụ hôm nay 19/11 thì nó sẽ check value tại U12, V12, W12 nếu cả 3 cùng dương thì mới remove công thức tại 3 ô, nếu có 1 cái âm bất kỳ thì sẽ giữ nguyên cả 3 ô không thay đổi gì ạ.

Hơn nữa số lượng cột rất nhiều nên có cách cho chạy đến cột cuối cùng mà có dữ liệu định dạng ngày ( M/dd ) ạ.

Ví dụ như trong file thì sẽ chạy đến cột 11/30 ạ.

Em xin cảm ơn!
Thử Sub này, chỉnh lại tùy ý
PHP:
Public Sub Gpe()
Dim C As Long, I As Long, J As Long, R As Long, Cols As Long
Dim Quantity As String, Store As String, D As Long
    Quantity = "Quantity"
    Store = "Store"
    D = Date
    Cols = Range("T6").End(xlToRight).Column
    R = Range("P100000").End(xlUp).Row
    For J = 20 To Cols
        If Cells(6, J) = D Then
            C = J
            Exit For
        End If
    Next J
    For I = 9 To R
        If Range("P" & I).Value = Quantity Or Range("P" & I).Value = Store Then
            If Cells(I, C).Value > 0 Then
                If Cells(I, C + 1).Value > 0 Then
                    If Cells(I, C + 2).Value > 0 Then
                        Cells(I, C).Resize(, 3).Value = Cells(I, C).Resize(, 3).Value
                    End If
                End If
            End If
        End If
    Next I
End Sub
 
Upvote 0
Thử Sub này, chỉnh lại tùy ý
PHP:
Public Sub Gpe()
Dim C As Long, I As Long, J As Long, R As Long, Cols As Long
Dim Quantity As String, Store As String, D As Long
    Quantity = "Quantity"
    Store = "Store"
    D = Date
    Cols = Range("T6").End(xlToRight).Column
    R = Range("P100000").End(xlUp).Row
    For J = 20 To Cols
        If Cells(6, J) = D Then
            C = J
            Exit For
        End If
    Next J
    For I = 9 To R
        If Range("P" & I).Value = Quantity Or Range("P" & I).Value = Store Then
            If Cells(I, C).Value > 0 Then
                If Cells(I, C + 1).Value > 0 Then
                    If Cells(I, C + 2).Value > 0 Then
                        Cells(I, C).Resize(, 3).Value = Cells(I, C).Resize(, 3).Value
                    End If
                End If
            End If
        End If
    Next I
End Sub
Em cảm ơn đại ka ạ. :)
Bài đã được tự động gộp:

Lô gic làm việc của thớt hơi lạ.
Nếu thoả điều kiện mà "remove" (tháo gỡ) thì khi không còn thoả điều kiện phải "restore/reinstate" (dựng lại) chứ.
Dạ file này là kiểu file kế hoạch sản xuất ạ, Nên nó cũng hơi trái khoáy vì dựa vào kế hoạch nhiều cái ạ.
 
Upvote 0
Web KT
Back
Top Bottom