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かを最初にチェックする仕組みにしていたので、そこで止まっていた、というワケです。

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

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

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

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);

サービスのスタートアップ一覧

windowsを使っていると、たまにサービスの起動状態を見直したい場合があります。

不要なサービスを起動しないようにするのが主な目的でしょうか。

ただ、何を変更したかあとでわかるようにしたいとも思ったりして、、、

調べてみるとscというコマンドが使える、が、一発でサービス全列挙というのはできないようで。

そしたらこちらにまさしくズバリそのものがありました。

http://d.hatena.ne.jp/papermelt/20110918/1316341039

動作が少し遅いのと、自動(遅延)に対応してないとのことで少し改造しました。

@echo off
title サービス起動設定をエクスポートする
echo 調査中…
sc query state= all type= service|findstr SERVICE_NAME>TEMP.TXT
for /F “tokens=*” %%i in (‘hostname’) do set FILENAME=サービス起動設定ファイル_%%i_%DATE:/=%.txt
echo>%FILENAME% [サービス起動設定ファイル]
for /F “tokens=*” %%i in (TEMP.TXT) do call :SUB “%%i”
del TEMP.TXT
goto :EOF
:SUB
set SERVICE_NAME=%~1
for /F “tokens=*” %%x in (‘sc qc “%SERVICE_NAME:~14%”^|findstr START_TYPE’) do set START_TYPE=%%x
if “%START_TYPE:~25%”==”BOOT_START” set START_TYPE2=boot
if “%START_TYPE:~25%”==”SYSTEM_START” set START_TYPE2=system
if “%START_TYPE:~25%”==”AUTO_START” set START_TYPE2=auto
if “%START_TYPE:~25%”==”AUTO_START  (DELAYED)” set START_TYPE2=delayed-auto
if “%START_TYPE:~25%”==”DEMAND_START” set START_TYPE2=demand
if “%START_TYPE:~25%”==”DISABLED” set START_TYPE2=disabled
echo %SERVICE_NAME:~14% is %START_TYPE2%
echo>>%FILENAME% %START_TYPE2%/%SERVICE_NAME:~14%
goto :EOF

こんな感じで出力されます。

disabled/clr_optimization_v2.0.50727_32
delayed-auto/clr_optimization_v4.0.30319_32

動作確認はWindows7です。

インポートの方は作ってません。現状を残したいだけなので。

2014-7-7 追記

自動(遅延)の delayed-auto が出ませんという方、失礼しました。
16行目の「”AUTO_START (DELAYED)”」の間のスペースは2ヶなんです。
ちゃんと2ヶ入れてあったんですがHTMLで詰められるのを忘れていました。
修正しました。

NTFSのアクセス権変更

NTFSのアクセス権変更は、プロパティを開いて「セキュリティタブ」から変更すればいいです。

がしかし、「セキュリティタブ」がそもそも出てこない、、、

そんなときはこれ(今回はWindows7でやってます)

  1. コマンドプロンプトを管理者権限で実行
    (最近は、Winキー(スタートボタン)→cmdと入力→Ctrl+Shift+ENTER、でやってます)
  2. cacls ファイル名 /g ユーザ名:F
    例:cacls F:\*.tib /g Everyone:F
    最後のFはフルコントロールの意味です

これだけです。

ところでこれを実行したら「セキュリティタブ」が出てきました。
アクセス権がないとセキュリティタブが出ないようです。

Outlook Express 6 から Windows Live メール へアドレス帳の移行(氏名が消える)

XPからWindows7への移行作業の一つにアドレス帳があります。

XPのアドレス帳(WAB)を保存してWindows Live メールでインポート、という手順をあちこちで見ますが、これを普通に実行するとほとんどの連絡先で氏名が消えてしまいました。

で、こちらを参考にしつつ、以下の手順でうまくいきました。

  1. 新PC(Windows7)で、WABをダブルクリックして、Windowsアドレス帳へインポートする
  2. Windowsアドレス帳を開く(スタートメニューで右側の一番上にある自分のユーザ名をクリックした中にあります)
  3. 氏名とメールアドレスがちゃんと表示されてるか確認
  4. Ctrl+aを押すか、整理→すべて選択 で全選択する
  5. エクスポート(見えてない場合は「≫」をクリック)
  6. 「vCard」を選んでエクスポート(一時的にフォルダを作っておいた方がいいでしょう)
  7. Windows Live メールを起動して左下にあるアドレス帳をクリックする
  8. インポート→名刺(.VCF)をクリックする
  9. エクスポートしたフォルダを開いて、一覧部分をクリックしたあとCtrl+aを押して全選択する(ファイル名に(氏名).vcfがたくさん並びます)
  10. 「開く」を押してインポート完了

IntelliMouse Explorer 4.0 はマウスキーボードセンターに対応していない

理由は不明ですが、Windows7をインストールすると標準で正常に認識できる場合と、HID準拠マウスになってしまう場合があります。

正常に認識できた場合は、OSアップデートなどで自動的にIntelliPointが導入されます。楽ちんです。むしろ何勝手に入れてんのと思います。

ところがHID準拠マウスだと、Microsoft HardwareのページからIntelliPoint(MouseKeyboardCenter)を入れようとしても、デバイスがないと怒られて終わりです。ドライバの更新で手動で「IntelliMouse Explorer」を選んでもダメでした。

こうなってしまった場合は、IntelliPoint 8.2 を入れるとよいそうです。ちゃんと認識してくれました。

*.ai を開く

滅多にあることじゃありませんが、たまに.aiの拡張子を持つデータを受け取ります。Adobe Illustratorのデータです。

受け取っても何万もするIllustratorは持っていません。大体は見ることもなくそのまま印刷屋さんへ渡すだけです。

今回、そういえば愛用のIrfanViewにプラグインがあったはず、と思い出し、本家のページを見るとプラグインの他にGhostscriptが必要と書いてありました。

ごくまれにしか必要としないもののために、たいそうなソフトを入れたくはありません。

他の方法を検索しても上位は XnView + Ghostscript。

すると少し下の方に、こちらのページを見つけました。

Illustrator イラストレーター(.ai)ファイルを手軽に見る方法 – code:x
http://code.xenophy.com/?p=150

.aiのファイルをAdobe Readerで見れるということです。

でもうちはセキュリティ対策でAdobe ReaderもFLASH Playerも入れてないので、代わりにPDFビューアとして使っている「PDF-XChange Viewer」で試したところ、見れました!

単純にPDFビューアならなんでもいいのかもしれませんね。