【问题标题】: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 语句,我宁愿在后面的行中添加到数组中以包含那个额外的限定符。也许我设置了错误的类型?我不知道?我觉得这可以很容易地完成,但我错过了一个非常小的细节。

【问题讨论】:

    标签: arrays excel vba select-case


    【解决方案1】:

    一些备注:

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

    阅读代码的 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://stackoverflow.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 就是这样。
    • 是的 - 有时一个想法只是一个想法。由于我还在学习,这是一个扩展我理解的好机会。这可能并不理想,但至少我可以更进一步地支持我的代码 - 谢谢!
    • 优秀。如果这解决了您的问题,请标记它以便其他人也可以找到它
    猜你喜欢
    • 2012-11-10
    • 2020-12-13
    • 2023-04-11
    • 1970-01-01
    • 1970-01-01
    • 2012-08-04
    • 1970-01-01
    • 1970-01-01
    • 2016-09-12
    相关资源
    最近更新 更多