VBS(WSH)でSendKeysを使って日本語(2バイト文字)を入力する方法

VBS(WSH)でSendKeysを使って日本語(2バイト文字)を入力する方法

scriptが良い感じに組みあがってきた時に発生したエラー。
『保存フォルダがありません』

実験でネットワークドライブに保存しようとしたんです。

場所は[ \\Landisk\disk1\共有File\Test ] 何度か確かめた所、指示している場所はココなのに[ \\Landisk\disk1\MFile\Test ] に保存しようとしてます。

そりゃね、そんなフォルダないからエラーになるのは分かる。
でも、なんで?
どこからMFileなんて名前が出てきた??
文字化けならもっと難解な文字になっていてもよさそうなのにMFileって。

まず先に解決策を記載

■IEでDLデータに対して名前を付けて保存を実行

private function saveFile(filName,dirName)  
   Dim i
   Dim onjShell
   Dim textClip

   Set textClip = CreateObject("WScript.Shell")
   WScript.Sleep 3000
   textClip.Run "cmd.exe /c Echo "&dirName&" | Clip", 0, True
   
    '保存操作エミュレート
    Set onjShell = WScript.CreateObject ("WScript.Shell")
      'フォーカス移動
      onjShell.SendKeys( "{F6}" )
        WScript.Sleep 300
      onjShell.SendKeys( "{TAB}" )
        WScript.Sleep 300
      onjShell.SendKeys( "{DOWN}" )
        WScript.Sleep 300
      onjShell.SendKeys( "A" )
        WScript.Sleep 1000
      onjShell.SendKeys(filName)
        WScript.Sleep 300
      'Tab反応ズレ防止策
      For i=1 To 5
        onjShell.SendKeys( "{TAB}" )
        WScript.Sleep 100
      Next
      '最上位フォルダに移動
      onjShell.SendKeys("{ENTER 10}")
        WScript.Sleep 300
      
      '保存作業
      onjShell.SendKeys( "{TAB 1}" )
        WScript.Sleep 300
      onjShell.SendKeys( "{ENTER 1}" )
        WScript.Sleep 1000
      textClip.SendKeys( "^v" )
    '↓だとMFileになる
    'onjShell.SendKeys(dirName)
        WScript.Sleep 300
      onjShell.SendKeys( "{ENTER 1}" )
        WScript.Sleep 300
      onjShell.SendKeys( "%s" )
        WScript.Sleep 300

    Set i = Nothing
    Set onjShell = Nothing
    Set textClip = Nothing
  End Function

呼び出し時に2つの引数(filName、dirName)を渡しています。
共にCSVデータから呼び出して取り出した値で、CSVデータはASIN(Shift_Jis)で保存しています。

SendKeysで送る前は日本語もちゃんとしている

SendKeysで送る前にMsgBox(dirName)で確認すると正しい保存先が出力されるので、保存文字コードの問題ではなさそうです。

つまりは、SendKeysに掛けると化けると。

解決策の解説

一度他のプログラムに書き込んで、それをクリップ ⇒ 貼付け で課題解決できるようです。
なんだその面倒な仕様は...。

上のスクリプトの場合は一度コマンドプロントに書き出して、入力した値をコピー、必要な個所で呼び出してます。

Set textClip = CreateObject("WScript.Shell")
WScript.Sleep 3000
textClip.Run "cmd.exe /c Echo "&dirName&" | Clip", 0, True

ココがコマンドプロントに書き込んでる箇所で

textClip.SendKeys( "^v" )

これが書き込んだ値をコピーして所定の位置に張り付けているパーツです。

ちなみに、下の様に書くと改行を無視して文字れ戸をコピペするようです。

textClip.Run( "cmd.exe /c set /p dummy="格納したい文字列" | clip", 0, true )

その他の注意点

VBSではUTF-16またはShift_Jisのみが対応エンコードとなります。
CSVファイルのコードを UTF-8 にすると読込んだ時点で文字化けしてるので、SendKeys以前の問題でうまく動きません。

VBS利用者ならCSV作成はExcelで行うでしょうから、ココは素直にShift_Jisで保存しときましょう。

まとめ

これでネットワークフォルダへの保存もバッチリ。

まさかコマンドプロント使ってコピペなんて芸当で解決しなきゃならないとは思いもしませんでしたが...。

\ 最新情報をチェック /

コメントを残す

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください