USBメモリのドライブレターNo.08612
伯林 さん 17/12/29 09:55
 
是非お知恵をお貸し下さい。
マクロの中でmnop.txtファイル(名は固定ではありません)を開くのに
openfile "e:\\abcd\\efgh\\ijkl\\mnop.txt";
のように書いています。このe:がUSBメモリなので差すたびにドライブレターが変わり
エラーとなり、苦慮しています。
USBドライブにはEASYDESK_Nと名付けてあり、エキスプローラでは例えば
EASYDESK_N(I:)
のように表示されます。
ドライブレターが変化してもmnop.txtを開くいい方法はないでしょうか?

[ ]
RE:08612 USBメモリのドライブレターNo.08613
でるもんたいいじま さん 17/12/29 10:18
 
こんにちは。でるもんた・いいじま@秀丸愛用者です。

> マクロの中でmnop.txtファイル(名は固定ではありません)を開くのに
> openfile "e:\\abcd\\efgh\\ijkl\\mnop.txt";
> のように書いています。このe:がUSBメモリなので差すたびに
> ドライブレターが変わりエラーとなり、苦慮しています。

簡単な方策として…
フォルダ構成はある程度まで固定でしょうか?

もし \abcd\efgh というフォルダがそのUSBメモリに存在することが
確実なのであれば、existfile("d:\\abcd\\efgh") のようにして、
特定のドライブレターが当該USBメモリに割り当てられているかどうかを
判定することができます。

この場合、一般的にはforでループを回してd〜zドライブについてチェック
すれば十分だと思います。唯一の難点は、外付けフロッピードライブが
d以降の(かつ、当該USBメモリより若い)ドライブに存在する場合には
そのドライブが駆動してしまうという点ですが、外付けFDDは通常a・b
ドライブに割り当てられますので、実用上は問題ないと思います。

あと、COMでScripting.FileSystemObjectを呼び出すという方法もあります。
VBSで書かれたサンプルコードがたとえばこちら↓
http://www.whitire.com/vbs/tips0075.html
にありますので、マクロヘルプを読みながら秀丸マクロでCOM呼び出しを
記述すれば目的は達せられると思います。フロッピードライブが動いて
しまうという難点はこちらでもどうしようもないですね。

[ ]
RE:08613 USBメモリのドライブレターNo.08614
Iranoan さん 17/12/29 13:37
 
伯林さん今日は、Iranoan です
> > マクロの中でmnop.txtファイル(名は固定ではありません)を開くのに
> > openfile "e:\\abcd\\efgh\\ijkl\\mnop.txt";
> > のように書いています。このe:がUSBメモリなので差すたびに
> > ドライブレターが変わりエラーとなり、苦慮しています。
<snip>
> この場合、一般的にはforでループを回してd〜zドライブについてチェック
> すれば十分だと思います。唯一の難点は、外付けフロッピードライブが
他には、個人で使用する場合に限られますが、USB を含む外付けのドライブ名を固定
してしまう方法が有ります
ググったらこんなページがりました
外付けドライブ名を固定する方法(Windows10) https://bacque.biz/archives/5617
外付けドライブ名を固定する方法(Windows7) https://bacque.biz/archives/2781
留意点として履き受注に有る通り、他の機器を先に繋げた時に使われてしまう若い文
字を使わないことです

[ ]
RE:08614 USBメモリのドライブレターNo.08615
秀丸担当 さん 17/12/29 14:49
 

そこそこ用途がありそうなので、でるもんたいいじまさんご紹介のWebページを参考
に、COMを使ったマクロにしてみました。
Label_GetNamedDrive:以下のサブルーチンをcallで呼んで使います。
"MYVOLUME"のところを"EASYDESK_N"にするといいと思います。


call Label_GetNamedDrive "MYVOLUME";
$strTargetDrive = $$return;

message $strTargetDrive;
//if( $strTargetDrive != "" ) {
//  openfile $strTargetDrive + ":\\abc.txt";
//} else {
//  //ドライブなし
//}

endmacro;

//------------
Label_GetNamedDrive:
  ##objFSO = createobject("Scripting.FileSystemObject");
  ##numDrive = 'C';
  $$strRet="";
  while( ##numDrive <= 'Z' ) {
    $$strDrive = char(##numDrive);
    if( member(##objFSO, "DriveExists", $$strDrive) != 0 ) {
      ##objDrive = member( ##objFSO, "GetDrive", $$strDrive );
      if( member(##objDrive, "IsReady" ) != 0 ) {
        $$strVolume = member( ##objDrive, "VolumeName" );
        //message $$strDrive + "のボリュームラベル:" + $$strVolume;
        if( $$strVolume == $$1 ) {
          $$strRet = $$strDrive;
        }
      }
      releaseobject ##objDrive;
      if( $$strRet != "" ) {
        break;
      }
    }
    ##numDrive = ##numDrive + 1;
  }
  releaseobject ##objFSO;
  return $$strRet;

[ ]
RE:08615 USBメモリのドライブレターNo.08616
伯林 さん 17/12/30 14:29
 
でるもんた・いいじま さん
Iranoan さん
秀丸担当 さん

暮れのお忙しいのにレス頂き、感謝しております。
私、あまりVBSやパソコンに詳しくないので、でるもんた・いいじまさんやIranoan
さんの文章を読み、さて、どうしようか?と悩んでおりましたら、秀丸担当さんから
の、そのものズバリのコードを頂き早速検証してみました。
結果、すこぶる順調に動作いたしました。
私の作りかけのマクロの中で、同名ファイルの検索、書き込み等ドライブレターで悩
んでいた部分が全て解決いたしました。
ありがとうございました。

皆様、よいお年をお迎えください。

[ ]