Excel VBAでbatファイルを実行し、環境変数を取得する方法はあるか?

このQ&Aのポイント
  • ExcelのVBAでbatファイルを実行し、環境変数を取得する方法について教えてください。
  • batファイル内でセットした環境変数の値をVBA側で取得することは可能でしょうか?
  • VBAでbatファイルを実行し、batファイルで設定した環境変数の値を取得する方法について知りたいです。
回答を見る
  • ベストアンサー

Excel VBAでbatファイルを実行

ExcelのVBAでbatファイルを実行し、 batファイル内でセットした環境変数を取得することは可能でしょうか? batファイルの内容は set MYDRIVE=E: set MYDIR=%MYDRIVE%\WORK のような感じです。 環境変数「MYDIR」の値をVBA側で取得できないかと思い、 ' 参照設定: Windows Script Host Object Model Sub ボタン1_Click() Dim myWshShell As New WshShell Dim myLong As Long Dim myWshEnvironment1 As WshEnvironment Dim myWshEnvironment2 As WshEnvironment Dim myWshEnvironment3 As WshEnvironment Dim myWshEnvironment4 As WshEnvironment myLong = myWshShell.Run("E:\work\test.bat") Set myWshEnvironment1 = myWshShell.Environment("System") Set myWshEnvironment2 = myWshShell.Environment("User") Set myWshEnvironment3 = myWshShell.Environment("Volatile") Set myWshEnvironment4 = myWshShell.Environment("Process") ' ブレークポイントを設定して内容確認 Set myWshShell = Nothing Set myWshEnvironment1 = Nothing Set myWshEnvironment2 = Nothing Set myWshEnvironment3 = Nothing Set myWshEnvironment4 = Nothing End Sub のようなコードを書いてみて「myWshEnvironment1」~「myWshEnvironment4」の内容を ウォッチ式で確認してみましたが、batファイルの中でセットした「MYDIR」の値は 含まれておりませんでした。 batファイルで設定した環境変数の値を取得する方法があれば 教えていただけないでしょうか?

質問者が選んだベストアンサー

  • ベストアンサー
回答No.2

Batファイル(仮に、e:\asd.bat)の中身を @echo off set aaa=fff echo %aaa% としておいて たとえば標準モジュールの場合ですが Sub CMDget() Dim wSh As Object, wExec As Object, Cmd As String, Result As String Set wSh = CreateObject("Wscript.Shell") Cmd = "e:\asd.bat" Set wExec = wSh.exec("%ComSpec% /c " & Cmd) Do While wExec.Status = 0 DoEvents Loop Result = wExec.StdOut.readall MsgBox Result Set wExec = Nothing Set wSh = Nothing End Sub とすればメッセージボックスに、fff と表示されます。 が、先の回答のように、Batファイルが終了した時点で、 SET した 環境変数は消えてなくなるので 使い道が無さそうに思えますけど? おしまい。

yossy3
質問者

お礼

ありがとうございます。 環境変数にSETしているbatファイルは他のbatファイルから呼び出されているので、下手に触れないのですが、もう1個batファイルを作って、環境変数にSETしているbatファイルをCALLしたあとで、必要な環境変数の値をECHOして標準出力に出力するか、リダイレクトしてテキストファイルに出力すれば、Excel側で拾えそうですね。 (a.bat) @echo off set aaa=fff set bbb=ggg (b.bat) @echo off call "~\a.bat" rem echoしたものをStdOutプロパティから拾う or リダイレクトしてテキストファイルから拾う echo %1 rem echo %1 > "~\hoge.txt" (VBA) ~(省略)~ Cmd="~\b.bat 環境変数名" Set wExec = wSh.exec("%ComSpec% /c " & Cmd) ~(省略)~

その他の回答 (1)

回答No.1

SET コマンドで作成した環境変数は、そのコマンドプロンプト上(メモリ)だけで 有効になっているようです。 一個目のコマンドプロンプトで、set zzz=fff とし set で zzz=fff が 返って来るのを確認。 もう一個コマンドプロンプトを立ち上げて SET としても先ほどの zzz=fff は返ってきません。 最初のコマンドプロンプトで再度試すと、しっかり有ります。 なのでEnviron関数でも、Wscript でも取得できないようです。 Batファイルを実行後にコマンドプロンプトを立ち上げて確認してもありませんでしたし。 調べたら SETX なるものがレジストリに登録できるようですけど未検証です。 私はこの辺で退却します。

yossy3
質問者

お礼

ありがとうございます。 Excelでコマンドプロンプトを起動して、 その中の環境変数が覗ければいいんですけど、 覗けないんですかね……

