【问题标题】:Converting a long nested if and or formula into vba case将长嵌套的 if 和 or 公式转换为 vba 案例
【发布时间】:2017-03-03 23:28:59
【问题描述】:

我有一个嵌套的 If And Or 公式,我正在尝试使用 VBA 将其转换为可能的 Case 公式(或任何其他建议都很好),但我是初学者,不知道如何。原因是这个公式目前在每个单元格AG12:ACG500 中,并且占用了太多内存,以至于电子表格非常慢。

基本上,我正在尝试将Z12:Z500(停电月份开始)列中的日期与AG6:ACG6(DATES)行中的日期相匹配,然后查看C12:C500(ACTV_NAME)列... R, S, L, MR, MS, ML, ?R, ?S or ?L 在两个日期(Z 列和第 6 行)相交的单元格中的输出 .. 这应该与甘特图栏开始的位置一致 .. 我不需要甘特图栏/颜色编码的任何帮助.. 我只需要帮助,基本上用前面提到的标记它们。

=IF(OR($Z12="",$AA12=""),"",IF(AND(AG$6=$Z12,$Z12<>"",$C12="Relay",$L12="No"),"R",IF(AND(AG$6=$Z12,$Z12<>"",$C12="Substation",$L12="No"),"S",IF(AND(AG$6=$Z12,$Z12<>"",$C12="Line",$L12="No"),"L",IF(AND(AG$6=$Z12,$Z12<>"",$C12="Relay",$L12="YES"),"MR",IF(AND(AG$6=$Z12,$Z12<>"",$C12="Substation",$L12="YES"),"MS",IF(AND($AF$6=$Z12,$Z12<>"",$C12="Line",$L12="YES"),"ML",IF(AND(AG$6=$Z12,$Z12<>"",$C12="Relay",$L12="Maybe"),"?R",IF(AND(AG$6=$Z12,$Z12<>"",$C12="Substation",$L12="Maybe"),"?S",IF(AND($AF$6=$Z12,$Z12<>"",$C12="Line",$L12="Maybe"),"?L",""))))))))))

【问题讨论】:

    标签: vba excel if-statement nested


    【解决方案1】:

    您的公式可以简化为:

    =IF(OR($Z12="",$AA12=""),"",IF(AND(AG$6=$Z12,$Z12<>""),IF($L12 = "YES","M" & LEFT($C12,1),IF($L12 = "Maybe","?" & LEFT($C12,1),LEFT($C12,1))),""))
    

    【讨论】:

    • 谢谢,太好了。但是,我仍然面临着在 182,500 个单元格中使用此公式的挑战,这会占用大量内存并极大地减慢电子表格的速度。我正在寻找一种将其转换为宏的方法,但不使用“.formula=”方法,但可能使用 CASE 或其他方法,但我不知道该怎么做。
    • @user7053814 通常你不会让人们在这里简单地为你编写 vba。既然你提供了一个公式,我就用一个公式来回答。我建议使用上述公式的逻辑来尝试创建一个循环遍历每一行以仅放置值的例程。当您遇到困难时返回您尝试过的代码并告诉我们它在哪里中断。通常在这里寻求 vba 帮助而不尝试显示 vba 是不受欢迎的。
    【解决方案2】:

    将单个公式转换为循环的例程

    这是 Scott Craner 对您的公式的简化版本,已转换为一个例程,将遍历 AG12:ACG500 中的所有单元格并检查每个单元格的相交条件。

    我无法测试这段代码,因为我没有数据集作为它的基础。话虽如此,我不确定它是否会以您想要的方式执行。让我知道它是否适合你。

    Sub compareDates()
        Dim ws As Worksheet: Set ws = ThisWorkbook.Sheets(1)
        Dim dataRange As Range: Set dataRange = ws.Range("AG12:ACG500")
        Dim oMS As Range, aN As Range, idk As Range, d As Range
        Dim yNM As Range, myCell As Range, myRow As Long, myCol As Long
    
        For Each myCell In dataRange
            myRow = myCell.Row
            myCol = myCell.Column
    
            Set oMS = ws.Range("Z" & myRow)  'Outage Month Start
            Set aN = ws.Range("C" & myRow)   'ACTV_NAME
            Set idk = ws.Range("AA" & myRow) 'not sure what AA is for
            Set d = ws.Cells(6, myCol)  'DATES
            Set yNM = ws.Range("L" & myRow)  'yes no maybe
    
            If oMS.Value = "" Or idk.Value = "" Then
                myCell.Value = ""
            ElseIf d.Value = oMS.Value And oMS.Value <> "" Then
                If UCase(yNM.Value) = UCase("Yes") Then
                    myCell.Value = "M" & Left(aN.Value, 1)
                ElseIf UCase(yNM.Value) = UCase("Maybe") Then
                    myCell.Value = "?" & Left(aN.Value, 1)
                Else: myCell.Value = Left(aN.Value, 1)
                End If
            Else: myCell.Value = ""
            End If
        Next myCell
    End Sub
    

    【讨论】:

      猜你喜欢
      • 2019-06-23
      • 2020-02-27
      • 1970-01-01
      • 2017-10-21
      • 2015-10-16
      • 1970-01-01
      • 2017-11-30
      • 1970-01-01
      相关资源
      最近更新 更多