Excel VBA質問箱 IV

当質問箱は、有志のボランティア精神のおかげで成り立っています。
問題が解決したら、必ずお礼をしましょうね。
本サイトの基本方針をまとめました。こちら をご一読ください。

投稿種別の選択が必要です。ご注意ください。
迷惑投稿防止のため、URLの入力を制限しています。ご了承ください。


1411 / 13645 ツリー ←次へ | 前へ→

【74639】同じ値認識しない 。・゚・(ノД`)・゚・。 13/8/19(月) 17:30 質問[未読]
【74640】Re:同じ値認識しない kanabun 13/8/19(月) 17:51 発言[未読]
【74641】Re:同じ値認識しない 。・゚・(ノД`)・゚・。 13/8/20(火) 9:50 質問[未読]
【74642】Re:同じ値認識しない kanabun 13/8/20(火) 11:22 発言[未読]
【74643】Re:同じ値認識しない kanabun 13/8/20(火) 11:49 発言[未読]
【74644】Re:同じ値認識しない (*´∀`) 13/8/20(火) 15:51 質問[未読]
【74645】Re:同じ値認識しない こたつねこ 13/8/20(火) 22:52 回答[未読]
【74648】Re:同じ値認識しない (*´∀`) 13/8/21(水) 15:14 質問[未読]

【74639】同じ値認識しない
質問  。・゚・(ノД`)・゚・。  - 13/8/19(月) 17:30 -

引用なし
パスワード
   L2とB30に全く同じ数値が入っているのですが、なぜか最後のELSEに飛んで”商品はありません”と出てしまいます。
なぜなのかアドバイスお願いします。ちなみにど素人です...。

↓↓↓↓


Sub 正方形長方形9_Click()

Dim i

For i = 17 To 66

If Range("l2").Value = Range("b" & i).Value Then


Range("E" & i).Value = Range("E" & i).Value - Range("D" & i).Value * Range("M2").Value
Range("C9").Value = Range("C9").Value + Range("D" & i).Value * Range("M2").Value

Range("C" & i).Value = Range("c" & i).Value - Range("M2").Value

Range("G13").Select
  ActiveCell.FormulaR1C1 = "=SUM(R[-6]C:R[-1]C)"
  
Range("k2:m2").ClearContents
Range("N2") = "=rounddown(P2,0)"


Else

If Range("L6").Value = Range("b67").Value Then

Range("G12").Value = Range("g12").Value - Range("o2").Value
Range("C69").Value = Range("c69").Value - Range("m2").Value

Range("k2:m2").ClearContents
Range("N2") = "=rounddown(P2,0)"


Else
MsgBox "商品はありません"


Exit For
End If
End If
Next


End Sub

【74640】Re:同じ値認識しない
発言  kanabun  - 13/8/19(月) 17:51 -

引用なし
パスワード
   ▼。・゚・(ノД`)・゚・。 さん:

インデントをつけて見やすいコードを書きましょう。
> Dim i
でなく、型宣言を付けましょう
Dim i As Long

すると流れが見えてきます。

Sub 正方形長方形9_Click()

Dim i As Long

For i = 17 To 66
  If Range("L2").Value = Range("B" & i).Value Then
    Range("E" & i).Value = Range("E" & i).Value - Range("D" & i).Value * Range("M2").Value
    Range("C9").Value = Range("C9").Value + Range("D" & i).Value * Range("M2").Value
    Range("C" & i).Value = Range("c" & i).Value - Range("M2").Value
    Range("G13").FormulaR1C1 = "=SUM(R[-6]C:R[-1]C)"
     
    Range("k2:m2").ClearContents
    Range("N2").Formula = "=rounddown(P2,0)"
  
  ElseIf Range("L6").Value = Range("b67").Value Then
    Range("G12").Value = Range("g12").Value - Range("o2").Value
    Range("C69").Value = Range("c69").Value - Range("m2").Value
    
    Range("k2:m2").ClearContents
    Range("N2").Formula = "=rounddown(P2,0)"
  Else
    MsgBox "商品はありません"
    Exit For
  End If
