选择案例语句中的数组是不是可能?
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:具有多个可能条件的案例语句中的模式匹配