2017-08-08 18 views
1

我想了解如果和如果在VBA,但我的代碼不起作用。你能告訴我做錯了什麼嗎?如何提高我的「if and else if」VBA?代碼

Sub columnA() 
Dim r As Range 
Dim src As Worksheet 
Dim copyRange As Range 
Dim pasteRange As Range 
Set src = ThisWorkbook.Sheets("report") 

lastRow = src.Range("D" & src.Rows.Count).End(xlUp).Row 
Set copyRange = src.Range("D3:D" & lastRow) 
Set pasteRange = src.Range("A3:A" & lastRow) 

If copyRange = "Updates" Then 
pasteRange = "Post-Edit" 
ElseIf copyRange = "New Product Translations" Then 
pasteRange = "Post-Edit" 
ElseIf copyRange = "Misc" Then 
pasteRange = "Human" 
ElseIf copyRange Is Nothing Then Exit Sub 
End If 

End Sub 

我想要做的是插入後編輯或人類在A列,如果在列d文本匹配標準,因此,如果在列d文字更新新新產品翻譯然後將細胞在列A應該是後期編輯,如果在列d細胞包含其它然後我要插入列A 人力

回答

0

您可以使用公式而不是If..ElseSelect Case
該公式如果直接鍵入,則爲=IF(OR($D3="Updates",$D3="New Product Translations"),"Post-Edit",IF($D3="Misc","Human",""))

在你的代碼,這將是:

Sub columnA() 

    Dim src As Worksheet 
    Dim formulaRange As Range 
    Dim lastrow As Long 

    Set src = ThisWorkbook.Sheets("report") 
    lastrow = src.Range("D" & src.Rows.Count).End(xlUp).Row 
    Set formulaRange = src.Range("A3:A" & lastrow) 

    formulaRange.FormulaR1C1 = _ 
     "=IF(OR(RC4=""Updates"",RC4=""New Product Translations""),""Post-Edit"",IF(RC4=""Misc"",""Human"",""""))" 

    'Replace formula with values. 
    formulaRange = formulaRange.Value 

End Sub 

如果你有查找表中的,例如你的價值觀找到H1:H3和你查到的值I1:I3,你可以使用=IFERROR(VLOOKUP(D3,$H$1:$I$3,2,FALSE),"")

在VBA的公式是:

formulaRange.FormulaR1C1 = _ 
    "=IFERROR(VLOOKUP(RC4,R1C8:R3C9,2,FALSE),"""")" 
+0

我檢查了這段代碼,它工作得很好。謝謝。 – Adrian

3

您可以從If切換到Select Case,看代碼是低:

Select Case copyRange 
    Case "Updates", "New Product Translations" 
     pasteRange = "Post-Edit" 

    Case "Misc" 
     pasteRange = "Human" 

End Select 

編輯1:全部代碼編輯

Option Explicit 

Sub columnA() 

Dim R As Range 
Dim src As Worksheet 
Dim copyRange As Range 
Dim pasteRange As Range 
Dim LastRow As Long 

Set src = ThisWorkbook.Sheets("report") 
With src 
    LastRow = .Range("D" & .Rows.Count).End(xlUp).Row 
    Set copyRange = .Range("D3:D" & LastRow) 
    Set pasteRange = .Range("A3:A" & LastRow) 
End With 

If Not copyRange Is Nothing Then 
    For Each R In copyRange 
     Select Case R.Value 
      Case "Updates", "New Product Translations" 
       R.Offset(, -3).Value = "Post-Edit" ' use offset of 3 columns to put the value in column "A" 

      Case "Misc" 
       R.Offset(, -3).Value = "Human" 

     End Select 
    Next R 
End If 

End Sub 
+0

謝謝你的回答,但是,我也得到運行time'13' 錯誤類型不匹配 – Adrian

+0

@Adrian在這行你得到這個錯誤? –

+0

如果copyRange =「更新」或copyRange =「新產品翻譯」,我希望在整個表中實現這個(從A3到最後一行) – Adrian

0

您可以在If這樣添加布爾條件(或)

If copyRange = "Updates" Or copyRange = "New Product Translations" Then 
    pasteRange = "Post-Edit" 
ElseIf copyRange = "Misc" Then 
    pasteRange = "Human" 
ElseIf copyRange Is Nothing Then 
    Exit Sub 
End If 

如果單元格範圍由一個單元格組成,則上面的代碼將起作用。對於倍數,你應該考慮一個業務邏輯你想要比較什麼。但是,如果您決定僅比較第一個,則會執行此項工作:

If CopyRange.Cells(1,1) = "Updates" 

請確保相應地對其進行更改。 pasteRange = "Something"是好的。


關於你在做什麼錯 - copyRange不能沒有,你在它上面的一個位設置到一個範圍。但是,它的單元格可能是空的。

要對此進行檢查,嘗試像以下: ElseIf copyRange.Cells(1,1) = vbNullString

因此您將檢查第一個單元格的範圍內是空的。

+0

謝謝你的答案,我試圖運行你的代碼,但我得到運行時'13'錯誤類型不匹配 – Adrian

+0

@Adrian - 在哪裏? – Vityata

+0

如果copyRange =「更新」或copyRange =「新產品翻譯」然後 – Adrian