情况:我有一个代码可以查看工作表中的某些数据,并根据某个单元格中的内容将其粘贴到另一列(同一行)上。
Ex:如果我的A5是" Bond",它会连接A5和B5的内容并将其粘贴到J5。
Obs1:对于第一,第二,第三和第四列数据,有许多子条件。
到目前为止我尝试了什么:我能够创建一个非常长的嵌套If链并考虑所有条件。我还能够使用Select case来考虑第一列条件。
问题:现在我正在尝试使用嵌套的Select Case来解释这种情况(考虑到If链是庞大的,太长而无法提高效率)。问题是我无法正确考虑多个条件的嵌套选择案例。
问题:当有多个条件时,使用嵌套Select Case的最佳方法是什么?
Obs2:从以前的研究中我发现了有关嵌套if的帖子,尤其是当存在true或false值时。这对我不起作用,因为每个层都有更多条件。
Code1:这是我到目前为止使用Select Case:
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
答案 0 :(得分:3)
您帖子的第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
构成:< / p>
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
中的示例。
已编辑&#34;已合并&#34;代码强>
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
答案 1 :(得分:1)
案例可以以与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
答案 2 :(得分:1)
这可能不是你所期望的答案,但是如果你将它应用到你自己的案例中,逻辑可以完美地运作。
让我们假设,VBA定期由Microsoft更新。至少和C#一样频繁。然后我们会有一些东西,称为[FLAGS],这个问题本来就很容易。但是,我们没有它,因此我们应该单独构建这样的东西。
想象一下,你有7个产品(AAA,BBB,CCC,DDD,EEE,FFF,GGG),你想知道你选择了哪一个。我认为这是你问题的核心。这很容易,如果你使用二进制数学 - 那么第一个产品的值为1,第二个是2,第三个是4,第四个是8等等。
因此,如果我们想象你有这个号码并且想要产品,那么这样的东西可能会起作用。 Number是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