Microsoft Formsで作ったフォームを、Teamsのグループに移動することができる。グループのフォームにすると機能は増えるのだが、個人用フォームとは色々扱いが異なるので、そのメモ。
個人用としてのフォームでは、管理画面の応答タブの「Excelで開く」から応答の全てをExcelのファイルとしてダウンロードできる。しかし、グループのフォームでは「Excelで開く」で開かれるのはSharePoint上に作成されたファイルになる。
SharePoint上のExcelファイルに応答を自動で反映させることができるので、この機能を使ってフォームの回答状況をチェックするマクロを作ってみた。SharePoint上のExcelファイルをExcelで開き、内容を読み取るというもの。
SharePoint上に応答とリンクしたExcelファイルを作成して開き(ブラウザ内で開かれる)、共有ボタンで共有のためのURLを取得する。https://なんとかかんとか という普通のURLとなるが、グループ名やフォーム名が長いとExcelで開くのが難しくなる。パスが短ければWorkbooks.Openメソッドや Hyperlinks(1).Followメソッドで開くことができるが、長い場合はShellステートメントを使ってWindowsに開かせないといけない。取得したURLをExcelで開くようにShellステートメントに書くのがミソ。実行前にExcelのオプション→詳細設定でリンクの処理の「Officeファイルへのサポート対象ハイパーリンクをOfficeデスクトップアプリで開く」にチェックを入れておく。
で、以下のような文を実行するとExcelでSharePoint上のファイルを開くことができる。
Shell Excel.exeのフルパス SharePoint上のExcelファイルのURL
ここで、SharePoint上のExcelファイルのURLは共有ボタンで取得した文字列すべてを使う。
ShellステートメントでWindowsにSharePoint上のファイル開かせる場合、自分の環境では数秒時間がかかる。Workbooks.OpenやHyperlinks(1).Followで開く場合は、ファイルが開かれるまで処理が次に進まないが、ShellではWindowsにコマンドを発行したらファイルが開かれていなくても次に処理が進んでしまう。これではまともに動かないので、ファイルが開かれるまでVBAに待たせる必要がある。
そこで、Excelで開かれているブックの数が一つ増えるまで待つことにした。ただVBAでループを回しているだけだとWindowsに制御が返らず、ファイルが開かれないのでDoEventsでOSに制御を戻すようにする。
Dim NextWbCount as Long, CharDQ as String, ResponseFile as Workbook
CharDQ = Chr$(34)
NextWbCount = Workbooks.count + 1
' HLStrは共有ボタンで取得したURL
Shell CharDQ + Application.Path + "¥Excel.exe" + CharDQ + " " + CharDQ + HLStr + CharDQ
' Shellステートメントで開いたファイルが開くまで待つ
Do
DoEvents
Loop Until Workbooks.count = NextWbCount
これでファイルは開かれるのだが、それで安心してはいけない。開いたファイルの内容が少し遅れて転送されてくるので、ファイルを開いたからといってVBAで即処理を始めると、空のファイルに対して処理をすることになってしまう。A列は応答に対する連番であり、A1セルは"ID"という文字列になるので、とりあえずA1セルが空欄でなくなるまで待つことにしてみる。このときもDoEventsでOSに制御を戻さないと、いつまで経っても内容が転送されてこないことになる。
Set ResponseFile = Workbooks(Workbooks.count)
With ResponseFile.Worksheets(1)
' 更新が反映されるまで待つ
Do
DoEvents
Loop While .Cells(1, 1).Value = ""
条件判定は、Loop While IsEmpty(.Cells(1, 1)) でもいいかもしれない。
最近のコメント