VB.NETですが、
趣味でアプリケーションを作成しています。
下記のコードで処理を実行させています。

Call Shell("C:\aaa.exe c:\test.txt c:\test2.txt", AppWinStyle.Hide)

(A)

Dim sr As New System.IO.StreamReader("c:\test2.txt", System.Text.Encoding.Default)
Dim sb As New System.Text.StringBuilder(CInt(Microsoft.VisualBasic.FileSystem.FileLen("c:\test2.txt") * 1.1))

'ファイルの最後までループ
Do Until sr.Peek = -1
sb.Append(sr.ReadLine & vbCrLf)
Loop
sr.Close()


"aaa"はtest.txtを加工してtest2.txtとして出力するプログラムです。
その後、test2を最後まで読み出しているのですが、
どうもプログラムaaaが処理を終了する前に
次の読み出し処理に移ってしまっているようなのです。
そこで、素人なりに上記(A)の部分に

For i = 0 To 2000000000
Next
For i = 0 To 2000000000
Next

とForループを加えて時間稼ぎしているのですが、
状況によって時間稼ぎがうまくいかない場合があります。どのように問題を回避すべきでしょうか?
aaaはDLLでも組み込み可能になっているプログラム
なのですがDLLで実行させると何らかのメリット
があるのでしょうか?
その点を教えていただけると助かります。
回答よろしくお願いいたします。

このQ&Aに関連する最新のQ&A

A 回答 (4件)

Dim hProc As System.Diagnostics.Process



'プロセス作成
hProc = System.Diagnostics.Process.Start("C:\aaa.exe c:\test.txt c:\test2.txt")
'プロセス終了待機
hProc.WaitForExit()
hProc.Close()
hProc.Dispose()

Dim sr As New System.IO.StreamReader("c:\test2.txt", System.Text.Encoding.Default)
Dim sb As New System.Text.StringBuilder(CInt(Microsoft.VisualBasic.FileSystem.FileLen("c:\test2.txt") * 1.1))

'ファイルの最後までループ
Do Until sr.Peek = -1
sb.Append(sr.ReadLine & vbCrLf)
Loop
sr.Close()

これでどうでしょうか。
    • good
    • 0
この回答へのお礼

回答ありがとうございます。
お返事遅れました。
プロセスの終了まで待機すればよいわけですね。
プログラムの動作確認ができました。
ありがとうございます。

お礼日時:2005/04/24 11:00

shell関数の第3引数が省略されていると、終了を待ちません


trueを指定すると終了を待つようになります。
呼び出したプログラムがハングアップする可能性がある場合には、第4引数でタイムアウト時間をミリ秒で指定することができます。(integerの範囲で)
    • good
    • 0
この回答へのお礼

回答ありがとうございます。
お返事遅れました。
第3引数があるとは思いませんでした。
動作確認したところうまくいきました。
ありがとうございます。

お礼日時:2005/04/24 11:05
    • good
    • 0
この回答へのお礼

回答ありがとうございます。
お返事遅れました。
#1さんの方法と同じ方法ですね。
プロセスの終了まで待機すればよいわけですね。
ありがとうございます。

お礼日時:2005/04/24 11:03

VBはVer6までしか触ってないので、.NETでどうなるかは自信がありませんけど。



同期/非同期の問題ですね。
shellは、確かに結果を待たずに次行を実行します。

そのため、結果を待つ処理が必要になります。

このカテゴリで「同期」で検索してみてください。
下記、過去問の#2さんの回答が適用できそうに思います。

参考URL:http://oshiete1.goo.ne.jp/kotaeru.php3?q=325703
    • good
    • 0
この回答へのお礼

回答ありがとうございます。
お返事遅れました。
VB6の方法のように思いますが、、、、。
よくわかりませんでしたので、
動作確認してません。
でもありがとうございました。

お礼日時:2005/04/24 11:02

このQ&Aに関連する人気のQ&A

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

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

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

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

QVBAで、アクティブなBOOKのファイル名を取得し

エクセルのVBAを使用して、選択されている、BOOKのファイル名を取得し、下記のように編集してA1セルに入れたいのですが、可能でしょうか?


BOOKのファイル名が「大阪_たこ焼き_1234.xls」の場合

大阪_と.xlsをは省いて、「たこ焼き_1234」がA1セルに入るようにしたい。

Aベストアンサー

拡張子なんでもござれ!
Sub TheBody()
Const xSeparator = "_"
Const xPeriod = "."
Dim KitCut As Variant
KitCut = Split(ActiveWorkbook.Name, xPeriod)
KitCut = Split(KitCut(0), xSeparator)
Range("A1").Value = KitCut(1) & xSeparator & KitCut(2)
Columns("A").AutoFit
End Sub

Q「System.Text.RegularExpressions」がない・・・?

お世話になっております。
VB2005 Express Editionユーザーです。

先日こちらの掲示板に質問させていただき、正規表現を使用しての操作方法を教えていただきました。

