2017-09-07 10 views
0

スプレッドシート自体の4つのドロップダウンリストの内容を評価する一連のIfステートメントを実行するコードを作成しようとしています。VBAの複数IF ELSE

しかし、私は選択肢の多くをしようとしたにもかかわらず取り除くように見えることはできません

場合、私はちょうど終了せずに

ブロックIFを言ってエラーが出るの下のコードを使用するとき。

ここでコードの長さをお詫びしますが、達成しようとしていることを説明する必要があると感じます。

Sub GOClick() 
Worksheets("Dashboard").Select 
If Worksheets("Dashboard").Range("B3") = "National Gallery" And 
Worksheets("Dashboard").Range("B4") = "Unframed" And 
Worksheets("Dashboard").Range("B7") = "Product Costings" And 
Worksheets("Dashboard").Range("B5") = "N/A" And 
Worksheets("Dashboard").Range("B6") = "N/A" Then 
Worksheets("(7b)").Activate 
Range("A8:F23").Copy 
Worksheets("Dashboard").Activate 
Range("D11").PasteSpecial xlPasteAll 


Else: 
If Worksheets("Dashboard").Range("B3") = "N/A" And 
Worksheets("Dashboard").Range("B4") = "N/A" And 
Worksheets("Dashboard").Range("B7") = "Product Costings" And 
Worksheets("Dashboard").Range("B5") = "N/A" And 
Worksheets("Dashboard").Range("B6") = "Inkjet" Then 
Worksheets("(1)").Activate 
Range("A5:G69").Copy 
Worksheets("Dashboard").Activate 
Range("D11").PasteSpecial xlPasteAll 


Else: 
If Worksheets("Dashboard").Range("B3") = "N/A" And 
Worksheets("Dashboard").Range("B4") = "N/A" And 
Worksheets("Dashboard").Range("B7") = "Product Costings" And 
Worksheets("Dashboard").Range("B5") = "N/A" And 
Worksheets("Dashboard").Range("B6") = "Xerox" Then 
Worksheets("(1)").Activate 
Range("A5:I101").Copy 
Worksheets("Dashboard").Activate 
Range("D11").PasteSpecial xlPasteAll 

Else: 
If Worksheets("Dashboard").Range("B3") = "Wholesale" And 
Worksheets("Dashboard").Range("B4") = "Ready to Hang" And 
Worksheets("Dashboard").Range("B7") = "Product Costings" And 
Worksheets("Dashboard").Range("B5") = "N/A" And 
Worksheets("Dashboard").Range("B6") = "N/A" Then 
Worksheets("(3a)").Activate 
Range("A5:S105").Copy 
Worksheets("Dashboard").Activate 
Range("D11").PasteSpecial xlPasteAll 
Else: MsgBox ("No Data") 
End If 

End Sub 
+5

:If'はちょうどあなたがそうでなければ'入れるたびに 'ElseIf' – tigeravatar

+0

を使用する:あなたは' if'なステートメントのネストされたを作成しているIf'、あなたは一つだけ '終わりif'終わる持っているので、プログラムがエラーをスローしているブロックの@ tigeravatarのコメントはこれを修正する必要があります。 – Jarom

+0

また、コードを適切にインデントする方法を学びます。このコードを見て、各ブロックの開始/終了位置を確実に伝えることは不可能です。 [Rubberduck](http://rubberduckvba.com/indentation)がそれを手伝ってくれます。免責事項:私はそのオープンソースのVBEアドインプロジェクトを管理しています。 –

答えて

3

ここで修正されたコードは、すべてのそれらの醜いActivateが削除無用、および適切なインデントで、です。私はまた、それをより短く短くするためにWith句を追加しました。代わりに、 `エルスの

Sub GOClick() 
With Worksheets("Dashboard") 
    If .Range("B3") = "National Gallery" And _ 
       .Range("B4") = "Unframed" And _ 
       .Range("B7") = "Product Costings" And _ 
       .Range("B5") = "N/A" And _ 
       .Range("B6") = "N/A" Then 
     Worksheets("(7b)").Range("A8:F23").Copy 
     .Range("D11").PasteSpecial xlPasteAll 

    ElseIf .Range("B3") = "N/A" And _ 
       .Range("B4") = "N/A" And _ 
       .Range("B7") = "Product Costings" And _ 
       .Range("B5") = "N/A" And _ 
       .Range("B6") = "Inkjet" Then 
     Worksheets("(1)").Range("A5:G69").Copy 
     .Range("D11").PasteSpecial xlPasteAll  

    ElseIf .Range("B3") = "N/A" And _ 
       .Range("B4") = "N/A" And _ 
       .Range("B7") = "Product Costings" And _ 
       .Range("B5") = "N/A" And _ 
       .Range("B6") = "Xerox" Then 
     Worksheets("(1)").Range("A5:I101").Copy 
     .Range("D11").PasteSpecial xlPasteAll 

    ElseIf .Range("B3") = "Wholesale" And _ 
       .Range("B4") = "Ready to Hang" And _ 
       .Range("B7") = "Product Costings" And _ 
       .Range("B5") = "N/A" And _ 
       .Range("B6") = "N/A" Then 
     Worksheets("(3a)").Range("A5:S105").Copy 
     .Range("D11").PasteSpecial xlPasteAll 
    Else 
     MsgBox ("No Data") 
    End If 
End With 

End Sub 
+1

コピーを1行に短縮することもできます。範囲( "A8:F23")。Copy .Range( "D11") '私は思う(ここでは、コメントの中で悪い行が壊れている/)。あなたはできませんか? '.Copy'は' xlPasteAll'と同じ結果でなければならないオプションの送り先パラメータを受け入れます。 –

-1

あなたのコードにEnd ifを追加します。

...... 
Range("D11").PasteSpecial xlPasteAll 
Else: MsgBox ("No Data") 
End If 
End if 
End Sub 
+1

1人の「End If」では十分ではありません。 'ElseIf'を使用することは、入れ子にされた' If'ブロックと比較して好ましいでしょう。 –