Next

一番最初 i は 17 でループを始めます。

i = 17 のとき、
>  If Range("L2").Value = Range("B" & i).Value Then

  If Range("L2").Value = Range("B17").Value Then
の比較をします。[L2]に等しい値は [B30]にしかないのですから、
[L2]の値と [B17]の値は等しくなく、

> ElseIf Range("L6").Value = Range("b67").Value Then

にジャンプしますが、ここも等しくないので、

> Else

に飛びます。
そこで

>    MsgBox "商品はありません"

とメッセージを出し、

>    Exit For

してしまっている(Loopを抜けている)
ので、

> L2とB30に全く同じ数値が入っているのですが、
> 最後のELSEに飛んで”商品はありません”と出てしまいます。

は、コードに書いてある通りのことが起きているわけです。

【74641】Re:同じ値認識しない
質問  。・゚・(ノД`)・゚・。  - 13/8/20(火) 9:50 -

引用なし
パスワード
   ▼kanabun さん:

ありがとうございます。
御蔭で理由分かったのですが結局アホなのでコード分かりません。(´・ω・`)
全部チェックしてからのELSEはどうやって書けばいいんですか??
教えてください。

【74642】Re:同じ値認識しない
発言  kanabun  - 13/8/20(火) 11:22 -

引用なし
パスワード
   ▼。・゚・(ノД`)・゚・。 さん:

>御蔭で理由分かったのですが結局アホなのでコード分かりません。(´・ω・`)
>全部チェックしてからのELSEはどうやって書けばいいんですか??

というか、コードを見ただけでは 結局何をしたいのか分かりません。

Dim i As Long

For i = 17 To 66
  If Range("L2").Value = Range("B" & i).Value Then
    Range("E" & i).Value = Range("E" & i).Value _
     - Range("D" & i).Value * Range("M2").Value
    Range("C9").Value = Range("C9").Value _
      + Range("D" & i).Value * Range("M2").Value
    Range("C" & i).Value = Range("c" & i).Value - Range("M2").Value
    Range("G13").FormulaR1C1 = "=SUM(R[-6]C:R[-1]C)"
     
    Range("k2:m2").ClearContents
    Range("N2").Formula = "=rounddown(P2,0)"
  
  ElseIf Range("L6").Value = Range("b67").Value Then
    Range("G12").Value = Range("g12").Value - Range("o2").Value
    Range("C69").Value = Range("c69").Value - Range("m2").Value
    
    Range("k2:m2").ClearContents
    Range("N2").Formula = "=rounddown(P2,0)"
  Else
    MsgBox "商品はありません"
    Exit For
  End If
Next

現在このようになっていますが、これを簡単にすると

For i = 17 To 66
  If Range("L2").Value = Range("B" & i).Value Then
    【処理1】

  ElseIf Range("L6").Value = Range("b67").Value Then
    【処理2】

  Else
    MsgBox "商品はありません"
    Exit For
  End If
Next

とまとめることができると思うけど、ここで
>    MsgBox "商品はありません"
の文は全部調べてからなので、For〜Next のループの外に出します。

>  If Range("L2").Value = Range("B" & i).Value Then

で何回一致したか、変数に覚えておきましょう。
そうすると、こんな構文になります。

Dim Cnt As Long
For i = 17 To 66
  If Range("L2").Value = Range("B" & i).Value Then
     Cnt = Cnt + 1 '一致した回数をカウント
    【処理1】

  ElseIf Range("L6").Value = Range("b67").Value Then
    【処理2】

  End If
Next
If Cnt = 0 Then
  MsgBox "商品はありません"
End If
  
こんなふうになります。
しかし、分らないのは

