秀丸からワードに移るNo.33413
柳絮 さん 14/08/28 12:39
 
いつもお世話になります。

以前ワードから秀丸に移る方法をお教えいただきましたが、逆に秀丸からワードに移
るにはどのようにしたら良いのでしょうか。

実現したいのは、秀丸のテキストを選択しておいてマクロを動かすと、その部分をコ
ピーして、アクティブウィンドウを既に開いているワードファイルに切り替え、そこ
にコピーしたテキストを貼り込むという動作です。

以前「秀丸エディタは、プログラミング言語を問わず、コマンドラインにファイル名
が書かれていれば、そのファイルを開くようになっている」とお教えいただきました。

そこで
$file = "C:\\Users\\ユーザー\\Documents\\test.doc";
のように書いたのですがうまく行きません。

どうぞよろしくお願いします。

柳絮

[ ]
RE:33413 秀丸からワードに移るNo.33414
秀丸担当 さん 14/08/28 14:29
 

ファイルを開くというだけでよければ、openbyshell文を使うと、エクスプロー
ラでファイルをダブルクリックして開くことと同じように開くことができます。

例:
openbyshell "C:\\Users\\ユーザー\\Documents\\test.doc";

ワードを外部から操作して貼り付けたりなどの操作は、それなりに高度なマクロ
を作る必要があります。
秀丸マクロのことだけでなく、vbsやjsからワードのオブジェクトを使って操作
するような知識が必要です。

ワードのオブジェクトの操作は、私自身はあまり詳しくないです。
秀丸マクロで作ると言っても、vbsやjsで書いたものを文法的に秀丸マクロに合
うように書き直すだけになるので、まずはvbsやjsで書いてみることをお勧めし
ます。

ワードのオブジェクトの操作は、"word.application vbs"などのキーワードで
Google検索などをするといろいろ情報が得られると思います。

[ ]
RE:33414 秀丸からワードに移るNo.33415
柳絮 さん 14/08/28 15:11
 
早速に有難う御座いました。

この質問は以前おすぎさんがここで問い合わせをなさっていたこととほぼ同じです。
困っているのは、秀丸の操作で「アクティブウィンドウを既に開いているワードファ
イルに切り替える」という一点です(切り替わったあとのワードの操作は一応できて
いるのです)。

お教えいただいたopenbyshellをもう少し勉強して見ます。

柳絮

[ ]
RE:33415 秀丸からワードに移るNo.33416
おすぎ さん 14/08/28 15:33
 
横からすみません。

私も教えてほしいです。

秀丸から、COMを呼び出すマクロを使って、
希望のワードファイルを開いて移ることはできます。

でも、そのワードファイルがすでに開いていた場合、秀丸からそのファイルに移るこ
とはできるのでしょうか?


[ ]
RE:33416 秀丸からワードに移るNo.33417
柳絮 さん 14/08/28 15:36
 
あれ、おすぎさんはもう完成していたのでは・・・

柳絮

[ ]
RE:33416 秀丸からワードに移るNo.33418
いいじま さん 14/08/28 15:51
 
いいじまです。

COMはほとんど使わないのですが、今回はCOMなしで、openbyshellで
できると思います。Wordでは同じ名前のファイルはパスが違っていても
同時起動不可のはずですから、マクロを含んだWordファイルを用意して
おいて、次のようにできると思います。

  1.秀丸上で特定のキーを押すとマクロが立ち上がるようにしておき、
   そのマクロでは本文全部をクリップボードに投入して、上記の
   Wordファイルをopenbyshellで起動する。
  2.Wordファイルのほうに、読み込まれた時にクリップボードを
   本文にペーストしてスペルチェッカを起動するマクロを
   実行するようにしておく。
  3.スペルチェックの結果が出たら、別のWordファイルとして保存、
   もしくは手作業で秀丸のほうに切り貼りして、とにかく
   マクロを含んだWordファイルは閉じる

[ ]
RE:33418 秀丸からワードに移るNo.33419
いいじま さん 14/08/28 15:59
 
いいじまです。

思いっきり嘘書いてました。

