Excel VBA質問箱 IV

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

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


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

【15714】間違えをさがしてください2 ピース 04/7/3(土) 21:58 質問[未読]
【15715】Re:間違えをさがしてください2 [名前なし] 04/7/3(土) 22:57 発言[未読]
【15716】Re:間違えをさがしてください2 ピース 04/7/3(土) 23:21 質問[未読]
【15717】Re:間違えをさがしてください2 [名前なし] 04/7/3(土) 23:38 発言[未読]
【15719】Re:間違えをさがしてください2 ピース 04/7/4(日) 0:15 発言[未読]
【15720】Re:間違えをさがしてください2 [名前なし] 04/7/4(日) 0:33 発言[未読]
【15721】Re:間違えをさがしてください2 ピース 04/7/4(日) 0:41 発言[未読]
【15722】Re:間違えをさがしてください2 ピース 04/7/4(日) 0:52 発言[未読]
【15723】Re:間違えをさがしてください2 [名前なし] 04/7/4(日) 1:02 回答[未読]
【15724】Re:間違えをさがしてください2 ピース 04/7/4(日) 10:25 発言[未読]
【15725】Re:間違えをさがしてください2 [名前なし] 04/7/4(日) 10:48 回答[未読]
【15731】Re:間違えをさがしてください2 ピース 04/7/4(日) 17:49 お礼[未読]
【15734】Re:間違えをさがしてください2 [名前なし] 04/7/4(日) 18:17 発言[未読]
【15737】Re:間違えをさがしてください2 ピース 04/7/4(日) 21:35 お礼[未読]

【15714】間違えをさがしてください2
質問  ピース  - 04/7/3(土) 21:58 -

引用なし
パスワード
   Sub henka()
  Dim k As Long, n As Long, a As Boolean

  a = False
  With Worksheets("Sheet1")
   For n = 1 To 49
     If IsNumeric(.Cells(n, 7).Value) And _
      IsNumeric(.Cells(n, 9).Value) Then
      k = .Cells(n, 7).Value - .Cells(n, 9).Value
      If k > 0 And Not a Then
       a = True
       .Cells(n, 9).Interior.ColorIndex = 3
      Else
       a = k > 0
       .Cells(n, 9).Interior.ColorIndex = 2
      End If
     End If
   Next n
  End With
End Sub
以上のプログラムがあるとして、赤で表示された数字から2つ目から赤で表示された数字を引いたときの値を求めるプログラムを作成しようとしています。
以下のようなプログラムを作成しましたが、うまくいきません。
間違いが分かる方は返信おねがいします。
PS 引いた値は赤く表示された数字の隣に表示する。
  引く値は赤く表示されたところのみとします。


Sub mouke()
  Dim k As Integer
  With Worksheets("Sheet1")
  For n = 1 To 49
      If .Cells(n, 9).Interior.ColorIndex = 3 Then
        k = .Cells(n + 2, 9).Value - .Cells(n, 9).Value
        Cells(n + 2, 10) = k * 1000
        .Cells(n + 2, 10).Interior.ColorIndex = 5
      End If
  Next n
  End With
End Sub

【15715】Re:間違えをさがしてください2
発言  [名前なし]  - 04/7/3(土) 22:57 -

引用なし
パスワード
   >赤で表示された数字から2つ目から赤で表示された数字を引いた
とありますが、
>        k = .Cells(n + 2, 9).Value - .Cells(n, 9).Value
を見ると、赤く表示されてるところの2つ下の値から赤で表示された数字を
引いてませんか?

あと、データが49行目までしかないなら、
>        k = .Cells(n + 2, 9).Value - .Cells(n, 9).Value
は空白から引くことになりますが。

それから、
>        Cells(n + 2, 10) = k * 1000
は、赤く表示されてるところの2つ下の行ですよね。

最後に、
>  Dim k As Integer
ですが、整数型(Integer)は、-32,768 〜 32,767 の値しか入れられないので、
Dim k As Long
としたほうがよいかと。

気付いた点はこんな所でしょうか。

【15716】Re:間違えをさがしてください2
質問  ピース  - 04/7/3(土) 23:21 -

引用なし
パスワード
   >>赤で表示された数字から2つ目から赤で表示された数字を引いた
>とありますが、
>>        k = .Cells(n + 2, 9).Value - .Cells(n, 9).Value
>を見ると、赤く表示されてるところの2つ下の値から赤で表示された数字を
>引いてませんか?
>
>あと、データが49行目までしかないなら、
>>        k = .Cells(n + 2, 9).Value - .Cells(n, 9).Value
>は空白から引くことになりますが。
>
>それから、
>>        Cells(n + 2, 10) = k * 1000
>は、赤く表示されてるところの2つ下の行ですよね。
>

出題ミスでした。
赤く表示されたところから2つ目から赤く表示されたところを引きたいんです。
申し訳ありません

【15717】Re:間違えをさがしてください2
発言  [名前なし]  - 04/7/3(土) 23:38 -

引用なし
パスワード
   例えば、I1,I3,I8が赤くなっているとしたら、
I3-I1の1000倍をJ3に、I8-I3の1000倍をJ8に出力ということで
いいんですか?