>  ElseIf Range("L6").Value = Range("b67").Value Then
>    【処理2】
>
のブロックです。このブロックではセルアドレスは固定になってます。
そうすると、 iが 17 To 66 まで変わるたびに(処理(1))を通らなかったら
毎回
>  ElseIf Range("L6").Value = Range("b67").Value Then
と固定セルの値を比較していますが、
これは どういうことでしょう。
For〜Next に入る前とかで、一度だけやっておけば済むような感じですが、
たぶんそういうことではないのでしょう。
その辺のところを 日本語とか 上に書いたような疑似コードで説明してみて
ください。

【74643】Re:同じ値認識しない
発言  kanabun  - 13/8/20(火) 11:49 -

引用なし
パスワード
   もしかして、17から 66行までのセルループのなかで、
[L2]と一致するセルは1つですか?
もしそうなら、

For i = 17 To 66
  If Range("L2").Value = Range("B" & i).Value Then
    【処理1】
     Cnt = 1
     Exit For

  End If

のようにしてください。
また、ほんとに一致するセルは(あっても)1つだけなら、
Loopでなく ワークシート関数のMATCH で求めてもいいですね。

Dim m
 m = Application.Match(Range("L2"), [B17:B66], 0)
 If IsNumeric(m) Then
   MsgBox [B17:B66].Item(m).Address(0,0) & "にありました"
 Else
   MsgBox "商品はありません"
 End If

【74644】Re:同じ値認識しない
質問  (*´∀`)  - 13/8/20(火) 15:51 -

引用なし
パスワード
   ▼kanabun さん:

本当にありがとうございました。天才ですね。

結局・・・
----------------------------
Sub 正方形長方形9_Click()

Dim Cnt As Long

If Range("L6").Value = Range("b67").Value Then

Range("G12").Value = Range("g12").Value - Range("o2").Value
Range("C69").Value = Range("c69").Value - Range("m2").Value

Range("k2:m2").ClearContents
Range("N2") = "=rounddown(P2,0)"

End If

For i = 17 To 66

If Range("l2").Value = Range("b" & i).Value Then

Range("E" & i).Value = Range("E" & i).Value - Range("D" & i).Value * Range("M2").Value
Range("C9").Value = Range("C9").Value + Range("D" & i).Value * Range("M2").Value

Range("C" & i).Value = Range("c" & i).Value - Range("M2").Value

Range("G13").Select
  ActiveCell.FormulaR1C1 = "=SUM(R[-6]C:R[-1]C)"
  
Range("k2:m2").ClearContents
Range("N2") = "=rounddown(P2,0)"

Cnt = 1
Exit For
End If
Next

If Cnt = 0 Then

MsgBox "商品はありません"

End If

End Sub
-----------------------------------

の形で上手くいきました。ループから他の二つは出しました。
Matchも後でやってみます。
理解できないのですがどうしてLongで宣言してCnt=1だと一つだけになるんですか?
御察しの通りL2と同じものは一つだけです。
教えてください。

【74645】Re:同じ値認識しない
回答  こたつねこ  - 13/8/20(火) 22:52 -

引用なし
パスワード
   ▼(*´∀`) さん:

>理解できないのですがどうしてLongで宣言してCnt=1だと一つだけになるんですか?

その部分は関係ないです。
その部分はForループの中で、条件に一致したのか、条件に一致しなかったのか
の判断を行うために、変数cntを用いただけですね。

Forループの中のIf文で条件に一致した場合Exit ForでForループを抜けるよう
処理しています、よって1件一致で処理完了となります。

>If Range("l2").Value = Range("b" & i).Value Then
中略
>Exit For
 ↑ここでForループを抜ける
>End If

【74648】Re:同じ値認識しない
質問  (*´∀`)  - 13/8/21(水) 15:14 -

引用なし
パスワード
   ▼こたつねこ さん:

ありがとうございます。
条件に一致したかの判断…。(・_ゝ・)… … …?。
なぜここで新たにIF文必要ないのでしょうか??

1411 / 13645 ツリー ←次へ | 前へ→
ページ:  ┃  記事番号:
2610219
(SS)C-BOARD v3.8 is Free