> Wordでは同じ名前のファイルはパスが違っていても
> 同時起動不可のはずですから、

これは誤りです。複数起動できます。
できないのはExcelの場合でした。

[ ]
RE:33419 秀丸からワードに移るNo.33420
柳絮 さん 14/08/28 16:16
 
いいじまさん

コメントを有難う御座いました。

openbyshellが良くわかっていないのですが、これはアプリケーションを起動するも
のなのではありませんか。

実現したいのは「アクティブウィンドウを既に開いているワードファイルに切り替え
る」なので、切り替えのコマンドがあるようにも思うのですが。

柳絮

[ ]
RE:33418 秀丸からワードに移るNo.33421
いいじま さん 14/08/28 16:17
 
いいじまです。

嘘書いたおわびにマクロ作って、動作確認までとりました。

> マクロを含んだWordファイルを用意して
> おいて、次のようにできると思います。
>
>   1.秀丸上で特定のキーを押すとマクロが立ち上がるようにしておき、
>    そのマクロでは本文全部をクリップボードに投入して、上記の
>    Wordファイルをopenbyshellで起動する。
>   2.Wordファイルのほうに、読み込まれた時にクリップボードを
>    本文にペーストしてスペルチェッカを起動するマクロを
>    実行するようにしておく。
>   3.スペルチェックの結果が出たら、別のWordファイルとして保存、
>    もしくは手作業で秀丸のほうに切り貼りして、とにかく
>    マクロを含んだWordファイルは閉じる

まず、この内容のマクロを用意します。
    ---- selectall.mac ここから ----
    selectall;
    copy;
    openbyshell "\\Users\\Delmonta\\a.docm";
    ---- selectall.mac ここまで ----

Wordファイルを作り、次のようなマクロを仕込んでおきます。
    ---- a.docm のマクロ ここから ----
    Sub AutoOpen()
        Selection.PasteSpecial Link:=False, DataType:=20, _
            Placement:=wdInLine, DisplayAsIcon:=False
        If Options.CheckGrammarWithSpelling = True Then
            ActiveDocument.CheckGrammar
        Else
            ActiveDocument.CheckSpelling
        End If
    End Sub

    ---- a.docm のマクロ ここまで ----

これで簡単に動作確認はできています。
起動するたびに「マクロの有効化」の確認が出るのが面倒では
ありますが、1回クリックするだけですので、そのへんはご勘弁を…。

[ ]
RE:33420 秀丸からワードに移るNo.33422
いいじま さん 14/08/28 16:20
 
柳絮さん:

> openbyshellが良くわかっていないのですが、これはアプリケーションを
> 起動するものなのではありませんか。

はい。

> 実現したいのは「アクティブウィンドウを既に開いているワードファイルに
> 切り替える」なので、切り替えのコマンドがあるようにも思うのですが。

切り替えることが最終目的なのですか?
他の何かの仕事を実現するためにウィンドウをアクティブに
するんですよね?

とすると、失礼ながら秀丸のところで質問するのは筋違いで、
Word側がそういう機能をCOM経由で提供しているかどうかを
「Word関係の場所で」質問するのが筋だと思います。

[ ]
RE:33421 秀丸からワードに移るNo.33423
柳絮 さん 14/08/28 16:38
 
いいじまさん

再度のコメントを有難う御座いました。スレッドの一番最初に書いたのですが、私の
説明がうまくありませんでしたね。

実現したいのは「秀丸のマクロ」でアクティブウィンドウを、その秀丸からワードに
切り替えたいのです。従ってこの質問は秀丸に関することであるように思うのです。

実は逆のことは実現できています。つまり「ワードのマクロ」でアクティブウィンド
ウを、そのワードから秀丸に切り替えるのですが、それはワードの方の書き方の問題
です。

うまく説明できたかしら。

柳絮

[ ]
RE:33423 秀丸からワードに移るNo.33424
いいじま さん 14/08/28 16:47
 
いいじまです。

> 実は逆のことは実現できています。つまり「ワードのマクロ」で
> アクティブウィンドウを、そのワードから秀丸に切り替えるのですが、
> それはワードの方の書き方の問題です。


