2024年3月18日月曜日

VBAからPDFファイルの特定のページを印刷する PDF-Xchange Viewer を使用

 ExcelやAccessのVBAからPDFファイルの特定のページを印刷するためには、一般的には「Acrobat」が必要で、「Acrobat Reader」ではなかなか上手くいかない。

「Acrobat」があっても、結構複雑な処理を書かないとだめ。

そこで、「PDF-Xchange Viewer」に行き着いた。
これは結構前に開発が終了していて、「PDF-Xchange Editer」になっているが、今でも窓の杜からダウンロードすることができた。

EditerではなくてViewerがいい点は、インストールが必要なく、「PDFXCview.exe」だけで動くこと。
EditerはEXE単体では動かない。

Shell "c:\pro****\PDFXCview.exe /print:pages='3-5' 'c:\target.pdf'"

これだけで標準プリンターから指定ページ(例なら3,4,5ページ)を出力して、自動的にViewerを終了する。そもそもバックグラウンドで動くので、終了したかどうかは画面上は不明です。

「pages='1-5'」とすれば1から5ページまでを印刷する。
「pages='3,5,7'」とすれば、3と5と7ページを印刷する。
「pages='1-3,5'」とすれば1から3ページまでと、5ページを印刷する。

まあ想像通りの動作です。

これを一つのプリントキューとして流すので、両面印刷設定済みのプリンターに対して、「pages='1-3,5'」と指定すれば、1枚目の紙の表に1ページ、裏に2ページ、2枚目の紙の表に3ページ、2枚目の紙の裏に5ページを印刷します。

これも想像通りの動作です。

もし、上記の例で、5ページを3枚目の表に印刷したければ、処理を分けて、1-3で1回流して、5ページだけを2回目として流すことになります。

2024年2月1日木曜日

VBA の Keybd_Event のパラメタの件

画面のハードコピー(スクリーンキャプチャ)を撮って、自動で印刷したくて、(画面ハードコピーツール)エクセルのマクロを作ったときにちょっとはまった。

多くの参考Web上では、第2パラメタを「使用しないので、常に0を指定。」としていることが多いのですが、私が参考にしたのはちょっと違いました。

多い解説

Sub 全画面()
    keybd_event &H2C, 0, 0, 0        'Print screen押す
    keybd_event &H2C, 0, 2, 0        'Print screen上げる
End Sub 

Sub アクティブウインドウのみ()
    keybd_event &H12, 0, 0, 0        'ALT押す
    keybd_event &H2C, 0, 0, 0        'Print screen押す
    keybd_event &H2C, 0, 2, 0        'Print screen上げる
    keybd_event &H12C, 0, 2, 0        'Print screen上げる
End Sub 

この第2パラメタを「1」にすれば、「ALT」を押しながら「PrintScreen」=アクティブウインドウのみになります。

Sub アクティブウインドウのみ()
    keybd_event &H2C, 1, 0, 0        'Print screen押す
    keybd_event &H2C, 1, 2, 0        'Print screen上げる
End Sub 

'MSの解説の意訳
keybd_event  bVk, bScan, dwFlags, dwExtraInfo
bVk=仮想キーコード(16進のキーコード)
bScan=キーのハードウェア スキャン コード(意味は不明だが、PrintScreenの時はとりあえず使える。)
dwFlags=関数操作のさまざまな側面を制御します。 このパラメーターには、次の 1 つ以上の値を指定できます(意味は不明だが、「0」を指定すれば、キーを押し下げ、「1」を指定すれば、押している(指定した)キーを放します。)
dwExtraInfo=意味不明かつ使い道不明

2023年11月29日水曜日

VBA の参照設定で「参照不可」があるために、コンパイルエラーになる

 Excel や Access のVBA で参照設定をしたけど、端末によってはその参照先がインストールされていないことがある。

私の場合は、Acrobat。

同じExcel のファイルを複数の端末で利用することになるが、Acrobat がインストールされている端末とReader しかインストールされていない端末がある。