関連するQ&A

  • エクセルvbaでファイル書き込みのとき同じファイルがある場合に\"上書きしますか?\"というメッセージをだすには?

    エクセルvbaでファイル書き込みのとき同じファイルがある場合に"上書きしますか?"というメッセージをだすには、どのようにやればよいでしょうか? ダイアログで上書きするときにメッセージを出すようにしたいのです。 現在は、 Dim fo As New Scripting.FileSystemObject Dim ts As TextStream Dim myDir As String Dim myFileDir As String myDir = ThisWorkbook.Path myFileDir = myDir & "\a.txt" 'ここにファイルを探すコードを埋め込んでいます。 Set ts = fo.CreateTextFile(myFileDir, False) よろしくお願いします。

  • エクセルVBAよりBATファイルを起動する方法。

    エクセルVBAよりBATファイルを起動する方法を教えてください。 現在下記の様な内容で作ってみましたがうまくいきません。 ***VBA側*** Private Sub CommandButton5_Click() Dim myID As String myID = Shell("D:\test.bat", vbMaximizedFocus) End Sub ***BATファイル側*** xcopy "d:\test1" "d:\test2"/I/Y エクセル2003で実行してみましたがうまくいきません。BATファイルは起動しているようなのですが、BATファイルの処理がうまくいかなくて困っています。(ちなみにBATファイル単体をダブルクリックで実行すると問題ないのですが…) 同じ内容をエクセル2007で実行するとうまくいきました。(ちなみにOSはVISTA) 2003(ちなみにOSはxp)で上手くいかないのがどうしてかわかりません。 どうか詳しい方ご教授ください。よろしくお願いいたします。

  • エクセルVBAとVBScript

    WinXP/Pro  エクセル2002使用です。 VBScriptで下記のメール送信のプログラムを作り、 それをエクセルVBA→BATファイル→VBScript(→エクセルVBAに戻る)という流れで自動化させましたが、下記のコードでは、現在進行中のエクセルVBAとは別のブックを作るのでうまくいきません。 (エクセルブックを2重起動してしまいます) Set objExcel =GetObject( "d:\auto\aaa.xls") Dim stradrs Dim strkk Dim strjikan with objExcel stradrs = .Worksheets("Sheet1").Cells(5,1).Value strkk= .Worksheets("Sheet1").Cells(4,1).Value strjikan = .Worksheets("Sheet1").Cells(4,2).Value end with Set objEmail = CreateObject("CDO.Message") objEmail.From = "***@***.com" objEmail.To = stradrs objEmail.Subject = "表題" objEmail.Textbody = "内容" objEmail.AddAttachment("d:\auto\" & strkk & strjikan & ".doc") objEmail.Send Set objEmail = nothing Set objExcel = nothing 目的は、最初に立ち上げている(VBScriptを呼び出したVBAを実行中の)エクセルから値を取得したいのです。 下記いずれかの方法によると思っています。 (1)エクセルVBAから直接VBScriptに引数で値を渡すことは可能でしょうか? (2)VBScriptからエクセルブックを起動させずに値を取得することは可能でしょうか? 値はテキスト文字です。 何卒よろしくお願いします。

  • Excel VBA 実行されないのはなぜ

    いつもお世話になっております。 VBAの練習で以下のような構文を作成し実行すると 構文のサンプルを並べているシートでのみエラーが表示されます。 新規シートでは実行されるので、なぜなのかと思います。 変数名が重複しているということもありません。 思い当たる点がありましたら教えてください。 よろしくお願いいたします。 Sub InputBoxメソッドで選択した範囲を取得する() Dim myselect As Range 'On Error Resume Next Set myselect = Application.InputBox("セル範囲を選択します。", Type:=8) If myselect Is Nothing Then Exit Sub myselect.Value = "test" End Sub

  • エクセルvba

    エクセルvbaなのですが Sub test() Dim xlApp As Object Dim xlBook As Object Set xlApp = CreateObject("Excel.Application") Set xlBook = xlApp.Workbooks.Open(ActiveWorkbook.FullName) 'コード・・・ Set xlApp = Nothing Set xlBook = Nothing End Sub これだと Set xlBook = xlApp.Workbooks.Open(ActiveWorkbook.FullName) の部分で、エラーになります。 実行時エラー1004です。 自身ファイルをオブジェクトに格納して操作したいのですがどうすればいいでしょうか?

  • VBA 開いているブックの場所

    ExcelでVBAを利用して、フォルダ(c:\"VBA練習")に置いてあるExcleの内容を、開いているExcleに自動読取り作業をするために、下記のようなコードを記述しました。(正常に動作します) そこで、ご相談なのですが、現在は特定のフォルダ(c:\"VBA練習")にExcelを置かないと読み取りは実現しません。ですが、開いているBookが置いてある"場所"にあるExcelを読み取りたい場合、どのように書き換えれば宜しいでしょうか? ご教授いただけると助かります。宜しくお願いします。 -------------------------------------------------------------- Private Sub 読込ボタン_Click() Dim myDir As String, myName As String, myBook As Workbook Dim copydata As Range, GYO As Range Dim SH2 As Worksheet, SH1 As Worksheet Set SH2 = ThisWorkbook.Worksheets("情報シート") '集計用のブックがあるフォルダ名を指定 myDir = "C:\VBA練習" myName = Dir(myDir & "\" & "*.xls") Do While myName <> "" Set GYO = SH2.Range("A65536").End(xlUp).Offset(1) '(1)指定した名前のブックを開いて変数に格納する Set myBook = Workbooks.Open(Filename:=myDir & "\" & myName) '(2)転記元を取得する Set SH1 = myBook.Worksheets("回答内容") Set copydata = SH1.Range("Z1").Resize(100, 1) '(3)転記先に貼り付ける copydata.Copy GYO.PasteSpecial Paste:=xlPasteValues, Transpose:=True '(4)開いたブックを閉じる myBook.Close myName = Dir() Loop End Sub --------------------------------------------------------------

  • エクセルVBAの実行スピードが落ちます

    エクセルで検索を行うVBAを使用していますが、エクセル立ち上げ時はサクサク動きますが、検索を繰り返し使っていくと、実行速度が落ちてしまいます。 エクセルを再起動すれば、元どおりの速さに戻ります。 何が原因でしょうか?どうすれば防ぐことはできるでしょうか? よろしくお願い申し上げます。 実行環境 WindowsXPproSP3 Pen4 3.0Ghz メモリ1GB HDD80GB Office2003 VBAの検索部分 Function Kensaku3(Key1 As String, Range1 As String) As Long '縦方向の検索   Dim myRng As Range   Dim Job1 As String   Dim Col1 As Long   Dim Row1 As Long   Col1 = Range(Range1).Column   Row1 = Range(Range1).row   Cells(Row1, Col1).Select   Set myRng = Range(Range1).Find(what:=Key1, _     After:=ActiveCell, LookIn:=xlValues, _     LookAt:=xlPart, SearchOrder:=xlByRows, _     SearchDirection:=xlNext, MatchCase:=False)   If myRng Is Nothing Then     Kensaku3 = 0   Else     Kensaku3 = myRng.row   End If   Set myRng = Nothing End Function

  • エクセルで、batを実行するには?

    エクセルのvbaで、batファイルを実行したいのですが、opentextでは、実行されません。内容としては、FDの中にあるexlファイルをcドライブの指定フォルダにコピーするだけです。

  • エクセルVBAのオートフィルタについて

    いつもお世話になります。 エクセル2007でVBAでオートフィルタを操作したいのですが、 一部うまくいきません。 以下の様なコードを書いて 日付で絞り込みたいのですが、 何も抽出されません。 リストを見てみると、変数はちゃんと入っており OK ボタンを押すとその日付で抽出されます。 何故VBAでの操作では抽出されないのでしょうか。 ご存じの方がおられましたら、よろしくお願いします。 Sub test() Dim mydate As Variant Dim rng3 As Range Dim fmt As Variant Dim objList3 As ListObject Dim wb1 As Workbook Dim wb2 As Workbook Dim wb4 As Workbook Dim sh1 As Worksheet Dim sh2 As Worksheet Dim sh3 As Worksheet Dim sh4 As Worksheet Dim sh7 As Worksheet '----------------------------------------------------------------------- Set wb1 = Workbooks("301.xlsm") Set wb2 = Workbooks("1.xls") Set wb4 = Workbooks("2.xls") Set sh1 = wb1.Worksheets("@") Set sh2 = wb1.Worksheets("@@") Set sh3 = wb2.Worksheets("@@@") Set sh4 = wb2.Worksheets("@@@@") Set sh7 = wb4.Worksheets("@@@@@") '---------------------------------------------------------- sh2.Range("A1:z63").ClearContents With sh7 Set objList3 = .ListObjects("リスト1") fmt = .Range("A2").NumberFormatLocal mydate = Format(mydate, fmt) objList3.Range.AutoFilter Field:=7, Criteria1:=mydate objList3.Range.AutoFilter Field:=5, Criteria1:="test" Set rng3 = objList3.Range.SpecialCells(xlCellTypeVisible) rng3.Copy sh2.Range("A2") objList3.Range.AutoFilter Field:=5 objList3.Range.AutoFilter Field:=5, Criteria1:=">=190" Set rng3 = objList3.Range.SpecialCells(xlCellTypeVisible) rng3.Copy sh2.Range("A20") objList3.Range.AutoFilter Field:=5 objList3.Range.AutoFilter Field:=7 End With Application.CutCopyMode = False Set rng3 = Nothing Set fmt = Nothing Set objList3 = Nothing Set wb1 = Nothing Set wb2 = Nothing Set wb4 = Nothing Set sh1 = Nothing Set sh2 = Nothing Set sh3 = Nothing Set sh4 = Nothing Set sh7 = Nothing End Sub (一部省略しています)

  • VBAで既存のパワポのファイルを開くには?

    アクセスやエクセルからVBAで既存のパワポのファイルを開くには? 参照設定をして、 Sub test() Dim App As PowerPoint.Application Dim MyFileName As String Set App = CreateObject("PowerPoint.Application") MyFileName = CurrentProject.Path & "サンプル.ppt" App.Visible = True Set App = Nothing End Sub を実行すると、パワポの空のアプリケーション開きますが肝心のファイルが開きません。 開く方法を教えてください。

専門家に質問してみよう