うーむ、それは「秀丸が提供している機能をCOM経由でWordから呼び出す」
という話ですよね? これは秀丸がそういう機能を提供しているからで
あって、一字一句同じマクロを用意して呼び出し先のファイル名だけを
変えても、たとえばPhotoshopをWordから呼び出すことはできないはずです。
純粋に、「呼び出される側のアプリ(=今回は秀丸)」がそういう機能を
COMなりDDEなりで提供しているかどうかの問題です。

> 実現したいのは「秀丸のマクロ」でアクティブウィンドウを、
> その秀丸からワードに切り替えたいのです。
> 従ってこの質問は秀丸に関することであるように思うのです。

逆にこちらは、「Wordが提供している機能をCOM経由で秀丸から呼び出す」
という話ですよね? 秀丸マクロ自体には、「他のアプリをアクティブに
する」という機能はありません。Wordがどんな機能を提供しているのかを
調べるのがはじめの一歩です。秀丸はこれについては全く不知です。

[ ]
RE:33424 秀丸からワードに移るNo.33425
いいじま さん 14/08/28 16:56
 
いいじまです。

> 実は逆のことは実現できています。つまり「ワードのマクロ」で
> アクティブウィンドウを、そのワードから秀丸に切り替えるのですが、
> それはワードの方の書き方の問題です。

試しに、そのマクロの「全文」を投稿していただけませんか?
そうすれば、秀丸固有の操作をしている(=逆のことをするには
Word固有の操作が必要、このフォーラムは筋違い)なのか、
それともほとんどのアプリをほぼ同じ操作でアクティブにできるのか、
他の皆さんにも判断がつくと思います。

[ ]
RE:33424 秀丸からワードに移るNo.33426
柳絮 さん 14/08/28 17:05
 
いいじまさん

色々ご助言有難う御座います。ただまだ少し噛み合っていないようですね。

問題とするのは「アクティブウィンドウの切り替え」だけです。

(1)ワードにいるときにワードから秀丸に切り替えるのにはワードマクロで次のよ
うにして可能になります(これはこちらでお教えいただいたものです。詳しくは htt
p://goo.gl/0o4mJcにお礼方々考え方を書いてあります)。

Sub 貼込み秀丸へ()
Dim obj As Object
Set obj = CreateObject("WScript.shell")
Selection.Copy
obj.Exec """c:\Program Files\Hidemaru\Hidemaru.exe"" /x ""C:\Users\...\abc.M
AC"""
End Sub

(2)秀丸にいるときに秀丸からワードに切り替えるときにも、上と対称形のような
秀丸マクロのコマンドがあると思って、この場でご質問をしている次第です。問題は
秀丸マクロのコマンドでは、アクティブウィンドウを切り替える時に、どう書くかと
いうところなのです。

柳絮

[ ]
RE:33426 秀丸からワードに移るNo.33427
いいじま さん 14/08/28 17:33
 
いいじまです。

> Sub 貼込み秀丸へ()
> Dim obj As Object
> Set obj = CreateObject("WScript.shell")
> Selection.Copy
> obj.Exec """c:\Program Files\Hidemaru\Hidemaru.exe"" /x
> ""C:\Users\...\abc.MAC"""
> End Sub

> (2)秀丸にいるときに秀丸からワードに切り替えるときにも、
> 上と対称形のような秀丸マクロのコマンドがあると思って、
> この場でご質問をしている次第です。問題は
> 秀丸マクロのコマンドでは、アクティブウィンドウを切り替える時に、
> どう書くかというところなのです。

飲み込めました。このWordマクロの鍵は、「秀丸を起動してabc.MACを実行すれば、
既存の秀丸がアクティブになる」という点です。「ファイル名を指定して実行」で
    "c:\Program Files\Hidemaru\Hidemaru.exe" /x "C:\Users\...\abc.MAC"
というコマンドを実行しても同じ結果になるはずです。

Word側から呼び出しているWScript.shell というオブジェクトは、explorer.exeが
提供しているもので、たまたまWord経由で呼び出しているにすぎません。

つまり、この操作のキーポイントは /x "C:\Users\...\abc.MAC" であって、
それさえできれば、WordからでもExcelからでも、あるいは他にも別のアプリを
呼び出す機能を備えたアプリでも、つまりどこからでも同じことができるのです。

そして、Wordには秀丸の /x に相当するものは存在しません。
"c:\Program Files\Microsoft Office\Office14\WINWORD.EXE" /x
"C:\Users\...\abc.MAC"
と書いても、「120%間違いなく」エラーになります。

従って、マクロ入りのWordファイルが不可避です。次の流れになるでしょう。

    1)秀丸マクロでopenbyshellを使ってマクロ入りのWordファイルを呼び出す。
     これは hidesoft.2:33421| で書いた通りの方法です。
     このWordファイルを仮に c:\Users\...\macro.docm としましょう。
    2)macro.docm に仕込んだマクロで目的のウィンドウをアクティブにする。
   これは Documents("nantoka.docx").Activate でできそうです。
    3)呼び出された macro.docm はもう不要なので、閉じる。
     Documents("macro.docm").Close でいけそうです。