Acrobat があれば、やりたいことはVBA からPDFファイルのページを指定して自動印刷。

Acrobat がなければ、対象ページをリストアップして、手動で印刷。

ところが、Acrobat のない端末でこのExcelファイルを起動して、VBA を実行すると、なんでもないところで、「コンパイルエラー」となって走らない。

単に変数に文字列を代入するだけでも走らない。

Acrobat のある端末で実行すれば、何事もなく実行される。

いろいろ試行錯誤したところ、すべての変数を宣言すれば、Acrobat の無い端末でも実行できた。

まるで、「Option Explicit」を設定しているような感じ。

普段はVBA 標準である「Option Explicit」は設定しないで書いているけど、これを宣言したのと同じように変数の宣言をしたらOK!

これからは、「Option Explicit」を宣言して、参照設定に関係なくても変数は宣言するようにした方がいいかなと思い直した。

因みに、どんな参照設定がされているかは、
「ThisWorkbook.VBProject.References」で参照設定一覧が取得できる。

「参照不可」はもともと異常な状態なので、「不可」の名前などを取得することはできないけど、当たるとエラーが発生するので、エラー処理で逃げることができる。

参照設定自体をON OFF できれば一番いいけど、端末によって元ネタのPathなども違うので、ちょっと無理なので、あれば自動印刷、なければ手動印刷で処理を分けて対応。


2023年4月18日火曜日

Panasonic カーナビ ストラーダ CN-F1X10BHD はパーキングブレーキセンサーを設定するだけで走行中でもテレビが映ることを確認

 パナソニックのカーナビ ストラーダ CN-F1X10BHD をヴェルファイアに取り付けました。

元は新車購入時にディーラーで取り付けてもらったアルパインの VIE-X009 からの載せ替えです。

作業内容などは、別に書くとして、大失敗というか、勘違いを書いておきます。

事前にネットで色々情報集めをしていたら、なぜか、パナソニック製のナビは、自主規制で走行中にテレビが映らないし、目標物検索などもできないと思い込んでました。

対策として、当然パーキングブレーキをアースに落とすことはわかっていたけど、それだけではダメで、車速センサーもカットしないと映らないと思い込んでしまった。

実際にヴェルファイアにナビを大まかに接続した状態で走行テストをしたら、テレビも映らないし、目標物検索などもできなかったんです。
当然、停止するとすべての操作ができます。

なので、車速センサーをカットするスイッチを自作することにしました。
ただ単にスイッチでカットするだけだと、復帰(車速センサーを接続する)させるのを忘れそうで、そうなると、自車位置は狂い続けるので、遅延スイッチを作って、カットして一定時間が経過したら、自動的に再接続する仕掛けを考えました。

遅延スイッチの動作確認をするために、再度、走行テストをしようとナビの結線を確認したら、なんと、パーキングブレーキケーブルがアースされていないことが判明。
車種別ハーネスに依存しきったために、アース接続をすっかり忘れてたんですね。
(この辺りのハーネスの説明は別途書くつもりです。)

結果的に、パーキングブレーキをアース処理するだけで、車速センサーは何も細工せずに普通に接続したままで、走行中でも全く問題無くテレビも映るし、その他全ての機能を利用できることが確認できました。

これで、助手席の人は走行中でもテレビを見ることができます。

車速センサーの処理が必要なのは、メーカーオプションの場合だけなのかな?
このメーカーオプションがどうなっているのかは確認していません。


2022年10月29日土曜日

Raspberrypi での MagicMirror

 CTRL + q で一時停止し、

Xwindow が開くので、

LXTerminal を起動して、

pm2 stop 0 を打つ

sudo apt update

sudo apt full-upgrade -y

sudo  apt autoremove -y

pm2 start 0

sudo reboot now

2021年11月15日月曜日

Xperia XZ1 に Y!mobile の SIM を入れるとテザリングが出来ない。

 Xperia XZ1 に Y!mobile の SIM を入れるとテザリングが出来ない。