【15719】Re:間違えをさがしてください2
発言  ピース  - 04/7/4(日) 0:15 -

引用なし
パスワード
   ▼[名前なし] さん:
>例えば、I1,I3,I8が赤くなっているとしたら、
>I3-I1の1000倍をJ3に、I8-I3の1000倍をJ8に出力ということで
>いいんですか?

そうではなくて、I1、I4、I8が赤い場合には、
I3-I1 I6-I4、I10-I8ということです。
説明が下手ですいません。

【15720】Re:間違えをさがしてください2
発言  [名前なし]  - 04/7/4(日) 0:33 -

引用なし
パスワード
   なにがどううまくいかないのかを書いてください。
なにかエラーメッセージが出るんですか?
こうなって欲しいのにこうなってしまうとかもっと具体的に
書いてくれないと。

なんか最初の回答で解決してるような気がしてきたんですが・・・。

【15721】Re:間違えをさがしてください2
発言  ピース  - 04/7/4(日) 0:41 -

引用なし
パスワード
   ▼[名前なし] さん:
>なにがどううまくいかないのかを書いてください。
>なにかエラーメッセージが出るんですか?
>こうなって欲しいのにこうなってしまうとかもっと具体的に
>書いてくれないと。
>
>なんか最初の回答で解決してるような気がしてきたんですが・・・。

エラーはでません。
私の望む結果は、以下のようなものです
1)青色に表示されるのはJ列のみ。
2)引き算の結果は引かれる数字の隣の列(J列)だけ表示されることです。 

【15722】Re:間違えをさがしてください2
発言  ピース  - 04/7/4(日) 0:52 -

引用なし
パスワード
   それと、今回の状態以外でも動くプログラムでもあって欲しいのです。
赤を認識して赤から2つ目の値から引く。
たとえば、(19,2)が赤だったら(19,4)-(19,2)、(19,13)-(19,11)、(29,4)-(29,2)などです。
列が異なる場合には関数を別にしてもかまいません。
19列目でしたら、mouke2()
29列目でしたら、mouke3()などのように

【15723】Re:間違えをさがしてください2
回答  [名前なし]  - 04/7/4(日) 1:02 -

引用なし
パスワード
   これを試してください。
Sub mouke(CheckCol As Integer)
 Dim k As Integer, n As Long
 With Worksheets("Sheet1")
  For n = 1 To 49
   If .Cells(n, CheckCol).Interior.ColorIndex = 3 Then
    k = .Cells(n + 2, CheckCol).Value - .Cells(n, CheckCol).Value
    .Cells(n, CheckCol + 1) = k * 1000
    .Cells(n, CheckCol + 1).Interior.ColorIndex = 5
   End If
  Next n
 End With
End Sub

使うときは、別のマクロから引数に列番号を指定して使用してください。
Sub Test()
 Call mouke(9)
 Call mouke(19)
 Call mouke(24)
End Sub
という感じで。

【15724】Re:間違えをさがしてください2
発言  ピース  - 04/7/4(日) 10:25 -

引用なし
パスワード
   ▼[名前なし] さん:
>これを試してください。
>Sub mouke(CheckCol As Integer)
> Dim k As Integer, n As Long
> With Worksheets("Sheet1")
>  For n = 1 To 49
>   If .Cells(n, CheckCol).Interior.ColorIndex = 3 Then
>    k = .Cells(n + 2, CheckCol).Value - .Cells(n, CheckCol).Value
>    .Cells(n, CheckCol + 1) = k * 1000
>    .Cells(n, CheckCol + 1).Interior.ColorIndex = 5
>   End If
>  Next n
> End With
>End Sub
>
>使うときは、別のマクロから引数に列番号を指定して使用してください。
>Sub Test()
> Call mouke(9)
> Call mouke(19)
> Call mouke(24)
>End Sub
>という感じで。


実行するとオーバーフローするのですが、どうすればいいのでしょうか?

【15725】Re:間違えをさがしてください2
回答  [名前なし]  - 04/7/4(日) 10:48 -

引用なし
パスワード
   >> Dim k As Integer, n As Long



 Dim k As Long, n As Long

にしてください。

【15731】Re:間違えをさがしてください2
お礼  ピース  - 04/7/4(日) 17:49 -

引用なし
パスワード
   ▼[名前なし] さん:
>>> Dim k As Integer, n As Long
>
>を
>
> Dim k As Long, n As Long
>
>にしてください。

ありがとうございます。
完成しました。私の説明が下手でいやな思いをさせてしまいましたね。
申し訳ありません。

【15734】Re:間違えをさがしてください2
発言  [名前なし]  - 04/7/4(日) 18:17 -

引用なし
パスワード
   いえいえ、とんでもないです。
解決したようでよかったです。お疲れ様でした!

今度質問するときは、例を示して具体的に説明してくださいね。(笑)

【15737】Re:間違えをさがしてください2
お礼  ピース  - 04/7/4(日) 21:35 -

引用なし
パスワード
   ▼[名前なし] さん:
>いえいえ、とんでもないです。
>解決したようでよかったです。お疲れ様でした!
>
>今度質問するときは、例を示して具体的に説明してくださいね。(笑)

文章で説明するのは困難ですもんね!
これからは具体的に説明するようにします。

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