自分のところで試していないので恐縮ですが、失礼ながらこの程度のことは
自力でできないと、なにかあったときに厳しいです。

[ ]
RE:33427 秀丸からワードに移るNo.33428
いいじま さん 14/08/28 17:55
 
いいじまです。たびたびすいません。

まず補足。

>> obj.Exec """c:\Program Files\Hidemaru\Hidemaru.exe"" /x
>> ""C:\Users\...\abc.MAC"""

これは、
    ・Wordのマクロには秀丸をアクティブにする機能はないので、
     abc.MACという秀丸マクロを作って、その中で処理をしている。
    ・一般論として、あるアプリから別のアプリをアクティブにする
     ことはできない。
ということを認識していただければと思います。

> 従って、マクロ入りのWordファイルが不可避です。次の流れになるでしょう。

これは秀丸の createobject 関数で何とかなるかもしれません。

ただ、「createobject word.application activate」で検索した
限りでは、そのものずばりというものはないようでした。

[ ]
RE:33426 秀丸からワードに移るNo.33429
h-tom さん 14/08/28 20:35
 

h-tom です。

>問題とするのは「アクティブウィンドウの切り替え」だけです。
秀丸マクロで、他のアプリケーションのウィンドウをアクティブにする命令は
ありません。

秀丸マクロは、秀丸エディタを制御するのが目的なので、他の秀丸エディタの
ウィンドウを操作する事はできますが、別ソフトのウィンドウを操作する事は、
基本的にはできません。

外部DLLを使えば可能ですが。
 ht_tool.dll
 http://homepage3.nifty.com/_htom/macro/ht_tools.html

Wordがターゲットなら、getobject 使えば、既存のWordにアクセスはできますが、
アクティブにできるかどうかは知りません。
アクティブにするメソッド/プロパティがあれば可能でしょう。

[ ]
RE:33429 秀丸からワードに移るNo.33430
柳絮 さん 14/08/28 21:58
 
h-tomさん

情報を有難う御座います。前にも助けていただきましたが、今回の「秀丸マクロは秀
丸エディタを制御するのが目的なので、他の秀丸エディタのウィンドウを操作する事
はできますが、別ソフトのウィンドウを操作する事は基本的にはできない」とのお話
は貴重なものでした。

では外部から操作するとしたらどうしたら良いのか。AHKの活用も考えています

柳絮

[ ]
RE:33430 秀丸からワードに移るNo.33431
秀丸担当 さん 14/08/29 09:09
 

秀丸エディタのマクロでは、setactivehidemaruという文で他の秀丸エディタに
アクティブを切り替える方法はありますが、他のアプリケーションに切り替える
ための文は確かに無いです。

vbsなどのやり方では、AppActivateを使ってアクティブを切り替える方法がある
ようです。

Set objShell = WScript.CreateObject("WScript.Shell")
objShell.AppActivate "test.doc"

これを秀丸のマクロに書き換えると、以下のようになります。

#objShell=createobject("WScript.shell");
callmethod #objShell,"AppActivate","test.doc";

