TinySeleniumVBA と 64bit

TinySeleniumVBA を使うと Excel から Edge を操作していろんなことができます。
本当に便利です。まぁ、昔もIEで同じようなことができてましたが、Edgeになって遠のいていました。

そんな便利なTinySeleniumVBAですが、職場で何人かに使ってもらったところ、ある人のところでエラーが発生し、まったく使い物になりませんでした。

エラーメッセージは、『クラスが登録されていません』、英語だと『class not registered』。日本語で検索するといくつかヒットしますが、『管理者権限でSeleniumBasicをインストールし直す』といったものしか出てきません。TinySeleniumVBAはインストール不要で使えるのがメリットですし、SeleniumBasicは使っていないので的外れの情報です。

そこで、英語のメッセージで調べた時に見つけた情報が今回解決のヒントになりました。
そこには「32bitなら32、64bitなら64の、OSとドライバーのバージョンを揃えろ」というものでした。
イマドキ、32bitのWindowsなんてあり得ません。職場のPCは、どれも3年以内に購入してますし、Windows11対応なので、10から11へアップグレードしろとせがんでくるのを拒否するのがしょっちゅうあって面倒くさいとメンバーから苦情がくる位です。

しかし、ふと「あれ? もしかしてExcelのバージョン…」と疑念が浮かび、調べると、動かないものに限って『64bit版 Excel』でした。
当初は『64bit版 Excel あるある』の、WINAPI関係の Declare PtrSafe の問題かと思いましたが、症状は改善しません。

VBAの On Error GoTo 処理を外してトレースすると、WebDriverクラス内の CurrentURL の中で、『CreateObject(“ScriptControl”)』がエラーを起こしていることをやっと突き止めました。
この関数内で、URLを JavaScriptの(正確には JScript ですが)『DecodeURI』で変換したいがために呼び出しているわけですが、『コレ(ScriptControl)』が 64bit版 Excel では動かないのです。

この解決策を調べると、またいろいろ出てきますが、こちら Excel 32Bit版 と 64Bit版 の問題(1)CreateObject(“ScriptControl”) の方法でなんとか解決できました。
(こちらのソースも一部問題があります。『d.appendChild elm』のところは『d.body.appendChild elm』にしてください)
(余談ですが、DecodeURIの逆『 EncodeURI 』は、何もせずとも VBA の WorksheetFunction.EncodeUrl で変換できる。なして一方通行なん?)

これでようやく 64bit版 Excel で、TinySeleniumVBA が動くようになりました。

ちなみに「まったく使い物になりません」と書きましたが、CurrentURLを使わなければ問題は発生しなかったと思います。誤作動防止のために、開いているページが自動操作対象のURLかを最初にチェックする仕組みにしていたので、そこで止まっていた、というワケです。

確定申告書の整理番号

https://www.keisan.nta.go.jp/h29yokuaru/kessansyo/seiribango.html
>番号欄には何を入力したらよいですか?
>整理番号がお分かりにならない場合は、空欄のままで差し支えありません。

この番号は申告者を税務署ごとに追跡するための番号だと思われます。
でも、わからなければ入力しなくてもいい(わからないのだから当然か)。

しかしこの8桁の番号には法則性があるようで、左から2桁目と3桁目が苗字の1文字目を表しているようです。

具体的には2桁目があかさたな順で、1が「あ行」、2が「か行」という具合で、「や行」なら8ということですね。(ただし「や・ら・わ行」については後で補足説明あり)
そして3桁目は段を表していますが、0から2ブロックずつ使っています。「あ」の段なら0、「い」の段なら2、「お」の段なら8という具合です。2ブロックずつなので、1も「あ」の段で使われると思われます。

実際に名前がどのようになるかといいますと、「あ」から始まる人は2桁目が1、3桁目が0になります。同様に「き」の人は22、「そ」の人は38となります。
逆に整理番号から調べて、もし64だったら「ふ」から始まる名前の人と推測できます。

ただ、「や行」から使われない段(「い」と「え」)が出てくるためか、ここを空き番号にせず詰めて使われるようです。
「や」からの割当を説明すると、や=80、ゆ=82、よ=84、ら=86、り=88、る=90、れ=92、ろ=94、わ=96、となるようです。(もし「を」があるなら98?)
このことから2桁目に0がくることはないと考えられます。