そのままのコードをとりあえず貼り付けさせていただいてどのような動作をするのか検証したかったのですが、
「System.Text.RegularExpressions」が必要とのことでを参照しようとしましたが当方の環境ではライブラリが見当たりません。

「Imports System.Text.RegularExpressions」とコード先頭に記述すれば、それで参照しているということになるのでしょうか?

先頭に「Imports System.Text.RegularExpressions」と記述すれば、こちらでご提示いただいたコードは何事もなくコンパイルされるのですが、反応している気配がないのです。

当方の環境内で「System.Text.RegularExpressions」を探しましたがありませんでした。

Express Editionということでライブラリが入っていないなんてことはないですよね?
Framework2.0をインストールしなおし、「System.Text.RegularExpressions」を探しましたがありませんでした。

どこかからダウンロードできるのでしょうか?

ご回答お待ちしています。
宜しくお願いいたします。

お世話になっております。
VB2005 Express Editionユーザーです。

先日こちらの掲示板に質問させていただき、正規表現を使用しての操作方法を教えていただきました。

そのままのコードをとりあえず貼り付けさせていただいてどのような動作をするのか検証したかったのですが、
「System.Text.RegularExpressions」が必要とのことでを参照しようとしましたが当方の環境ではライブラリが見当たりません。

「Imports System.Text.RegularExpressions」とコード先頭に記述すれば、それで参照しているという...続きを読む

Aベストアンサー

ライブラリはデフォルトで読み込まれていると思う。
例えばSystem.Text.RegularExpressions.Regexクラスは

http://msdn2.microsoft.com/en-us/library/system.text.regularexpressions.regex.aspx

Namespace: System.Text.RegularExpressions
>Assembly: System (in system.dll)

というようにSystem.dllというファイル内にある

#Importsはライブラリの読み込みじゃなくて,
XMLでいう名前空間接頭辞やデフォルト名前空間の設定だと思う

QExcelVBA:自己のBook名を取得したい

WindowsXP-Proです。
Excelヴァージョンは2003です。

ExcelVBAでコーディングしています。
で、自分自身(つまり、このVBAコードを記述しているExcel本体)のBook名を取得したいのですが、何か関数は用意されていますでしょうか?

自分自身のBook名を取得したい理由は、VBAコードを記述しているExcel本体のファイル名(Book名)の名前が変更されても、VBAが正常に機能するように、今現在のBook名を取得したいのです。

複数のExcelファイルを、このVBAで操作しているため、
Workbooks("本体のBook名").Activate
を用いており、仮にファイル名(本体のBook名)の名前が変更されても、VBAが正常に機能できるように、"本体のBook名"部分を固定ではなく、可変で持てるようにしたいからです。

Aベストアンサー

Public Sub Auto_Open()
  MsgBox ActiveWorkbook.Name
  MsgBox ThisWorkbook.Name
End Sub

Private Sub Workbook_Open()
  MsgBox Me.Name
End Sub

いずれも、ブック名が表示されました。

QFor ~ Next の中での Dim宣言について

四角形を下方向にずらしながら繰り返し描きたい場合、
以下のソースのようにFor ~ Next の中での Dim宣言を
行うのは一般的でしょうか。

他にスマートな記述があれば教えてください。
よろしくお願いします。

---------------------------------------
'四角形を下方向にずらしながら描画
For i = 0 To 10
  Dim rect As New Rectangle(x, y* i , w, h)
  g.DrawRectangle(Pen.Black, rect)
Next

Aベストアンサー

RectangleのOffsetメソッドを使うという方向なら Rectangleオブジェクトの生成は1回でいいことになります

dim rect as new Rectangle( x, y, w, h )
for i = 0 to 10
  g.DrawRectangle( Pens.Black. rect )
  rect.Offset( 0, 1 )
next
といった具合です …

Q他のワークシート名の取得方法 (VBAを使用せずに)

VBAを用いずに、ワークシート関数のみでワークシート名を取得できないか探しています。

自分のシート名は、以下の出力結果の一部より取得することができました。
=CELL("filename")

しかし、他のシート名を取得する方法が思いもつきません。

VBAを用いずにシート名を取得することはできないのでしょうか?

Aベストアンサー

Excel2000でしたら、
1.[挿入]-[名前]-[定義] から、名前を2つ定義します。
  ・名前:PPP  参照範囲:=GET.WORKBOOK(1)
  ・名前:QQQ  参照範囲:=GET.DOCUMENT(88)
2.A1 に =SUBSTITUTE(INDEX(PPP,ROW()),"["&QQQ&"]","") と入力します。
3.A1 を下方にドラッグコピーすると、シート名が一覧で表示されます。

例えば3枚目のシート名のみを取得する場合は、任意のセルに
=SUBSTITUTE(INDEX(PPP,3),"["&QQQ&"]","") と入力します。

※マクロ関数というものですが、最近のバージョンにこれが付帯されているのかどうか
  わかりませんが。   ^_^;

Q調べてもわからないのでこの文の意味を教えてください。 Dim a as system.Reflect

調べてもわからないのでこの文の意味を教えてください。

Dim a as system.Reflection.Assembly=system.Reflection.Assembly.GetExcutingAssembly()

Dim b as string = system.IO.Path.GetDirrectoryName(a.Location)


VB.NETを使用しています。

Aベストアンサー

Dim a as system.Reflection.Assembly=system.Reflection.Assembly.GetExcutingAssembly()
自分自身 (実行プログラム) を参照

Dim b as string = system.IO.Path.GetDirrectoryName(a.Location)
実行プログラムがあるフォルダーのパスを取得

QEXCEL VBA で現在開いているブックのファイル名を取得する方法

EXCEL2003 VBAで業務を簡素化するために、現在開いているブックのファイル名を取得する方法が分かりません。
作業手順をマクロを使って処理していますが、オリジナルのワークブックをファイル名を変えて保存し、以後、このワークブックを読み込んで使用しています。
このときのVBAは、オリジナルのファイル名を使っているため、ファイル名を変更するとエラーになり、以後の業務に使用できません。
常にファイル名を取得出来るVBAをどなたか、教えて下さい。

Aベストアンサー

>現在開いているブックのファイル名
 ちょっと曖昧な表現かなぁという気もいたしますが、VBAが書いてあるブックのブック名は
ThisWorkbook.Name
で、現在 "アクティブにして" 操作対象になっているブックの名前は
ActiveWorkbook.Name
ですね。

 しかし、
>VBAは、オリジナルのファイル名を使っているため、ファイル名を変更するとエラーになり
というような文脈からすると、
ThisWorkbook.Name
の方ですかね。

QMicroSoft BasicのDim文とVisualBasicのDim文の違い

私が20年前にMicroSoft Basicを使っていたときは、DIM文はDIMENSIONの略で配列型変数の宣言に使っていました。

最近VisualBasicの勉強を始めたのですが、変数の宣言はすべてDim文になっており、昔のMS BasicのDim文と意味合いが変わっているのに驚いています。

ここで質問させてください。
・なぜ配列を意味するDimension文が変数の宣言なのか?
・どのバージョンのBasicからDim文の意味が変わったのか?

私が使用していたのはNEC N-Basic,N-88Basic,N-98Basicです。

Aベストアンサー

VISUAL BASIC のDimは ディメンジョンの略です。
私の経験ではVB2.0時代からありました。

配列0を考えた場合変数とおなじであるからだとおもいます

QVBAでアカウント名を取得する方法

VBAで処理したEXCELブックをデスクトップに自動保存しようとしています。VBAで現在作業中のユーザーアカウント名を自動で取得する方法を教えていただきたいのですが。

デスクトップ上にブックを保存するには、パスを記述すればよいのですが、現在PC毎にユーザーアカウントを設定しユーザー名が異なっています。
このため、PC毎にこのユーザー名をデスクトップへのパスに入れ込まなければなりません。毎回キーボードからこのユーザー名を入力する方法もありますが、自動的にユーザー名を取得し、正しいパスを指定する方法を検討しています。
どなたか、VBAでこのユーザー名を取得する方法が有れば教えていただきたいのですが。
よろしくお願いいたします。

Aベストアンサー

Environ関数で、環境変数[USERNAME]を取得する。

MsgBox Environ("USERNAME")

QSystem.IO.Directory.GetFilesの順番

For Each strFileName As String In Directory.GetFiles("フォルダ名","*.TXT")
'なにか処理
Next strFileName


としてファイル名を読み込んで処理する場合、ファイル名でソートされて順番に出てくるような気がします。
どのような基準でソートされるのかを調べているのですが、はっきり明記されているものが見つかりません。

安心して使うために裏付けがほしいのですが、どこかに詳細な資料はないでしょうか?
よろしくお願いします。

Aベストアンサー

内部的に FindFirstFile / FindNextFile を使っているようだけど
http://www.microsoft.com/japan/msdn/net/general/win32map.asp

取得する順番は..
http://forums.belution.com/ja/vc/000/038/23.shtml

なるほど!

正式情報は
http://msdn.microsoft.com/library/en-us/fileio/fs/findnextfile.asp

The order in which this function returns the file names is dependent on the file system type. With the NTFS file system and CDFS file systems, the names are returned in alphabetical order. With FAT file systems, the names are returned in the order the files were written to the disk, which may or may not be in alphabetical order.

内部的に FindFirstFile / FindNextFile を使っているようだけど
http://www.microsoft.com/japan/msdn/net/general/win32map.asp

取得する順番は..
http://forums.belution.com/ja/vc/000/038/23.shtml

なるほど!

正式情報は
http://msdn.microsoft.com/library/en-us/fileio/fs/findnextfile.asp

The order in which this function returns the file names is dependent on the file system type. With the NTFS file system and CDFS file systems, the names are returned in alphabetical or...続きを読む


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

人気Q&Aランキング

おすすめ情報