AppActivateはウィンドウのタイトルの一部が一致していればアクティブを切り
替えるようで、あまり厳密ではないようですが、これが手っ取り早いという気が
します。

[ ]
RE:33431 秀丸からワードに移るNo.33440
柳絮 さん 14/08/29 15:52
 
秀丸担当様

色々お世話になります。vbaのAppActivateを秀丸マクロに書き換えたもの、まだ私の
ところでは動いていないのですが、試行錯誤をしているときに一つ気付いたことがあ
ります。

「秀丸から他のアプリケーションに切り替えるための文はない」とのこと、一旦は納
得しかけたのですが、秀丸から別のアプリケーションに切り替えるマクロを、ここで
お教えいただいて自分で使っていることを思い出しました。

それはgoogle.macというマクロで、秀丸のうえで文字を選択しておいて秀丸マクロを
動かすと、アクティブウィンドウがブラウザーに切り替わり検索窓にその文字が入力
され、その上で検索結果が表示されるものです。

ここから言えるのは「秀丸から他のアプリケーションに切り替えて、さらにそのアプ
リケーション上での動作を秀丸マクロで指定する」実例があると言うことです。しか
も他のアプリケーション上で動作させるために他のファイルを起動することもありま
せん。

今はこれを使って何かできないかと試しているところです。

柳絮


//google.mac
//範囲選択している文字列、カーソル位置にある単語、または任意の
//文字列を入力してWebブラウザでGoogle検索をします。
//Hidemernet Explorer をインストールしているときは秀丸エディタ
//上に検索結果を出すこともできます。

//以下設定
#fHmnetex = false;  //Hidemernet Explorerを使う場合true
//以上設定

if( selecting ) {
    $s = gettext(seltopx,seltopy,selendx,selendy,1) ;
} else {
    selectword;
    $s = gettext(seltopx,seltopy,selendx,selendy,1);
    $s = input( "Google検索",  $s );
}
if( $s == "" ) {
    endmacro;
}
$param = "";
if( #fHmnetex ) {
    $percent = "%";
    $and = "&";
} else {
    $percent = "^%%";
    $and = "^&";
}
#c = strlen( $s );
#i = 0;
while( #i < #c ) {
    $param = $param + $percent +
        leftstr( hex( ascii( midstr( $s, #i, 1 ) ) ), 2 );
    #i = #i + 1;
}
$param = "http://www.google.co.uk/search?q=" + $param + $and + "ie=Shift_JIS
" + $and + "oe=Shift_JIS" +
        $and + "hl=ja";
if( #fHmnetex ) {
    openfile $param;
} else {
    run getenv("Comspec") + " /c start " + $param + " >nul";
}
endmacro;

[ ]
RE:33440 秀丸からワードに移るNo.33441
秀丸担当 さん 14/08/29 16:48
 

AppActivateは、タイトルバーのタイトルの文字列を見つけるもので、単純でア
ナログ的なもののようです。
例えば、メモ帳のタイトルバー全体だったら以下のようにしてできるようです。

  #objShell=createobject("WScript.shell");
  callmethod #objShell,"AppActivate","無題 - メモ帳";

「"無題 - "」とか、「" - メモ帳"」のような、先頭または最後の文字列でもい
いようです。
タイトルに書かれているものなので、

  #objShell=createobject("WScript.shell");
  callmethod #objShell,"AppActivate","C:\\Users\\ユーザー\\Documents\\
test.doc";

としたらダメだと思います。(ワードはc:\から始まるタイトルではないような
ので)

----

google.macは、簡単に言うと他のソフトを起動していることに相当しています。
最初のコメントの、openbyshellも、ワードが起動してアクティブが切り替わっ
ていると思います。
33426番のコメントの(1)のワードマクロも、hidemaru.exeを起動しています。

そもそもの話になってしまいますが、最初のコメントの

  openbyshell "C:\\Users\\ユーザー\\Documents\\test.doc";

で、Word 2013で試している限りでは、既に開いていれば既存のtest.docにアク
ティブが切り替わっていて、目的は達成されているような気がします。
(もしかしたらワードのバージョンや設定によって違うのかもしれませんが)

[ ]