• 締切済み

wshからexcel操作で,ChDirを使いたい

はじめて質問をします。  monnomestと申します。 vbaのマクロを実行して、シートを作成するwsh(by jscript)を作成しました。そのシートを保存する際にchrdirで保存場所を明示したいのですが、指定の仕方が分かりません。(wshを置いておくdirectoryにしたい。) ChDirは、エクセルのmethodではないため、以下のようでは、エラーになりますし、 var objXL = WScript.CreateObject("Excel.Application"); objXL.Visible = true; with(objXL){ var tar=workbooks.Open(scriptpath+vba); try{ Run("'"+vba+"'!'"+command+"'"); }catch(e){ } tar.Close(); ChDir("xxxxxxx"); ←  とは出来ない。 } もちろん、wshを使わず、vbaをそのまま立ち上げればこんなことする必要はないのですが、 諸々の事情がありまして、wshで行えれば都合がよいのです。 objectが何なのかが分かれば解決でしょうか。 どなたかご教示いただけますでしょうか。

みんなの回答

  • Wendy02
  • ベストアンサー率57% (3570/6232)
回答No.3

こんばんは。 あまり、私が、ごちゃごちゃ言ってもしょうがないですね。 ちょっと、度が過ぎたかもしれません。不適切な言葉があったら、申し訳ありません。 ChDir で直接影響を受けるのは、本来、GetOpenFilename等の、この手のダイアログだけだと思います。保存する場合に、ChDir は不要です。単に、ディレクトリを書かなくて済むだけです。 もし、あえて変えるなら、[Application.]DefaultFilePath で規定になっているフォルダを変えればよいのです。そこを一次的に変えれば、開く時には、そこを開けますし、保存する時も、そこになります。

monnomest
質問者

お礼

> もし、あえて変えるなら、[Application.]DefaultFilePath で規定になっているフォルダを変えればよいのです。 なるほど、そうですよね。納得です。 ありがとうございました。

  • Wendy02
  • ベストアンサー率57% (3570/6232)
回答No.2

こんにちは。 ここのログの範囲だけでは、ChDir は必要ないように思います。その必然性が分からないです。何か、基本的な誤解が生じているようです。 >保存ダイアログを開く際にそのユーザーがクリックしたwsfのdirectoryが開く。」というのが目的です。 どのアプリケーションでも、ユーザーにフォルダを選ばせる時に、当初は、[使用ユーザー]のMy Documents やC:\から開くのが一般的だと思うのです。そこで、ダイアログを開いて、自由選択させて、ファイルを保存するわけです。 ブック tar.Close してからなら、ChDir ではなく、FileSystemObject で、MoveFileメソッドを行えばよいのですが、それは、常識的ではありません。 wsfであろうがなかろうが、ChDir というのは、アプリケーションの対象のカレントディレクトリが変わるという目的で、VBAの中で通用する話で、VBAの外に出たら、保存のフォルダは直接関係ありません。通常は、フォルダ名を入れないで保存や開くことをする以外は、ChDir は使いません。 ダイアログは、JavaScript やVBScipt なら、CreateObject("WScript.Shell") のSpecialFolders オブジェクトなどで出して、フォルダを取得して、それを保存フォルダの変数、例えば、#1 の newdir に渡せば良いわけでは?

monnomest
質問者

お礼

再びありがとうございます。 > 当初は、[使用ユーザー]のMy Documents やC:\から開くのが一般的だと思うのです。 ぅーん。ただ、チームで共同作業をしていて、サーバー内のすでに決まっているdirectoryに保存する必要がある場合、curdirを指定してしまいたいこともあると思います。たとえば毎月ちがうしかも階層の深いところにあるdirectoryに収めるのだけれど、vbaに参照情報をつけたりするのは、スマートでないと思うわけで、軽いwsfを予定の保存先においてそこに完成したシートを保存したかっただけです。 (別のパターンでcsvを加工して、展開させるwsf+vbaを作って活用していますが、そのcsvのdirectoryにvba内でchdirしています。しかし、質問させていただいているケースでは、netからの情報を自動集計するvbaなので、元データもない。)  でも、考えてみたら書類名は、ある程度決まっているものだし、  Activeworkbook.SaveAs (scriptdir+'newname'); でいいんでした。それを発見できて助かりました。 (別の問題と混ざり合ってターゲットがずれていってしまったようです。)  ところで、必然性はともかく、ChDirのやりようはあるかの疑問は残るのですが、、、

  • Wendy02
  • ベストアンサー率57% (3570/6232)
回答No.1

こんばんは。 > ChDir("xxxxxxx");    ←  とは出来ない。 >objectが何なのかが分かれば解決でしょうか。 これを動かすには、Visual Basic For Application のタイプライブラリを呼び出しておかないと動かないかもしれませんが、必要あるのでしょうか? >そのシートを保存する際にchrdirで保存場所を明示したいのですが、指定の仕方が分かりません。 単に、別のマクロを作って、command2 をRunさせるか、 Run("'"+vba+"'!'"+command2+"'"); ←これで動くかは分かりませんが。 保存するなら、以下のようなすれば良いです。 // newdir ="x:\\xxxxxx\\"; DisplayAlerts = false; tar.SaveAs (newdir + tar.Name); DisplayAlerts = true; tar.Close False; //

