
VBでフォルダを作成する、基本的なロジックを作成しています。
現在、仮にD:\にはフォルダが存在しないとして、
MkDir "D:\Test\Temp\"
とするとエラーになってしまいます。
MkDir "D:\Test\"
とするとフォルダが作成されるのですが、
その後に、
MkDir "D:\Test\Temp\"
とすると、やはりエラーになってしまいます。
どのようにすれば、1つの処理の中で、複数階層のフォルダが作成できるのでしょうか?
ちなみにVB6.0 SP5で、実際にはMkDir関数の引数は文字列変数です。
よろしくお願いします。
No.7ベストアンサー
- 回答日時:
うーん。
下の方法で出来ない事はないと思うのですが。コードがあっていると仮定した場合、もしかしてフロッピーなどのアクセスが非常に遅いメディアに対して行っているという事はないですか?
その場合、少しウェイトをおいてあげないと間に合わない可能性はあります。フォルダ作成は実際はWindowsがやっていますが、ファイル操作関連は遅延書き込みを行っている為、コード上では終了していても、実際にはまだフォルダが出来ていないという事も考えられます。
Public Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long)
を宣言して
MkDir "D:\Test\"
Call sleep(500) '0.5秒まつ。待ってる時間に別に根拠はないので適当なものにかえてください。
MkDir "D:\Test\Temp\"
とかやってみてはどうでしょう?
あとは
Private Sub mMakeDir()
On Error Goto ErrChk
MkDir "D:\Temp\Test\"
Exit Sub
ErrChk:
Debug.Print Err.Description
End Sub
などのコードを書いて、なぜエラーになっているかをチェックしてはどうでしょう?(Err.Description はエラーオブジェクトの直前におきたエラーの内容を表示します)
案外思っていない事でエラーになっているかもしれません。
それでも駄目なら、MkDirなどのOSよりのファイル操作コマンドは使わずに、FileSystemObjectを使ってみてはどうでしょう?
Dim aoFso As Object ' File System Object
On Error GoTo ErrChk
Set aoFso = CreateObject("Scripting.FileSystemObject")
Call aoFso.CreateFolder("D:\Temp\")
Call aoFso.CreateFolder("D:\Temp\Test\")
ErrChk:
Set aoFso = Nothing
End Sub
※エラーチェックをいれているのは、フォルダ作成に失敗しても、オブジェクトを確実に解放する為。
DirやMkDirなどのOSよりのファイル操作コマンドは、コードが正しくても時々理不尽な失敗をするので、そのせいかもしれません。
みなさん、ご回答ありがとうございました。
とくにサンプルソースなどは大変参考になります。
質問内容についてはいまだになぞのままなんですが・・・
No.6
- 回答日時:
>MkDirは、1階層下のフォルダを作成するので
そうでもないのでは。
MkDir "D:\Test\Temp\"はTestフォルダがない段階でエラーになるのでは?。
ーーーー
中間ディレクトリを作成することが出来ます。
batというディレクトリ配下にcommandというディレクトリがあり(こここに注意)、その配下にmdというディレクトリがあるディレクトリ構造を作成するには
mkdir \bat\command\md
というように書きます。
http://www.confrage.com/dos/command/md/md.html
ーーーーーー
>MkDir "D:\Test\"
>MkDir "D:\Test\Temp\"は¥不要では?
No.5
- 回答日時:
当方の環境ではできますので、単純なエラーかも。
セミコロンだったり、\マークが抜けていたり、前後のmkdirで親ディレクトリがなかったり。フルパスでの指定ですよね?
No.4
- 回答日時:
ちなみに自分はこんな感じで作っているのでが、
どうでしょうか?
Dim vPath As String 'パス
Dim strFile As String '検索等で使用
Dim strdir As String 'ディレクトリ作成で使用
Dim strmkdir() As String 'ディレクトリ作成
Dim lngI As Long 'ループカウンタ
vPath=D:\Test\Temp
'★ディレクトリの作成処理
strmkdir = Split(vPath, "\") '\ごとに区切る
For lngI = LBound(strmkdir) To UBound(strmkdir)
If lngI <> 0 Then
strdir = strdir & "\" & strmkdir(lngI)
Else
strdir = strdir & strmkdir(lngI)
End If
'指定されたフォルダがない場合は作成する
strFile = Dir(strdir, vbDirectory)
If Len(Trim(strFile)) = 0 Then
MkDir strdir
End If
Next lngI
No.3
- 回答日時:
ディレクトリを複数階層新規に作成する場合は
順番に作成していけばできます。
飛び越しで2階層以上を一度に作成しようとするとエラーになります。
なので後者の方法でできるはずですが、何か勘違いはありませんか?
なお、引数は文字列変数とのことなので、
ループ内での"\"の判定が必要になります。
後日でしたら私の方でもコードを確認することはできるのですが・・・
No.2
- 回答日時:
MkDirは、1階層下のフォルダを作成するので
MkDir "D:\Test"
MkDir "D:\Test\Temp"
で「D:\Test\Temp」のフォルダは作成できますよ。
ただし、既に「D:\Test\Temp」が存在している場合は
同じフォルダを作成しようとしてエラーとなります。
作成前に、以下の判定式を使ってみたらどうでしょう。
Dim strDirName As String
strDirName = Dir("D:\Test\Temp", vbDirectory)
If strDirName <> "" Then
MsgBox "既にフォルダが存在しています。"
Else
MkDir "D:\Test"
MkDir "D:\Test\Temp"
End If
回答ありがとうございます。
>MkDirは、1階層下のフォルダを作成するので
そのようですね。
で、2回に分けて作成しているのですが、やはりエラーになってしまいます。
ちなみに、このPGでは作成するフォルダは必ず存在しない前提で実行されます。
(存在する場合は実行されません)
No.1
- 回答日時:
MkDir "D:\Test"
のエラーチェックをして、なかったら
MkDir "D:\Test\Temp"
最後の\マークをはずして試してみてください。
参考URL:http://www.microsoft.com/japan/msdn/library/defa …
回答ありがとうございます。
説明が不足して申し訳ありません。
MkDir "D:\Test\Temp"
でも同じエラーです。
エラー内容は"パスが見つかりません"です。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Excel(エクセル) 2つのマクロを連続して動かしたい 3 2022/09/20 23:46
- Visual Basic(VBA) セルの値からファイルを複数作りたい2 3 2022/10/07 15:54
- Windows 10 外部ドライブにマウントできない問題について 9 2022/03/22 18:08
- Excel(エクセル) 複数のブックをひとつのブック(複数のシートにまとめる)場合にシートとの順番について 5 2022/12/28 20:47
- Visual Basic(VBA) Excel VBA 同じ名前のフォルダがあれば作成したブックを格納するマクロをつくりたい 2 2023/01/16 16:19
- Excel(エクセル) フォルダ内のエクセルファイルを開かずにデータ採取する関数式 2 2022/12/22 22:15
- その他(プログラミング・Web制作) フォルダを一括で作成する方法 0 2022/07/27 19:19
- Visual Basic(VBA) VBA GetAttrについて教えてください 2 2022/12/22 15:25
- フリーソフト フォルダ、ファイル名の一括変換について 3 2023/03/16 09:23
- C言語・C++・C# c言語 配列とポインタについて 3 2023/02/09 22:53
このQ&Aを見た人はこんなQ&Aも見ています
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
Subversionのリポジトリの削除
-
MkDir関数
-
CFileDialogの最初のディレクト...
-
apacheの設定?
-
Smarty includeでテンプレート...
-
ロケットBBSについて
-
DLL のロードの順序
-
FTPコマンドでディレクトリごと...
-
ホームページ編集が出来なくて...
-
visualstudioでc#のdllができない
-
FTPでのファイルとディレクトリ...
-
Apatcheのhttpd.confについて
-
fopenでファイルが開かない場合...
-
ディレクトリ内の最新ファイル...
-
図に示す階層構造で,現在のデ...
-
絶対パス?絶対アドレス?意味...
-
上位ディレクトリ名(フォルダ...
-
glob関数で日本語文字が取得で...
-
unlink「許可がありません」と...
-
exec()で他ディレクトリのexeプ...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
FTPコマンドでディレクトリごと...
-
Subversionのリポジトリの削除
-
CFileDialogの最初のディレクト...
-
バッチを用いたフォルダの自動移動
-
visualstudioでc#のdllができない
-
rmdirでフォルダが消せません
-
現在位置より2つ上のディレク...
-
makefile でファイルをコピーす...
-
JAVA内で複数のファイルを削除...
-
http://localhost/に.htaccess...
-
絶対パス?絶対アドレス?意味...
-
VB2008でFTPでのディ...
-
powershell で書いたプログラム...
-
ファイル・ディレクトリ削除を...
-
Subversionで、ファイルをリネ...
-
FTPでのファイルとディレクトリ...
-
Visual C++ 2005 Express Editi...
-
VB.NET 最下位のディレクトリ名...
-
ファイル選択ダイアログで選択...
-
DLL のロードの順序
おすすめ情報