au で買った XZ1 SOV36 です。
まあ基本的にSOFTBANK 系ではBAND が違うのでダメなんでしょうけど。

XZ1側では「テザリング中のエラーが発生しました。」と表示され、
受け側の端末では、「接続先にインターネット接続がありません。」と表示される。

XZ1 側の APN 設定で、
「APNタイプ」を「default,supl,dun」とすれば解消しました。

「設定」→「ネットワークとインターネット」→「モバイルネットワーク」→「詳細設定」→「アクセスポイント名」→「Y!mobile APN」をタップ。

下の方へ送ると、

「APNタイプ」があるので、タップすると入力できるようになる。

私の場合は、デフォルトで「default, mms, supl, hipri」となっていましたが、これではダメで、

「default,supl,dun」が正解。


もちろんSIMロックは解除済みが前提です。

2021年6月12日土曜日

Raspberry PI3 の X window が「パスワード待ち」になって、パスワードを受け付けない。

 Raspberry PI3 をデジタルサイネージ風に使っていて、
MP4ビデオを数本入れて、自動再生していました。

その方法は、
omxplayer という動画プレイヤーを使って、
/home/pi/.config/lxsession/LXDE-pi/autostart
にスクリプトを入れて、複数の動画を連続再生しています。

参考にさせていただいたのは、
http://www.cenolan.com/2013/03/looping-video-playlist-omxplayer-raspberry-pi/

毎日順調に再生されていたのですが、
同じコンテンツだと飽きてくるので、今回違う動画ファイルを入れようと思って、
電源を切ったときに、ミスったようです。

実は、上記の設定だと、必ず自動再生されてしまうので、
メンテや動画ファイルの交換には必ず、ほかの端末からSSHなどでコンソールに入るしか方法が無くなりますが、そうなると、ネットワーク環境が必要になります。

今回は、全くネットワークを使わない設定にしたかったので、
USBポートに特定のデバイスをつないだ時だけ、自動再生されない設定にしていました。

USBポートに「DELL のキーボードを検出したとき」という設定です。

普段は、ネットワークもなし、キーボードもマウスもなし。
全くラズパイ本体だけをモニターに繋いでて、
メンテナンスの際にDELL製のキーボードをつなぐと自動再生されない。

で、キーボードを繋いで、コンソールを出して、
「autostart」のファイル名を一時的に変更して、再起動させると、X-Windowが起動する。

ここで、再起動の際に、なぜか X-Window は起動するけど、「pi」のユーザーで、ログインパスワード待ちのウインドウが開いて、正規のパスワードを入れても、ログインできない状態になってしましった。

普通は自動ログイン設定なので、パスワード待ちなんてありえないのに。

試しにわざと間違ったパスワードを入れてみると、「パスワードが間違ってる。」というメッセージがでるので、入れたパスワード自体は正しい。

でも、X は触れない。デスクトップ背景の画像も表示されているのに。

これにはかなりはまった。

とりあえず、CTRL+ALT+F1 でコンソールを出して、raspi-config でCUI ログインに変更したら、CUI ログインはできたけど、日本語が通らない。

この状態で、startx でX-Window を起動したら、TimeOut とか言いやがって、起動しない。

と思っていたら、一旦タイムアウトしてるのでのに、何かのキーを触ったらX が起動した!

ログインもできている。

でも、根本的な原因は解消されていなくて、自動起動させたら、ログインパスワード待ちのまま。

色々ネットを彷徨ったら、
https://www.raspberrypi.org/forums/viewtopic.php?t=180859
このページに助けていただいた。

「`~/.Xauthority` の権限をlsコマンドなどで確認してもし`pi`以外のものだったら`pi`にしてログインし直しして直らないか.」

ちょうど偶然 X が起動している状態になったので、ファイルマネージャーで権限を確認したら、「root」になっている。なんでじゃ?

これを、
「sudo chown pi.pi ~pi/.Xauthority」
で「pi」に変更したら、正常に戻った。

助かりました。