XXX.bas ファイルのカラー表示について

  1. Kuro様、フォーラムの皆様 こんにちは。いつもお世話になっております。

    Mery Ver 2.6.7 を使わせていただいておりますが、ExcelやWord のマクロで使われる、拡張子が .bas のファイルを開いても、.js ファイルなどのようにカラー表示されません。予約語、変数名、関数名、コメントなど、すべて単色になってしまいます。

    ツール:オプション:基本タブ にあるカスタムファイルフィルタには、*.bas という設定は入っております。

    もし対処法がわかりましたらご教授ください。
    お忙しいところ、誠に申し訳ありません。
    よろしくおねがいします。

     |  Takeshi  |  返信
  2. こんばんは。Mery をご愛用いただきありがとうございます。
    拡張子が .bas には対応していませんが、VisualBasic の色分けで良ければ、以下の手順で割り当てることができます。

    (1) [表示] メニューから [編集モード] の中の [編集モードの設定] を開きます。
    (2) 一覧から [VisualBasic] を選択して [プロパティ] をクリックします。
    (3) プロパティ画面で [関連付け] のタブを開き、[追加] ボタンをクリックして、新しい拡張子として「bas」と入力します。(拡張子のドット "." は不要です)

    あとは [OK] で画面を閉じます。

    これで、次回以降は、拡張子が .bas のファイルが VisualBasic の色付けで読み込まれるようになります。

    > ツール:オプション:基本タブ にあるカスタムファイルフィルタには、*.bas という設定は入っております。
    [カスタムファイルフィルタ] は、ファイルを開くおよび名前を付けて保存ダイアログでファイルにフィルタをかける際の [ファイルの種類] の項目で使用する設定ですので、そこに bas を追加する必要はありません。

    (上記で申し上げた手順で VisualBasic に割り当てれば、開くダイアログなどの VisualBasic のフィルタ項目にも .bas が追加されます)

     |  Kuro  |  返信
  3. Kuro様 お忙しいところ、さっそくの返信ありがとうございました。

    > こんばんは。Mery をご愛用いただきありがとうございます。
    > 拡張子が .bas には対応していませんが、VisualBasic の色分けで良ければ、以下の手順で割り当てることができます。
    > これで、次回以降は、拡張子が .bas のファイルが VisualBasic の色付けで読み込まれるようになります。

    おお! これで bas ファイルもカラーで印刷できるようになりました!
    VBE では、カラー印刷ができないので困っておりました。大変助かります。

    いろいろ多機能で、 Mery はすごいですね。
    これからも愛用させていただきます。

    ありがとうございました!

     |  Takeshi  |  返信
  4. うまくいったようで良かったです。

    Excel とかのマクロには疎いので、.bas の拡張子は VB6 のものかと思っていましたが、Mery の VisualBasic の色分けで対応できたようで安心しました。

    > いろいろ多機能で、 Mery はすごいですね。
    > これからも愛用させていただきます。
    ありがとうございます。
    色分けで足りない単語などがありましたら、手順にある [編集モードの設定] から自由に追加・削除したりなどのカスタマイズも可能です。

    また、Mery が標準では対応していないモードでも、自分で作ることもできますし、他の方が作成した構文ファイルを取り込んで、新しいモードに対応させたりすることも可能です。

    MeryWiki には編集モードを増強できる「構文ファイル」がたくさん登録されていますので、ご興味があれば見てみてくださいね!
    https://www.haijin-boys.com/wiki/構文ファイル

     |  Kuro  |  返信
  5. > ExcelやWord のマクロ
    なんか15年ぐらいまえに当時の勤め先の Windows Me でレンタルコンテナの管理用のマクロを組んだことを思いだして懐かしい気持ちになりました。あのころは自分のPCも持っていなかった頃なので拡張子 BAS やエクスポート/インポート機能もしりませんでした。 :)

    > bas ファイルもカラーで印刷
    当時のマクロのコードのバックアップを編集モード「VisualBasic」や「VBScript」で開くと、Excel VBA で必須の Range とか Value とかのプロパティは定義されていないようですね。VBE の画面どおりにカラー印刷するには、かなり手を入れないと無理かも?
    私は Excel VBA から遠ざかってしまっていますし、うちの XP だとMS Office のバージョンも古すぎるので Office VBA 用の構文ファイルを作ることはできませんが…。 :(

    > MeryWiki には編集モードを増強できる「構文ファイル」がたくさん登録されています
    Takeshi さんはマクロをお作りになるので、Mery の JavaScript マクロ専用の構文ファイル「Mery Macro JS」の導入をおすすめします。 エディタがカラフルになってコーディングしてる気分が増しますし、Mery のマクロのコーディング専用に作ってありますからきっとお役に立つとおもいます。
    https://www.haijin-boys.com/wiki/Mery_Macro_JS
    新規の編集モードとして「Mery_Macro_JS」をつくり、プロパティ画面の「インポート」ボタンから ZIP の「色分け済み_MSY」フォルダ内の「Mery_Macros_JS.msy」を読みこめば OK。 プロパティパネルの「関連付け」タブで拡張子「js」を指定してしまっても可(というか、「JavaScript」編集モードを上書きしてもいいのですが)。

    もし気に入ったなら、ZIP の Macros フォルダの「編集モードの自動選択」マクロを「ファイルを開いた時」用のイベントマクロとして導入してください。
    ZIP の「Ext」フォルダの「js.txt」ファイルを Mery\Ext フォルダの js.txt に上書きすると Ctrl+Space キーでの入力補完もできるようになり、 mePosLogical などの入力が少しだけ楽になります。

    @ Kuro さん
    私はポータブル版しか使っていないのですが、インストーラ版でバージョンアップしたときに「Ext」フォルダ内のカスタマイズ済みの hoge.txt は上書きされるものなのでしょうか? ← ZIP版の上書き更新で hoge.txt を上書きしてしまうことを考えて、いちおう Mery Macro JS の「Ext」フォルダには「js[backup].txt」ファイルも入れてあるので、ユーザー側で自己救済できるようにはしてあります。

    あと、マクロリファレンスで Copy / Paste() メソッドの定数 meCopyQuotes が漏れていますね(使い方を知らないですが ME_COPYUNICODE = 1 も?)。 先日 meCaseCapitalize のことを書いたときに忘れていました。 :(
    GetLine / GetLines() メソッドで定数「0」が使えることや、#title, #tooltip などのプリプロセスの説明も足して置いていただけると、マクロライブラリの「マクロ覚え書き(開発者向け)」を読んだことがない初学者さんも幸せになれるかもしれません。

     |  sukemaru  |  返信
  6. >私はポータブル版しか使っていないのですが、インストーラ版でバージョンアップしたときに「Ext」フォルダ内のカスタマイズ済みの hoge.txt は上書きされるものなのでしょうか?
    インストーラ版でも Ext フォルダは上書きされます。

    上書きしないようにしてしまうと、こちらで Ext ファイルを更新した際にも反映できないですからね。

    インストーラの機能としては、上書きするかどうかダイアログで確認ならできますが、Ext フォルダ内のファイルの数だけ (26 回) 上書き確認のダイアログが表示されるのでヤバイです ^^;

    >あと、マクロリファレンスで Copy / Paste() メソッドの定数 meCopyQuotes が漏れていますね(使い方を知らないですが ME_COPYUNICODE = 1 も?)。 先日 meCaseCapitalize のことを書いたときに忘れていました。 :(
    ご報告ありがとうございます。meCopyQuotes は追記しておきました。ME_COPYUNICODE は使用されていませんので不要ですね。

    > GetLine / GetLines() メソッドで定数「0」が使えること
    0 を指定しても一応動作はするようですが、仕様ではありません。

    > #title, #tooltip などのプリプロセスの説明も足して置いていただけると、マクロライブラリの「マクロ覚え書き(開発者向け)」を読んだことがない初学者さんも幸せになれるかもしれません。
    それはちょっと作業量的にヘビーなので、すぐにというわけには行きませんが、心と体と時間に余裕が出来たらがんばってみようと思います。

     |  Kuro  |  返信
  7. ご返信、ありがとうございます。

    > インストーラ版でも Ext フォルダは上書きされます。
    > 上書きしないようにしてしまうと、こちらで Ext ファイルを更新した際にも反映できないですからね。
    ですよね。 :)
    「転ばぬ先の杖」で予備のファイルを入れておいて正解だったようです。

    > > GetLine / GetLines() メソッドで定数「0」が使えること
    > 0 を指定しても一応動作はするようですが、仕様ではありません。
    あれ? 隠し仕様だとおもっていました…。

    > それはちょっと作業量的にヘビーなので、すぐにというわけには行きませんが、心と体と時間に余裕が出来たらがんばってみようと思います。
    わがまま言って、すいませんでした。マクロライブラリの ks さんの「マクロ覚え書き(開発者向け)」のページへのリンクでも… ともおもわなくはないですが、高度な内容を含んでいるので初学者には難しいんですよね。 X(

     |  sukemaru  |  返信
  8. > > 0 を指定しても一応動作はするようですが、仕様ではありません。
    > あれ? 隠し仕様だとおもっていました…。
    引数を何も指定しない場合は論理行単位になります。

    > わがまま言って、すいませんでした。マクロライブラリの ks さんの「マクロ覚え書き(開発者向け)」のページへのリンクでも… ともおもわなくはないですが、高度な内容を含んでいるので初学者には難しいんですよね。 X(
    ks さんが書いてくださっている「プリプロセス」の部分は簡略化されていますが、実際の仕様はちょっと説明するのに時間がかかりそうなぐらい複雑なのです…。

    sukemaru さんは XP だったと思いますので、ちょっと重要なポイントのみ説明させていただきます。

    Mery のスクリプトエンジンは、#language 指令を省略した場合、Chakra (jscript9.dll) [以下、Chakra と表記します] という IE9 以降の高速なスクリプトエンジン使用するのですが、XP だと確か IE9 はインストールできなかったと思います。

    Chakra と旧 jscript の間には互換性はあることはあるのですが、一部の機能が仕様変更されています。
    https://docs.microsoft.com/ja-jp/microsoft-edge/dev-guide/whats-new/javascript-version-information
    ↑ この表に互換性が書かれていますが、XP 環境で開発したマクロは、それ以降の OS では動かなくなっている可能性も若干ございます。

    そういう場合に備えて、Mery では古いスクリプトエンジン (jscript.dll) を指定して互換性を重視するモードが用意されています。

    それが #language 指令です。

    マクロの先頭に、

    #language = "JScript"

    を記述しておけば、Windows XP から Windows 10 まで、OS に関係なく古いスクリプトエンジン (jscript.dll) を使って互換モードでマクロを実行させることができますので、IE9 が入っていない環境で作られたマクロであれば、この指令を入れておくことをおすすめします。(Chakra と比べてマクロの動作速度は若干遅くなりますが)

    というのも、最近気づいたのですが、Mery の Quit メソッドって古いスクリプトエンジンでは問題なく動くのですが、Chakra では、どうも jscript9.dll の仕様で、スクリプトエンジンの強制停止が出来なくなってるようなんです。

    対策を調査しましたが、マイクロソフトから情報が半分ぐらいしか公開されていない (IActiveScriptSiteInterruptPoll っていう中断機能) ようで、現状では手の打ちようがありません。Mery 側でできる対応としては Chakra の場合は Quit メソッドを封印 (実行時にエラーを吐いて処理は継続) するしかない感じです。(それか、Quit メソッド以降は document.selection.text で変更を抑制する、とか)

    先日、ご投稿いただいたマクロで Quit メソッドが使われていたので、安全のために #language = "JScript" 指令を先頭に追記して互換モードにしていただければと思います。

    と、いった感じでプリプロセスの部分は語りだすと長くなりますね… (w 他にも #include にまつわる深い仕様などもありますし、Wiki に執筆するとなるとちょっとした読み物レベルになると思います。

    こういう事情がありまして、マクロの詳細な仕様につきましてはツッコミが入ったときに、その都度、説明 (言い訳) させていただく感じですので、マニュアルの情報不足の点はご容赦ください。

    そのうち、こういった細かい仕様も含めてきちんと文書化するつもりです。

     |  Kuro  |  返信
  9. ご返信、ありがとうございます。
    Chakra とXPの JScript 5.8 とで異なる部分があるのは Mery 2.6.6 の記事と Mery.txt の更新履歴で読んだ半年後、マクロの自作を始めたさいに自分でも調べました。
    以来、「XP(JScript 5.8)で動くコードなら Chakra でも大丈夫そうね」ぐらいのゆる~い理解でマクロを作っていまして、「#language = "JScript" を記述しないほうが新しいOSを使っている人のPCではマクロの動作が速くなったりするかも?」とおもって、あえてプリプロセスでのスクリプトエンジン指定はしていませんでした。そもそも、うちのXPとは CPU その他のハードウェア的実装が違うでしょうから、いまどきのPCなら "JScript" 指定でもバリバリ動いたりしそうですね。 :)
    最近では他の方のつくったマクロだと変数の宣言に let が使われていたり、XPでは利用できないループ処理コンストラクタが使われていたりして、動作テストも大変だったりします。せめて、「XPでは動きません、あしからず」って書いてくれてあれば…。

    > 先日、ご投稿いただいたマクロで Quit メソッドが使われていたので、安全のために #language = "JScript" 指令を先頭に追記して互換モードにしていただければと思います。
    本体コードの終了宣言代わりに Quit() を入れているだけのものもありますが、条件分岐で中断するために Quit() を入れているものもあるので、投稿したマクロを総チェックかしら? X(
    if ( ... ) { ;;; Quit() } の Quit() を消して後のコードを else {} でスッポリくくるか、if ( ... ) の条件を反転させればプリプロセスを書かないでもよさそうですが、素直に #language = "JScript" を書き足すだけのほうが簡単そうですね。

    > そのうち、こういった細かい仕様も含めてきちんと文書化するつもりです。
    「是非に」とお願いしたいところではありますが、「そのうち」は「そのうち」ということで、気長~に待たせていただきます。あるいは、例の特典つき『裏技本』とかでも。 :)

     |  sukemaru  |  返信
  10. > あえてプリプロセスでのスクリプトエンジン指定はしていませんでした。
    そうでしたか、これは失礼いたしました。

    > そもそも、うちのXPとは CPU その他のハードウェア的実装が違うでしょうから、いまどきのPCなら "JScript" 指定でもバリバリ動いたりしそうですね。 :)
    そうですね。でも、Chakra を使ったほうが速度は 10 倍ぐらい速く (当社比) なりますし、悩ましいところですね。

    > 「XPでは動きません、あしからず」って書いてくれてあれば…。
    Chakra の欠点ですが、XP に限らず Vista や 7 でも IE のバージョンによっては動かないこともありますので、速度を捨てて互換性を重視するなら #language = "JScript" を指定したほうが安全ですね。

    > 本体コードの終了宣言代わりに Quit() を入れているだけのものもありますが、条件分岐で中断するために Quit() を入れているものもあるので、投稿したマクロを総チェックかしら? X(
    お手数をおかけします。Quit の件は、その後も調査を続けまして、先ほどようやく解答にたどり着きました。

    結論から申し上げますと、Chakra で Quit が使用できないというのは、JScript エンジンの仕様でした。

    Mery に関係なく、普通に WSH (wscript または cscript) で以下のようなコードを実行してみると…。

    WScript.Echo("a");
    WScript.Echo("b");
    WScript.Quit();
    WScript.Echo("c");
    WScript.Echo("d");

    古い JScript エンジンだと Quit メソッドは正常に動作するのですが、Chakra エンジンだと以下のエラーが出て動作しません。

    エラー: Object doesn't support this action
    コード: 800A01BD
    ソース: JavaScript runtime error

    以下のサイトにその旨が記載されていました。
    http://inemaru.hatenablog.com/entry/2018/04/05/055557

    どうやら Chakra エンジンを使用した WScript では Quit メソッド (スクリプトを中断する機能) がサポートされていないようです。

    つきましては、Mery でも Chakra エンジンで Quit メソッドを使用した場合、WScript と同様「コード: 800A01BD」のエラーを返す仕様にするしかなさそうです。

    > 素直に #language = "JScript" を書き足すだけのほうが簡単そうですね。
    はい、Quit メソッドを使用している箇所は、何らかの対応が必要になると思います。

    一応、「コード: 800A01BD」でエラーを吐いてそこでマクロの実行は終了しますので、Quit メソッドより後のコードが実行されることはありませんから、強制終了といえば強制終了ですが… ^^;

    マクロリファレンスの Quit メソッドのとこに「※Chakra (JScript9.dll) では動作しません。」を追記しておきました。

    本題からだいぶ離れてしまいすみませんでした。

     |  Kuro  |  返信
  11. ご返信、ありがとうございます。
    > でも、Chakra を使ったほうが速度は 10 倍ぐらい速く (当社比) なりますし、悩ましいところですね。
    > 速度を捨てて互換性を重視するなら #language = "JScript" を指定したほうが安全ですね。
    ちょ、10倍って! マジですか...。
    拙作マクロを使っている人がいるのかどうか分かりませんが、"JScript" にお付き合いいただくのも申し訳ないので、可能なかぎり Quit() をはずしてきました。「ブックマークの復元」マクロは常用するものでもないとおもうので "JScript" にしちゃいましたが、アイコンつき ZIP で投稿しているものに要・修正のものが多くて参りました。

    以前、「検索ジャンプ」マクロで表示行の折り返し対応のコードにすると遅くて実用に適さないとおもったのは、マシンスペックと "JScript" のせいだったのかもしれませんね。 :(

    分かりやすいご説明をいただき、ありがとうございました、

     |  sukemaru  |  返信
  12. > ちょ、10倍って! マジですか...。
    スクリプトの内容にもよりますが、検証時では 10 倍以上、50 ~ 100 倍の速度が出ました。

    > 拙作マクロを使っている人がいるのかどうか分かりませんが、"JScript" にお付き合いいただくのも申し訳ないので、可能なかぎり Quit() をはずしてきました。
    ありがとうございます。マクロの修正、お手数をおかけしました。ホントにね、Mery のデフォルト (#language を指定しなかった場合) に、Chakra にするか、"JScript" にするか悩んだのですが、過去をかえりみるよりも前向きに!ということで、標準を Chakra にしたんです (w

    > 以前、「検索ジャンプ」マクロで表示行の折り返し対応のコードにすると遅くて実用に適さないとおもったのは、マシンスペックと "JScript" のせいだったのかもしれませんね。 :(
    "JScript" で遅くなっている可能性はありますね。

    色々とお手数をおかけして申し訳ございませんが、今後ともよろしくお願いいたします。

     |  Kuro  |  返信
スポンサーリンク