2025年3月24日月曜日

Windows10のプリンター名が変更できない。

 Windows10にプリンタードライバーを入れた。

ところが、プリンター本体が来るまでに、先にドライバーだけ入れておこうと思ったのが間違いで、プリンターを繋いでも認識しない。

そこで、メーカー指定の手順通り、一度プリンターの電源を切り、再度投入してからドライバーを入れると、きちんと接続できて、印刷もできるようになった。

でも、プリンター名が、「〇〇(コピー2)」みたいな名前になってしまった。
こちらがちゃんとつながる方なので、先にいれて繋がらない方の「〇〇」というプリンターを削除した。

それから、「〇〇(コピー2)」の名前を変更して、「〇〇」にしようとしたら、「その名前は既に使われてるので変更できません。」みたいなメッセージが出て、名前が変更できない。

以下の処理で対応

1,ファイル名を指定して実行(Windows+R)で services.msc を入力して「サービス」を起動。(コントロールパネル→管理ツール→サービスでも可)

2,Print Spooler を探して、サービスを停止

3,%WINDIR%\ystem32\spool\PRINTERS 配下のファイルを全部削除。(「Print Spooler」サービスを停止しているので、必要なファイルは無いはず。)

4,「サービス」に戻って、先ほど停止した「Print Spooler」 サービスを開始

これで、プリンター名の変更ができるはず。

2024年9月10日火曜日

Access のRunTime版でアクションクエリのメッセージを消す

 Public Function Mess_OFF()

'レコード更新確認
    Application.SetOption "Confirm Record Changes", False


'オブジェクトの削除
    Application.SetOption "Confirm Document Deletions", False
'でも、そもそもRunTime版ではオブジェクトの削除ができない?
'いや、VBAで削除することも考えられるか。


'アクションクエリ実行
    Application.SetOption "Confirm Action Queries", False

End Function

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回目として流すことになります。

追記
PDF-Xchange Viewer はダウンロードのあと、一度インストール作業が必要で、インストール後は、 「PDFXCview.exe」だけをどこか他のフォルダや、他のパソコンに移動させても使えます。
その際にPDFXCview.exeを置いているフォルダの下に、「language」フォルダと、その中の「pdfxvw_jpn.xml」ファイルを持ってきておくと、日本語メニューが使えるので助かります。

さらに追記
表題のとおり、VBAを使って、PDF-Xchange Viewerで連続印刷をすると、VBAからはじゃんじゃんプリント命令が送られて、スプーラーに溜まっていく。
スプーラーは、送られてきた順番に印刷するんだと思っていたら、そうではなくて、大量のスプールがされていると、スプーラーが気に入った(?)データからプリンターに送られるようです。
したがって、予期しない順番で紙が出てきます。
(もちろん、1個のスプールデータの中はきちんと指示通りに出ます。)
例えば、
1個のPDFファイルの、1-3ページ、5-7ページ、10ページ、15-20ページ、25ページを印刷みたいな処理を流すと、プリンターから1-3ページの次に10ページの紙が出てきたりします。
これを完全に回避する方法は無いような感じです。
仕方ないので、VBA側で処理にウエイトを入れて、スプーラーにデータが溜まらないようにするぐらいで逃げています。ウエイトを入れすぎると全ての印刷が完了するまでの時間が伸びるので、ちょうどいいウエイトをどう考えるか?
プリンターの印刷速度(30枚/分とか)と、プリンター本体のバッファー(メモリー)を勘案しながら、試行錯誤ですね。

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