2016-07-17 2 views
-1

enter image description hereVBAが大きいエクセルネストされたIFを交換し、文

する私は、大規模な入れ子になったIFとステートメントを持っていると私はその管理不能以来であるとして、VBAでそれを使用しないようにしたいです。

は、私は簡単な例を使用します:文が追加するかのより多くがあるとして、VBAコードは、私が代わりに使用することができますどのような

Range("O2").Formula = "=IF(M2>TODAY(),""VALIDATED"",IF(AND(N2="""",M2=""""),""NEW ITEM"",IF(AND(N2=""NEW ITEM"",M2<TODAY()),""NOT VALIDATED""))) 

。また、私は1000行の行があるので、ループを使用する必要はありません。

更新...私はいくつかの新しいコードを追加しましたが、コードは各セルを通過し、マクロの実行時間に影響を与える可能性があります。これをスピードアップする方法はありますか?

Set Col = Range("O2:O" & lastrowOU3) 
For Each Cell In Col 
If Cell.Offset(0, -2) = 0 And Cell.Offset(0, -1) = 0 Then Cell.Value = "NEW ITEM" 
If Cell.Offset(0, -2) = 0 And Cell.Offset(0, -1) = "NEW ITEM" Then Cell.Value = "NOT VALIDATED" 
If Cell.Offset(0, -2) < Date And Cell.Offset(0, -1) = "NEW ITEM" Then Cell.Value = "NOT VALIDATED" 
If Cell.Offset(0, -2) < Date And Cell.Offset(0, -1) = "VALIDATED" Then Cell.Value = "NOT VALIDATED" 
If Cell.Offset(0, -2) < Date And Cell.Offset(0, -1) = "NOT VALIDATED" Then Cell.Value = "NOT VALIDATED 1" 
If Cell.Offset(0, -2) < Date And Cell.Offset(0, -1) = "NOT VALIDATED 1" Then Cell.Value = "NOT VALIDATED 2" 
If Cell.Offset(0, -2) >= Date Then Cell.Value = "VALIDATED" 
Next 

助けてください。

乾杯、

コナー

+0

申し訳ありません申し訳ありません追加するのは忘れました。同じ論理を2行目から最後の行までその列のすべての行に適用します。 – Conor

+0

申し訳ありませんアップロードする方法がわかりません – Conor

+0

基本的に、col Mが今日より大きい場合、col O = "VALIDATED"の値 – Conor

答えて

1
this = Format(Now, "yyyy-mm-dd") 
Set rNg = ThisWorkbook.Sheets("Sheet1").Range("m1:m200") 
For Each rCell in rNg.Cells 
    If rCell.Value > Weekday(This) Then rCell.Offset(0,2).Value = "Validated" 
    If rCell.Value = "" And rCell.Offset(0,1) ="" Then rCell.Offset(0,2).Value = "New Item" 
    If rCell.Value < Weekday(This) And rCell.Offset(0,1) ="New Item" Then rCell.Offset(0,2).Value = "Not Validated" 
Next rCell 

は独自の変数を暗くし、おそらく「『.VALUE」しかし、あなたはあなた自身のコードを試してみてくださいdidntのいずれかの方法』「でrefencedことカント」。これはあなたが探しているものです:P

+0

列Mのコレクション全体が空で、すべての "New Item "列Oに?だからあなたは一定の範囲を使用しているのですか? –

+0

さて、あなたは私に多くのことを教えてくれませんでした。あなたのポストで育った唯一の列は、何らかの方法で空白にする必要があることは言及していません。あなたがループを止める基準を知っているなら、私が "IF cell so、so =" "Exit For"と示唆したものを簡単に調整することができます。彼は十分に説明できませんでした。私は彼に頼んだものを教えてくれました –

+0

@Doug: 'Weekday()'関数はまったく必要なく、 'this'と値を比較するだけです。それは時間価値であるので、私はそれを「今」と呼んでいます。第2に、OPは、列2の最後の塗りつぶし行までループするように指定されており、一定の範囲を超えていません。 – user1016274

1

私はIFステートメントのコードを理解しましたが、これは時間がかかる可能性がある各セルを一度に実行します。これをスピードアップする方法はありますか?

Set Col = Range("O2:O" & lastrowOU3) 
For Each Cell In Col 
If Cell.Offset(0, -2) = 0 And Cell.Offset(0, -1) = 0 Then Cell.Value = "NEW ITEM" 
If Cell.Offset(0, -2) = 0 And Cell.Offset(0, -1) = "NEW ITEM" Then Cell.Value = "NOT VALIDATED" 
If Cell.Offset(0, -2) < Date And Cell.Offset(0, -1) = "NEW ITEM" Then Cell.Value = "NOT VALIDATED" 
If Cell.Offset(0, -2) < Date And Cell.Offset(0, -1) = "VALIDATED" Then Cell.Value = "NOT VALIDATED" 
If Cell.Offset(0, -2) < Date And Cell.Offset(0, -1) = "NOT VALIDATED" Then Cell.Value = "NOT VALIDATED 1" 
If Cell.Offset(0, -2) < Date And Cell.Offset(0, -1) = "NOT VALIDATED 1" Then Cell.Value = "NOT VALIDATED 2" 
If Cell.Offset(0, -2) >= Date Then Cell.Value = "VALIDATED" 
Next 
+0

'If'の代わりに' ElseIf'を使うと、すべてのセルのすべての条件をチェックするのではなく、一致するものを見つけたら停止します。また、今のように、2番目の 'If'では' 'NEW ITEM''を直ちに' 'NOT VALIDATED''に上書きします。' = 0'、 ' = Date'というケースをグループ化することもできますサブケースにネストされた 'If'sまたは' Select Case'を使用してください。コードが動作したら、codereview.stackexchange.comに向かい、改善してください。おそらく配列を使ってかなり高速化できます... – arcadeprecinct

+0

おかげで解決策を見つけてうれしく思いました。 –

関連する問題