投稿

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要素に変数を指定して、動的に要素を指定するという事は以前からやっていたので、もしかしたら、この機能を使わなくてもできたんじゃないかという気がしています。 テキストに基づく取得を使うと、より簡単にそれができ

小宮商店の軽量折り畳み傘を購入

イメージ
小宮商店の折り畳み傘を愛用してきました。 小宮商店の軽量で大型の折り畳み傘を愛用中 ケースに入れず、裸でバッグに入れていたせいか、複数の、折り目の角の部分に小さな穴が開いていました。歩くと、生地と骨がこすれるためかキュッキュッと音もするようになりました。 購入してから7年がたつし、色もネイビーより黒がいいので買い替えることにしました。これまでの傘はキャンプ用にでもします。 今まで使っていたのは、次の商品か、それの前のモデルでしょう。 小宮商店 Daily Use Umbrella 超軽量カーボン傘 ホック式 親骨(布が張ってある骨)65cm、重量195g、と軽量です。 今回調べてみると、骨を折らなくても楽に開閉できる商品もありました。 小宮商店 Daily Use Umbrella 超軽量カーボン傘 楽々開閉 確かにこれまでの傘は閉じるとき、ポキポキと骨を畳むのが面倒といえば面倒でした。 開閉が楽になる代わり重量は230gと35gアップしています。 35gの差は大きくはありませんが、私の場合常にカバンに傘を入れているので、重くなるのは考え物です。 60cmモデルにすれば、楽々開閉でも175gとホック式より軽くなりますが、小さくて足元が濡れてしまうのは本末転倒です。思案した結果、従来通りホック式を買うことにしました。 購入したのはいつも通りAmazon。 小宮商店 新型 超軽量カーボン 65cm 折りたたみ傘 大判 無地 無地 8本骨 メンズ Hock式 税込み4,840円でした。 実測はカバー込みで198g 開いてみると、生地がこれまでの物より柔らかくなった感じです。ハリがないため、畳みにくくなったような気がします。実際には雨に濡れるので、雨の中で使ってから、また感想を書いてみたいと思います。

iPhone 15 Pro Max でも裸族

これまでずっとスマートフォンは裸で使ってきました。ケースはもちろんフィルムも貼ったことがありません。 iPhone 12 Pro Maxでも裸族かも 昨年 iPhone 15 Pro Max に買い替えましたが、それでも裸族です。今のところ落としたことはありません。 iPhone 12 Pro Max については、二階落としました。キャンプで酔っ払ってトイレに行ったときに、コンクリートの床に思いっきり落としました。しかも2回も。さすが酔っ払い。 しかし、フレームに傷はついたものの画面が割れることはありませんでした。 あの時は普段は入れないフリースのポケットに入れたのが敗因でした。ポケットが浅くて落ちてきやすいデザインでした。 いつものようにパンツのポケットに入れればよかった。 iPhone 12 Pro Max は 15 を買ったので、親父用のおさがりにしました。親父にやる時はさすがにケースとフィルムを貼りました。フィルムは撥油性能が低下したから付けたという面もあります。 妻は、以前はフィルムとケースの両方をつけていましたが、iPhone 15 になってからはケースのみでフィルムはつけていません。 今日ニュースを見ていたら、こんな記事が目に入りました。 スマホの画面保護フィルム、実はもういらない説 やはりフィルムはいらないのかもしれない。

THE NORTH FACEのフリースベストを洗ったら毛玉ができてショック

イメージ
THE NORTH FACEのフリースベストを買ったところ、とても使い勝手が良くて気に入って使っていました。 今日の散歩で汗をかいたので洗濯したところ、一発で表面が荒れてしまい毛玉っぽくなってショック!! 洗濯表示を見ると手洗いマークがついていました。気に入ったものは洗濯表示を確認してから洗うべしと強く心に刻みました。 無残にも荒れてしまった表面。洗濯前は滑らかで触るたびに心地よさを感じる手触りでした。 ちなみに、傷まないように裏返して洗ったし柔軟剤も使っていたし、洗濯物も少なくして洗ったのにこのざまです。 (スポーツ用品は原則柔軟剤は使わない方がいいです。吸水、速乾性が損なわれます) 乾いたら、とりあえずブラッシングをしてみます。 フリースのふわふわ復活【自宅でメンテナンスしてみた】 ブラッシングしたらある程度改善! 2024-03-14 追記 ものは試しで手持ちの洋服ブラシで半分だけブラッシングしてみたら、見た目はある程度、手触りはかなり改善しました! 写真ではわかりにくいけれど、右側だけブラッシングしました 見た目は、それほどでもないけれど、手触りは明らかに改善して、購入当時にかなり近くなりました。 これに懲りて二度とフリースを洗濯機で洗いません。おしゃれ着洗濯モードならいけそうな気もしますが、洗濯機と洗剤の仕様確認が必須です。手で押し洗いというのがベストなのかもしれません。

