如何检查单元格值是否大于X,从这两个值中获取差异并添加到Excel中的下一个单元格?

时间:2017-05-17 00:01:34

标签: excel vba excel-vba excel-formula

我有一个很好的问题,我真的需要帮助! 我想在Day1和Day2列中使用函数。 目标:检查每个单元格并确保它不超过27.如果是,请获取单元格值与27之间的差值,继续差异并添加到下一个单元格。

例如,在Day1列中,它将检查13是否大于27.但事实并非如此,它将保留该值。与第14和第26相同。第1天列中的下一个值是29,大于27,因此它会将该单元格值更改为27并将结果差值(29-27)= 2并添加到下面的单元格中,以便31 + 2 = 33.现在33大于27,所以它将再次将该值更改为27,并将差值(33-27)= 6并将其添加到第2天的第一个单元格中:6 + 5 = 11。

此过程也将在Day2列中重复。如果Day2列中的最后一个值不超过27,则保持原样。移至下一列并重复检查单元格值是否大于27的过程。

电流:

Time    Day1 Day2
Hour0   13   5
Hour1   14   15
Hour2   26   29
Hour3   29   26
Hour4   31   4

渴望:

Time    Day1 Day2
Hour0   13   11
Hour1   14   15
Hour2   26   27
Hour3   27   27
Hour4   27   5

现在我不是一个excel专家,所以我尝试了很少的if语句,但不认为这是解决这个问题的方法。我做了,if(A1>27, 27, A1)检查A1是否大于27,将该值更改为27,否则保留该值。但是我还需要另一个if语句,if(A1>27, A2=(A1-27) + A2, A1) 试图找到一种方法来组合这两个if语句或是否有其他我可以使用的excel函数/秘密? 请任何帮助表示赞赏。 谢谢!

2 个答案:

答案 0 :(得分:1)

您最好的选择是使用Visual Basic。将以下代码插入工作表并运行它。它会做你想要的。

Sub Test()
    Dim lngLastRow As Long
    Dim lngLoopCtr As Long
    Dim value_1 As Long
    Dim value_2 As Long
    lngLastRow = Range("A" & Rows.Count).End(xlUp).Row

    For lngLoopCtr = 2 To lngLastRow Step 1
        value_1 = Range("B" & lngLoopCtr)
        value_2 = Range("B" & lngLoopCtr + 1)
        If value_1 > 27 Then
            Range("B" & lngLoopCtr + 1) = value_2 + (value_1 - 27)
            Range("B" & lngLoopCtr) = 27
        End If
    Next lngLoopCtr

    For lngLoopCtr = 2 To lngLastRow Step 1
        value_1 = Range("C" & lngLoopCtr).Value
        value_2 = Range("C" & lngLoopCtr + 1).Value
        If value_1 > 27 Then
            Range("C" & lngLoopCtr + 1) = value_2 + (value_1 - 27)
            Range("C" & lngLoopCtr) = 27
        End If
    Next lngLoopCtr
End Sub

答案 1 :(得分:1)

使用VBA,使用“结转”变量来跟踪可以分配给下一个单元格的数量:

Sub runMe()
    Dim lastCol As Long
    Dim lastRow As Long
    Dim c As Long
    Dim r As Long
    Dim cf As Double
    With ActiveSheet
        'assumes headings in row 1, and column 1
        lastCol = .Cells(1, .Columns.Count).End(xlToLeft).Column
        lastRow = .Cells(.Rows.Count, 1).End(xlUp).Row

        For c = 2 To lastCol
            For r = 2 To lastRow
                cf = cf + CDbl(.Cells(r, c).Value)
                If cf > 27 Then
                    .Cells(r, c).Value = 27
                    cf = cf - 27
                Else
                    .Cells(r, c).Value = cf
                    cf = 0
                End If
            Next
        Next
        'place any final carry forward into a new column
        If cf > 0 Then
            .Cells(2, lastCol + 1).Value = cf
        Else
            .Cells(2, lastCol + 1).ClearContents
        End If
    End With
End Sub