2017-08-08 59 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