こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

解決済みの質問

エクセルVBAの質問です。

次のようなマクロを作ったのですがエラーにはならないのですが、うまく働きません。
Else if の行が悪いと思うのですがどうなおせばいいのかわかりません。
どなたか教えてください、よろしくお願いします。


Sub 判定()

Application.ScreenUpdating = False '処理中の表示をさせない
lastrow = (Range("B4").End(xlDown).Row) 'B列の一番最後の行番号を代入

length(1) = Range("S2")

For i = length(1) + 4 + 1 To lastrow

If Cells(i - 1, 8) = "" And Cells(i - 1, 15) = "GC3" Or Cells(i - 1, 15) = "GC2" Then
Cells(i, 8) = Cells(i, 2) * Cells(1, 5) + Cells(1, 7)

ElseIf Cells(i - 1, 8) <> "" And Cells(i - 1, 15) = "DC3" Or Cells(i - 1, 15) = "DC2" Or Cells(i - 1, 15) = "DC1" Then
Cells(i, 9) = Cells(i, 2) * Cells(1, 5) - Cells(1, 7)

Else: Cells(i, 8) = Cells(i - 1, 8)
End If
    Next
End Sub

投稿日時 - 2012-01-29 07:58:04

QNo.7272761

すぐに回答ほしいです

質問者が選んだベストアンサー

もしやりたいことが、私が想像している通りであれば
If Cells(i - 1, 8) = "" And (Cells(i - 1, 15) = "GC3" Or Cells(i - 1, 15) = "GC2") Then
Cells(i, 8) = Cells(i, 2) * Cells(1, 5) + Cells(1, 7)

ElseIf Cells(i - 1, 8) <> "" And (Cells(i - 1, 15) = "DC3" Or Cells(i - 1, 15) = "DC2" Or Cells(i - 1, 15) = "DC1") Then
Cells(i, 9) = Cells(i, 2) * Cells(1, 5) - Cells(1, 7)

Else: Cells(i, 8) = Cells(i - 1, 8)
End If
と Orの部分を()で囲んでみましたが?

Cells(1, 5) + Cells(1, 7)も変数に置き換えて
長いIf分は、確かにわかりにくいのでSelectで分岐すると
掛率=Cells(1,5).Value
加算=Cells(1,7).Value
IF Cells(i - 1, 8).Value = "" Then
Slecet Case Cells(i - 1, 8).Value
Case "GC3"
Cells(i, 8).Value = Cells(i, 2).Value * 掛率 + 加算
Case "GC2"
Cells(i, 8).Value = Cells(i, 2).Value * 掛率 + 加算
Case Else
Cells(i, 8).Value = Cells(i - 1, 8).Value
 End Select
Else
Slecet Case Cells(i - 1, 8).Value
Case "DC3"
Cells(i, 9).Value = Cells(i, 2).Value * 掛率 - 加算
Case "DC2"
Cells(i, 9).Value = Cells(i, 2).Value * 掛率 - 加算
Case "DC1"
Cells(i, 9).Value = Cells(i, 2).Value * 掛率 - 加算
Case Else
Cells(i, 8).Valuse = Cells(i - 1, 8).Value
 End Select
End If
とか言った書き方にしたら、やりたいことと一致しているかわかりやすくありませんか。
コードを記述するときですが、後から自分が見直してもわかる(他の人が見てもわかりやすい)
CellsのValueも略せずに記述しておく
方がベターです。

投稿日時 - 2012-01-29 13:45:56

お礼

hallo2007さん ありがとうございました。 
返事が遅くなってすみませんでした。

()で囲んでみたらうまく動くようになりました。
ベストアンサーにさせていただきます。

select case の方法もあることはわかっていたのですがあまり使ったことがないので
自信がありませんでした。

それからlength(1)=renge("s2")ですが他のマクロで配列を使っていてそれをコピペ
してしまいました。
動作には関係ありません。

ありがとうございました。

投稿日時 - 2012-02-04 09:12:42

このQ&Aは役に立ちましたか?

0人が「このQ&Aが役に立った」と投票しています

回答(4)

ANo.3

length(1) = Range("S2")
のlength(1) の変数に「配列」を使用していますが、必要でしょうか?

とりあえず
length = Range("S2")

For i = length + 4 + 1 To lastrow
だけで動くかどうか」、試してみは如何でしょうか。

投稿日時 - 2012-01-29 10:43:11

ANo.2

#1です。

内容は全く見ていませんが、

> Application.ScreenUpdating = False '処理中の表示をさせない

Falseにしたら、処理終了時Trueにしようと思いませんか?

投稿日時 - 2012-01-29 10:06:48

ANo.1

> うまく働きません。
> どうなおせばいいのかわかりません。

だったら、どういう動作を期待しているのかを書きましょう。

投稿日時 - 2012-01-29 09:39:04

あなたにオススメの質問