ショートカット 相対パス UNCパス上にあるプログラムを実行する場合 引数もある。。。
最近VBAの入門編のマニュアルを作成した。
なおEXCELマクロを使って、対象となる操作の箇所に関連する画像のみを表示させることにした。
これでOKかなと思い実際にテストしようとしたら当然ながら参照用のエクセルマクロブックと入門者が「右クリック」で「新規作成>Microsoft Excel ワークシート」で一旦エクセルブックを作成させてからチュートリアルは始まるので色々まずいことが分かった。
それで一つ一つの操作をキャプチャソフト(rapture.exe)を使い画像に保存し、保存フォルダをZIPして画像ビューワー(Honeyview.exe)で順次スライドのように矢印キーで参照しながら実行してもらう方式にした。
画像ビューワーはチュートリアルフォルダ配下に置くことにした。そこでチュートリアルフォルダ直下にショートカットキーを実行するとチュートリアルスタートというシナリオでショートカットキーを作成した。
グーグルで調べてみると色々な方法があることが分かった。結局④の方法を採用して解決した。
①「リンク先」に「%windir%\explorer.exe "実行ファイルの相対パス"」と指定する。
「作業フォルダー」は空白にする。
② なにかよくわからないがdllで実行できるみたいだ
%windir%\system32\rundll32.exe url.dll,FileProtocolHandler "相対パス"
<引数を指定する場合>
③ 引数がある場合はcmd.exeでできるみたいだ。
%windir%\system32\cmd.exe /c start "%cd%" "相対パス" [引数...]
④以下のやり方だとUNCパス上にショートカットを置いても実行できた!
%windir%\System32\mshta.exe vbscript:close(createobject("wscript.shell").run("相対パス [引数...]",1))
※引数の後ろにある数字で起動時の画面の大きさを指定することも可能。
0:非表示 1:通常のウィンドウ 3:最大化 7:最小化
上図の「VBA00_入門チュートリアル1」をダブルクリックすると
これで一応うまくいったので終わりにする。なおHoneyview.exeは前回オープンしたときの状態を想像だがレジストリに保存しているようである程度すすんだところで終了させて再度オープンすると最後にオープンしたところからスタートする優れものであった。
なおこのマニュアルの2つ目は「ボタンとイベント処理でマクロ実行」をテーマに引き続き作成予定です。
Webページのテキストを選択できないようにしているサイトについて
Webページを閲覧しているとたまにテキスト選択できないページがあります。
普段ページを見てるときはカーソルでテキスト選択後コピーして必要な個所をサクラエディタに貼り付けてメモするようにしています。また癖として反転できないページにであうとつるつるのガラスの上から記事を見てるような気分になってイライラしてきます。解除する方法は以下の手順で大概のサイトは可能ですが今後そんなサイトを見つけるたびに記録していくことにしました。
<参考にしたページ>
<UserCSSの登録をしなくてもこれで対処できそうです>
WebサイトによってはJavaScriptではなくCSSのuser-selectを使用してテキストのコピーを無効化していることがある。
例: うたまっぷ
このようなサイトではChromeのメニューの表示=>開発/管理=>デベロッパーツールからConsoleを開き、下記のコードを貼り付けてEnterキーで実行するとCSSのuser-selectを無効化することでテキストがコピーできるようになる。
var css = '* { user-select: auto !important; }';
var head = document.head || document.getElementsByTagName('head')[0];
var style = document.createElement('style');
head.appendChild(style);
style.appendChild(document.createTextNode(css));
<出会ったWebページ>
<解決できなかったサイト>
なんと以下のサイトは以前は解除できてたのにできなくなっていました。
Web関係の仕組みはあまり詳しくないので今のところお手上げです。
・F12でやればテキスト自体は取り出し可能ですがページ上での選択が出来なくなってました。以前はできてたのに・・・。CSSを埋め込むツールは拒否されて実行できなくなっていました。どうやれば拒否できるかを調べる必要がありますが一旦諦めることにします。
2019/09/27(金) 10:55:34
今日再度チャレンジしたら解除できてしまいました!
ただ何が正しかったのかはよくわかっていません。
解除するためにやったこと。
1.下記の拡張機能を導入
2.ブラウザはグーグルクロームとほぼ同じで広告ブロックするbraveブラウザ使用
3.JSの実行不可モードに設定
4.CSSの埋め込みアドインソフトで下記のコードを登録
html
{
-webkit-touch-callout: auto !important;
-webkit-user-select: auto !important;
-khtml-user-select: auto !important;
-moz-user-select: auto !important;
-ms-user-select: auto !important;
user-select: auto !important;
-webkit-tap-highlight-color: rgba(0,0,0,0);
}
* {user-select: auto !important;
-webkit-user-select: auto !important;
-webkit-user-drag: auto !important;
}
.unselectable
{
-moz-user-select:auto !important;
-webkit-user-select:auto !important;
cursor: default;
}
5.下記のURLサイトを表示
https://fujiisouta.xyz/tag/ai%e5%bd%a2%e5%8b%a2%e5%88%a4%e6%96%ad
VBAメモ このユーザ辞書管理マクロの使い道について
本シート上でユーザ辞書の管理が可能になります。 |
<利点> |
・アドイン登録することでエクセル文書入力中やその他の文書の入力中に思い通りの変換ができないときにすぐにメモして登録できるようになります。 |
・別のPC(ノートPCを含む)に同じ変換辞書で行いたい場合に便利です。 |
・定期的に見直して不要になったものを削除したり、インターネット上から用語を拾ってきたときにメモするのに最適です。 |
https://toricago.hatenablog.com/entry/2016/08/03/223634 |
学術用語、専門的な用語、最新用語などが変換できないとき |
知人や友人などの名前がうまく変換できないとき |
長い単語を短い読みで入力したいとき |
同音異義語など、用語の使い方がよく混乱し、ユーザー コメントを付け候補一覧で見分けたいとき |
<まとめ>
Windows10のユーザ辞書自体はコマンドラインインターフェースがどうもなさそうで結局Sendkeysを利用してユーザ辞書を登録しようという発想でチャレンジしました。
<嵌った点>
1.[ NumLockがオフになる ]
VBAのSendkeysはNumLockがオフになるということでWSHのSendkeysで回避できるのでそちらを採用したが何故か結果が芳しくないケースがあり、最終的にはVBAのSendkeysを利用することにした。NumLockのオフの回避は毎回無条件にSendKeys "{NUMLOCK}"で対応することにしました。
2.[ クリップボードに設定する処理はすぐに反映されていないケースがある]
ファイル名を入力する必要があるのですがクリップボードにファイル名をコピーしてCtrl+vで貼り付けようとしました。しかしクリップボードにセットするコマンドはSJISにある文字しか対応できませんでした。ところで以下の技を使えばUNICODEでも大丈夫なことが分かりました。
Private Sub SetCB(ByVal str As String)
'クリップボードに文字列を格納
With CreateObject("Forms.TextBox.1")
.MultiLine = True
.Text = str
.SelStart = 0
.SelLength = .TextLength
.Copy
End With
End Sub
ところで当初はSendkeysは2バイト文字列は送付できないと思っていたのですが実はできることを知り下記の形式でユーザ辞書の一覧出力のファイル名を設定することができました。上記のクリップボード利用だとOSのプロセスが絡んでいるためかすぐにクリップボードに反映されていなため何度も失敗してしまいました。
sFileName = "辞書一覧.txt"
Application.Sendkeys sFileName
3.[ PCではうまくいく処理がノートPCではうまくいかない]
Sendkeysによる処理がPCではうまくいくのに、ノートPCではNGばかりになり途方にくれました。最終的にはクリップボード方式をやめたら上手くいくようになりました。
4.[ マッチング処理のための複数キーのソート処理]
最初はキーを連結した項目を作り、その項目をソートキー指定すればいいと思ってましたがそのためには最初のキー項目の長さが同じでないと正しい複合キーのソートはできないことが分かりました。それでどうしようかと思ってググっているとなんとステーブルソートならば最初に二番目のキー項目だけでソートしてその結果に対して今度は1番目のキー項目で所期の目的とすることが可能なことが分かりました。ステーブルソートに関しては相当性能が良いマージソートがありそれを利用して2回ソート実行で解決しました。
5.[ ユーザ辞書に1件も登録がない場合]
Windows10のユーザ辞書は登録したユーザ辞書の項目が1件もない場合はプルダウンメニューの該当コマンド自体がdisableとなってダウンロードに失敗することがわかりました。この対応は難しく事前にダミー登録を1件して失敗しないようにしようかと思いましたが、結局はファイルが存在してない場合はユーザ辞書の一覧出力に失敗したと判断して登録ゼロ件対応をすることにしました。
<身につけたこと>
1.Application.Waitコマンドの待ち時間が1秒以下の場合の設定方法
2.複数のキー項目を対象にソートする場合の方法
3.2次元配列の使い方
4.マッチングによるユーザ辞書に登録済かどうかのチェック
5.ユーザ辞書には登録してあるが管理シート上にはない場合にシートの上位に挿入する方法。その他の項目はチェック前と同じ並び順を維持する方法。
VBAメモ 1件登録は半角が全角に変換されて登録されるので断念・・・
一応ほぼ完成しました。
感想としてSendkeysはタイミングを計る必要がありとても苦労しました。だからPCの性能によっては調整が必要になるかと思います。
標題にあるように1件登録のサポートを苦労して実現したんですが、登録内容に半角英数字があると何故か全角に変換されて登録されてしまうので半角英数字がある場合はファイル登録方式でサポートすることに変えました。
■単語を1つ登録する場合 |
1. 行番号をクリック |
2. 「読み」欄に「変換前の入力文字」を登録。 |
3. 「語句」欄に「変換後の文字」を登録。 |
4. 「品詞」欄にセルを移動すると「名詞、短縮読み、人名、顔文字、地名」のドロップダウンリストから選択。直接入力も可能。 |
5. 「ユーザコメント」欄に適当に登録した目的等を入力。なくてもよい。 |
6. SKEY欄にセルを移動すると"F1キーを押下すると単語登録できます!"の表示。 |
7. F1キーを押下。➡マクロが [単語の登録] ダイアログ ボックスで、単語を1つ登録 |
※シートの3行目から9行目が登録条件を満たす状態になっていれば順次登録を実行。 |
※F1キーは一回限り有効 |
■エクセルシートから一括で登録する場合 |
1. 「辞書登録」ボタンをクリック |
※▮ACT日時 ▮処置 欄に日付時刻と登録の文字が入ります。 |
※既に登録済みでも同様に更新されます。 |
この手順書を作成する過程で1件登録自体は下記の手順で問題ないことがわかり私が作成した1件登録機能はあまり意味がないものになりました。
ショートカットキー[Ctrl]+[F7]
Windows10のみで操作できます。
メモ帳など、文字を入力できるアプリケーションを起動します。
単語登録したい文字を入力します。または、すでに入力済みのものがあれば、それを表示しておきます。
単語登録したい文字列を範囲選択します。
ここでは例として、「突然のご連絡、大変失礼いたします。」という文を範囲選択します。
キーボードから、[Ctrl]キーと[F7]キーを同時に押します。
注意IMEは入力モードがオン(変換できる状態)であることを確認してください。
[単語の登録]ダイアログボックスが表示されます。
[単語]のテキストボックスには、範囲選択した文字が表示されています。
参考文字列を選択していない状態でも、[単語の登録]ダイアログボックスを表示させることができますが、文字列を選択して操作したほうが、[単語]のテキストボックスに選択文字列が表示されるので効率的です。
VBAのメモ 打鍵シミュレーションにおいて待ち時間をミリセック単位でウエイトしたい場合
現在上記のアプリを開発中です。
バッチで辞書に登録しようとするために下記の辞書登録ツールが登録する終了タイミングを計算して待っている必要があります。
sendkeysを実行する前に下記のような処理待ちを実行しようとしています。
Application.Wait [Now()] + 3849 / 86400000 '日数.1日を単位とした日にちの小数
秒単位ならば下記のやり方で大丈夫です。
Application.Wait Now + TimeValue("00:00:01")
ですがミリセック単位で指定したい場合はと調べてみると下記の記述でいけるそうです。カギ括弧はどんな意味かと調べたらApplication.evaluateとほぼ同じという意味だそうです。
Application.Wait [now() + "00:00:03.55"]
このカギ括弧内はエクセルシートのセルに=now()+"00:00:03.55"と記述した結果と同じ意味になります。
【メモ】
Application.evaluateは文字列を評価してオブジェクトにしたり、シート上の関数式を実行してくれるという使い方らしい。。。