• 締切済み

Excelで出席者表をつくる。

  マクロが得意な方、お願いします。 Excel2013で出席者表(仮称)をつくりたいのです。 添付図のように、E列に(1または2)を入れて、 マクロで(2=欠席者)の列を非表示にする記述を教えてください。 ボタンに登録して、逐次非表示にするボタンと、 一括して再表示にするボタンを作りたいのです。 フィルターを使うとできますが、マクロ学習を始めたので、 教えていただいた記述を研究してマクロをマスターしたいのです。。 よろしくお願いします。

みんなの回答

回答No.2

決してマクロが得意なわけではありませんが(笑)。 私ならどうするのかなぁ?で考えてみました。 (1)全行を舐めて、E列が「2」だったら非表示 Sub SAMPLE01()   ' ※非表示にする処理   ' 2行目から「B列に値が存在する最終行」まで繰り返し   For i = 2 To Cells(Rows.Count, 2).End(xlUp).Row     If Cells(i, 5).Value = 2 Then    ' その行のE列が「2」だったら     ' 「1だけを表示」にするなら     ' If Cells(i, 5).Value <> 1 Then       Rows(i).EntireRow.Hidden = True 'その行を非表示     Else         ' その行が「2」以外だったら(念のため)       Rows(i).EntireRow.Hidden = False 'その行は非表示にしない     End If   Next i End Sub Sub SAMPLE02()   ※全行を再表示する   Cells.EntireRow.Hidden = False End Sub ※この二つを別なマクロとして、二つのボタンにそれぞれ設定。 (2)フィルタをON-OFFするマクロ Sub SAMPLE03()   If ActiveSheet.AutoFilterMode Then  ' 既にフィルタがかかっていたら     Range("A1").AutoFilter    ’ フィルタを解除   Else  ' フィルタがかかっていなかったら     Range("A1").AutoFilter Field:=5, Criteria1:="<>2" ' 「2以外」でフィルタ     ' 「1」だけを抽出するなら     ' Range("A1").AutoFilter Field:=5, Criteria1:="=1"   End If End Sub ※これだとボタン一つで済みます。 どちらかだろうなぁ。 せっかく > マクロ学習を始めたので、 とのことですので、(個人的に)覚えておきたい書き方をもう一つ。 (1)と同様、全行を舐めます。 Sub SAMPLE04()   ' 2行目から「B列に値が存在する最終行」まで繰り返し   For i = 2 To Cells(Rows.Count, 2).End(xlUp).Row     Select Case Cells(i, 5).Value ' 各行のE列の値で処理を分岐       Case 1 ' 「1」だったら         Rows(i).EntireRow.Hidden = False ' その行は表示       Case 2 ' 「2」だったら         Rows(i).EntireRow.Hidden = True ' その行は非表示       Case Else ' 「その他(Else)」だったら         Rows(i).EntireRow.Hidden = True ' その行は非表示     End Select   Next i End Sub 条件分岐が多いときに、書いた後で見易いように・・ 条件が増えたり減ったりしそうなときにいじりやすいように・・ という、場面によっては重宝する書き方です。 ※全行表示は、上述SAMPLE02をそのまま使います。 どちらにしても、私はなるべくシンプル派なので、 フィルタのON-OFFを採用するかなぁ。 余談ではありますが・・・   Cells(Rows.Count, 2).End(xlUp).Row これで、2列目(=B列)における「一番下」の行番号を拾います。 「仮に」出席者の列(B列)に歯抜けがあっても 最終行まで処理を続けてくれます。 Do While ~ Loop で繰り返すと、 B列が歯抜けを起こしていると、そこで処理が止まってしまい、 それ以降の行についてはノータッチ・・という状況に陥ります。  ※当然、歯抜けが100%無いデータセットなら問題は無いです。 なので、Do ~ Loopを使うなら 「歯抜けの可能性がより低い(はずの)「No.(A列)」が空白になるまで」 の方が良いような気がします。 まぁ、好みの問題ではありますけどね。

lovelykajiyan
質問者

お礼

マクロが途中で止まってしまうのです。 時間をかけて、解析してみます。 ありがとうございました。

  • f272
  • ベストアンサー率46% (8626/18446)
回答No.1

私なら,こんな感じにします。 Sub Macro2() Set a = Range("E2") Do While Not IsEmpty(a.Offset(, -3)) If a.Value = 2 Then a.EntireRow.Hidden = True Set a = a.Offset(1) Loop End Sub

lovelykajiyan
質問者

お礼

マクロが止まってしまうのです。 今しばらく時間をかけて、対策を考えて見ます。 ありがとうございます。

関連するQ&A