投稿

VBA: 突然マクロが壊れて実行が中断する

イメージ
就業時間を計算するExcelファイルが動作しなくなったと連絡がありました。具体的には残業時間等のセルに時間ではなく #### のような表示がされてしまっています。 デバッグしてみたところ、ある所まで進むと、そこでエラーメッセージもなく突然実行が中断していました。 試しに、プログラムの動作に影響がないように、その部分のコードを変更したところ、とりあえずそこは進むようになりましたが、また今度は何の変哲もない、次のような別の場所で止まるようになってしまいました。 コード自体に問題があるわけではなく、モジュールが何らかの理由で壊れてしまっているようです。 そこで、その標準モジュールのコードをすべて削除して、正常に動いているファイルからコピペし直したところ、とりあえず正常に動作するようになりました。 今回、利用者はファイルの編集をスマートフォンのExcelで行ったかもしれないので、もしかしたら、その際に破損したのかもしれません。 数か月前に、社内でマクロが破損するというトラブルが数回発生しました。これについては、Excelのアップデートもしくは、Acrobat のアドインが原因だったのではないかと思っています。妻の職場でも同様に発生していたという事です。しばらくしたら、発生しなくなりました。 マクロがエラーもなく突然動作しなくなったら、コードを貼付し直してみるとよいかもしれません。他も破損している可能性があるので根本的な解決にはならないかもしれませんが、その場しのぎにはなります。

サーモスのポケットバッグ REX-023 を購入

イメージ
もらいもののショッピングバッグを使っていて、軽くてコンパクトなのは良かったのですが、お弁当を入れて歩いていると、お弁当が立てになってしまい使い勝手が良くありませんでした。 そこで、そこが平らなショッピングバッグが欲しくて購入したのがサーモスのポケットバッグREX-023。Amazonで899円と値段もお手頃。 【公式通販】ポケットバッグ REX-023 グレー(GY) | サーモスオンラインショップ (shopthermos.jp) 2回使ってみたところなかなかいい感じで使えています。お弁当の上に重いキムチとかを入れると転げ落ちたりはしますが、お弁当自体は水平を保ってくれました。 23Lあって、買い物には十分な容量です。サーモスですが保冷機能はありません。 畳み方が書いてあります。 畳んだ状態。比較的コンパクトに畳めます。ピンク入りの部分は伸縮性があります。ただ、若干はめるのが手間だと感じます。ホックの方が良かったと思うけれど、そうすると畳み方を気にする必要が出てきます。難しい。 畳む途中。パッケージ裏の3番目の状態です。 広げた状態。折じわがついているので畳みやすいです。 底面を広げた状態。お弁当も余裕で入りました。逆に余裕すぎると動きやすいかもしれませんが、未検証です。 というわけで、ダメもとで買ってみましたが、今のところいい感じです。

荻窪の西郊ロッヂング

 ニュースを読んでいたら、次の記事が流れてきました。 荻窪に突如現れる「グンヂッロ郊西」の正体。焼夷弾が落下も戦後復興を支えた100年建築 | Business Insider Japan 写真に見覚えがあったので、読んでみると、やはり散歩で何度か前を通っている建物で、そのレトロぶりに驚いて興味を持っていました。レトロなだけあって文化庁の登録有形文化財に指定されているそうです。 私史上最も恐ろしかったホラー映画「リング」の撮影にも使われたという事です。真田広之の部屋でしょうか? あれを見た時も古風な部屋で印象に残っていました。 一回泊まってみたい。

UQに加えて IIJmio の eSIM を契約してデュアルSIM

