はじめに
前回に続き「これまで自動化を諦めていた作業をMicrosoft Copilotを使って自動化してみた」という記事です。
今回はのテーマは課題管理の効率化です。
※前回の記事はこちら
やりたいこと
特に大規模PJにおいて、チーム毎や業者毎に課題管理表を用意した結果、全体管理が難しくなることはよくあると思います。
この図のように、
- 顧客向けと内部向けで課題簿が分かれる
- 大規模になればなるほど、体制図の縦方向縦方向(ex.チーム数の増大)にも横方向(ex.委託先数の増大)にもに管理簿が増えていく
という状況になると、全体管理をするPMやPJ管理チームが各チームの課題を追うことが困難になります。1
今回は、PJ内に散らばった課題管理表を横断的にチェックし、期限が超過しているものを自動抽出する仕組みをCopilotを使って作ってみました。
そもそもExcel管理辞めればいいじゃん、に対して
最近ではExcel管理から脱却し、Atlassian JiraやRedmine等のチケット管理サービスや、Notionで課題やタスク、ドキュメント等を横断的に管理している組織も多いです。
もちろんそのようなサービスを使えれば万事解決なのですが、様々な理由からExcel管理を逃れられない組織もあるかと思います。
例えば
- SaaS系サービスの導入時には検討必須なサービス利用料やセキュリティに対する懸念は、大規模PJになるほど複数組織/複数業者での開発となるため、組織間のしがらみにより突破が困難。
- これまでExcel管理でなんとかやれていたのに、新しいサービスを導入するとなると、仕組みの整理や使い方の習熟等のハードルもついて回る。
等です。
上記のようにExcelでの課題管理の脱却はハードルが高いけど何とか効率化したい、という状況に対して、Copilotを使って効率化してみたという記事になります。
実装内容
実際に作成したものの紹介です。
以下のようなチームAとチームBの2つの課題管理簿があるとします。
これらの管理簿から、以下の条件にヒットする課題を自動抽出します。
- 期限が超過している課題
- 期限が入力されていない課題
- 日付形式で入力されていない課題(今回の例だとチームBの項番5の「3/1→3/31」のようなケース)
- 完了しているものは除く
抽出用のVBAマクロを設定するExcelファイルを別で用意します。
実行用シートに抽出対象の管理簿のファイルパスを記入し、実行ボタンを押すと…↓
このように、実行用シートの隣に新規シートが作成され、各管理簿で先ほどの条件に合致する課題のみを地抽出してくれる、という仕組みです。※実行日:2024/3/16
以下が、Copilotと対話しながら実装したVBAコードです。
Sub ExtractRows()
Dim ws As Worksheet
Dim rng As Range
Dim i As Long
Dim LastRow As Long
Dim LastRowString As String
Dim NewSheet As Worksheet
Dim StartRow As Long
Dim StartCol As Long
Dim DueDate As Date
'開始行と開始列を設定します
StartRow = 4 '開始行(タイトル行) 適切に設定してください
StartCol = 2 '開始列(タイトル列) 適切に設定してください A=1,B=2と入力する。
LastRowString = "この行より上に行追加する" '表の末尾を示す文字列 適切に設定してください。
Set ws = ThisWorkbook.Sheets("Sheet1") 'シート名を適切に変更してください
LastRow = ws.Cells(ws.Rows.Count, StartCol).End(xlUp).Row
'「この行より上に行追加する。」が入力されている行を見つけ、LastRowに表の末尾の行数を代入する
For i = StartRow To LastRow
' 表の末尾になったらループを抜ける
If ws.Cells(i, StartCol).Value = LastRowString Then
LastRow = i - 1
Exit For
End If
Next i
For i = StartRow To LastRow
'最初の行はタイトル行なので、無条件に出力する。
If i = StartRow Then
Set rng = ws.Rows(i)
End If
If ws.Cells(i, StartCol + 5).Value <> "完了" And ws.Cells(i, StartCol + 1).Value <> "" Then
'期限が日付形式で入力されているかチェック
If IsDate(ws.Cells(i, StartCol + 6).Value) Then
DueDate = CDate(ws.Cells(i, StartCol + 6).Value)
Else
DueDate = 0
End If
If DueDate = 0 Or DueDate < Date Then
'期限が日付形式で入力されていないか、期限が超過している場合、行を抽出
Set rng = Union(rng, ws.Rows(i))
End If
End If
Next i
If Not rng Is Nothing Then
'新しいシートを作成
Set NewSheet = Sheets.Add(After:=Sheets(Sheets.Count))
'条件に一致する行をコピー
rng.Copy Destination:=NewSheet.Rows(2)
End If
End Sub
Copilotを使用した所感
前回に引き続き、Copilotの活用によりVBA初心者でも簡単にVBAスクリプトを実装することができました。
Copilot(生成AI)の普及により、これまで自動化のハードルが高く地味に負担になっていた作業を「誰でも、簡単に」自動化できるようになったことに意義があると感じています。
特に「誰でも」できるようになったことで、現場のメンバでも自身で効率化を試みることも、日々作業負担を減らしたいと思っているマネージャーやリーダ層が仕組みを整えてあげるといったことも、柔軟にできるようになりました。
やはり、ある程度のプログラミングスキルは必要だった
ただ今回は少し躓いた箇所がありました。
例えば、Copilotが対話の途中で以下のようなコードを返してくれました。
...(省略)...
LastRow = ws.Cells(ws.Rows.Count, StartCol).End(xlUp).Row
For i = LastRow To StartRow Step -1
...(省略)...
Next i
...(省略)...
これは、Excelを下から逆順にForループする処理なのですが、てっきり上から昇順にループしていると思い込んでおり、なかなか実行結果が期待通りにならず、Copilotとの対話もすれ違い続けることがありました。
LastRow = ws.Cells(ws.Rows.Count, StartCol).End(xlUp).Row
の説明や、for文の変数i
の最初の値についてCopilotに問い合わせることで、逆順にループしていることに気づきました。。。
前回の記事ではColilotの出力結果をコピペするだけで、内部のロジックはほぼ見なくとも、やりたいことが実現できました。
ただ今回は上記の通り少し苦戦したため、やはりCopilotの回答結果を鵜呑みにするのは良くなく、回答結果の良し悪しを判断するためにある程度のコードリーディングスキルがやデバッグスキルが必要になってくると感じました。2
さらなる自動化(定期実行)
今回の期限超過課題抽出のさらなる自動化として、実行ボタンを都度押すのではなく定期的に自動実行するようにするとより便利になると思います。
今回は実装まではできていないのですが、やり方がいくつか考えられるため、Copilotを使って実装案を整理や比較をしてみました。
ちょっと意図する回答と違いました…補足して更問いしてみます。
私の会社ではSharepointを使用していることや、実行結果をTeamsに自動投稿もしたいため、次回はOfficeスクリプト+Power Automateで実装してみたいと思います。
VBAからTpypeScriptへのコード変換とかCopilot得意そうですよね。
まとめ
- Copilotを使って複数のExcel課題管理簿から期限超過している課題を自動抽出するVBAマクロを実装することができました。
- Copilotを使ったとしても、ある程度のコードリーディングスキルやデバッグスキルは必要になると痛感しました。
- 今後はOfficeスクリプト+Power Automateで定期実行やTeams通知を実装したいです。