选择案例语句中的数组是不是可能?

Posted

技术标签:

【中文标题】选择案例语句中的数组是不是可能?【英文标题】:Is an array inside a select case statement possible?选择案例语句中的数组是否可能? 【发布时间】:2020-02-08 02:36:13 【问题描述】:

我只是想知道我是否可以分配一个数组并将其用作 case 语句中的限定符?

Sub AccountCopy()
Dim Criteria1 As Variant
Dim Criteria2 As Variant
Dim Acct As Variant
Dim NR As Integer

Criteria1 = Array("Checking", "Savings")
Criteria2 = Array("Loans", "Credit Card")

MonthSheet.Range("T1") = "Title"
MonthSheet.Range("U1") = "Account"
MonthSheet.Range("V1") = "Description"
MonthSheet.Range("W1") = "Amount"
MonthSheet.Range("X1") = "Date"
MonthSheet.Range("Y1") = "Category"

With Range("T1:Y1")
    .Font.Name = "Calibri"
    .Font.Size = 8
    .Font.Bold = True
    .HorizontalAlignment = xlCenter
    .Style = "Title"
    .Columns.AutoFit
End With



For Each Acct In [AccountNameList]
    Select Case Acct.Offset(0, 1).Value
        Case Is = Criteria1
            NR = Range("T" & Rows.Count).End(xlUp).Row + 1 'Next Row
            'MonthSheet.Range 
        Case Criteria2
    End Select

不要太严厉地批评我,我对此还是很陌生。我不经常在fourms上发帖,但他们是一些非常有才华的人,我想问谁比那些已经编码多年的人更好?提前致谢!

这就是我想要完成的: 我想将“Criteria1”数组定义为我想要的维度。也许我想在列表中添加第三个标准。与其去改变 case 语句,我宁愿在后面的行中添加到数组中以包含那个额外的限定符。也许我设置了错误的类型?我不知道?我觉得这可以很容易地完成,但我错过了一个非常小的细节。

【问题讨论】:

【参考方案1】:

一些备注:

    您正在定义一个一维数组,而您不需要一个二/三维数组来完成您想要的。请查看Mathieu's tutorial 了解相关信息 始终fully qualify 对象以避免代码意外行为 缩进你的代码(你可以使用免费的www.rubberduckvba.com来帮助你) 您想要的完全是可行的...通过不同的方式,一种方法是使用辅助函数在数组中查找匹配项。

阅读代码的 cmets 并根据需要进行调整

辅助功能选项

Option Explicit

Public Sub AccountCopy()

    Dim Criteria1 As Variant
    Dim Criteria2 As Variant
    Dim Acct As Variant ' This can be declared as a Range
    Dim NR As Integer ' Better to name the variables to something readable like: newRow

    ' Added this new variable
    Dim accountValue As String

    Criteria1 = Array("Checking", "Savings")
    Criteria2 = Array("Loans", "Credit Card")

    MonthSheet.Range("T1") = "Title"
    MonthSheet.Range("U1") = "Account"
    MonthSheet.Range("V1") = "Description"
    MonthSheet.Range("W1") = "Amount"
    MonthSheet.Range("X1") = "Date"
    MonthSheet.Range("Y1") = "Category"

    ' This next line should be something like: <TheCodeNameOfTheSheet>.Range("T1:Y1") to be fully qualified
    With Range("T1:Y1")
        .Font.Name = "Calibri"
        .Font.Size = 8
        .Font.Bold = True
        .HorizontalAlignment = xlCenter
        .Style = "Title"
        .Columns.AutoFit
    End With


    ' In here, it's easier to understand if you use Thisworkbook.Names("AccountNameList")
    For Each Acct In [AccountNameList]

        ' Store the account next cell's value
        accountValue = Acct.Offset(0, 1).Value

        Select Case True
        Case IsInArray(accountValue, Criteria1)
            ' Do something
            Debug.Print "Something", Acct.Offset(0, 1).Address
        Case IsInArray(accountValue, Criteria2)
            ' Do something else
            Debug.Print "Something else", Acct.Offset(0, 1).Address
        End Select

    Next Acct

End Sub

Public Function IsInArray(stringToBeFound As String, arr As Variant) As Boolean
    ' Credits: https://***.com/a/11112305/1521579
    IsInArray = (UBound(Filter(arr, stringToBeFound)) > -1)
End Function

另一种方法是遍历数组项

这样的事情......

在 for each 循环中添加这个

在代码的某处需要dim counter as long

For counter = 0 To UBound(Criteria1)
    If Acct.Offset(0, 1).Value = Criteria1(counter) Then
        ' Do something
        Debug.Print "Something", Acct.Offset(0, 1).Address
    End If
Next counter

For counter = 0 To UBound(Criteria2)
    If Acct.Offset(0, 1).Value = Criteria2(counter) Then
        ' Do something else
        Debug.Print "Something else", Acct.Offset(0, 1).Address
    End If
Next counter

【讨论】:

感谢里卡多的反馈。我知道还有另一种方法可以做到这一点,但是我试图避免循环语句或函数。无论哪种方式,我都感谢您的帮助。我希望我可以在 case 函数中使用该数组,而无需超出它。但是,我好像做不到。 AFAIK 就是这样。 是的 - 有时一个想法只是一个想法。由于我还在学习,这是一个扩展我理解的好机会。这可能并不理想,但至少我可以更进一步地支持我的代码 - 谢谢! 优秀。如果这解决了您的问题,请标记它以便其他人也可以找到它

以上是关于选择案例语句中的数组是不是可能?的主要内容,如果未能解决你的问题,请参考以下文章

选择语句问题中的案例?

选择案例陈述和数据验证

SQL Server:具有多个可能条件的案例语句中的模式匹配

JavaScript Switch语句 - 单个案例中的同义词

选择Case语句和数据验证

Oracle 中的案例语句显示所有内容而不是查询项