Top

hiroyuki.tank.support.site

簡単!マクロ講座

第45回〜あてな-チェックが多すぎたら〜


 いまどうなっているかを表示します。
*******************************************************************************
Sub Macro43()
  datagyo = 2
  Sheets("データ").Select
  Cells(datagyo, 1).Select
  i = 1
   Do Until Cells(datagyo, 2) = ""
    If Cells(datagyo, 1) = "レ" Then
      Range(Cells(datagyo, 2), Cells(datagyo, 6)).Select
      Selection.Copy
      Sheets("入力").Select
      Cells(i + 1, 1).Select
      ActiveSheet.Paste
      Sheets("データ").Select
      Application.CutCopyMode = False
      i = i + 1
    End If
     datagyo = datagyo + 1
   Loop
End Sub
*******************************************************************************

 このコードと同じならあっています。ちゃんと動くはずです。

 次に,チェックされている人が11人以上いた場合どうなるかを考えましょう。
 いままではテストで数人にチェックを入れて「うごいたうごいた」と喜んでいたことでしょうが,ユーザーは何人にチェックを入れるかわかりません。100人くらいにチェックを入れるのだったら問題ないでしょうが,もし1万人くらいにチェックを入れていたら(そんなこと普通はないでしょうけどね),そのチェックがなくなるまでプログラムが終わりません。ずっとループします。そうなるとユーザーは待たされますし,最悪の場合異常終了することにもなりかねません。
 こういった予期せぬことにも対応しておくということが大変なのです。
 こういったことは作り手がどれだけ親切かどうかということにも関係します。

 今回の場合,チェックが11人以上だったらループを抜けて欲しいわけです。
 これをどうやって実現するか。簡単です。
Do Until Cells(datagyo, 2) = ""
のところに「チェックが11個以上あったら」という条件を追加すればよいのです。
 この条件は前回予告したカウント変数 i を利用します。
 i はチェックがある都度1ずつ加えられていますから(だからカウント変数です)変数 i に入っているのはチェックの数なのです。
  Do Until Cells(datagyo, 2) = "" Or i > 10
 としてみてください。
 データがなくなるかまたはチェックが10を越えるまでループするということになります。
 これで11人以上にチェックがあってもプログラム的には大丈夫ですね。
 でもユーザーは11人以上チェックしているのでもしかしたら「なんで印刷されないのか!おかしい!」なんて思うかもしれません。そのために,メッセージを表示させたらどうでしょうか?
 Loop の次の行に以下をかいてみてください。これでチェックが10を越えているときはメッセージが表示されるようなります。

*******************************************************************************
If i > 10 Then
MsgBox "11人目以降の人は印刷されません。"
End If
*******************************************************************************
 「もしカウンタ変数 i が10より多かったら」の IF構文ですね。

 完成形は↓こちらを参考にしてください。VBEにコピーペーストするとちゃんと動くはずです。お試しください。
    atena45

| hiroyuki.tank.support.site.Top | このページのTop | マクロ講座目次 | 前回 | 次回 |