簡體   English   中英

Excel VBA ElseIf 循環

[英]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)

以下是它的工作原理,以便您可以對其進行修改以更好地滿足您的需求。

  1. MATCH function 在此數組中查找來自 G5 的值: {"Bank Op","MDS","MM"," "}並返回找到它的元素編號。 例如,空格將在第 4 個 position 中找到,而 MATCH function 返回 4。
  2. INDEX({"F&C","Credit Op","Deposit","Bankwide"}持有替代品。在第 4 個 position 是“Bankwide”,如果 G5 持有空間,則將返回。
  3. 如果 G5 保存的值不在 MATCH 數組中,則會導致錯誤。 如果出現錯誤,公式將返回 G5 中的原始值。

不幸的是,您的兩個代碼並未涵蓋所有可能性。 例如“支付”沒有對應物。 因此,我的公式將保持原樣。 如果您想要另一個結果,請將其添加到第 5 個 position {"Bank Op","MDS","MM"," ","Pay"}的 MATCH 數組中,並將對應的數組添加到 INDEX 數組中,也在第 5 個 position 中, {"F&C","Credit Op","Deposit","Bankwide","Card"} .

現在,如果您更喜歡使用 VBA 來完成所有這些操作,您將使用相同的邏輯。 您將創建兩個 arrays 而不是一系列 IF,假設您將它們命名為OriginalReplacement 您將在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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM