目次

出欠管理

 講義、実習は授業の出席日数が不足していると
 単位認定の前に試験受験資格の有無を判定する
 必要が出ることもあります。

 以下は、自分が担当したある教育機関での出欠
 情報を入れたテキストファイルの内容。

201301,2,2,2,2,2,2,2,2,2,2,2,2,2,2
201302,1,2,2,2,2,2,2,2,2,2,2,2,1,2
201303,2,0,2,2,0,2,2,2,2,2,2,2,0,2
201304,1,1,2,2,2,2,2,3,2,2,2,2,2,2
201305,2,2,2,2,2,2,2,2,2,2,2,2,2,2
201306,2,2,2,3,2,2,2,0,2,2,2,2,2,2
201307,2,2,2,2,2,2,2,2,2,2,2,2,2,2
201308,2,2,2,2,2,2,2,2,2,2,2,2,2,2
201309,2,1,2,2,2,2,2,2,2,2,2,2,2,2
201310,2,2,1,2,2,2,2,2,2,2,2,2,2,2
201311,2,2,2,2,2,2,2,2,2,2,2,2,2,2
201312,2,2,2,2,1,2,2,2,2,2,2,2,2,2
201313,2,2,2,2,2,2,2,2,2,2,2,2,2,2
201314,2,2,2,2,2,2,2,0,2,2,2,2,2,2
201315,2,2,2,2,2,2,2,3,2,2,2,2,2,2
201316,2,2,2,2,2,2,1,2,2,2,2,2,2,2
201317,2,2,2,2,2,2,2,2,2,2,2,2,2,2
201318,2,0,0,3,2,2,2,2,2,2,2,2,2,2
201319,2,1,2,1,2,1,2,1,2,1,2,1,2,2
201320,2,3,2,2,2,2,2,2,2,2,2,2,2,2

 数値の意味は、以下としています。

 CSV形式のテキストファイルの内容を
 読み込むと、以下となります。



 マクロを利用して、出席状況を把握してみます。

 列に入れる情報を次のように固定。

 項目名を21行に格納。



 1行に関係するのは、4種の情報なので
 4変数を用意し、B列からO列までスキャン
 して計算後、結果をP列からS列に格納。

 雛形は、以下でよいはず。

Dim objS As Object

Dim i  As Byte
Dim ii As Byte

Dim absence As Byte
Dim delayed As Byte
Dim attend  As Byte
Dim others  As Byte
Dim xtmp    As Byte

' clear
absence = 0
delayed = 0
attend  = 0
others  = 0

' set object pointer
objS = ThisComponent.CurrentController.ActiveSheet
' scan
For i = 0 to 13
  ' set pointer
  ii = i + 1
  ptr = objS.getCellByPosition(ii,0)
  ' get number
  xtmp = ptr.Value
  ' judge
  Select Case xtmp
    Case 0    : absence = absence + 1
    Case 1    : delayed = delayed + 1
    Case 2    : attend  = attend  + 1
    Case Else : others  = others  + 1 
  End Select
Next i
' store
objS.getCellByPosition(15,0).Value = absence
objS.getCellByPosition(16,0).Value = delayed
objS.getCellByPosition(17,0).Value = attend
objS.getCellByPosition(18,0).Value = others

 1行についての操作ができたなら、全行に対して適用。

Dim objS As Object

Dim i  As Byte
Dim ii As Byte
Dim j  As Byte

Dim absence As Byte
Dim delayed As Byte
Dim attend  As Byte
Dim others  As Byte
Dim xtmp    As Byte

' set object pointer
objS = ThisComponent.CurrentController.ActiveSheet

For j = 0 To 19
  ' clear
  absence = 0
  delayed = 0
  attend  = 0
  others  = 0
  ' scan
  For i = 0 to 13
    ' set pointer
    ii = i + 1
    ptr = objS.getCellByPosition(ii,j)
    ' get number
    xtmp = ptr.Value
    ' judge
    Select Case xtmp
      Case 0    : absence = absence + 1
      Case 1    : delayed = delayed + 1
      Case 2    : attend  = attend  + 1
      Case Else : others  = others  + 1 
    End Select
  Next i
  ' store
  objS.getCellByPosition(15,j).Value = absence
  objS.getCellByPosition(16,j).Value = delayed
  objS.getCellByPosition(17,j).Value = attend
  objS.getCellByPosition(18,j).Value = others
Next j

 Calc用マクロにしたので、行列形式での位置を指定。

 マクロに名前をつけて、サブルーチンにします。

Sub Calc()
  Dim objS As Object

  Dim i  As Byte
  Dim ii As Byte
  Dim j  As Byte

  Dim absence As Byte
  Dim delayed As Byte
  Dim attend  As Byte
  Dim others  As Byte
  Dim xtmp    As Byte

  ' set object pointer
  objS = ThisComponent.CurrentController.ActiveSheet

  For j = 0 To 19
    ' clear
    absence = 0
    delayed = 0
    attend  = 0
    others  = 0
    ' scan
    For i = 0 to 13
      ' set pointer
      ii = i + 1
      ptr = objS.getCellByPosition(ii,j)
      ' get number
      xtmp = ptr.Value
      ' judge
      Select Case xtmp
        Case 0    : absence = absence + 1
        Case 1    : delayed = delayed + 1
        Case 2    : attend  = attend  + 1
        Case Else : others  = others  + 1 
      End Select
    Next i
    ' store
    objS.getCellByPosition(15,j).Value = absence
    objS.getCellByPosition(16,j).Value = delayed
    objS.getCellByPosition(17,j).Value = attend
    objS.getCellByPosition(18,j).Value = others
  Next j
End Sub

 このマクロで、出欠の情報を求めると、以下。




 出欠状態をデータにしてから、受験資格や
 単位認定を考えるのは、別の話です。

 FOR文を利用して繰返す場合、TOの右の値が最終値になります。
 行と列のカウンタを、+1してしまうことがあるので注意が必要。

 CalcからExcelのマクロに変換するには、Sheets、Cellsを利用した
 置換で対応できます。

Sub Calc()
  Dim i As Byte
  Dim j As Byte

  Dim absence As Byte
  Dim delayed As Byte
  Dim attend  As Byte
  Dim others  As Byte
  Dim xtmp    As Byte

  For j = 1 To 20
    ' clear
    absence = 0
    delayed = 0
    attend  = 0
    others  = 0
    ' scan
    For i = 2 to 15
      ' get number
      xtmp = Sheets(1).Cells(j,i).Value
      ' judge
      Select Case xtmp
        Case 0    : absence = absence + 1
        Case 1    : delayed = delayed + 1
        Case 2    : attend  = attend  + 1
        Case Else : others  = others  + 1 
      End Select
    Next i
    ' store
    Sheets(1).Cells(j,16).Value = absence
    Sheets(1).Cells(j,17).Value = delayed
    Sheets(1).Cells(j,18).Value = attend
    Sheets(1).Cells(j,19).Value = others
  Next j
End Sub


目次

inserted by FC2 system