バッチファイルを呼び出してセットする方法を用いてきたのですが、各マシンにより既に使用されている環境変数の領域がまちまちなため(?)、うまくいったり行かなかったりします。

VBで環境変数をセットする方法はないでしょうか?
どなたか教えて下さい。よろしくお願いします。

A 回答 (2件)

SHELL=C:\WINDOWS\COMMAN.COM /E:512


CONFIG.SYSに上記のような設定をしてださい。
これで領域不足はなくなるはずです。
環境変数の設定はAUTOEXEC.BATで設定して下さい。
/E:512という所が環境変数の割当てサイズになります。
    • good
    • 0
この回答へのお礼

おかげさまで、環境変数の領域不足のメッセージは回避できるようになりました。
ありがとうございます。

「パラメータが多すぎます。」というメッセージは、バッチファイルの書き方で回避できました。バッチファイルは、NT系と98系では多少書き方が異なるようで、どっちかでうまくいってももう片方ではうまくいかなかったりするので、苦労しました。

winapi関連で、環境変数を設定する方法を調べてみましたが、取得はできるけど、設定はなかなかうまくいきません(SetEnvironmentVariable関数)。バッチファイルを実行するのではなくVBから直接起動できればきれいなのですが、無理なのかなぁ…と思っています。

お礼日時:2001/04/24 17:46

うーん、何をしたいのかがいまいちよくわからないんですが。


自作のプログラムを起動するんですか?
そのプログラム中で環境変数を使っています?

この回答への補足

とある製品の部品を使用しているのですが、その仕様でいくつかの情報を環境変数であらかじめ設定してから実行して下さい…という手順となっています。

そのため、現在は、
(1)必要な環境変数の設定とプログラムをキックするバッチファイルを書き出す。
(2)書き出したバッチファイルを実行する。
手順になっています。

しかし、その際に環境変数の設定時に
「環境変数の領域が足らない」
「パラメータが多すぎます」
のエラーで弾かれてしまうことがあります(端末の環境によって)。

なので、環境変数の設定からプログラムの実行までをVBでできれば回避が可能なのかな?と考えました。

言葉足らずの面、申し訳ありませんでした。
よろしくお願いします。

補足日時:2001/04/24 14:18
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人はこんなQ&Aも見ています

このQ&Aを見た人が検索しているワード

このQ&Aと関連する良く見られている質問

QEXCELファイルのカレントフォルダを取得するには?

EXCELファイルのカレントフォルダを取得するには?

C:\経理\予算.xls

D:\2005年度\予算.xls

EXCEL97ファイルがあります。

VBAで
  カレントフォルダ名
(C:\経理\,D:\2005年度\)
を取得する事は可能でしょうか?

CURDIRでは上手い方法が見つかりませんでした。

Aベストアンサー

こんばんは。
Excel97 でも、同じですね。以下で試してみてください。

Sub test()
'このブックのパス
a = ThisWorkbook.Path
'アクティブブックのパス
b = ActiveWorkbook.Path
'Excelで設定されたデフォルトパス
c = Application.DefaultFilePath
'カレントディレクトリ
d = CurDir
MsgBox "このブックのパス   : " & a & Chr(13) & _
   "アクティブブックのパス: " & b & Chr(13) & _
   "デフォルトパス    : " & c & Chr(13) & _
   "カレントディレクトリ : " & d & Chr(13)
End Sub

Q別のシートから値を取得するとき

Worksheets("シート名").Activate
上記のを行ってから別シートの値を取得するのですが、
この処理を行うと指定したシートへ強制的にとんでしまいます。。。

※イメージ
For ~ To ~
  Worksheets("シートA").Activate
  シートAの値取得
       :
  Worksheets("シートB").Activate
  シートBの値取得
Next

このイメージ処理を行うとものすごい勢いで画面がチカチカします。。。
シートを変えずに他のシートから値を取得する方法はないのでしょうか。
教えてください!

Aベストアンサー

Worksheets("シートA").Range("A1")

みたいな感じでできませんか?

QVBアプリケーションで終了コードを指定する方法

VB6でアプリケーションを作成しますが、
親プロセスに終了コードを返して、Errorの有無を
認識させたいと思います。
VB6で可能でしょうか??
可能なら、どのような方法があるでしょう??
よろしくお願い申します。

Aベストアンサー

VB6の機能だけでは無理なように思います

WinAPIのExitProcessを使えば出来そうです
この場合 Sub Main経由でやったほうがいいかもしれません

たとえば 標準モジュールに
Public Declare Sub ExitProcess Lib "kernel32" (ByVal uExitCode As Long)

Public bFlag As Boolean

Sub Main()
  Form1.Show vbModal
  If bFlag Then
    ExitProcess 1
  End If
  ExitProcess 2
End Sub
といった具合のコードが記述してあれば bFlagがTrueならば 1を返し
それ以外なら 2を返すといったことが可能です

バッチファイルから呼び出すならば
Text.exe
if errorlevel == 3 goto L3
if errorlevel == 2 goto L2
echo "1"
goto exit
:L2
echo "2"
goto exit
:L3
echo "3"
:exit
といったバッチで判定できるでしょう

VB6の機能だけでは無理なように思います

WinAPIのExitProcessを使えば出来そうです
この場合 Sub Main経由でやったほうがいいかもしれません

たとえば 標準モジュールに
Public Declare Sub ExitProcess Lib "kernel32" (ByVal uExitCode As Long)

Public bFlag As Boolean

Sub Main()
  Form1.Show vbModal
  If bFlag Then
    ExitProcess 1
  End If
  ExitProcess 2
End Sub
といった具合のコードが記述してあれば bFlagがTrueならば 1を返し
それ以外なら 2を返すといっ...続きを読む

QVBAで外部プログラムを非表示で実行するには

VBAとVBScriptを混同しているのかもしれませんがよく分からないので教えてください。

Excel2010のVBAから、外部プログラム(test.exe)をコマンドプロンプトを非表示の状態で実行して、外部プログラムの実行が終了するのを待ってから、次の処理をさせたいのですが、test1のプログラムでは(A)の部分でエラーになってしまいます。また、test2のプログラムでは正しく実行されるのですがコマンドプロンプトのウインドウを非表示にする方法がよく分かりません。

test1のプログラムでエラーをでなくする方法、または、test2のプログラムでコマンドプロンプトのウインドウを非表示にする方法がありましたら教えてください。

-------------------------------------------------------
Sub test1()
 Dim ws As Object
 Dim we As Object
 Dim command As String
 command = "C:\test.exe"
 Set ws = CreateObject("WScript.Shell")
 Set we = ws.Run("%ComSpec% /c " & command, 0, False) '<===(A)
 Set we = Nothing
 Set ws = Nothing
End Sub
-------------------------------------------------------
Sub test2()
 Dim ws As Object
 Dim we As Object
 Dim command As String
 command = "C:\test.exe"
 Set ws = CreateObject("WScript.Shell")
 Set we = ws.exec("%ComSpec% /c " & command)
 Do Until we.Status
  DoEvents
 Loop
 Set we = Nothing
 Set ws = Nothing
End Sub
-------------------------------------------------------

VBAとVBScriptを混同しているのかもしれませんがよく分からないので教えてください。

Excel2010のVBAから、外部プログラム(test.exe)をコマンドプロンプトを非表示の状態で実行して、外部プログラムの実行が終了するのを待ってから、次の処理をさせたいのですが、test1のプログラムでは(A)の部分でエラーになってしまいます。また、test2のプログラムでは正しく実行されるのですがコマンドプロンプトのウインドウを非表示にする方法がよく分かりません。

test1のプログラムでエラーをでなくする方法、または、te...続きを読む

Aベストアンサー

Runメソッドを何処で調べましたか?
詳しくはこちらを見てください。
http://msdn.microsoft.com/ja-jp/library/cc364421.aspx

先ず、Aで失敗する理由ですが、Runメソッドの戻り値は何型ですか?
説明を見れば分かると思いますが、整数です。オブジェクトでは
ありません。従って、戻り値の型が違うし、Set文を使うのもオカシイ

次に、プログラムの終了を待つなら、Runメソッドの第3引数は
省略するか、Trueを指定すべきです。

test2のExecメソッドはオブジェクトを返しますが、この中には
標準入出力やエラー出力用の出し入れ口があり、人に代わって
データを送り込んだり、出力結果を見て、処理を変更するなどを
行う場合に使いますので、今回の仕様では使いません。
尚、DoEventsでグルグル回る処理は絶対にすべきではありません。
必ずSleepを入れるべきだし、DoEventsの使用そのものを避ける
べきだからです。この文がどのような効果をもたらすかを理解しており、
それを制御できるだけの技術があれば別ですが・・・

Runメソッドを何処で調べましたか?
詳しくはこちらを見てください。
http://msdn.microsoft.com/ja-jp/library/cc364421.aspx

先ず、Aで失敗する理由ですが、Runメソッドの戻り値は何型ですか?
説明を見れば分かると思いますが、整数です。オブジェクトでは
ありません。従って、戻り値の型が違うし、Set文を使うのもオカシイ

次に、プログラムの終了を待つなら、Runメソッドの第3引数は
省略するか、Trueを指定すべきです。

test2のExecメソッドはオブジェクトを返しますが、この中には
標準入出力やエラー...続きを読む

QRange("A1")⇔cells(1,1)の変換。

EXCELのマクロについて質問します。
Range("A1")⇒(1,1)
cells(1,1)⇒("A1")
に一発変換する方法を教えて下さい。
時間があるかた宜しくお願いします。

Aベストアンサー

こんなのでよろしいでしょうか?
range("A1") → Range("A1").Row & "," & Range("A1").Column
cells(1,1) → Cells(1, 1).Address(False, False)
()や""は付けていません

QVBAでドラッグ・アンド・ドロップ

エクスプローラからファイルを選択して、ワードもしくはエクセルにD&Dしファイル名を取得したいと思います。

VBだとOleDragDropでいけるようですが、VBAにはこのイベントがありません。

ということは、無理ってことなのでしょう赤?

Aベストアンサー

こんにちは。

Excelしかやったことがありませんが、エクスプローラを開いて、ドラッグ&ドロップすれば、ふつう、そのままでいけるはずですが?

それにチェック機能をつけるのでしたら、Office では、ユーザーフォームの[ツール]メニューの、[その他のコントロール]で、Microsoft Listview Control (SP4) があるかと思います。そのListview Control に 以下のように、OleDragDrop イベントをつければよいと思います。

以下のコードでは、Explorer は、自分で閉じてください。

Excelの場合。
サンプルコード

'<UserFormモジュール以外>
Sub uformShow()
Dim myPath As String, myID As Double
myPath = ThisWorkbook.Path
myID = Shell("Explorer.exe /e, /root," & myPath, vbNormalFocus)
If myID = 0 Then Exit Sub
UserForm1.Show 0
End Sub

'<ユーザーフォームモジュール>
Private Sub ListView1_OLEDragDrop(Data As MSComctlLib.DataObject, _
                 Effect As Long, Button As Integer, _
                 Shift As Integer, x As Single, y As Single)

Dim i As Long
With Me
  AppActivate Me.Caption
  .ListView1.ListItems.Clear
  If Data.Files.Count < 1 Then Exit Sub
  For i = 1 To Data.Files.Count
   If InStrRev(Data.Files(i), "xls") > 0 Then
    Workbooks.Open (Data.Files(i))
   Else
    MsgBox "Excelの標準ファイルではありません。", vbCritical
   End If
  Next i
End With
End Sub

Private Sub UserForm_Activate()
  With Me.ListView1
    .OLEDragMode = 1
    .OLEDropMode = 1
    .View = 2
  End With
End Sub

こんにちは。

Excelしかやったことがありませんが、エクスプローラを開いて、ドラッグ&ドロップすれば、ふつう、そのままでいけるはずですが?

それにチェック機能をつけるのでしたら、Office では、ユーザーフォームの[ツール]メニューの、[その他のコントロール]で、Microsoft Listview Control (SP4) があるかと思います。そのListview Control に 以下のように、OleDragDrop イベントをつければよいと思います。

以下のコードでは、Explorer は、自分で閉じてください。

Excelの場合。
サンプル...続きを読む

QFunctionの戻り値を配列にしたいのですが

vbを始めたばかりですがよろしくお願いします。

Functionの戻り値を配列にしたいのですが

Function fnc(ByVal a As Byte, ByVal b As Byte) As Integer()
fnc(0) = a + b
fnc(1) = a - b
End Function
というような使い方はできないのでしょうか?
一つのFunctionで二つの計算結果をかえすには
どうしたらよいのでしょうか?
お願いします。

Aベストアンサー