イメージ
これまで iPhoneは auのサブブランドUQ、iPad は IIJmio の eSIMを使ってきました。 先日のゴールデンウィークから山を再開したので、iPhoneの回線に IIJmio のデータeSIMを加えることにしました。データ eSIMはドコモ網を使っているので、UQを補完できます。 ヤマレコの調子が悪い 登山の再開にあたってAppleWatchを使っていることもあるので、ヤマレコを本格的に使ってみることにしました。 ヤマレコを使うと、次のようにWatchに登山計画の標高グラフなどを表示することができます。 ところが、UQだけだと登山中に次のように表示されるときがありました(スクリーンショットは上の画像とは別の日です)。どうやら通信出来ないとこうなってしまうようで、これだと不便です。(追記:地図を正しくダウンロードしていないとこうなるのかもしれません) また、これとは別に、高尾山の奥にある小仏城山でさえも電波が入らない時がありました。 今後山行を続けることを考えると、山で電波が通じないのは死活問題です。 データeSIMを契約 そこで昨日の朝、山に行く前にIIJmioのサイトからサクッとデータeSIMを契約してみました。 既に、妻のiPhoneサブ回線や、iPadの回線を予約していたので難しいことはありませんでした。 一回線追加して、データシェアプランを有効化して、パケットを3回線で共有できるようにするだけでした。 3回線で共有するため、選んだプランは2GB(月額440円)にしました。 契約出来たら、早速iPhoneにインストールしてデュアルSIM状態にしました。 使ってみて 次の画像は自宅での電波状況です。UQがバリ4なのに対して、IIJmio(ドコモ)は2本しか立っていません。 次は奥多摩の高水三山で見た時の電波状況です。UQが1本しか立っていないのに、IIJmioは逆にフルです。 しっかり相互に補完できているようで何よりです。 iPhone 15 Pro Max を使っていて、一応電波状況が悪いときは自動的に回線が切り替わるようになっているようです。 これで、山だけでなく、以前ドコモで起こったような大規模な通信障害がauで発生しても安心です。来る関東大震災の備えにもなるかもしれません。

Wikipedia に寄付

今年もまたWikipediaから寄付のメールが届いたので、メールに書かれていた去年と同じ 1,560円を寄付しました。 寄付してから思ったけれど、去年 1,560 円だったのなら、今年は円安だからもっと寄付しないといけなかったのではないか? 次回覚えていたら、金額をアップしてみよう。 Wikipediaはさんざん使っているので、寄付くらいはしておこうと思いました。日本人は特に寄付が少ないらしいし。 ちなみに、私は寄付が基本的には好きではありません。寄付を扱う組織に無駄遣いされているような気がするためです。寄付したお金の大半が組織の維持に使われているようだと最悪です。その点、Wikipediaのように直接寄付できるところは、確実に正しく使ってもらえるので、寄付をする気になれます。

VBA の DoEventsに対する考察

 DoEventsとは 長年その意味が良くわからなかったのがDoEventsです。 DoEvents 関数 (Visual Basic for Applications) | Microsoft Learn MicrosoftのTimer関数のサンプルコードでは、ループの合間にDoEvents が実行されています。 Do While Timer < Start + PauseTime     DoEvents    ' Yield to other processes. Loop タイマー関数 (Visual Basic for Applications) | Microsoft Learn これ、何のために実行してるの? と思い、今回改めて調べてみました。とても参考になったのは次のページです。 読んで字の如くDoEvents #VBA - Qiita なるほど、DoEventsを実行すると、Excelに対して発生していたイベントをExcelに処理させることができるんですね。 ノンプリエンプティブなマルチタスクOS そこで疑問に思ったのは、上のコードに書かれていたYield to other processes.というコメントです。 他のプロセスにゆずる、と書かれているけど、他のプロセス(Edgeなど)は、そんなことしなくても処理を続行できるのでは?、と思いました。 そして思い出したのは、Windows 3.1など、いにしえのノンプリエンプティブなマルチタスクOSです。 Windows 3.1 系統(95, 98, Me等)のOSは、OSがExcel等のアプリにCPUの使用権を渡すと、アプリが使用権を自発的に返すまで待つという仕組みでした。これだとアプリが使用権を返さないと、他のアプリはもちろん、OSまで停止してしまいます。 実際、昔のWindowsだと、Windowsごとフリーズして、再起動するしかないという事がしばしば起きました。 それに対して、Windows NT系のOS(2000, XP, 7, 8, 10, 11)は、アプリ等の実行時間をOSが管理していて、アプリを強制的に停止して、他のアプリやOSを動かす仕組みです。これだとExcelがマクロを実行中でも、他のアプリ等も実行可能です。 ノンプリエンプティブOSにおけるDoEventsは、Ex

