Excel VBA質問箱 IV

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

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


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

【75474】九九を途中で止めるプログラムを作成したいのですが… ガイツ 14/4/13(日) 3:19 質問[未読]
【75475】Re:九九を途中で止めるプログラムを作成したい... γ 14/4/13(日) 9:07 発言[未読]
【75476】Re:九九を途中で止めるプログラムを作成したい... ガイツ 14/4/13(日) 12:11 お礼[未読]
【75477】Re:九九を途中で止めるプログラムを作成したい... γ 14/4/13(日) 13:58 発言[未読]
【75478】Re:九九を途中で止めるプログラムを作成したい... ガイツ 14/4/13(日) 17:00 お礼[未読]
【75479】Re:九九を途中で止めるプログラムを作成したい... γ 14/4/13(日) 17:56 発言[未読]
【75490】Re:九九を途中で止めるプログラムを作成したい... ガイツ 14/4/14(月) 20:50 お礼[未読]

【75474】九九を途中で止めるプログラムを作成したい...
質問  ガイツ  - 14/4/13(日) 3:19 -

引用なし
パスワード
   今晩は。ガイツと申します。VBAを初めて2週間程度の初心者です。
下記について上手くいかないところが有り、ご教授頂けますと幸いです。

<質問>
九九の表を作成したいのですが、条件として答え(a)が55以下となれば
それ以上は何も記載しないというプログラムを下記のように作成しました。

それなりにプログラムは走るのですが、本来55以下を出力して欲しいので、
7*8=56がaより大きくなる為、その前の7*7=49までを出力して欲しいのですが、
6の段の54を出力した時点で止まってしまいます。

試しにaの数値を56,57,58,59,60と増やしていくと、59までは55と同じ出力
になるのですが、a=60とした時点で7*8=56を出力し、止まってくれます。

非常に何となくで、分かりにくいと思うのですが、i=9,j=9としているもの
の、実はi=10(6*10=60をプログラムの中で計算している?)の結果を読み込んでい
るような印象を受けています。

かなり初歩的な質問かと存じますので、非常に恐縮ですが、何卒宜しくお願い致
します。

-----------------------------------------------------------------------
Sub 掛け算で答えが55以下を表示し、その後はループしない()

Dim i As Integer
Dim j As Integer
Dim a As Integer
Dim sheetobj As Worksheet
Set sheetobj = ThisWorkbook.Worksheets("Sheet1")

With sheetobj

a = 55(←ココを56,57,58,59,60と増やしてみました)

For i = 1 To 9

For j = 1 To 9

 If i * j > a Then

  Exit For

 Else

  .Cells(i + 1, j + 1) = i * j

 End If

Next j

 If i * j > a Then

  Exit For

 End If

Next i

End With

End Sub

-----------------------------------------------------------------------

【75475】Re:九九を途中で止めるプログラムを作成した...
発言  γ  - 14/4/13(日) 9:07 -

引用なし
パスワード
   いくつかコメントします。

(1)まず、インデントをきちんとつけることです。
これによってプログラムの構造が見やすくなるはずです。

Sub 掛け算で答えが55以下を表示し、その後はループしない()
  Dim i As Integer
  Dim j As Integer
  Dim a As Integer
  Dim sheetobj As Worksheet
  
  Set sheetobj = ThisWorkbook.Worksheets("Sheet1")

  With sheetobj
    a = 55   '(←ココを56,57,58,59,60と増やしてみました)
    For i = 1 To 9
      For j = 1 To 9
        If i * j > a Then
          Exit For
        Else
          .Cells(i + 1, j + 1) = i * j
        End If
      Next j
      If i * j > a Then
        Exit For
      End If
    Next i
  End With
End Sub

(いやきちんとやってます、ということなら、
 投稿の際、それをコピーペイストするようにしてください)

(2)こうした作業をデバッグ(虫取り)といいますが、
そのための技法はご存じですか?
この場合は、ステップ実行(F8を押して、一行ごとに実行させる)が
有効です。自分の思い違いに気づけます。

(3)
> 条件として答え(a)が55以下となれば
> それ以上は何も記載しないというプログラム 
「それ以上しない」とは、
・そのあとすべてなら、
 Exit Subで抜けるべきだし、(そうではなさそう)
・その行は、それ以上しないということなら、
 Exit Forはひとつでいいはずで、
      If i * j > a Then
        Exit For
      End If
 が不要ではないですか?

手を動かして確認してみて下さい。

【75476】Re:九九を途中で止めるプログラムを作成した...
お礼  ガイツ  - 14/4/13(日) 12:11 -

引用なし
パスワード
   γ様こんにちは。早速コメントを頂き有難う御座います。

>(1)まず、インデントをきちんとつけることです。
>これによってプログラムの構造が見やすくなるはずです。
→ご指摘有難う御座います。早速自分のプログラムにインデント
 を付けました。非常に見やすくなりました。以後、留意致します。
 今回は小生の大雑把な性格が露わとなり恥ずかしい限りです…
 又、見にくいところ、ご丁寧にご回答頂き有難う御座いました。

