Microsoft Copilotを使って課題管理を効率化してみた~複数のExcel課題管理簿から、期限超過している課題を自動抽出～

# はじめに
前回に続き「これまで自動化を諦めていた作業をMicrosoft Copilotを使って自動化してみた」という記事です。

今回はのテーマは**課題管理の効率化**です。

https://www.bing.com/chat?q=Bing+AI&FORM=hpcodx

※前回の記事はこちら

https://qiita.com/yuitomai/items/714042aa3e7b356dc919


# やりたいこと

特に大規模PJにおいて、チーム毎や業者毎に課題管理表を用意した結果、全体管理が難しくなることはよくあると思います。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3740505/6e568ea8-a578-e95f-c7fc-1d1306aaccb0.png)

この図のように、
- 顧客向けと内部向けで課題簿が分かれる
- 大規模になればなるほど、体制図の縦方向縦方向（ex.チーム数の増大）にも横方向（ex.委託先数の増大）にもに管理簿が増えていく

という状況になると、全体管理をするPMやPJ管理チームが各チームの課題を追うことが困難になります。[^1]

[^1]: 各チームからエスカレされる課題を確認するという受け身の対応ではなく、PMやPJ管理チーム側からも積極的に各チームの状況を拾いに行く必要がある、という前提です。

今回は、PJ内に散らばった課題管理表を横断的にチェックし、期限が超過しているものを自動抽出する仕組みをCopilotを使って作ってみました。

# そもそもExcel管理辞めればいいじゃん、に対して

最近ではExcel管理から脱却し、Atlassian JiraやRedmine等のチケット管理サービスや、Notionで課題やタスク、ドキュメント等を横断的に管理している組織も多いです。

もちろんそのようなサービスを使えれば万事解決なのですが、様々な理由からExcel管理を逃れられない組織もあるかと思います。

例えば

- SaaS系サービスの導入時には検討必須なサービス利用料やセキュリティに対する懸念は、大規模PJになるほど複数組織/複数業者での開発となるため、組織間のしがらみにより突破が困難。
- これまでExcel管理でなんとかやれていたのに、新しいサービスを導入するとなると、仕組みの整理や使い方の習熟等のハードルもついて回る。

等です。

上記のように**Excelでの課題管理の脱却はハードルが高いけど何とか効率化したい、という状況に対して、Copilotを使って効率化してみた**という記事になります。


# 実装内容

実際に作成したものの紹介です。
以下のようなチームAとチームBの2つの課題管理簿があるとします。

**■チームA管理簿**
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3740505/23303d6e-9c66-11ae-577b-dd54c112a6e4.png)

**■チームB管理簿**
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3740505/19b16925-a25f-c9cd-689e-18dfa1819815.png)

これらの管理簿から、以下の条件にヒットする課題を自動抽出します。
- 期限が超過している課題
- 期限が入力されていない課題
- 日付形式で入力されていない課題（今回の例だとチームBの項番5の「3/1→3/31」のようなケース）
- 完了しているものは除く


抽出用のVBAマクロを設定するExcelファイルを別で用意します。

**■抽出VBA実行用Excel**
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3740505/782da04c-5ec4-2140-21c3-fcbf90862aa5.png)


実行用シートに抽出対象の管理簿のファイルパスを記入し、実行ボタンを押すと…↓

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3740505/fd56a7b1-9204-ba79-2e54-188e6cf07673.png)

このように、実行用シートの隣に新規シートが作成され、各管理簿で先ほどの条件に合致する課題のみを地抽出してくれる、という仕組みです。※実行日：2024/3/16

以下が、Copilotと対話しながら実装したVBAコードです。

```Visual Basic:課題抽出.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が対話の途中で以下のようなコードを返してくれました。
```Visual Basic
    ...（省略）...
    
    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に問い合わせることで、逆順にループしていることに気づきました。。。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3740505/7e89b2d9-06aa-0f11-e941-a21abd63f4a4.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3740505/623acf7d-3740-1d35-50ac-7bf926d82742.png)

[前回の記事](https://qiita.com/yuitomai/items/714042aa3e7b356dc919)ではColilotの出力結果をコピペするだけで、内部のロジックはほぼ見なくとも、やりたいことが実現できました。

ただ今回は上記の通り少し苦戦したため、やはりCopilotの回答結果を鵜呑みにするのは良くなく、回答結果の良し悪しを判断するためにある程度のコードリーディングスキルがやデバッグスキルが必要になってくると感じました。[^2]

# さらなる自動化（定期実行）
今回の期限超過課題抽出のさらなる自動化として、実行ボタンを都度押すのではなく定期的に自動実行するようにするとより便利になると思います。
今回は実装まではできていないのですが、やり方がいくつか考えられるため、Copilotを使って実装案を整理や比較をしてみました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3740505/9cb853bf-c99f-39ae-b588-20a28289e876.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3740505/383e6132-481e-2aee-c2f1-1124eb8b02c2.png)

ちょっと意図する回答と違いました…補足して更問いしてみます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3740505/ee53c16a-635a-a70f-fbec-3f30fb9b8c2c.png)


私の会社ではSharepointを使用していることや、実行結果をTeamsに自動投稿もしたいため、次回は**Officeスクリプト＋Power Automate**で実装してみたいと思います。


https://learn.microsoft.com/ja-jp/office/dev/scripts/overview/excel

https://www.microsoft.com/ja-jp/power-platform/products/power-automate

VBAからTpypeScriptへのコード変換とかCopilot得意そうですよね。


# まとめ
- Copilotを使って複数のExcel課題管理簿から期限超過している課題を自動抽出するVBAマクロを実装することができました。
- Copilotを使ったとしても、ある程度のコードリーディングスキルやデバッグスキルは必要になると痛感しました。
- 今後はOfficeスクリプト＋Power Automateで定期実行やTeams通知を実装したいです。


[^1]: 各チームからエスカレされる課題を眺めるような受け身の管理では不十分で、PMや統制チーム側からも積極的に各チームの状況を拾いに行くべき、という前提です。
[^2]: ただしVBAの細かな文法は理解できてなくてもよいし、コードリーディングやデバッグにもCopilotが使えるため、やはり生成AIはものすごいと感じるばかりです。。。