多个条件的嵌套 Select 个案例
Nested Select Case for multiple conditions
情况: 我有一个代码遍历工作表中的一些数据,并根据特定单元格中的内容将某些内容粘贴到另一列(同一行)。
例如:如果我的A5是"Bond",它会将A5和B5的内容拼接起来,粘贴到J5中。
Obs1: 有几十个子条件,分别针对第一、二、三、四列数据。
到目前为止我尝试了什么: 我能够创建一个很长的嵌套 If 链并考虑所有条件。我还能够使用 Select 大小写来说明第一列条件。
问题: 现在我正在尝试使用嵌套的 Select 案例来解决这种情况(考虑到 If 链非常庞大,而且太长而效率不高).问题是我无法正确解释多个条件下的嵌套 Select 个案。
问题:当有多个条件时,使用嵌套 Select 案例的最佳方式是什么?
Obs2: 从之前的研究中,我发现这里有关于嵌套 if 的帖子,尤其是当存在 true 或 false 值时。这对我不起作用,因为每一层都有更多的条件。
代码 1: 这是我目前使用 Select 案例得到的结果:
Function fxr2()
Dim lRow As Long, LastRow As Long
Dim w As Workbook
Dim ws As Worksheet
Set w = ThisWorkbook
Application.ScreenUpdating = False
Application.EnableEvents = False
Application.Calculation = xlCalculationManual
LastRow = Worksheets("Fixer").Cells(Rows.Count, "A").End(xlUp).Row
For lRow = 7 To LastRow
Dim type1 As String, result As String
type1 = w.Worksheets("Fixer").Cells(lRow, 1).Text
Select Case type1
Case Is = "Bail-in"
result = w.Worksheets("Fixer").Cells(lRow, 1)
Case Is = "Basel"
result = w.Worksheets("Fixer").Cells(lRow, 1) & " " & w.Worksheets("Fixer").Cells(lRow, 2) & " " & w.Worksheets("Fixer").Cells(lRow, 3) & " " & w.Worksheets("Fixer").Cells(lRow, 4) & " " & w.Worksheets("Fixer").Cells(lRow, 5)
Case Is = "Collateral"
result = w.Worksheets("Fixer").Cells(lRow, 1) & " " & w.Worksheets("Fixer").Cells(lRow, 2) & " " & w.Worksheets("Fixer").Cells(lRow, 3)
Case Is = "Design"
result = w.Worksheets("Fixer").Cells(lRow, 1)
Case Is = "General"
result = w.Worksheets("Fixer").Cells(lRow, 1) & " " & w.Worksheets("Fixer").Cells(lRow, 2) & " " & w.Worksheets("Fixer").Cells(lRow, 3)
Case Is = "Investment"
result = w.Worksheets("Fixer").Cells(lRow, 1)
Case Is = "Lower"
result = w.Worksheets("Fixer").Cells(lRow, 1) & " " & w.Worksheets("Fixer").Cells(lRow, 2) & " " & w.Worksheets("Fixer").Cells(lRow, 3)
Case Is = "Recapitalization"
result = w.Worksheets("Fixer").Cells(lRow, 1)
Case Is = "Refinance"
result = w.Worksheets("Fixer").Cells(lRow, 1)
Case Is = "Upper"
result = w.Worksheets("Fixer").Cells(lRow, 1) & " " & w.Worksheets("Fixer").Cells(lRow, 2) & " " & w.Worksheets("Fixer").Cells(lRow, 3)
Case Else
result = w.Worksheets("Fixer").Cells(lRow, 1) & " " &
w.Worksheets("Fixer").Cells(lRow, 2)
End Select
w.Worksheets("Fixer").Cells(lRow, 10).Value = result
Next lRow
End Function
代码 2: 这是我使用嵌套 Ifs 的代码的一小部分:
ElseIf w.Worksheets("Fixer").Cells(lRow, 1) = "General" Then
w.Worksheets("Fixer").Cells(lRow, 10) =
w.Worksheets("Fixer").Cells(lRow, 1) & " " &
w.Worksheets("Fixer").Cells(lRow, 2) & " " & w.Worksheets("Fixer").Cells(lRow, 3)
If w.Worksheets("Fixer").Cells(lRow, 4) = "Base" Or
w.Worksheets("Fixer").Cells(lRow, 4) = "Inte" Or
w.Worksheets("Fixer").Cells(lRow, 4) = "Tier" Or
w.Worksheets("Fixer").Cells(lRow, 4) = "v" Or w.Worksheets("Fixer").Cells(lRow, 4) = "Ba" Or w.Worksheets("Fixer").Cells(lRow, 4) = "Bas" Or
w.Worksheets("Fixer").Cells(lRow, 4) = "Int" Or
w.Worksheets("Fixer").Cells(lRow, 4) = "Inte" Or
w.Worksheets("Fixer").Cells(lRow, 4) = "Inter" Or
w.Worksheets("Fixer").Cells(lRow, 4) = "Tie" Or
w.Worksheets("Fixer").Cells(lRow, 4) = "Tier-" Then
w.Worksheets("Fixer").Cells(lRow, 11) = ""
ElseIf w.Worksheets("Fixer").Cells(lRow, 4) = "" Or
w.Worksheets("Fixer").Cells(lRow, 4) = "Upp" Or
w.Worksheets("Fixer").Cells(lRow, 4) = "Uppe" Or
w.Worksheets("Fixer").Cells(lRow, 4) = "Upper" Or
w.Worksheets("Fixer").Cells(lRow, 4) = "I" Or w.Worksheets("Fixer").Cells(lRow, 4) = "L" Or w.Worksheets("Fixer").Cells(lRow, 4) = "T" Or
w.Worksheets("Fixer").Cells(lRow, 4) = "U" Then
w.Worksheets("Fixer").Cells(lRow, 11) = ""
ElseIf w.Worksheets("Fixer").Cells(lRow, 4) = "Design" Or
w.Worksheets("Fixer").Cells(lRow, 4) = "Inve" Or
w.Worksheets("Fixer").Cells(lRow, 4) = "Inv" Or
w.Worksheets("Fixer").Cells(lRow, 4) = "Low" Or
w.Worksheets("Fixer").Cells(lRow, 4) = "Lowe" Or
w.Worksheets("Fixer").Cells(lRow, 4) = "Proj" Or
w.Worksheets("Fixer").Cells(lRow, 4) = "Pro" Or
w.Worksheets("Fixer").Cells(lRow, 4) = "Ref" Or
w.Worksheets("Fixer").Cells(lRow, 4) = "Refi" Or
w.Worksheets("Fixer").Cells(lRow, 4) = "Stock" Or
w.Worksheets("Fixer").Cells(lRow, 4) = "Inve" Then
w.Worksheets("Fixer").Cells(lRow, 11) =
w.Worksheets("Fixer").Cells(lRow, 4)
ElseIf w.Worksheets("Fixer").Cells(lRow, 4) = "LBO" Or
w.Worksheets("Fixer").Cells(lRow, 4) = "Working" Or
w.Worksheets("Fixer").Cells(lRow, 4) = "Work" Or
w.Worksheets("Fixer").Cells(lRow, 4) = "Wor" Or
w.Worksheets("Fixer").Cells(lRow, 4) = "Gre" Or
w.Worksheets("Fixer").Cells(lRow, 4) = "Gree" Or
w.Worksheets("Fixer").Cells(lRow, 4) = "Green" Or
w.Worksheets("Fixer").Cells(lRow, 4) = "Interc" Or
w.Worksheets("Fixer").Cells(lRow, 4) = "Intercom" Or
w.Worksheets("Fixer").Cells(lRow, 4) = "Intercompany" Or
w.Worksheets("Fixer").Cells(lRow, 4) = "Intermed" Then
w.Worksheets("Fixer").Cells(lRow, 11) =
w.Worksheets("Fixer").Cells(lRow, 4)
ElseIf w.Worksheets("Fixer").Cells(lRow, 4) = "Low" Or
w.Worksheets("Fixer").Cells(lRow, 4) = "Lower" Or
w.Worksheets("Fixer").Cells(lRow, 4) = "Lowe" Or
w.Worksheets("Fixer").Cells(lRow, 4) = "No" Or w.Worksheets("Fixer").Cells(lRow, 4) = "Pen" Or w.Worksheets("Fixer").Cells(lRow, 4) = "Pens" Or w.Worksheets("Fixer").Cells(lRow, 4) = "Pension" Or w.Worksheets("Fixer").Cells(lRow, 4) = "Projec" Or w.Worksheets("Fixer").Cells(lRow, 4) = "Project" Or w.Worksheets("Fixer").Cells(lRow, 4) = "Refin" Or w.Worksheets("Fixer").Cells(lRow, 4) = "Refina" Then
w.Worksheets("Fixer").Cells(lRow, 11) = w.Worksheets("Fixer").Cells(lRow, 4)
ElseIf w.Worksheets("Fixer").Cells(lRow, 4) = "Refinanc" Or w.Worksheets("Fixer").Cells(lRow, 4) = "Refinance" Or w.Worksheets("Fixer").Cells(lRow, 4) = "Stoc" Or w.Worksheets("Fixer").Cells(lRow, 4) = "Sto" Or w.Worksheets("Fixer").Cells(lRow, 4) = "w" Or w.Worksheets("Fixer").Cells(lRow, 4) = "Wor" Or w.Worksheets("Fixer").Cells(lRow, 4) = "W" Or w.Worksheets("Fixer").Cells(lRow, 4) = "Tier-1" Or w.Worksheets("Fixer").Cells(lRow, 4) = "Tier-2" Then
w.Worksheets("Fixer").Cells(lRow, 11) = w.Worksheets("Fixer").Cells(lRow, 4)
End If
Obs3: 为了更好地说明我的数据是如何组织的,这里只介绍其中的一小部分。
您的 post 的第 1 部分(代码 1)可能看起来像下面更短和简化的版本(内部解释代码注释):
Function fxr2()
Dim lRow As Long, LastRow As Long
Dim w As Workbook
Dim ws As Worksheet
Set w = ThisWorkbook
Set ws = w.Worksheets("Fixer") '<-- set the worksheet
Application.ScreenUpdating = False
Application.EnableEvents = False
Application.Calculation = xlCalculationManual
Dim type1 As String, result As String '<-- There's no need to Dim them every time inside the loop
' use With statement, will simplify and shorten your code later
With ws
LastRow = .Cells(.Rows.Count, "A").End(xlUp).Row '<-- fully qualify Rows.Count with "Fixer" sheet
For lRow = 7 To LastRow
type1 = .Cells(lRow, 1).Text
Select Case type1
Case "Bail-in", "Investment", "Recapitalization", "Refinance", "Design"
result = .Cells(lRow, 1)
Case "Basel"
result = .Cells(lRow, 1) & " " & .Cells(lRow, 2) & " " & .Cells(lRow, 3) & " " & .Cells(lRow, 4) & " " & .Cells(lRow, 5)
Case "Collateral", "General", "Lower", "Upper"
result = .Cells(lRow, 1) & " " & .Cells(lRow, 2) & " " & .Cells(lRow, 3)
Case Else
result = .Cells(lRow, 1) & " " & .Cells(lRow, 2)
End Select
.Cells(lRow, 10).Value = result
Next lRow
End With
End Function
下面的代码2是2个Case
条件,由多个String
构成您正在尝试比较:
Select Case .Cells(lRow, 4)
Case "Base", "Inte", "Tier", "v", "Ba", "Bas", "Int", "Inte", "Inter", "Tie", "Tier-", "", "Upp", "Uppe", "Upper", "I", "L", "T"
.Cells(lRow, 11) = ""
Case "Design", "Inve", "Inv", "Low", "Lowe", "Proj", "Pro", "Ref", "Refi", "Refin", "Refina", "Refinanc", "Refinance", "Stock", "Inve", "LBO", "Working", "Work", "Wor", "Gre", _
"Gree", "Green", "Interc", "Intercom", "Intercompany", "Intermed", "Refinanc", "Stoc", "No", "Pen", "Pens", "Pension", "Projec", "Project", _
"Sto", "Stoc", "w", "Wor", "Tier-1", "Tier-2"
.Cells(lRow, 11) = .Cells(lRow, 4)
End Select
不确定这正是您要放置的位置,但这只是一个示例,说明如何使用嵌套在另一个 Select Case
.
中的 Select Case
已编辑 "Merged" 代码
Function fxr2()
Dim lRow As Long, LastRow As Long
Dim w As Workbook
Dim ws As Worksheet
Set w = ThisWorkbook
Set ws = w.Worksheets("Fixer") '<-- set the worksheet
Application.ScreenUpdating = False
Application.EnableEvents = False
Application.Calculation = xlCalculationManual
Dim type1 As String, result As String '<-- There's no need to Dim them every time inside the loop
' use With statement, will simplify and shorten your code later
With ws
LastRow = .Cells(.Rows.Count, "A").End(xlUp).Row '<-- fully qualify Rows.Count with "Fixer" sheet
For lRow = 7 To LastRow
type1 = .Cells(lRow, 1).Text
Select Case type1
Case "Bail-in", "Investment", "Recapitalization", "Refinance", "Design"
.Cells(lRow, 10).Value = .Cells(lRow, 1)
Case "Basel"
.Cells(lRow, 10).Value = .Cells(lRow, 1) & " " & .Cells(lRow, 2) & " " & .Cells(lRow, 3) & " " & .Cells(lRow, 4) & " " & .Cells(lRow, 5)
Case "Collateral", "General", "Lower", "Upper"
.Cells(lRow, 10).Value = .Cells(lRow, 1) & " " & .Cells(lRow, 2) & " " & .Cells(lRow, 3)
' ===== Added the Nested case here (just for example) =====
Select Case .Cells(lRow, 4)
Case "Base", "Inte", "Tier", "v", "Ba", "Bas", "Int", "Inte", "Inter", "Tie", "Tier-", "", "Upp", "Uppe", "Upper", "I", "L", "T"
.Cells(lRow, 11) = ""
Case "Design", "Inve", "Inv", "Low", "Lowe", "Proj", "Pro", "Ref", "Refi", "Refin", "Refina", "Refinanc", "Refinance", "Stock", "Inve", "LBO", "Working", "Work", "Wor", "Gre", _
"Gree", "Green", "Interc", "Intercom", "Intercompany", "Intermed", "Refinanc", "Stoc", "No", "Pen", "Pens", "Pension", "Projec", "Project", _
"Sto", "Stoc", "w", "Wor", "Tier-1", "Tier-2"
.Cells(lRow, 11) = .Cells(lRow, 4)
End Select
' ==== End of Nested Select Case ====
Case Else
.Cells(lRow, 10).Value = .Cells(lRow, 1) & " " & .Cells(lRow, 2)
End Select
Next lRow
End With
End Function
Case 可以像 IF 一样嵌套:
Select Case a
Case 10
Select Case b
Case 1
'a is 10, b is 1
Case 2
'a is 10, b is 2
Case 3
'a is 10, b is 3
End Select
Case 20
Select Case b
Case 1
'a is 20, b is 1
Case 2
'a is 20, b is 2
Case 3
'a is 20, b is 3
End Select
End Select
这可能不是您所期望的答案,但如果您将其应用到您自己的案例中,逻辑将完美无缺。
让我们假设 VBA 由 Microsoft 定期更新。至少和 C# 一样频繁。然后我们就会有一些东西,叫做 [FLAGS] ,这个问题就会非常简单。但是,我们没有,因此我们应该单独构建这样的东西。
想象一下,您有 7 种产品(AAA、BBB、CCC、DDD、EEE、FFF、GGG)并且您想知道您选择了哪一种。我认为这是您问题的核心。这很容易,如果你使用二进制数学 - 那么第一个产品的值为 1,第二个为 2,第三个为 4,第四个为 8 等等
- 27表示您选择了1+2+8+16。 (AAA、BBB、DDD、EEE)
- 28表示您选择了4+8+16。 (CCC, DDD, EEE)
因此,如果我们假设您有号码并且想要产品,那么这样的事情可能会奏效。数字是 lngNumber 并且 LngToBinary
为您提供数字的二进制值。在 Sub TestMe
中,您实际上可以对产品执行一些操作,而不是打印产品。
Option Explicit
Option Private Module
Public Sub TestMe()
Dim arrProducts As Variant
Dim lngCounter As Long
Dim lngValue As Long
Dim strBinary As String
Dim lngNumber As Long
arrProducts = Array("AAA", "BBB", "CCC", "DDD", "EEE", "FFF", "GGG")
'1, 2, 4, 8, 16, 32, 64
lngNumber = 28 '1+2+8+16
strBinary = StrReverse(LngToBinary(lngNumber))
For lngCounter = 1 To Len(strBinary)
lngValue = Mid(strBinary, lngCounter, 1)
If lngValue Then
Debug.Print arrProducts(lngCounter - 1)
End If
Next lngCounter
End Sub
Function LngToBinary(ByVal n As Long) As String
Dim k As Long
LngToBinary = vbNullString
If n < -2 ^ 15 Then
LngToBinary = "0"
n = n + 2 ^ 16
k = 2 ^ 14
ElseIf n < 0 Then
LngToBinary = "1"
n = n + 2 ^ 15
k = 2 ^ 14
Else
k = 2 ^ 15
End If
Do While k >= 1
LngToBinary = LngToBinary & Fix(n / k)
n = n - k * Fix(n / k)
k = k / 2
Loop
End Function
更多关于 [FLAGS] 的信息:https://msdn.microsoft.com/en-us/library/system.flagsattribute(v=vs.110).aspx
情况: 我有一个代码遍历工作表中的一些数据,并根据特定单元格中的内容将某些内容粘贴到另一列(同一行)。
例如:如果我的A5是"Bond",它会将A5和B5的内容拼接起来,粘贴到J5中。
Obs1: 有几十个子条件,分别针对第一、二、三、四列数据。
到目前为止我尝试了什么: 我能够创建一个很长的嵌套 If 链并考虑所有条件。我还能够使用 Select 大小写来说明第一列条件。
问题: 现在我正在尝试使用嵌套的 Select 案例来解决这种情况(考虑到 If 链非常庞大,而且太长而效率不高).问题是我无法正确解释多个条件下的嵌套 Select 个案。
问题:当有多个条件时,使用嵌套 Select 案例的最佳方式是什么?
Obs2: 从之前的研究中,我发现这里有关于嵌套 if 的帖子,尤其是当存在 true 或 false 值时。这对我不起作用,因为每一层都有更多的条件。
代码 1: 这是我目前使用 Select 案例得到的结果:
Function fxr2()
Dim lRow As Long, LastRow As Long
Dim w As Workbook
Dim ws As Worksheet
Set w = ThisWorkbook
Application.ScreenUpdating = False
Application.EnableEvents = False
Application.Calculation = xlCalculationManual
LastRow = Worksheets("Fixer").Cells(Rows.Count, "A").End(xlUp).Row
For lRow = 7 To LastRow
Dim type1 As String, result As String
type1 = w.Worksheets("Fixer").Cells(lRow, 1).Text
Select Case type1
Case Is = "Bail-in"
result = w.Worksheets("Fixer").Cells(lRow, 1)
Case Is = "Basel"
result = w.Worksheets("Fixer").Cells(lRow, 1) & " " & w.Worksheets("Fixer").Cells(lRow, 2) & " " & w.Worksheets("Fixer").Cells(lRow, 3) & " " & w.Worksheets("Fixer").Cells(lRow, 4) & " " & w.Worksheets("Fixer").Cells(lRow, 5)
Case Is = "Collateral"
result = w.Worksheets("Fixer").Cells(lRow, 1) & " " & w.Worksheets("Fixer").Cells(lRow, 2) & " " & w.Worksheets("Fixer").Cells(lRow, 3)
Case Is = "Design"
result = w.Worksheets("Fixer").Cells(lRow, 1)
Case Is = "General"
result = w.Worksheets("Fixer").Cells(lRow, 1) & " " & w.Worksheets("Fixer").Cells(lRow, 2) & " " & w.Worksheets("Fixer").Cells(lRow, 3)
Case Is = "Investment"
result = w.Worksheets("Fixer").Cells(lRow, 1)
Case Is = "Lower"
result = w.Worksheets("Fixer").Cells(lRow, 1) & " " & w.Worksheets("Fixer").Cells(lRow, 2) & " " & w.Worksheets("Fixer").Cells(lRow, 3)
Case Is = "Recapitalization"
result = w.Worksheets("Fixer").Cells(lRow, 1)
Case Is = "Refinance"
result = w.Worksheets("Fixer").Cells(lRow, 1)
Case Is = "Upper"
result = w.Worksheets("Fixer").Cells(lRow, 1) & " " & w.Worksheets("Fixer").Cells(lRow, 2) & " " & w.Worksheets("Fixer").Cells(lRow, 3)
Case Else
result = w.Worksheets("Fixer").Cells(lRow, 1) & " " &
w.Worksheets("Fixer").Cells(lRow, 2)
End Select
w.Worksheets("Fixer").Cells(lRow, 10).Value = result
Next lRow
End Function
代码 2: 这是我使用嵌套 Ifs 的代码的一小部分:
ElseIf w.Worksheets("Fixer").Cells(lRow, 1) = "General" Then
w.Worksheets("Fixer").Cells(lRow, 10) =
w.Worksheets("Fixer").Cells(lRow, 1) & " " &
w.Worksheets("Fixer").Cells(lRow, 2) & " " & w.Worksheets("Fixer").Cells(lRow, 3)
If w.Worksheets("Fixer").Cells(lRow, 4) = "Base" Or
w.Worksheets("Fixer").Cells(lRow, 4) = "Inte" Or
w.Worksheets("Fixer").Cells(lRow, 4) = "Tier" Or
w.Worksheets("Fixer").Cells(lRow, 4) = "v" Or w.Worksheets("Fixer").Cells(lRow, 4) = "Ba" Or w.Worksheets("Fixer").Cells(lRow, 4) = "Bas" Or
w.Worksheets("Fixer").Cells(lRow, 4) = "Int" Or
w.Worksheets("Fixer").Cells(lRow, 4) = "Inte" Or
w.Worksheets("Fixer").Cells(lRow, 4) = "Inter" Or
w.Worksheets("Fixer").Cells(lRow, 4) = "Tie" Or
w.Worksheets("Fixer").Cells(lRow, 4) = "Tier-" Then
w.Worksheets("Fixer").Cells(lRow, 11) = ""
ElseIf w.Worksheets("Fixer").Cells(lRow, 4) = "" Or
w.Worksheets("Fixer").Cells(lRow, 4) = "Upp" Or
w.Worksheets("Fixer").Cells(lRow, 4) = "Uppe" Or
w.Worksheets("Fixer").Cells(lRow, 4) = "Upper" Or
w.Worksheets("Fixer").Cells(lRow, 4) = "I" Or w.Worksheets("Fixer").Cells(lRow, 4) = "L" Or w.Worksheets("Fixer").Cells(lRow, 4) = "T" Or
w.Worksheets("Fixer").Cells(lRow, 4) = "U" Then
w.Worksheets("Fixer").Cells(lRow, 11) = ""
ElseIf w.Worksheets("Fixer").Cells(lRow, 4) = "Design" Or
w.Worksheets("Fixer").Cells(lRow, 4) = "Inve" Or
w.Worksheets("Fixer").Cells(lRow, 4) = "Inv" Or
w.Worksheets("Fixer").Cells(lRow, 4) = "Low" Or
w.Worksheets("Fixer").Cells(lRow, 4) = "Lowe" Or
w.Worksheets("Fixer").Cells(lRow, 4) = "Proj" Or
w.Worksheets("Fixer").Cells(lRow, 4) = "Pro" Or
w.Worksheets("Fixer").Cells(lRow, 4) = "Ref" Or
w.Worksheets("Fixer").Cells(lRow, 4) = "Refi" Or
w.Worksheets("Fixer").Cells(lRow, 4) = "Stock" Or
w.Worksheets("Fixer").Cells(lRow, 4) = "Inve" Then
w.Worksheets("Fixer").Cells(lRow, 11) =
w.Worksheets("Fixer").Cells(lRow, 4)
ElseIf w.Worksheets("Fixer").Cells(lRow, 4) = "LBO" Or
w.Worksheets("Fixer").Cells(lRow, 4) = "Working" Or
w.Worksheets("Fixer").Cells(lRow, 4) = "Work" Or
w.Worksheets("Fixer").Cells(lRow, 4) = "Wor" Or
w.Worksheets("Fixer").Cells(lRow, 4) = "Gre" Or
w.Worksheets("Fixer").Cells(lRow, 4) = "Gree" Or
w.Worksheets("Fixer").Cells(lRow, 4) = "Green" Or
w.Worksheets("Fixer").Cells(lRow, 4) = "Interc" Or
w.Worksheets("Fixer").Cells(lRow, 4) = "Intercom" Or
w.Worksheets("Fixer").Cells(lRow, 4) = "Intercompany" Or
w.Worksheets("Fixer").Cells(lRow, 4) = "Intermed" Then
w.Worksheets("Fixer").Cells(lRow, 11) =
w.Worksheets("Fixer").Cells(lRow, 4)
ElseIf w.Worksheets("Fixer").Cells(lRow, 4) = "Low" Or
w.Worksheets("Fixer").Cells(lRow, 4) = "Lower" Or
w.Worksheets("Fixer").Cells(lRow, 4) = "Lowe" Or
w.Worksheets("Fixer").Cells(lRow, 4) = "No" Or w.Worksheets("Fixer").Cells(lRow, 4) = "Pen" Or w.Worksheets("Fixer").Cells(lRow, 4) = "Pens" Or w.Worksheets("Fixer").Cells(lRow, 4) = "Pension" Or w.Worksheets("Fixer").Cells(lRow, 4) = "Projec" Or w.Worksheets("Fixer").Cells(lRow, 4) = "Project" Or w.Worksheets("Fixer").Cells(lRow, 4) = "Refin" Or w.Worksheets("Fixer").Cells(lRow, 4) = "Refina" Then
w.Worksheets("Fixer").Cells(lRow, 11) = w.Worksheets("Fixer").Cells(lRow, 4)
ElseIf w.Worksheets("Fixer").Cells(lRow, 4) = "Refinanc" Or w.Worksheets("Fixer").Cells(lRow, 4) = "Refinance" Or w.Worksheets("Fixer").Cells(lRow, 4) = "Stoc" Or w.Worksheets("Fixer").Cells(lRow, 4) = "Sto" Or w.Worksheets("Fixer").Cells(lRow, 4) = "w" Or w.Worksheets("Fixer").Cells(lRow, 4) = "Wor" Or w.Worksheets("Fixer").Cells(lRow, 4) = "W" Or w.Worksheets("Fixer").Cells(lRow, 4) = "Tier-1" Or w.Worksheets("Fixer").Cells(lRow, 4) = "Tier-2" Then
w.Worksheets("Fixer").Cells(lRow, 11) = w.Worksheets("Fixer").Cells(lRow, 4)
End If
Obs3: 为了更好地说明我的数据是如何组织的,这里只介绍其中的一小部分。
您的 post 的第 1 部分(代码 1)可能看起来像下面更短和简化的版本(内部解释代码注释):
Function fxr2()
Dim lRow As Long, LastRow As Long
Dim w As Workbook
Dim ws As Worksheet
Set w = ThisWorkbook
Set ws = w.Worksheets("Fixer") '<-- set the worksheet
Application.ScreenUpdating = False
Application.EnableEvents = False
Application.Calculation = xlCalculationManual
Dim type1 As String, result As String '<-- There's no need to Dim them every time inside the loop
' use With statement, will simplify and shorten your code later
With ws
LastRow = .Cells(.Rows.Count, "A").End(xlUp).Row '<-- fully qualify Rows.Count with "Fixer" sheet
For lRow = 7 To LastRow
type1 = .Cells(lRow, 1).Text
Select Case type1
Case "Bail-in", "Investment", "Recapitalization", "Refinance", "Design"
result = .Cells(lRow, 1)
Case "Basel"
result = .Cells(lRow, 1) & " " & .Cells(lRow, 2) & " " & .Cells(lRow, 3) & " " & .Cells(lRow, 4) & " " & .Cells(lRow, 5)
Case "Collateral", "General", "Lower", "Upper"
result = .Cells(lRow, 1) & " " & .Cells(lRow, 2) & " " & .Cells(lRow, 3)
Case Else
result = .Cells(lRow, 1) & " " & .Cells(lRow, 2)
End Select
.Cells(lRow, 10).Value = result
Next lRow
End With
End Function
下面的代码2是2个Case
条件,由多个String
构成您正在尝试比较:
Select Case .Cells(lRow, 4)
Case "Base", "Inte", "Tier", "v", "Ba", "Bas", "Int", "Inte", "Inter", "Tie", "Tier-", "", "Upp", "Uppe", "Upper", "I", "L", "T"
.Cells(lRow, 11) = ""
Case "Design", "Inve", "Inv", "Low", "Lowe", "Proj", "Pro", "Ref", "Refi", "Refin", "Refina", "Refinanc", "Refinance", "Stock", "Inve", "LBO", "Working", "Work", "Wor", "Gre", _
"Gree", "Green", "Interc", "Intercom", "Intercompany", "Intermed", "Refinanc", "Stoc", "No", "Pen", "Pens", "Pension", "Projec", "Project", _
"Sto", "Stoc", "w", "Wor", "Tier-1", "Tier-2"
.Cells(lRow, 11) = .Cells(lRow, 4)
End Select
不确定这正是您要放置的位置,但这只是一个示例,说明如何使用嵌套在另一个 Select Case
.
Select Case
已编辑 "Merged" 代码
Function fxr2()
Dim lRow As Long, LastRow As Long
Dim w As Workbook
Dim ws As Worksheet
Set w = ThisWorkbook
Set ws = w.Worksheets("Fixer") '<-- set the worksheet
Application.ScreenUpdating = False
Application.EnableEvents = False
Application.Calculation = xlCalculationManual
Dim type1 As String, result As String '<-- There's no need to Dim them every time inside the loop
' use With statement, will simplify and shorten your code later
With ws
LastRow = .Cells(.Rows.Count, "A").End(xlUp).Row '<-- fully qualify Rows.Count with "Fixer" sheet
For lRow = 7 To LastRow
type1 = .Cells(lRow, 1).Text
Select Case type1
Case "Bail-in", "Investment", "Recapitalization", "Refinance", "Design"
.Cells(lRow, 10).Value = .Cells(lRow, 1)
Case "Basel"
.Cells(lRow, 10).Value = .Cells(lRow, 1) & " " & .Cells(lRow, 2) & " " & .Cells(lRow, 3) & " " & .Cells(lRow, 4) & " " & .Cells(lRow, 5)
Case "Collateral", "General", "Lower", "Upper"
.Cells(lRow, 10).Value = .Cells(lRow, 1) & " " & .Cells(lRow, 2) & " " & .Cells(lRow, 3)
' ===== Added the Nested case here (just for example) =====
Select Case .Cells(lRow, 4)
Case "Base", "Inte", "Tier", "v", "Ba", "Bas", "Int", "Inte", "Inter", "Tie", "Tier-", "", "Upp", "Uppe", "Upper", "I", "L", "T"
.Cells(lRow, 11) = ""
Case "Design", "Inve", "Inv", "Low", "Lowe", "Proj", "Pro", "Ref", "Refi", "Refin", "Refina", "Refinanc", "Refinance", "Stock", "Inve", "LBO", "Working", "Work", "Wor", "Gre", _
"Gree", "Green", "Interc", "Intercom", "Intercompany", "Intermed", "Refinanc", "Stoc", "No", "Pen", "Pens", "Pension", "Projec", "Project", _
"Sto", "Stoc", "w", "Wor", "Tier-1", "Tier-2"
.Cells(lRow, 11) = .Cells(lRow, 4)
End Select
' ==== End of Nested Select Case ====
Case Else
.Cells(lRow, 10).Value = .Cells(lRow, 1) & " " & .Cells(lRow, 2)
End Select
Next lRow
End With
End Function
Case 可以像 IF 一样嵌套:
Select Case a
Case 10
Select Case b
Case 1
'a is 10, b is 1
Case 2
'a is 10, b is 2
Case 3
'a is 10, b is 3
End Select
Case 20
Select Case b
Case 1
'a is 20, b is 1
Case 2
'a is 20, b is 2
Case 3
'a is 20, b is 3
End Select
End Select
这可能不是您所期望的答案,但如果您将其应用到您自己的案例中,逻辑将完美无缺。
让我们假设 VBA 由 Microsoft 定期更新。至少和 C# 一样频繁。然后我们就会有一些东西,叫做 [FLAGS] ,这个问题就会非常简单。但是,我们没有,因此我们应该单独构建这样的东西。
想象一下,您有 7 种产品(AAA、BBB、CCC、DDD、EEE、FFF、GGG)并且您想知道您选择了哪一种。我认为这是您问题的核心。这很容易,如果你使用二进制数学 - 那么第一个产品的值为 1,第二个为 2,第三个为 4,第四个为 8 等等
- 27表示您选择了1+2+8+16。 (AAA、BBB、DDD、EEE)
- 28表示您选择了4+8+16。 (CCC, DDD, EEE)
因此,如果我们假设您有号码并且想要产品,那么这样的事情可能会奏效。数字是 lngNumber 并且 LngToBinary
为您提供数字的二进制值。在 Sub TestMe
中,您实际上可以对产品执行一些操作,而不是打印产品。
Option Explicit
Option Private Module
Public Sub TestMe()
Dim arrProducts As Variant
Dim lngCounter As Long
Dim lngValue As Long
Dim strBinary As String
Dim lngNumber As Long
arrProducts = Array("AAA", "BBB", "CCC", "DDD", "EEE", "FFF", "GGG")
'1, 2, 4, 8, 16, 32, 64
lngNumber = 28 '1+2+8+16
strBinary = StrReverse(LngToBinary(lngNumber))
For lngCounter = 1 To Len(strBinary)
lngValue = Mid(strBinary, lngCounter, 1)
If lngValue Then
Debug.Print arrProducts(lngCounter - 1)
End If
Next lngCounter
End Sub
Function LngToBinary(ByVal n As Long) As String
Dim k As Long
LngToBinary = vbNullString
If n < -2 ^ 15 Then
LngToBinary = "0"
n = n + 2 ^ 16
k = 2 ^ 14
ElseIf n < 0 Then
LngToBinary = "1"
n = n + 2 ^ 15
k = 2 ^ 14
Else
k = 2 ^ 15
End If
Do While k >= 1
LngToBinary = LngToBinary & Fix(n / k)
n = n - k * Fix(n / k)
k = k / 2
Loop
End Function
更多关于 [FLAGS] 的信息:https://msdn.microsoft.com/en-us/library/system.flagsattribute(v=vs.110).aspx