>(2)こうした作業をデバッグ(虫取り)といいますが、
>そのための技法はご存じですか?
>この場合は、ステップ実行(F8を押して、一行ごとに実行させる)が
>有効です。自分の思い違いに気づけます。
→お恥ずかしながら、F8で一行ごとに実行できることを知りませんでした。
 この機能を知れたことは非常に大きいです。有難う御座いました。
 早速試しに実行してみたところ、やはりFor j =1 to 9としていますが、
 2回目のIfの際に『J=10』が代入されているようになっていました。
 (この考察が誤りでしたら厚かましながら今一度コメントを頂けますと幸甚です。)

>(3)
>> 条件として答え(a)が55以下となれば
>> それ以上は何も記載しないというプログラム 
>「それ以上しない」とは、
>・そのあとすべてなら、
> Exit Subで抜けるべきだし、(そうではなさそう)
>・その行は、それ以上しないということなら、
> Exit Forはひとつでいいはずで、
>      If i * j > a Then
>        Exit For
>      End If
> が不要ではないですか?
>
>手を動かして確認してみて下さい。
→ご指摘頂きました、End IfをEnd Subに変えるプログラムで自分が得たい
 回答を得ることができました!!有難う御座いました。
 ただ、質問が言葉足らずで申し訳ないのですが、最終的には『1回の実
 行で別のセルにこの九九の表をn回作る』というプログラムを作成したいと
 思っています。こちらについては今回頂いた沢山のヒントをもとに、もう少
 し自分で考る所存です。

 素性も分からない小生に対し、温かいコメントを頂きましたこと、感謝致します。
 有難う御座いました。

【75477】Re:九九を途中で止めるプログラムを作成した...
発言  γ  - 14/4/13(日) 13:58 -

引用なし
パスワード
   (1)
>  早速試しに実行してみたところ、やはりFor j =1 to 9としていますが、
>  2回目のIfの際に『J=10』が代入されているようになっていました。
>  (この考察が誤りでしたら厚かましながら今一度コメントを頂けますと幸甚です。)

Sub test()
  Dim k As Long

  For k = 1 To 3
    '何もしない。主題ではないので。
  Next
  MsgBox k  ' 4が表示されるはず
End Sub
の例で考えましょう。

k を 1 から順に 1ずつ加算して処理を実行するのですが、
k = 3 の処理を実行(この場合は何もしてませんが)した後で(Nextのところで)、
3 に 1 を加算して、おっと これは 上限値 3 を超えているからループから脱出せよ、
となるのです。

ですから、 ループを抜けた段階では、 k は 4 になっていて良いのです。
これは仕様です。

ループを抜けた後で、ここでいう k という ループカウンタの値を使うことは
めったにありません。k の役目はもう終わっているのです。

つまり、
> 2回目のIfの際に『J=10』が代入されているようになっていました。
これは想定どおりで、おかしなことでも何でもありません。

(2)
> →ご指摘頂きました、End IfをEnd Subに変えるプログラムで自分が得たい
>  回答を得ることができました!!
ちょっと誤解があります。

> 本来55以下を出力して欲しいので、
> 7*8=56がaより大きくなる為、その前の7*7=49までを出力して欲しいのですが、
> 6の段の54を出力した時点で止まってしまいます。
という記述からすると、
6 * 9 で終了してしまったらダメなはずで、
7*1, 7*2 ・・・・ と実行させたいわけですから、私が書きましたように、
以下のようにしたら良いでしょう。

Sub 掛け算で答えが55以下を表示し、その後はループしない()
  Dim i As Long
  Dim j As Long
  Dim a As Long
  Dim sheetobj As Worksheet
  
  Set sheetobj = ThisWorkbook.Worksheets("Sheet1")
  With sheetobj
    a = 55
    For i = 1 To 9
      For j = 1 To 9
        If i * j > a Then
          Exit For
        Else
          .Cells(i + 1, j + 1).Value = i * j
        End If
      Next j
    Next i
  End With
End Sub


つづきは、どうぞトライしてみて下さい。

【75478】Re:九九を途中で止めるプログラムを作成した...
お礼  ガイツ  - 14/4/13(日) 17:00 -

引用なし
パスワード
   γ様。こんにちは。ご多忙中、またもやコメントを頂き有難う御座います。
至れり尽くせり恐縮です。

>Sub test()
>  Dim k As Long
>
>  For k = 1 To 3
>    '何もしない。主題ではないので。
>  Next
>  MsgBox k  ' 4が表示されるはず
>End Sub
>の例で考えましょう。
>
>k を 1 から順に 1ずつ加算して処理を実行するのですが、
>k = 3 の処理を実行(この場合は何もしてませんが)した後で(Nextのところで)、
>3 に 1 を加算して、おっと これは 上限値 3 を超えているからループから脱出せよ、
>となるのです。
>
>ですから、 ループを抜けた段階では、 k は 4 になっていて良いのです。
>これは仕様です。
>
>ループを抜けた後で、ここでいう k という ループカウンタの値を使うことは
>めったにありません。k の役目はもう終わっているのです。
>
>つまり、
>> 2回目のIfの際に『J=10』が代入されているようになっていました。
>これは想定どおりで、おかしなことでも何でもありません。
→分かり易いよう、プログラムまで書いて頂きすみません。
 お蔭様でこの点は完璧に理解できました。有難う御座いました!


