[英]Excel VBA ElseIf Loop
我對 VBA 非常陌生,希望能得到一些幫助。 我有一個工作表,其中包含以下兩列,從單元格 G:5 和 H:5 開始。 我需要根據 G 中的值更新 H 列但卡住了。 我需要 go 向下 G 和 H 的整個列。
酸鹼度 | 程序(新邏輯) |
---|---|
訂金 | |
訂金 | |
訂金 | |
訂金 | |
支付 | |
卡片 | |
支付 |
我有下面的代碼,並嘗試根據我的需要對其進行修改,但它並沒有像我需要的那樣填充 H 中的每個單元格。 任何人都可以看看我的代碼,看看我哪里出錯了。 我的 ifelse 陳述似乎是正確的。
Sub Looper()
Dim i As String
Dim Sel As String
Dim MoveDown As String
Dim pH As String
Dim Program As String
i = 2
MoveDown = "YES"
Do Until MoveDown = "DONE"
Sel = "G5" + Replace(Str(i), " ", "")
pH = Range(Sel).Value
If pH = "Deposit" Then
Program = "Deposit"
ElseIf pH = "Card" Then
Program = "Card"
ElseIf pH = "CL" Then
Program = "CL"
ElseIf pH = "RE" Then
Program = "RE"
ElseIf pH = "Bank Op" Then
Program = "F&C"
ElseIf pH = "MDS" Then
Program = "Credit Op"
ElseIf pH = "MM" Then
Program = "Deposit"
ElseIf pH = "" Then
Program = "Bankwide"
End If
Sel = "H5" + Replace(Str(i), " ", "")
Range(Sel).Value = Program
i = i + 1
Sel = "G5" + Replace(Str(i), " ", "")
If Range(Sel).Value = "" Then
MoveDown = "DONE"
End If
Loop
End Sub
我首先在沒有循環的情況下進行了刺傷,它可以工作,但我再次需要在整個專欄中使用 go:
Sub totn()
Dim ProductSF As String
Dim ProductNew As String
ProductSF = Range("G5").Value
If ProductSF = "Deposit" Then
ProductNew = "Deposit"
ElseIf ProductSF = "Card" Then
ProductNew = "Card"
ElseIf ProductSF = "CL" Then
ProductNew = "CL"
ElseIf ProductSF = "RE" Then
ProductNew = "RE"
ElseIf ProductSF = "Bank Op" Then
ProductNew = "F&C"
ElseIf ProductSF = "MDS" Then
ProductNew = "Credit Op"
ElseIf ProductSF = "MM" Then
ProductNew = "Deposit"
ElseIf ProductSF = " " Then
ProductNew = "Bankwide"
End If
Range("H5").Value = ProductNew
End Sub
這個公式能達到你的目的嗎? 在 G5 中輸入並根據需要復制下來。
=IFERROR(INDEX({"F&C","Credit Op","Deposit","Bankwide"},MATCH(G5,{"Bank Op","MDS","MM"," "},0)),G5)
以下是它的工作原理,以便您可以對其進行修改以更好地滿足您的需求。
{"Bank Op","MDS","MM"," "}
並返回找到它的元素編號。 例如,空格將在第 4 個 position 中找到,而 MATCH function 返回 4。INDEX({"F&C","Credit Op","Deposit","Bankwide"}
持有替代品。在第 4 個 position 是“Bankwide”,如果 G5 持有空間,則將返回。 不幸的是,您的兩個代碼並未涵蓋所有可能性。 例如“支付”沒有對應物。 因此,我的公式將保持原樣。 如果您想要另一個結果,請將其添加到第 5 個 position {"Bank Op","MDS","MM"," ","Pay"}
的 MATCH 數組中,並將對應的數組添加到 INDEX 數組中,也在第 5 個 position 中, {"F&C","Credit Op","Deposit","Bankwide","Card"}
.
現在,如果您更喜歡使用 VBA 來完成所有這些操作,您將使用相同的邏輯。 您將創建兩個 arrays 而不是一系列 IF,假設您將它們命名為Original
和Replacement
。 您將在Original
數組中查找 G5 中的項目,然后從Replacement
中選擇相同的元素。 您可以循環執行此操作,例如,
For R = 5 To Cells(Rows.Count, "G").End(xlUp).Row
Cells(R, "H").Value = 0 ' do the conversion here
Next R
不混合編程邏輯和數據被認為是一種很好的做法。
如果您將數據寫入您的代碼,如下所示(數據是哪個值與哪個其他值匹配),這意味着每次必須更改這些值中的任何內容時,您都必須再次觸摸代碼。
If pH = "Deposit" Then
Program = "Deposit"
ElseIf pH = "Card" Then
Program = "Card"
ElseIf pH = "CL" Then
Program = "CL"
' …
這就是為什么這是一個不好的做法。 好的做法是將代碼與任何數據分開,因此代碼邏輯是通用的並且可以很容易地重用。 如果數據發生變化,則不需要程序員。 這也使您的代碼保持苗條和更好的可維護性,因為它不會被大量數據弄亂。
解決方案是將您的數據寫入工作表(這可能是一個隱藏的工作表,因此沒有人看到它並感到困惑)。
因此,如果您將其放入名為MatchTable
的工作表中
抬頭 | 返回 |
---|---|
訂金 | 訂金 |
卡片 | 卡片 |
CL | CL |
回覆 | 回覆 |
銀行業務 | F&C |
MDS | 信用操作 |
毫米 | 訂金 |
=" " | 全行 |
您可以在單元格 H5 中輕松使用如下查找公式
=INDEX(MatchTable!B:B,MATCH(G5,MatchTable!A:A,0))
提取匹配的數據。 然后可以將此公式復制到您的單元格的 rest 中。
現在,每當您更改MatchTable
上的某些內容時,這都可以輕松應用於您的工作表。 無需再觸碰任何代碼或觸碰任何公式。
請Pay
,如果在您的示例中找不到匹配項,則公式將顯示#N/A
錯誤。 然后你可以使用類似下面的東西來設置一個默認值:
=IFERROR(INDEX(MatchTable!B:B,MATCH(G5,MatchTable!A:A,0)),"(default, no match)")
或者類似的東西
=IFERROR(INDEX(MatchTable!B:B,MATCH(G5,MatchTable!A:A,0)),G5)
如果不匹配任何內容,則使用原始值Pay
。
如果必須使用 VBA 完成,您可以使用相同的WorksheetFunction.Index 方法和WorksheetFunction.Match 方法的組合,如上面公式中使用相同的MatchTable
。
或者,您可以使用 VBA 編寫公式
ThisWorkbook.Worksheet("Sheet1").Range("H5:H100").Formula = "=IFERROR(INDEX(MatchTable!B:B,MATCH(G:G,MatchTable!A:A,0)),G:G)"
如果需要,將公式轉換為值,然后:
With ThisWorkbook.Worksheet("Sheet1").Range("H5:H100")
.Value = .Value
End With
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.