ローカル変数を使えば可能だと思いますよ

VB6.0の場合
Function fnc( byVal a as Byte, Byval b as Byte) as Integer
  dim ar(1) as Integer
  ar(0) = a + b
  ar(1) = a - b
  fnc = ar
End Function

VB.NETなら
Function fnc( byVal a as Byte, Byval b as Byte) as Integer
  dim ar(1) as Integer
  ar(0) = a + b
  ar(1) = a - b
  return ar
End Function

VB.NETでも fnc = ar と言った記述も出来ます

呼び出し側では 動的配列として返り値を受けます
dim results() as Integer
results = fnc( 5, 3 )
と言った具合です

Q【Excel VBA】マクロでExcel自体を終了させたい

環境:WindowsXP、Excel2003

マクロでエクセルを終了(ブックを閉じて、アプリケーション自体も終了)させたいのですが、以下のコードではアプリケーションが閉じてくれません。

ThisWorkbook.Close
ExcObj.Quit
Application.Quit

どこか悪いところはありますでしょうか?

よろしくお願いします。

Aベストアンサー

普通に考えれば質問者のコードで上手くいきそうですが
hana-hana3さんの回答にもあるようにThisWorkBook.Closeでコード終了となりますので
Application.QuitをThisWorkBook.Closeの前にもってこないといけません。
Application.Quitはそれがあるプロシージャのコードが全て終わるまで
その実行を保留するちょと特別動作をします。

'-------------------------------------
 Application.Quit
 ThisWorkbook.Close
'-------------------------------------
 
 

QVBAでCSVファイルが使用中かどうかの確認

お世話になっております。

Excel VBA についてご質問します。
今、VBAでCSVファイルを作成してデータ管理を行うソフトを作成しております。
このソフトは、共有をかけて複数の人で使用するため同じCSVファイルに同時にアクセスする可能性があります。そのため、CSVファイルに混同したデータが書き込まれてしまう恐れがあります。
そこで、CSVファイルがオープン中または、アクセス中が認識できる命令等はないでしょうか?

よろしくお願いします。

Aベストアンサー

こんにちは。

CSV ファイルですか....難しいですよ。

Excel で CSV を開く場合、ファイルはロックされるため、下記のような
ロジックで使用中かどうかを調べることは可能です。

' // ファイルが使用中か調べる
Public Function FileInUse(ByVal sFilename As String) As Boolean

  Dim n As Integer
  n = FreeFile()
  On Error Resume Next
  Open sFilename For Binary Lock Read Write As #n
  FileInUse = CBool(Err.Number > 0)
  Close #n
  On Error GoTo 0

End Function

ただし、これは CSV を編集するアプリが、ファイルを開くときに、
ファイルをロックする、、これが条件です。ロックされないファイル
について、使用中かどうかを判定する術はありません。

CSV は Excel で編集すると限定できる場合は、このロジックで十分です。

しかし、CSV の実態は単純なテキストですから、メモ帳などでも編集
できますよね?
メモ帳(他多くのエディタ)では、ファイルがロックがされませんから、
このケースでは検知できません。

心配ならデータベース(例えば mdb とか)を使った方がよろしいのでは?

こんにちは。

CSV ファイルですか....難しいですよ。

Excel で CSV を開く場合、ファイルはロックされるため、下記のような
ロジックで使用中かどうかを調べることは可能です。

' // ファイルが使用中か調べる
Public Function FileInUse(ByVal sFilename As String) As Boolean

  Dim n As Integer
  n = FreeFile()
  On Error Resume Next
  Open sFilename For Binary Lock Read Write As #n
  FileInUse = CBool(Err.Number > 0)
  Close #n
  On Error GoTo 0

End Fun...続きを読む

Qバッチ処理でファイルの中身を変数に入れるやり方

あるファイルの中には1行の文字列があります。
このファイルをバッチで読み取り、変数に設定したいです。

例:
test.txt
abcacbacbacbacbacbacbacbacb

test,bat
set DATA=[test.txtを読み込んだ値]

よろしくお願い致します。

Aベストアンサー

これですね。

参考URL:http://www.upken.jp/kb/dqvgHNRUxwFDkmtoqEwfXHUjDrevNv.html


このQ&Aを見た人がよく見るQ&A

人気Q&Aランキング

おすすめ情報