残りの4桁目以降の後ろの5桁で、納税者に順番に割り振っていくと思われますが、5桁で表せる組み合わせはざっと10万人(社)分、2ブロックあるので20万人分ということになります。名前1文字あたりで考えると十分すぎるかな、とも思えますが、もしチェックディジットで1桁使っていたらと思うと、一気に2万人分しかなくなるんですよね。実際にチェックディジットがあるかどうかは不明ですが、かなり古くからある気がしますので無い可能性が高いですかね。

1桁目については、見たところ「0」で固定されていましたが、人口が多い首都圏では番号が足りなくなるかもしれませんので、ブロックが一杯になったら1桁目が1・2…と増えていくのかもしれませんね。もっとも首都圏でこの法則があてはまるかもわかりませんが。

ちなみに最初の方でも書きましたが、税務署ごとの割当てなので、税務署が違えば同じ整理番号になることも普通にあります。税務署番号5桁+整理番号8桁で同じ番号が重複して発行されることはありません。

ユーザ名の変更

自分のWordpressから、度々不正ログインによる『IPブロックしたよ』のメールが来るので、ユーザ名を推測されないものに変更してみました。

パスワードは元々20文字以上なので突破されることはないと思ってますが、不正ログインを試みるヤツラには関係ないですもんね。

GMailにGoogleのアカウントを追加

GMailの差出人に他のGoogleアカウントを追加するときの注意点です。

GMailの設定⇒アカウント⇒名前 のところから「他のメールアドレスを追加」をクリックし、GMailのアドレスを入力します。

するとSMTPサーバの認証を求められるので、パスワードを入力するのですが、通常はエラーが出ます。

エラーコードは 534 、「安全性の低いアプリがアカウントにアクセスするのを許可」せよと出るため、まずはこの設定を有効にします。

ところがこれを有効にしてもエラーが解消されません。

次にやるのが、 https://accounts.google.com/DisplayUnlockCaptcha の許可です。

これでようやく認証が通りました。

認証が終わったら、「安全性の低いアプリ…」は無効に戻しましょう。

Accessで「クエリが破損」エラー ロールバックバッチ

Accessはいつか覚えたいと思いつつ、一向に実現しないものの一つです。ただ、VBAとSQLはなんとなくわかるので、メンテナンスくらいはできます。

それで、標記のエラーが発生しヘルプに呼ばれたのですが、再起動で戻らないし、破損であればバックアップから戻すのが定石かな、と思って軽くぐぐってみると、すぐにOfficeのアップデートが原因とわかりました。

通常のOfficeであれば、WindowsUpdateの該当KBをアンインストールすればすぐに解決なのですが、Office365版の場合は「ロールバック」になるそうで、「管理者権限でこのコマンドを実行して」と言っても難しそうなのでバッチを作りました。

バッチファイルの中で管理者権限をチェックしていますので、そのまま実行してかまいません。ロールバックの対象は、とりあえず直前のビルド12130.20272にしてありますが、うまくいかない場合は別のビルドに修正してください。

@ECHO OFF
OPENFILES > NUL 2>&1
IF NOT %ERRORLEVEL% EQU 0 GOTO GOADMIN

REM I’m Admin
CD “%programfiles%\Common Files\Microsoft Shared\ClickToRun”
OfficeC2RClient.exe /update user updatetoversion=16.0.12130.20272
GOTO :EOF

:GOADMIN
REM Not Admin
powershell start-process %0 -verb runas

Hello WordPress

WordPress へようこそ。これは最初の投稿です。編集もしくは削除してブログを始めてください !

ということで、Wordpressへ引越しました!

はてなダイアリー終了ということで、はてなブログへの移行もやってみたのですが、いい機会だし独自ドメインもあるしこちらへ。
MovableType形式のエクスポート⇒インポートで簡単に移行できました。
よく見るとはてな記法?の部分がちょっと体裁が変ですね。まあバリバリに使ってたわけでもないので徐々に直していきます。

今後ともよろしくお願いいたします。

Windows10 1709でのSMBv1共有

自宅のサーバ代わりのPCを入れ替えました。

ついでにWindowsを最新にしてしまえとFall Creators Update(FCU)を入れてみました。

しばらくして気付いたのが、Androidから共有フォルダへの接続不能、、、

Windows同士だと開けていたので気付くのが遅れました。

ネットで調べると、SMBv2以降対応の最新スマホに買い換えるか、セキュリティリスクを承知でSMBv1を有効にしろ、とあります。

とくにランサムウェアの台頭でFCUではSMBv1を切り捨てることになったのだと。

