【问题标题】:Select Case Loop选择案例循环
【发布时间】:2023-03-28 00:18:01
【问题描述】:

我根据我在这里找到的另一个问题(链接:Excel VBA Select Case Loop Sub)建模了一个 Select Case 循环。

为了使其适用,我必须做的更改非常少,而且我看不出哪里出错了。这是我的代码:

Private Function getColor(ByVal MatVal As Range) As Integer
        Select Case MatVal
            Case 0 To 1
                getColor = 9: Exit Function
            Case 1.01 To 3
                getColor = 46: Exit Function
            Case 3.01 To 5
                getColor = 27: Exit Function
            Case 5.01 To 10
                getColor = 4: Exit Function
            Case 10.01 To 20
                getColor = 5: Exit Function
            Case 20.01 To 30
                getColor = 11: Exit Function
            Case 30 To 100
                getColor = 29: Exit Function
        End Select
End Function

调用方式:

Set LipR = Workbooks("LMacro.xlsm")
Set SecX = Application.Workbooks.Open(Path & "SecX.csv")
Set Xws = SecX.Sheets("SecX")


Set Lws = LipR.Sheets("Funds")




    With Lws
        For i = 2 To 10 'LwsRows



            If Lws.Range("A" & i).Value <> "" Then
            LipR.Sheets.Add(After:=LipR.Sheets(LipR.Sheets.Count)).Name = Lws.Range("A" & i).Value
            NewFund = Lws.Range("A" & i).Value
            Set Fsheet = LipR.Sheets(NewFund)               


            End If

                With Fsheet
                    FsheetRows = .Range("A" & .Rows.Count).End(xlUp).Row
                End With

                ....                    
                Set MatPhase = Fsheet.Range("O4:O" & FsheetRows)

                For Each MatVal In MatPhase.Cells
                    MatVal.Interior.ColorIndex = getColor(MatVal)
                Next MatVal

                Fsheet.Cells.EntireColumn.AutoFit

                Application.Goto _
                Reference:=Fsheet.Range("A1"), Scroll:=True

        Next i
    End With

我在这里缺少什么?我真的试图避免为此使用 if/elseif。

谢谢

【问题讨论】:

  • 1. 有什么问题? 2. 你不需要在每一行后面加上“退出函数”;一旦其中一个案例的计算结果为真,getColor 将被设置,然后它将退出案例表达式,因为没有其他案例将计算为真。
  • 我刚刚对此进行了测试,它运行良好。我确实将MatPhase 范围更改为:Set MatPhase = ActiveSheet.Range("A1:A10")。也许检查FsheetFsheetRows 是合法值?
  • 当我运行它时,颜色到处都是,或者不存在。 MatPhase 中的单元格是由公式驱动的,如果这有所作为的话。我添加了一个 matphase.select,然后在设置后立即停止,它正在获取正确的单元格。
  • 对于 MatPhase 范围内值低于 0 或 > 100 的任何单元格,您将获得不存在的颜色。“到处都是”颜色是什么意思?
  • 应该为每张创建的工作表调用这个循环,所以我将举几个例子。在创建的第一张纸上,我有几次 -113 和 17.52。也不是有色人种。我希望在 -113 上出现这个,并希望它是白色的,但不是 17。下一张表我的值范围从 0.09 到 30,全部突出显示为绿色。几张纸之后,范围全是蓝色的。我认为你是对的,问题出在我的 Sub 中,所以我将编辑我的帖子并添加更多周围的代码,看看是否有帮助。

标签: vba loops excel select-case


【解决方案1】:

我的猜测是你在调用函数的 sub 中出错了。以下内容无需对您的函数进行任何修改,只要您的值在您循环的 0 到 100 之间的范围内即可。

在我的示例中,我使用的是 Sheet2 并将 FsheetRows 设置为 20。我在 P 列中包含了一个带有 O 列值副本的屏幕截图,以防单元格颜色难以看到。根据需要进行修改以使用工作簿中的对象。

Sub ColorMyCells()

    Dim Fsheet As Worksheet
    Dim FsheetRows As Long

    Set Fsheet = ThisWorkbook.Sheets("Sheet2")
    FsheetRows = 20

    Dim MatVal As Range, MatPhase As Range

    Set MatPhase = Fsheet.Range("O4:O" & FsheetRows)

    For Each MatVal In MatPhase.Cells
        MatVal.Interior.ColorIndex = getColor(MatVal)
    Next MatVal
End Sub

运行后,范围现在看起来像下面屏幕截图中的 O 列:

【讨论】:

  • 当我在新书中创建它时,这也适用于我。我已经尝试将它与我的联系起来,并确保变量正确通过。当我更改代码以选择 MatPhase 时,它​​选择了正确的单元格。我让它输出 Fsheetrows 的值,并在对应的 Fsheet 上这样做。我所有的变量也声明为相同的类型。
【解决方案2】:

我猜你的MatVal 是一个单元格/范围

Private Function getColor(ByVal MatVal As Range) As Integer

    Select Case MatVal.Value
        Case 0 To 1: getColor = 9
        Case 1.01 To 3: getColor = 46
        Case 3.01 To 5: getColor = 27
        Case 5.01 To 10: getColor = 4
        Case 10.01 To 20: getColor = 5
        Case 20.01 To 30: getColor = 11
        Case 30 To 100: getColor = 29
    End Select
End Function

【讨论】:

  • MatVal 应该在每次循环时代表一个单元格,但我希望它在 MatPhase 范围内工作,相应地为每个单元格着色。 Fsheet 也是动态的,并且是基于其他值创建新选项卡的更大循环的一部分。这个 For Each 循环只是我在每张纸上循环时需要完成的一个格式化部分。我使用 if then 语句在另一列中设置了仅红色的另一种颜色格式设置,它工作正常,但是对于多个类,我认为 Select Case 会更好。
猜你喜欢
  • 2010-12-22
  • 2012-06-28
  • 2016-01-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-06-10
  • 1970-01-01
相关资源
最近更新 更多