VBA でWaitやSleepを使う際の問題

VBAには、そのものずばりの Wait もしくは Sleep がありません。 Application.Wait Application.Wait は指定した「時間」の停止ではなく、指定した「時刻」まで処理を停止するというよく分からない仕様です。そして何より、Application.Waitは動作が安定していません。 試しに次のようなプロシージャーを実行してみます。 Sub uTest()     Dim uStart          uStart = Timer     uWait 1     Debug.Print Timer - uStart '経過時間を表示 End Sub Sub uWait(ByVal uSeconds)     Application.Wait (Now + uSeconds / 86400) End Sub 結果は次の通りで、全く安定しません。  0.921875   0.78125   0.90625   1   0.234375   0.4453125   0.8515625   0.03125   0.59375  私の使い方が悪いのかバグがあるのか。 Timer 関数 そこで、Timer関数を使って次のようなプロシージャーを書いて見ました。 参考にしたのは、次のページです。 タイマー関数 (Visual Basic for Applications) | Microsoft Learn Sub uWait(ByVal uSeconds As Single)     Dim uStart As Single     Dim uElapsed As Single          uStart = Timer          Do         uElapsed = Timer - uStart         If uElapsed < 0 Then '午前0時を超えた場合             uElapsed = uElapsed + 86400 '60 * 60 * 24 seconds         End If     Loop Until uElapsed > uSeconds End Sub 4回実行した結果は、次のとおり概ね正確です。  1.001953   1.001

Defender for Buisiness を試験導入

イメージ
法人版の365 Business Standard を使っているので、セキュリティもDefender for Business を使ってみようかと思いました。 とりあえず、365の管理画面から、試用版の無料ライセンスを入手し、ユーザーに割り当てます。 ライセンスを入手して管理画面が使えるようになるまで結構時間がかかります。 Windows PCをオンボード 次にDefenderの管理画面の「設定」「エンドポイント」「オンボーディング」から、オンボードパッケージをダウンロードし、そこからスクリプトを取り出して実行し、Windows 11 PCをオンボードしました。 オンボードしてから、PCの情報が取得できるまで結構時間がかかります。下手すると次の日じゃないと更新されないんじゃないかと思っています。 オンボードが完了してから、PCのデスクトップにEICARテストファイルを作成するときちんと検出されました。 デバイスのインベントリー デバイスのインベントリ画面を見ると、PCの露出レベルが「中」になっていたため、調べると、Visual Studio 等が古いままだったので、削除したり、更新したりしました。 Defender for Businessのいいところは、Microsoft製品以外の 7-zip や Acrobat、Chrome等のアプリの脆弱性も警告しくれるところです。 また、メールで実行可能ファイルを実行できてしまうなど、設定の甘いところも指摘してくれます。 Macのオンボード 問題だったのはMacの追加でした。 インストールパッケージとオンボードパッケージをダウンロードし、インストールしたのですが、フルディスクアクセスのところにMicrosoft Defenderが表示されませんでした。 その状態で、EICARテストファイルをダウンロードしたりスキャンして見たりしましたが、全然検出されませんでした。 どうやら、オンボードパッケージを実行する際に、インストールパッケージが必要だったようです。 インストールパッケージを再度ダウンロードして、オンボードパッケージを再度実行したところ、表示されるようになり、無事にフルディスクアクセスを許可することができました。 その結果、EICARテストファイルがきちんと検出されるようになりました。これで一安心です。 Manual d

Power Automate for Desktop: Edgeの制御がうまくいかない