今使っているスマホはすでに4年が経過、自分でも2,3年で乗り換えのつもりだったのですが、タイミングを逃しずるずると今に至ります。

もちろん買い換えたい気持ちはありますが今日明日というのは現実的ではないので、SMBv1有効化の方向で。

ところがPowerShellなどでSMBv1を有効化してもAndroidからは開けません。

2,3日あくせくしてようやく原因が判明しました。

FCUでは「Windowsの機能の有効化または無効化」の設定で「SMB 1.0/CIFSサーバー」を有効にしないとなりません。

こちらの中程に画像がありますが、既定でオフになっています。

「Fall Creators Update」で注目、ネットワーク&セキュリティ機能4選+1【イニシャルB】 – INTERNET Watch

たしか、この記事読んだはずだったんですけどねぇ。

ツイッターBOT作成苦労話

枯れた掲示板を運営しているのですが、書き込みがあったらツイートしたら便利かなと思ったんです。

iftttにメールを送ったらツイートするというレシピがあり、すぐできるなと思いました。

まず最初に、え?と思ったのが、ツイッターのアカウント作成。電話番号を入力しないと先に進めません。

ネットで調べると、スマホから登録するといいとのこと、確かに「スキップ」のリンクが出てきました。

iftttと連携して、いざメール送信。が、ちっともツイートされません。

ここでどうしたかよく覚えていませんが、すぐに解決できそうになかったので早々に諦めました。

php版のBOT作成プログラムを探すと結構出てきたので、簡単なツイートはなんとかできるようになりました。

注意点は古い情報が多いこと(ツイッターのAPI仕様がころころ変わるせいでもある)、そしてBOT用のAPIキーの取得に携帯認証が必要ということです。

同一の電話番号で10個のアカウントが作れるそうです。そこまで複アカしてないし、APIキーはどうやっても必要なので認証させました。

次にひっかかったのは140字制限。

BOTは自作のメッセージがほとんどなので当然140字以内に収めますが、掲示板は字数制限なしなわけで普通にツイートしようとしたら字数オーバーで弾かれました。

mb_strimwidth($str, 0, 140, ‘…’, ‘UTF-8’);

これだ! って思いましたが、コレmb_といいつつマルチバイト対応してない?(文字数じゃなくwidth(幅)で丸めるんだから自分の勝手な思い込みですよね)

mb_substrで十分でした。

WORDの差込印刷で計算してカンマ付き全角表示

  1. フィールドコードを挿入(=Formulaにします)
  2. =の後ろに「差し込みフィールドの挿入」から差し込みしたい値を挿入
  3. 丸かっこで計算する内容を記述
  4. 丸かっこの後ろはカンマ付数字にするため「\# “#,##0″」、全角にするため「\*DBCHAR」にする

例えば一口5000円の会費を計算するといった場合の最終的なフィールドコードは

{=({MERGEFIELD 口数} * 5000) \# “#,##0” \*DBCHAR}

のようになります。

WORD2007で確認してますが、フィールドコードが複雑になったあたりから、右クリックメニューの「フィールドコードの編集」を選ぶと動作停止するようになってしまいました。

フィールドコードの編集はAlt+F9で表示を切り替えて行うといいです。

Tampermonkey detected that your browser profile is broken!

普段、chromeおよびIron(chrome互換ブラウザ)のポータブル版を愛用しています。

しかし起動時に上記エラーが出ることがあります。

エラー対策を調べると、プロファイルを作り直せというのがほとんど。

しかしプロファイル修復どころか新規インストールでもエラーが出たためちょっと困りました。

引数で最初からプライベートモードにしてるのが原因という気もします。

ということで、単純にプラグインを書き換えてエラーメッセージだけ表示させないようにしました。

修正したのは以下のファイル

Google Chrome Portableの場合

GoogleChromePortable\Data\profile\Default\Extensions\[ランダムな文字列]\[バージョン]\background.js

Iron Portableの場合

IronPortable\Profile\Default\Extensions\[ランダムな文字列]\[バージョン]\background.js

ランダムな文字列は本来Tampermonkeyとなるところですが、固定にするとウイルスに書き換えられる恐れがあるためランダムに変更された思うので、とりあえずこのフォルダを片っ端から開いてみてTampermonkeyのバージョンと一致したらそれが正解ということだと思います。

background.js に最初の方に上記エラーメッセージがあるので、大きく囲むように /* と */ でコメント化しました。

function(){/*confirm(“Tampermonkey detected [中略] broken!”],a,!0)*/})},1E3);