« 2021年10月 | トップページ | 2022年1月 »

2021年11月

2021年11月17日 (水)

DDWinのエラー

Windows 10上でDDWinで電子ブックの辞書(と言っても知らない人が多そうだ)を使っている。とある辞書の本文内にあった別項目へのリンクをクリックしたら、DDWinがアクセスしちゃいけないメモリにアクセスしたようなエラーメッセージが出て、ちゃんと動かない上にDDWinを終了できなくなってしまった。

DDWinはタスクマネージャーから終了できた。

エラーの方はどうやらフォントが悪かったようだ。エラーが出たときは源ノ明朝の派生フォントのアプリ明朝を指定してあった。IBM Plex Sans JPでも同じリンクでエラーとなり使えなかった。かなり昔に合成したMigu 1BTだとエラーが出ない。新し目のフォントと相性が悪いのかもしれない。

| | コメント (0)

2021年11月 1日 (月)

FormsとSharePointとExcel VBA

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)) でもいいかもしれない。

| | コメント (0)

起動ディスクがHDDのWindows PCを少しだけ快適に

起動ディスクがHDDのかなり古いデスクトップPCを使っている。OSはWindows 10。起動ディスクがHDDなので色々遅いのは仕方がないのだが、Microsoft TeamsとMicrosoft Edgeは使う気をかなり削ぐ遅さ。

Microsoft Teams

ウインドウが邪魔なので、バックグラウンドで起動/ウインドウを閉じても終了しない設定で、用がないときはウインドウを閉じている。メンションされた通知が表示されたときに見に行くのだが、ウインドウが表示されるまで秒単位で待つ。わずか数秒なのだが、これが遅くてストレスになる。最小化してある他のアプリケーションのウインドウを再表示するぐらいのスピードで開いてくれるといいのだが。

ユーザープロファイルフォルダに有るAppData¥Local¥TeamsフォルダをUSB 2.0接続のSSDに移動して、元のフォルダがあったところに移動先のジャンクションを作成したところ、表示速度が劇的に速くなった。最小化したアプリケーションを再表示するぐらいに。これなら少し使う気になる。

Microsoft Edge

アンチウイルスソフトやバックアップソフトなどがCドライブをアクセスし始めると、とたんにレスポンスが悪くなる。スリープしている別のタブを表示させるのにも分単位で待たないといけない。最初はEdgeのプロファイルフォルダをUSB 2.0接続のSSDに移動して元の場所にジャンクションを張っておいたのだが、多少はましになったかな程度の効果。結局Edgeそのものが入っているProgram Files(x86)¥MicrosoftフォルダもSSDに移動してジャンクションを張った。これでかなりまともに動くようになった。

TeamsもEdgeもSSDのシステムで使うのを前提に作ってあるんじゃないかという気がする。

今回USB 2.0という遅いインターフェースながらSSDを使うことで早くなった。今どきの高速なインターフェースでSSDが搭載されたPCなら快適なんだろうな。

| | コメント (0)

64 bit版ExcelでVBAマクロを走らせたら

もともと32 bit版Excelで作ったVBAマクロを64 bit版Excelで実行したら、Declare文でDLL内の関数を呼び出しているところでエラーとなった。

表示されたメッセージはPtrSafeをどうとか書いてあるので、検索して調べてみた。DLLの関数の呼出しに引数としてLongなどを与えてある場合はLongPtrへ型を変えた上でDeclare PtrSafeと書く必要があるとのこと。幸い(?)自分が作ったマクロの引数はStringだけなので、PtrSafeを加えるだけで問題なく動いた。

指定したネットワーク上のフォルダでファイルダイアログを開くために、カレントディレクトリをUNCパスで指定するためにDLLの中の関数を呼び出しているのだが、方法を変えたほうが良さそうだ。

今まではApplication.GetOpenFilenameでファイルを選んでいた。これからはFileDialogオブジェクトを使ってみよう。

| | コメント (0)

« 2021年10月 | トップページ | 2022年1月 »