イメージ
しばらく前のWindows Updateからだと思いますが、Power Automate for DesktopからEdgeの制御がうまくいかなくなりました。 具体的には、銀行サイトにアクセスする際の電子証明書の選択に失敗するとか、普段はうまくいくところで正しく動作しないとかです。 以前からEdgeを終了させないと調子が悪かった 以前から、Edgeを終了させずに、つまり画面を閉じずにPower Automate for Desktopのフローを実行するとうまく動作しないことがありました。おそらく前回実行時の情報が残っていてそれが悪さをするのでしょう そんなときは、Edgeを閉じてからフローを実行すればうまくいっていました。しかし、今回は、画面を閉じても動作が異常です。 Edgeは画面を閉じても裏で動いている Edgeは終了させても高速化のため、バックグラウンドでプロセスが動いています。つまり、画面上は消えているけれど、裏では待機中の状態です。そしてEdgeが呼び出されると画面を素早く表示しています。 これまでは、画面を閉じれば、裏のプロセスも一旦リセットされていたのだと思いますが、Windows Updateにより、完全に終了しなくなったのかもしれません。 その結果、プロセスに残っている情報が、Power Automate for Desktopの制御に悪影響を与えているのではないかと思います。 プロセスを強制終了 そこで、タスクマネージャーを使って、バックグラウンドで動いているEdgeのプロセスを終了させたところ、正常に動作することが確認できました。 そのため、次のように、フローの最初でEdgeのプロセスがあるかどうかを判定し、あれば、終了するというアクションを組み込みました。 この結果、それまでの異常な動作はなくなりました。完全にプロセスが終了することにより、プロセスに残っていた情報がクリアされるためでしょう。 しかし、この方法だと、プロセスを強制終了するため、Edgeが強制終了されたと言ってくることがあり、気分の良いものではありません。 本当は、Edgeに命令を送って正しく終了させることが望ましいのですが、方法が不明です。 Edgeの設定は効果なし Edgeの設定「システムとパフォーマンス」にある「スタートアップ ブースト」や「Microsoft Edge が

Power Automate for Desktop:テキストに基づく取得で劇的に高速化

イメージ
 長年、遅くて悩まされていたPower Automate for Desktopのフローが、「テキストに基づく取得」を使用したところ、劇的ビフォーアフターで高速になりました。 テキストに基づく取得のサンプル 1. 「Loop」アクションを追加し、1から5まで1ステップずつ増加します。 2. 「ウィンドウのUI要素をクリック」アクションを追加します。 3. UI要素を選択し、UI要素の追加を選択します。 4. 電卓の数字ボタンを右クリックし、「テキストに基づく取得」をクリックします。 5. 「テキスト値」をクリックし、「{X}」をクリックし、変数「LoopIndex」を選択 6. 「テキスト値」に変数LoopIndexが入力されます。 7. 作成されたUI要素を確認すると、次の通りButton'5'の要素の「Name」にLoopIndexが指定されているのがわかります。 8. フローは次のようになっています。 9. フローを実行すると、UI要素のLoopIndexは、1から5へと次々と変わり、結果的に1から5のボタンがクリックされることになります。 実例 アプリの請求書一覧から、次々と請求書を選択して入金するという業務フローがありました。これが請求書の選択処理にやたら時間がかかり悩みの種でした。 これまでのフローは次のように、請求書リストを順番に見て行って、対象の請求書番号が見つかったら処理するというものでした。 遅い原因は、請求書一覧から一件一件要素の請求書番号を読み取る事でした。Power Automate for Desktopは、画面の情報を読み取るのがやたら遅いので、この処理を何度もやったら遅くなるのは当然でした。 今回、テキストに基づく取得が使えることが分かったので、請求書番号を使ってPower Automate for Desktopが自分自身で直接UI要素を参照するようにフローを作り替えたところ、次のように劇的ビフォーアフターでシンプルになりました。 その結果、速度も劇的に速くなりました。 よく考えてみると ただ、よく考えてみると、UI要素に変数を指定して、動的に要素を指定するという事は以前からやっていたので、もしかしたら、この機能を使わなくてもできたんじゃないかという気がしています。 テキストに基づく取得を使うと、より簡単にそれができ