【问题标题】:VBA loop one cell upward until cell not equal "" and a cell incorporate two IF functionsVBA向上循环一个单元格,直到单元格不等于“”并且一个单元格包含两个IF函数
【发布时间】:2016-11-30 20:02:23
【问题描述】:

我对 VBA 完全陌生,正在自学。问题来了:

enter image description here

所以对于 E 列 如果 B = "S" 那么 E = "" // 空

如果 B = "F" 那么 E = (Reverse Rank x PREVIOUS Adjusted Rank + no of failure + 1)/(Reverse Rank + 1)

或公式excel格式

E5 = ((D5*E4)+($K$1+1))/(D5+1)

所以问题出在公式中先前调整的排名上。比如说,要获得 E5 的值,它需要 E4 的值,但如果 E4 = "" 则它必须向上移动一个单元格。如果上一格也是="",则还要再上一格,直到不等于""。

问题是我不确定哪个功能适合使用。我认为这将是 IF 和 LOOP 但我不明白如何编写条件。就像我说的那样,我是全新的,时间限制让我感到焦虑。另外,如果您注意到,对于 E 列,我想有两个 IF 函数?一个是 E 取决于 B 列。

If Range("B2:B" & lastRow) = "S" or "F" and one is if E="" or ""

我是如何融入其中的?

【问题讨论】:

    标签: excel vba loops if-statement


    【解决方案1】:
    1. 当您遇到第一个“F”时,E 列中的第一个值是什么 B栏?我的意思是,E 栏中什么都没有,什么是“以前的调整排名”。在这种情况下,我只是将其设置为 0。
    2. 什么是“没有失败”?

    这是我为您提供的解决方案,我将“无故障”设置为零。

    Sub test()
    Dim i, j As Integer
    Dim previous As Single
    Dim NoOfFailure As Single
    For i = 2 To Cells.CurrentRegion.Rows.Count
        If Cells(i, 2).Value = "S" Then
            Cells(i, 5).Value = ""
        ElseIf Cells(i, 2).Value = "F" Then
            previous = 0
            NoOfFailure = 0
            For j = i To 2 Step -1
                If Cells(j, 5).Value <> "" Then
                    previous = Cells(j, 5).Value
                    Exit For
                End If
            Next
            Cells(i, 5).Value = (Cells(i, 4).Value * previous + NoOfFailure + 1) / (Cells(i, 4).Value + 1)
        End If
    Next
    End Sub
    

    【讨论】:

    • 哦,对于不清楚的描述,我真的很抱歉。当B=F等于1时,E中的第一列。失败次数在单元格K1中,由用户输入。非常感谢您的回答!帮我很多!
    • 感谢所有帮助我的人!我已经得到答案了!!非常感谢!!这是一个很棒的社区!
    【解决方案2】:

    我认为您可以在不使用 VBA 的情况下做到这一点。您可以使用以下内容来获取 E 列中以前的非空白值:

    E5=INDEX($E:$E,MAX(ROW($E$1:$E4)*(LEN($E$1:$E4)>0)))
    

    此公式查看单元格 E5 上方的 E 列(即 E1:E4)并返回具有最大行值且非空白(长度 > 0)的一个单元格。

    从那里,你的整个公式变成:

    E5=IF($B5="S","",IF($B5="F",($D5*INDEX($E:$E,MAX(ROW($E$1:$E4)*(LEN($E$1:$E4)>0)))+($K$1+1))/($D5+1)))
    

    请注意,这些是数组公式,因此必须使用 Ctrl+Shift+Enter 对其进行验证。此外,E 列顶部的非空白值必须手动输入或使用不同的公式输入。

    【讨论】:

    • 谢谢你x100!会试试这个!是的,最上面的列 E 我已经给出了一些价值。非常感谢
    • 顺便说一句,我不想​​要 E1:E4 之间的最大值,我只需要空单元格上方的值。只要不为零,则接受单元格上方的值。如果是这种情况,我只需要删除 'MAX(ROW($E$1:$E4)' ?
    • 不是找到最大值,而是找到最大中的非空白值,即该列中最后一个非空白值。跨度>
    • 哦,我明白了。非常感谢!我现在明白了!你帮了大忙!
    猜你喜欢
    • 1970-01-01
    • 2021-12-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-08-04
    • 1970-01-01
    • 1970-01-01
    • 2017-03-09
    相关资源
    最近更新 更多