2017-08-08 7 views
1

私はVBAでifとelse ifを理解しようとしていますが、私のコードは動作しません。私が間違っていることをアドバイスできますか?その後、"ifと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 

私は何をしたいことは、列D内のテキストは、更新または新新製品翻訳であれば、列D内のテキストを基準にして一致した場合、列Aにポスト編集またはヒトを挿入することで、細胞内D列のセル​​は、その他が含まれている場合は、列Aはその後、私は列Aで人間を挿入したい、ポスト編集あるべき

答えて

0

If..ElseまたはSelect 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 

あなたがテーブルにルックアップを持っている場合は、例えば自分の価値観I1:I3H1:H3とあなたのルックアップ値を見つけるために、あなたは=IFERROR(VLOOKUP(D3,$H$1:$I$3,2,FALSE),"")を使用することができます。

VBAでの式は次のようになります。

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

このコードをチェックしても問題なく動作します。ありがとうございました。 – Adrian

3

あなたはコードがあることを参照してくださいSelect CaseIfから切り替えることができます低:

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

    Case "Misc" 
     pasteRange = "Human" 

End Select 

編集1:完全なコードは、このようIfにブール条件(または)を追加することができます

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 = "Updates"またはcopyRange = "New Product Translations"の場合は、テーブル全体(A3から最後の行まで)に実装したいと思います。 – Adrian

0

編集:

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 

セルの範囲が1つのセルで構成されている場合、上記のコードは機能します。倍数の場合は、正確に比較したいものをビジネスロジックと考えるべきです。ただし、最初のものだけを比較する場合は、次のようにジョブを実行します。

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

対応するすべての場所で必ず変更してください。 pasteRange = "Something"はokです。

あなたは間違って何をしているかについては

- copyRangeは何もすることはできません、あなたは少し上記の範囲にそれを設定しています。ただし、そのセルは空にすることができます。 ElseIf copyRange.Cells(1,1) = vbNullString

をこのようにあなたが空であることのための範囲の最初のセルをチェックします。これを確認するには

は、次のようにしてみてください。

+0

答えをありがとう、私はあなたのコードが実行時'13 'エラータイプの不一致 – Adrian

+0

@Adrian - どこに? – Vityata

+0

copyRange = "Updates"またはcopyRange = "New Product Translations" Then – Adrian

関連する問題