dinos Anya/アーニャ キッチンすき間収納 ロータイプを購入

 洗面台と洗濯機の間の隙間に、これまではプラスチックの安っぽい隙間収納を使ってきました。プラでやわなので、天板も歪んでいて上に置くものが安定しません。引き出しの動きもイマイチ。だから前から買い替えたいと思っていました。 というわけで、妻が探してきたのは次の商品。 Belle Maison コンセント付き隙間ワゴン コンセント付き。 一番下の引き出し以外はレールがついていなくて、真っすぐ引き出さないと開かないというレビューが。それは嫌だな。22,900円。 ニトリ 5cm単位で選べる引き出しタイプ スリムカウンター 引き出しにストッパーがついていないので、最後まで引き出すと落ちてしまうだろうし、そうなると一番奥が使いにくそう。17,990円。 Belle Maison サイズが選べる隙間サニタリーチェスト  組み立て式で15,900円(幅20cmモデル)と安い。 防水性が良くないとか、強度がなさそうなどのレビューが。 最下段の引き出しがコロ付きなので、床に傷がつきそうなのも×。 dinos Anya/アーニャ キッチンすき間収納 ロータイプ(引き出し3段) 幅20cm奥行55cm高さ85cm 全ての引き出しにフルスライドレール付き。前面、天板には傷が付きにくく汚れにも強いポリエステル化粧合板。 31,900円と最も高いけれど、その分品質も最も良さそう。 難点は内寸の幅が10.5cmと狭い事。レールを付けると仕方がないのかもしれません。 現在の収納家具より奥行きが伸びてフルスライドレールなので奥まで有効に使えそうなので、結果的に同じくらいになる事を願います。 なお、奥行きは55cmで洗面台とぴったり合うのも○。 というわけで、これにしました。 なお、受注生産らしく納品には時間がかかります。

Excelのテーブルに行や列を挿入する際のエラー

イメージ
 Excelのテーブルに行や列を挿入しようとすると、「この操作を実行するとワークシート上のテーブル内でセルが移動されてしまうため、この操作は行われません」というエラーメッセージが表示され、失敗する時があります。 長年このエラーの原因が不明でしたが、あるときどうしても解決する必要があって調べたところ、ようやく原因がわかりました。 現象 図1の場合、上のテーブルに行を追加しようとするとエラーが発生します。 図1 図2の場合は、左側のテーブルに列を追加しようとすると発生します。 図2 テーブルに行や列を追加しようとすると、そのテーブルの範囲だけが拡張されます。 どういう事かというと、図1の上のテーブルの場合、行を挿入すると、B, C, D列のみセルが追加され、A列やE列は変化がありません。 そうすると、下のテーブルは、列1、2、3だけ下にずれることになり、テーブルが壊れてしまいます。そのため、最初のエラーメッセージが表示されるという事です。 図2の場合も同様で、左のテーブルに列を追加しようとすると2行目から5行目までだけが右にシフトしようとします。これもまた右側のテーブルが壊れてしまうため、エラーが起こるというわけです。 回避策 テーブルに行や列を追加するのではなく、シートに対して行全体、列全体を追加すれば、図1の下のテーブルや図2の右のテーブルも全体的に移動するのでエラーは発生しません。 この場合、人間が手動で追加する場合はいいのですが、VBAを使って、テーブルに行や列を追加する場合は、シートに対する行や列の追加が必要になるためやっかいです。 一つのシートにテーブルを複数追加する場合は、このような問題が起こらないようにレイアウトを考える必要があります。 私の場合は、仕方なく、図1のパターンでは、列が少ないテーブルを下に配置することにしました。これだと、上のテーブルを追加しても、下のテーブルは全体的に下にずれるため問題ありません。 そういうレイアウトにできない場合は、仕方がないので、行全体、列全体を追加することになります。