monnomest
質問者

補足

回答ありがとうございます。質問内容が明確でなくてすみません。 wsfで実行するのは、シートの作成までで、 あくまで「ユーザーに多少の加工の後に好きな場所に好きな名前で保存してもらいたく、保存ダイアログを開く際にそのユーザーがクリックしたwsfのdirectoryが開く。」というのが目的です。 ご指摘のとおりVBAにアクセスすればChDirを扱えると思うのですが、 「CreateObject("Excel.Application")のようなものが必要かかな」 というところで終わってしまって、、、、

関連するQ&A

  • WSHでシャットダウン

    WSH(JScript)でシャットダウンする方法を教えてください。 OSは2000とXPです。 XPだけなら以下の方法で出来るようですが、 2000で実行するとエラーになってしまいます。 var ws = new ActiveXObject("WScript.Shell"); ws.Run("shutdown -s -f");

  • JScriptでExcelの全シートにアクセスする方法

    JScriptからWSHを使って、Excelファイル内の全ワークシートにアクセスしようと試みています。たとえば、 var excel=WScript.CreateObject("Excel.Application"); excel.Visible=false; book=excel.Application.Workbooks.Open(ファイル名); for(var sheet in book.Sheets) { WScript.Echo(sheet.Name); } と書いてみましたが、forループに入りません。 VBScriptでは上記のようなコードでOKらしいのですが、JScriptではNGなのでしょうか? また、Office製品のActiveXオブジェクト(というのかどうかよくわからないのですが)を詳しく紹介しているサイトや書籍などをご存知でしたら教えてください。 MicrosoftのサイトにはTIPS程度しか載っていないので、独習できない状況です。

  • WSHのエラー対策

    いつも参考にさせて頂いております。 当方環境: OS WinXP WSH Version 5.7 現在、WSH+JScript でFTPによるファイル転送のプログラムを作成しております。 ところが、実行させてみると、FTPコマンド実行のところでエラーが発生します。 (IPやコマンドファイルはスクリプト内で取得しています) var ws = WScript.CreateObject("WScript.Shell"); var errCode = ws.Run("ftp -i -s:"+cf+" "+ip_add,0,true); エラーメッセージ:「処理を待つことができません。」 MicrosoftのHPで検索したら、以下の事が分かりました。 「通常このエラーは、あるプロセス (ショートカット リンクの実行など) が完了するまでスクリプトが待機しているときに、そのプロセスが値を返さない場合に発生します。」 色々なHP見ても、大体皆さんFTPコマンドはこのように実行されているんですが、どこが違うのでしょうか? また、このエラーへの対処方法をご存知の方がいらっしゃいましたら、 ご教授下さい。

  • [WSH] ファイルのコピーができない

    こんにちは。 次のようなスクリプトでFTPフォルダにファイルをコピーしようとしたのですが、カレントフォルダにファイルがコピーされてしまうようです。 どうすれば、FTPフォルダにファイルをコピーできるのでしょうか? var objShell = WScript.CreateObject("Shell.Application"); var objFolder = objShell.NameSpace("ftp://user:password@sitename/directory/"); objFolder.CopyHere("C:\\WINNT\\win.ini"); WScript.Sleep(6000); ※下記のページを参考にさせていただき作成しました。http://homepage3.nifty.com/aya_js/wsh/wsh25.htm

  • WSHによるExcelのセルコピー&ペーストの方法

    【やりたいこと】 WSHを利用して 1.あるExcelファイル(Aとする)を開く 2.別のExcelファイル(Bとする)を開く 3.Aの特定のシートの特定のセル範囲をコピー 4.Bの特定のシートに、3でコピーしたセル範囲をペースト 5.B上書き保存&閉じる 6.A閉じる 【現状】 以下のようなコードを書いてみたのですが、 ファイルの開閉はできますがコピー&ペーストが 全くできていないようです。 何が問題なのかよくわからず質問させていただきました。 かなり素人なので無駄も多いですが、ぜひご教授願います。 よろしくお願い致します。 ------------------------------------- Set xl1 = Wscript.CreateObject("Excel.Application") xl1.Visible = false Set book1 = xl1.WorkBooks.Open(A) Set mysheet1 = book1.worksheets(特定のシート) Set xl2 = Wscript.CreateObject("Excel.Application") xl2.Visible = false Set book2 = xl2.WorkBooks.Open(B) Set mysheet2 = book2.worksheets(特定のシート) mysheet1.Activate xl1.Range("A1").CurrentRegion.Select xl1.Selection.Copy mysheet2.Activate xl2.Range("A1").Select xl2.Selection.Pastespecial 'ファイルクローズ book2.Close false xl2.Quit set mysheet2 = Nothing set book2 = Nothing Set xl2 = Nothing book1.Close false xl1.Quit set mysheet1 = Nothing set book1 = Nothing Set xl1 = Nothing --------------------------------

  • jscriptからエクセルのオートシェイプを作成しようとしていますが、

    jscriptからエクセルのオートシェイプを作成しようとしていますが、文字サイズの変更ができません。 スクリプトは以下の通りです。 <job id="ConstJob"> <reference guid="00020813-0000-0000-C000-000000000046"></reference> <script language="JavaScript"> //エクセルオブジェクト var excel = new ActiveXObject("Excel.Application"); //表示しないで編集 excel.Visible = false; // エクセル新規作成 var book = excel.Workbooks.Add(); book.Worksheets("Sheet1").Activate; // オートシェイプの作成 var shape0 = book.Worksheets("Sheet1").Shapes.AddShape(1, 5, 5, 410, 130); shape0.TextFrame.Characters().Font.Size = 9; ……(1) shape0.TextFrame.Characters().Text = "ここにテキスト"; //エクセルの保存 var fso = new ActiveXObject("Scripting.FileSystemObject"); book.SaveAs(fso.GetFolder(".").path + "\\sample.xls"); //エクセルの終了 excel.Quit(); WScript.Echo("作業完了"); </script> </job> この状態でwsfファイルを起動させると、(1)の行でエラーを起こしてしまいます。 「Font クラスの Size プロパティを設定できません。」というエラーです。 検索するとシートの保護を解除すればいい、というページが見つかったのですが、 (参考→http://okwave.jp/qa/q2497357.html) マクロでは使えても、Jscriptで書いても動作してくれません。 解決策をご存知の方は、よろしくお願いします。

  • WSHで他のバッチを呼びその終了を待つ方法

    WSHでプログラミングをしています。 WSHを使う理由はWin上から簡単にメールを送信できるのでとりあえず選択しました。 で、WSHのバッチから、普通のDOSコマンドで記述したバッチを呼んで、そのバッチの結果出力されたログファイルをWSHのバッチでメールに添付して送信したいなどと思っています。 今は var ws = WScript.CreateObject("Wscript.Shell"); ws.run("tmp.bat"); こんな感じで「tmp.bat」という名のDOSコマンドのバッチを呼び出しているのですが、このコマンドは命令発行したらその命令が終了するのを待たず次の命令に進んでしまうようです。 なので、ログ作成とメール送信のタイミングが合わない状態です。 処理待ちする方法を教えてください。よろしくお願いします。

  • VBA 新規にエクセルを開き既存のファイルを開く

    VBAで新規にエクセルのアプリケーションを起動し、 その中に既存のファイルを起動する方法は有りますか? Sub Sample() Dim appExcel As Excel.Application Dim WSH As Variant Dim strPath As String Set appExcel = New Excel.Application Set WSH = CreateObject("Wscript.Shell") strPath = ActiveWorkbook.Path With appExcel .Visible = True .Workbooks.Add .ActiveWorkbook.SaveAs (strPath & "\ test.xls") End With Set WSH = Nothing End Sub このコードは、ネットから拾ったサンプルコードなのですが 新しいアプリケーションでエクセルを立ち上げることはできたのですが 新規のブックが開いてしまい、 更に、開きたいファイルに上書き保存してしまいそうです。 新規のブックが開く原因は .Workbooks.Addで、 上書き保存する原因は .ActiveWorkbook.SaveAs だとわかってるのですが、 この部分を同変更すればいいのかがわかりません。 Workbooks.Open?Filename:="C:\Users\test.xlsx" だと、現在実行しているvbaファイルを同じ枠内で 該当のファイルが開いてしまいます。

  • WSHでエクセルのあるシートをテキストファイルに変換したい

    こんにちは。 OSはWin2K,WSHは5.6,Excelは2002を使用しています。 「月計表.xls」には「1月」から「12月」と「合計」 というシートがあります。 このうち「合計」シートをテキストファイル(タブ区切り) としてデスクトップに保存したいのですが、 VBScriptではどのように記述すればよろしいでしょうか? よろしくお願いいたします。

  • cscriptでは動くが、html埋め込みは×

    例えば、下記のコードは、Table.jsとかしてCscript Table.jsとするとちゃんと動きますが、<html><body><script language="jscript"> ここに記載</script></body></html>として、IE9で動かそうとしても動きません。htmlに埋め込んで動かすにはどうしたらいいのでしょうか? var excelApp = WScript.CreateObject("Excel.Application"); //var excelApp = new ActiveXOject("Excel.Application");  としても一緒でした。 var book = excelApp.Workbooks.Open("d:\\test\\Table.xls"); var sheet = book.WorkSheets("Sheet1"); // Excel内を読み込み var itemName = sheet.Cells(3, 2); var weaponType = sheet.Cells(3, 3); var power = sheet.Cells(3, 4); var deffence = sheet.Cells(3, 5); var price = sheet.Cells(3, 6); WScript.Echo(itemName, weaponType, power, deffence, price); book.Close(); excelApp.Quit(); excelApp = null;

専門家に質問してみよう