エクセルマクロのパスワード

何事においても先達はあらまほしき事なり

「1234」
72文字
6062CC13E913E9EC1714E94DB4B5BB69EAA21E41EBFCFC944A99D12883ECB411D5C4C725
74文字
6260CE844BA14BA1B45F4CA1150CFD13A1426AB619731444BC027169003BC46CF98D2C3F8D
76文字
959739565B76787678898877782825EE08AE357FA52C620973A13594A42DFC132D2E4EE37E44
78文字
0E0CA28EEEF2390F390FC6F13A0F679EAF816FACBCDC6B29C63A6E0CC7935ECD22FE5F1FB29113

https://barihack.net/excel-macropass-hack/

PowerAutomateでエクセルを扱う場合の注意

PowerAutomate便利ですね。
Office/Teamsとあわせてつかうとめちゃ便利です。
特にデータ保存やScriptなどでExcelOnlineと合わせて使うことが多いと思いますが
ExcelOnlineは結果整合性なので注意が必要。

例えば同一フロー内で「Excel→表に行を追加」「Excelスクリプトの実行」を順に行った場合、
前者の結果がが後者で参照できるかはタイミングによります。
Flow内でWaitしてみたり、エクセルを改めて開くようなことをしてみたのですが回避できませんでした。


なので、Excelスクリプトがあるときは行の追加や更新はエクセルスクリプトで一緒にやりましょう。
そうすれば1トランザクションの中なので、うまくいきます。

その他エクセルスクリプトをFlow内から呼び出すときの注意点
docs.microsoft.com

PowerAutomateフローで指定時間Waitする

自動化あるあるですが、PowerAutomateでもフロー内でWaitが必要になるときがあります。
ちょっと前まで「Delay Until」というWait用フローがあったのですがいつの間にか統廃合されていました。
なので、「Do Until」を使って指定秒数Waitしましょう。
f:id:GARAPON:20210830144642p:plain

変数初期化

現在時刻にWaitしたい分だけ加算しましょう。型は文字列型です。

addSeconds(utcNow(),5)

全部UTCのままでやっているのでデバッグのときとか気を付けましょう

Do Until

条件「utcnow()」,「次の値より大きい」、「上記で初期化した変数」
でセットしましょう。
アクションに何も設定していないと最適化でスキップされるので
無駄に足し算をさせるとか、テキストの検索を無駄に行うなどの人畜無害な処理を行わせましょう。
(指定時間Waitでなくてよいならここで1000カウントさせるとかでもよい)

これでOK。
ログでみるとちゃんとWaitされているのがわかりますね。

それでは良い自動化ライフを!

PowerAutomateで文字列編集をする

PowerAutomateで文字列編集するなら圧倒的にエクセルスクリプト
というかPowerAutomateは拡張スクリプトを書く場所がほかにないのでエクセルスクリプトに書くしかないともいえる。
まあスクリプトを一回呼び出せればあとは何でもできるわけです。
エクセルにデータも保存できるし、関数だって使いたい放題。

複数戻り値を戻す場合

というかんじでエクセルスクリプト依存が高まると、複数戻り値がほしくなるので
以下のように対処しましょう。

function main(workbook: ExcelScript.Workbook) {
  let nameArray = ["がらがらさん","ぽんぽんさん"];
  return nameArray
}

みたいなのを作ってからFlowで以下のデータの詰め替えをしてあげる。

    • 変数の初期化 データタイプArray
    • Apply to each 内で 配列変数に追加 

f:id:GARAPON:20210827182652p:plain

    • 関数で抜き出す variables('配列変素')[1] とかのファンクションとして文字列内に埋め込む

f:id:GARAPON:20210827183050p:plain

これで何とかなる。

ちょっとめんどくさいけど皆様の自動化生活に幸あれ!

PowerAutomateで日時スレッドに投稿する

PowerAutomate便利です。
Office関連と連携しながら色々できるのいいですよねー。

私はボットを作って各種情報をTeamsに呟かせているのですが、
普通にやると発言が多くなりすぎてみずらいので
日時でスレッドを作り、そこに呟かせるように修正してみました。

日時のスレッド作成

時刻トリガで日時の発言をさせます。
どうせなので以下のような関数で日付を記載しておきます。

formatDateTime(convertTimeZone(utcNow(), 'UTC', 'Tokyo Standard Time'),'yyyy/MM/dd')

このあと自動的に返信を行うために上記発言のIDを保存しておきます。
PowerAutomateでストレージ代わりに使うとしたらやはりエクセルがおすすめです。
エクセルに日付、IDを格納する表を作っておき、そこに日付、IDを保存します。
このとき表の書式設定は文字列にしておきましょう。

随時発言を返信に修正。

発言フローの中でまず該当エクセルからIDを引っ張ります。そして
Teamsの「チャネル内のメッセージで返答」で該当IDに返答すればOK.

つい先日までFlowBotでは返答ができなかったのですが、いつの間にかできるようになりましたね。
日々機能改善されているPowerAutomateでこれからも楽しくやっていきましょう。

VBAからWin32のSleepを呼び出す

vbaでスリープさせる方法はたくさんありますが、Win32APIのスリープを直呼びしてみたらいまいちだったけどメモ。

呼び出し方は以下の通り。

    Private Declare PtrSafe Sub Sleep Lib "kernel32" (ByVal ms As LongPtr)

   Private Sub wait()
       Sleep 5000 
   End Sub

上記で使えはするが、SleepだとExcelなりOutlookなりVBAの母艦の反応も悪くなるので、VBAでつかうならdoEventのほうがCPUは食うけどお勧めな気がします。

なのでお蔵入りですね。