網頁

2021年6月5日 星期六

如何結合 Google Meet 自動點名 和 Excel 的 選課名單,自動標示出曠課、遲到的學生名單?

關於 Google Meet 如何自動點名,請看此篇文章,Google Meet 如何自動點名?

打開 以 Google Meet Attendance List 產生的出席名單的檔案,如 2021-06-04T05_56_27.631Z. csv。
打開 有學生資料的選課單 Excel 檔,如 阿旺師點名簿.xlsx。
以 Google Meet Attendance List 產生的出席名單如下,選此工作表,按右鍵,選「移動或複製」。

註:
Google Meet Attendance List 產生的出席名單,跟上面不一樣 ,已經有新的格式。
所以 後面的程式要修改為  
Const attend_start_row = 6  ' 當節出席名單的工作表 第一位同學的列號
當節出席名單的工作表 第一位同學的列號,請根據 Google Meet Attendance List 產生的出席名單來修改。


活頁簿選  選課名單活頁簿,如 阿旺師點名簿.xlsx。
 選取工作表之前,選[「工作表1」。勾選 「建立複本」。按 「確定」,就可把 出席名單的工作表 複製到  選課單活頁簿 內。

在 選課名單活頁簿 內,選 2021-06-04 此出席名單 工作表,按右鍵,選「重新命名」。

修改名稱 為 : 2021-06-04-05-彈性學習。 此課程 是在 2021-06-04 第5節上課,課程名稱為 :彈性學習。


出席名單的工作表名稱:2021-06-04-05-彈性學習。
程式中的常數要修改 :
Const attendance = "2021-06-04-05-彈性學習" ' 當節出席名單的工作表名稱
Const attend_start_row = 2  ' 當節出席名單的工作表 第一位同學的列號
Const attend_end_row = 28  ' 當節出席名單的工作表 最後一位同學的列號

Excel 的 選課名單,工作表名稱:手機APP應用程式設計。
程式中的常數要修改 :
Const course_name = "手機APP應用程式設計" ' 選課名單 工作表的名稱
Const begin_column = 6 ' 要開始寫入的欄位,即 F 欄
Const date_row = 8 ' 要寫入日期的列號
Const student_first_row = 11 ' 要點名的學生第一位同學的列號 11
Const last_student_row = 38  ' 最後一位同學的列號
Const student_name_column = 4 ' 姓名 的欄位,在 D 欄

「檢視」,選 「巨集/檢視巨集」。







先輸入巨集名稱,如 take_attendance 。即點名的意思。
按「建立」。

在 Sub take_attendance()  和 End Sub 的中間 。

貼上以下程式碼:


' 以下為出席名單工作表的參數 ,以 外掛程式 attendance list 所產生的工作表為例
Const attendance = "2021-06-25-05-彈性學習" ' 當節出席名單的工作表名稱
Const attend_start_row = 6  ' 當節出席名單的工作表 第一位同學的列號

Dim rownumber As Integer ' 當節出席名單的工作表 的列數

'如果 最後一列,是老師的名字,如阿旺師,就不用算,下面也不用改
Const attend_end_row = 28  ' 當節出席名單的工作表 最後一位同學的列號

' 以下為選課名單工作表的參數
Const course_name = "手機APP應用程式設計" ' 選課名單 工作表的名稱
Const begin_column = 8 ' 要開始寫入的欄位
Const date_row = 8 ' 要寫入日期的列號
Const first_student_row = 11 ' 要點名的學生第一位同學的列號 11
Const last_student_row = 38  ' 最後一位同學的列號
Const student_name_column = 4 ' 姓名 的欄位
Const absent_string = "曠課"  ' 沒來的同學,要寫入的文字

Const late_time = 10 ' 超過10 分鐘進來的,標示 遲到
Const late_string = "遲到"  '


Dim i, j As Integer
Dim attend_student_name As String
Dim attend_student_name_len As Integer
Dim presentf As Boolean ' 如果有出席, presentf 設為 true
Dim first_seen As Date

rownumber = Sheets(attendance).Cells(Rows.Count, 1).End(xlUp).Row ' 工作表有幾列
Sheets(course_name).Cells(date_row, begin_column) = Left(attendance, 13) ' 2021-06-04-05-彈性學習中的日期節數,是從左邊取13個字 即 2021-06-04-05

For i = first_student_row To last_student_row
          presentf = False
          For j = attend_start_row To rownumber - 1 '  最後一列,是老師的名字,如阿旺師,所以不用算 ,此程式修改成沒用到 attend_end_row
           attend_student_name = Sheets(attendance).Cells(j, 1)
           attend_student_name_len = Strings.Len(attend_student_name) - 10 ' 出席名單的 第1欄為 111級商4班10號吳佩容,前面10個字元不是姓名
           

              If Strings.Right(attend_student_name, attend_student_name_len) = Sheets(course_name).Cells(i, student_name_column) Then
                 presentf = True
                 If Minute(Sheets(attendance).Cells(j, 2)) > 10 Then
                               
                    Sheets(course_name).Cells(i, begin_column) = late_string
                 End If
                 Exit For
                             
              End If
          Next j
          
          If presentf = False Then Sheets(course_name).Cells(i, begin_column) = absent_string
          
Next i

按左上方的「執行」鈕。


執行結果如下:


按左上方的 儲存 鈕。

記得選 「否」,要有巨集 的功能。

存檔類型 要選  *.xlsm (要有 Macro 巨集 ),不是 xlsx。







下次打開此活頁簿,要選 「啟用內容」,讓巨集程式有作用。


註:
  1. 如果有二位學生同名,請手動修改程式執行後的結果。
  2. 出席名單的 First Seen 和 Time in Call 此二個欄位的格式為 日期時間,所以VBA 的 first_seen 變數要宣告為date,不能當作字串,不然會有問題。