>(2)
>> →ご指摘頂きました、End IfをEnd Subに変えるプログラムで自分が得たい
>>  回答を得ることができました!!
>ちょっと誤解があります。
>
>> 本来55以下を出力して欲しいので、
>> 7*8=56がaより大きくなる為、その前の7*7=49までを出力して欲しいのですが、
>> 6の段の54を出力した時点で止まってしまいます。
>という記述からすると、
>6 * 9 で終了してしまったらダメなはずで、
>7*1, 7*2 ・・・・ と実行させたいわけですから、私が書きましたように、
>以下のようにしたら良いでしょう。
>
>Sub 掛け算で答えが55以下を表示し、その後はループしない()
>  Dim i As Long
>  Dim j As Long
>  Dim a As Long
>  Dim sheetobj As Worksheet
>  
>  Set sheetobj = ThisWorkbook.Worksheets("Sheet1")
>  With sheetobj
>    a = 55
>    For i = 1 To 9
>      For j = 1 To 9
>        If i * j > a Then
>          Exit For
>        Else
>          .Cells(i + 1, j + 1).Value = i * j
>        End If
>      Next j
>    Next i
>  End With
> End Sub
>
>つづきは、どうぞトライしてみて下さい。
→こちらもプログラムを記載頂き申し訳ございません。ありがとうございます。
 ただ、小生の日本語力が無いばかりに得たい結果をお伝えしきれなかったと
 ころ、不甲斐なく思います。
 上記でご提示頂きましたプログラムでは『55以下の回答を全て表示する』という
 プログラムになると思います。
 小生が作成したいものは『順番に数字を表示していき、55より大きい解が得
 られたらそれを表示せずにそこまでの数字を表示する。つまり、7の段の
 7*8=56が一番最初に55を超えますので、7*7=49までを表示させ、それ以降は
 8の段、9の段は表示させない』ようにしたいのです。

ただ、今回ご教授頂いた下記2つのポイントを把握すればなんとか自力で辿りつけそ
うです。
 1.For a =b to c は最後のa=cのループの際、next aから元にループするまでの間は  a=c+1の数字を与えている。
 2.F8キーを押すことで1つづつプログラムの動きを把握できる。

折角の日曜日に、これ以上γ様の貴重なお時間を頂くのは申し分けなさすぎます。
後は微力ながら自分で頑張ってみようと思います。本当にありがとうございました。
(と、威勢の良いことを申し上げましたが、もしまた分からなくなってしまった場合は厚かましながらご教授頂けますと嬉しいです♪)

【75479】Re:九九を途中で止めるプログラムを作成した...
発言  γ  - 14/4/13(日) 17:56 -

引用なし
パスワード
   何か勘違いをしていました。九九を復習しなければ・・・。

一回でも55を超えたら終了するのであれば、
Exit Sub ですね。

Sub 掛け算で答えが55以下を表示し、その後はループしない()
  Dim i As Long
  Dim j As Long
  Dim a As Long
  Dim sheetobj As Worksheet
  
  Set sheetobj = ThisWorkbook.Worksheets("Sheet1")
  With sheetobj
    a = 55
    For i = 1 To 9
      For j = 1 To 9
        If i * j > a Then
          Exit Sub
        Else
          .Cells(i + 1, j + 1).Value = i * j
        End If
      Next j
    Next i
  End With
End Sub

【75490】Re:九九を途中で止めるプログラムを作成した...
お礼  ガイツ  - 14/4/14(月) 20:50 -

引用なし
パスワード
   γ様。今晩は。最後までお付き合い頂きありがとうございました。

>何か勘違いをしていました。九九を復習しなければ・・・。
→すみません。完全に私の言葉不足でした…

>一回でも55を超えたら終了するのであれば、
>Exit Sub ですね。
>
>Sub 掛け算で答えが55以下を表示し、その後はループしない()
>  Dim i As Long
>  Dim j As Long
>  Dim a As Long
>  Dim sheetobj As Worksheet
>  
>   Set sheetobj = ThisWorkbook.Worksheets("Sheet1")
>  With sheetobj
>    a = 55
>    For i = 1 To 9
>      For j = 1 To 9
>        If i * j > a Then
>          Exit Sub
>        Else
>          .Cells(i + 1, j + 1).Value = i * j
>        End If
>      Next j
>    Next i
>  End With
> End Sub
→やはりこの場合Exit Subで終わらせるのが筋ということですね。
 実はお恥ずかしながらExit Subというのも今回教えて頂き、初めて
 知りました。

 色々とご教授頂き、有難う御座いました。

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