• ベストアンサー

Dirで取得したFile名をTblに書き出したいのですが・・・

何のカテゴリで質問すればいいのか・・・すみません お願いします。 >Access97のVBAを使用してNT4.0Server上にあるフォルダ内のFile名 を取得し存在チェックをかけられないか?と考えております。 Dosバッチみないな物を考えていましたが、どのような記述が適切 なのか迷っております。 ・変数内で処理する方法が適切か? ・TBLに書き出した方が適切か? >双方の記述方法をご教授お願い致します。 >また、どちらが適切なのかを教えて頂けたら幸いです。

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

  • ベストアンサー
  • Hk2001
  • ベストアンサー率48% (24/49)
回答No.4

忘れてましたけどさっきのサンプルは アクションクエリを使用しているため ファイル名に’があるとエラー起こします。 回避方法は、アクションクエリをやめて、テーブルをOpenしてレコードに AddNewしていってください。 ではでは

pooh_200x
質問者

お礼

ありがとうございます。 ちょうどVBからVBAに変更している最中でした。 察して頂いたAddItemの所で引っかかって・・・(泣) すぐ置き換えてみたいと思います。

pooh_200x
質問者

補足

できました! 今回は本当にありがとうございました。 VBAの知識が足りず、何度も補足のお手間を取らせすみません。 自分でもう少し解決できるようがんばります。 >では失礼します。

その他の回答 (3)

  • Hk2001
  • ベストアンサー率48% (24/49)
回答No.3

どうも、度々先回のサンプルはVBで作成してしまい アクセスでは、一部修正が必要になります。すみません。 ※※※※※※ 変更点 ※※※※※※ オブジェクトの参照部分 .Textなどは使えないから削除した コンボBOXは AddItem がないのでテーブルを使用し連結させた Tbl01 というテーブルを作成 FileNm というフィールド名でデータ型 テキスト サイズは 100~250くらい オブジェクト名は、アクセスで使用するときのデフォルト名じゃないから 変更の必要あり フォーム1 → Form1 など... ソースサンプル↓↓↓↓↓↓↓↓↓↓↓↓ Option Compare Database Private Sub Command1_Click() Dim sDirNm As String Dim sSqlStr As String sSqlStr = "DELETE FROM Tbl01" Call FlRunSQL(sSqlStr) '検索フォルダ If Right$(text1, 1) <> "\" Then sDirNm = text1 & "\" Else sDirNm = text1 End If Call FlFileChk(sDirNm) Combo1.Requery End Sub Private Sub Form_Load() Dim sSqlStr As String text1 = "" text1 = CurDir sSqlStr = "DELETE FROM Tbl01" Call FlRunSQL(sSqlStr) End Sub Private Function FlFileChk(ByVal sDirNm As String) Dim sFileNm As String 'ファイル名 Dim sTmpDir() As String 'フォルダ名配列 Dim lCnt As Long '配列カウント Dim sSqlStr As String ReDim sTmpDir(0) '配列初期化 '※※※※※※※※※ 'ファイル名追加 '※※※※※※※※※ sFileNm = Dir(sDirNm, vbDirectory) Do Until sFileNm = "" If sFileNm <> "." And sFileNm <> ".." Then 'ビット単位の比較を行い、フォルダかどうかを調べます。 If (GetAttr(sDirNm & sFileNm) And vbDirectory) = vbDirectory Then '配列追加 lCnt = UBound(sTmpDir) + 1 ReDim Preserve sTmpDir(lCnt) sTmpDir(lCnt) = sFileNm Else sSqlStr = "" sSqlStr = sSqlStr & "INSERT INTO Tbl01 VALUES ('" & sDirNm & sFileNm & "')" Call FlRunSQL(sSqlStr) End If End If sFileNm = Dir() Loop '※※※※※※※※※ 'サブフォルダ検索および再起 '※※※※※※※※※ For lCnt = 1 To UBound(sTmpDir) sFileNm = sTmpDir(lCnt) If sFileNm <> "." And sFileNm <> ".." Then 'ビット単位の比較を行い、フォルダかどうかを調べます。 If (GetAttr(sDirNm & sFileNm) And vbDirectory) = vbDirectory Then ' フォルダであれば、再起します。 Call FlFileChk(sDirNm & sFileNm & "\") End If End If Next End Function '======================================================================================== ' 関数名 FlRunSQL ' 処理内容 アクションクエリの実行 ' 引数 ' String vsSQL :SQL文 '======================================================================================== Public Function FlRunSQL(ByVal vsSQL As String) As Long Dim sFncNm As String '関数名 Dim lFncRtn As Long '戻り値 Dim sMsg As String 'メッセージ sFncNm = "[FlRunSQL():]" sMsg = "" On Error GoTo FncErr DoCmd.SetWarnings False 'メッセージ表示Off DoCmd.RunSQL vsSQL, True '実行 DoCmd.SetWarnings True 'メッセージ表示On '*********** '正常 '*********** GoTo FncEnd FncErr: '*********** '異常 '*********** If sMsg = "" Then sMsg = "(" & Err.Number & ")" & Err.Description FncEnd: '*********** '終了 '*********** End Function

  • Hk2001
  • ベストアンサー率48% (24/49)
回答No.2

返答遅れました。 ほんとは、自分で考えるのが一番なんですけど サンプルで取得できます。 フォームにテキスト、ボタン、コンボBOXを置いてください。 再起部分など、STEPで動きを確かめて理解したほうがいいかも 失敗すると永久ループになったりするから・・・ ソースサンプル↓↓↓↓↓↓↓↓↓↓↓↓ Private Sub Command1_Click() Dim sDirNm As String Combo1.Clear '検索フォルダ If Right$(Text1.Text, 1) <> "\" Then sDirNm = Text1.Text & "\" Else sDirNm = Text1.Text End If Call FlFileChk(sDirNm) End Sub Private Sub Form_Load() Text1.Text = "" Combo1.Clear Text1.Text = CurDir End Sub Private Function FlFileChk(ByVal sDirNm As String) Dim sFileNm As String 'ファイル名 Dim sTmpDir() As String 'フォルダ名配列 Dim lCnt As Long '配列カウント ReDim sTmpDir(0) '配列初期化 '※※※※※※※※※ 'ファイル名追加 '※※※※※※※※※ sFileNm = Dir(sDirNm, vbDirectory) Do Until sFileNm = "" If sFileNm <> "." And sFileNm <> ".." Then 'ビット単位の比較を行い、フォルダかどうかを調べます。 If (GetAttr(sDirNm & sFileNm) And vbDirectory) = vbDirectory Then '配列追加 lCnt = UBound(sTmpDir) + 1 ReDim Preserve sTmpDir(lCnt) sTmpDir(lCnt) = sFileNm Else 'ファイル名追加 Combo1.AddItem sDirNm & sFileNm End If End If sFileNm = Dir() Loop '※※※※※※※※※ 'サブフォルダ検索および再起 '※※※※※※※※※ For lCnt = 1 To UBound(sTmpDir) sFileNm = sTmpDir(lCnt) If sFileNm <> "." And sFileNm <> ".." Then 'ビット単位の比較を行い、フォルダかどうかを調べます。 If (GetAttr(sDirNm & sFileNm) And vbDirectory) = vbDirectory Then  ' フォルダであれば、再起します。 Call FlFileChk(sDirNm & sFileNm & "\") End If End If Next End Function

pooh_200x
質問者

お礼

こんばんわ! またまた遅くなりすみません >ほんとは、自分で考えるのが一番なんですけど >サンプルで取得できます。 確かにおっしゃるとおりです。反省・・・ まだDocmdとIf文を使えるようになったばかりで勉強不足です。 さっそく明日・・・今日でした。試してみます。 では

  • Hk2001
  • ベストアンサー率48% (24/49)
回答No.1

こんにちは えっと、質問の内容がいまいち理解できなかったので回答の仕方が わからないのですが・・・ Dirでファイル名を取得できた時点で存在チェックは、できているのでは? あと >フォルダ内のFile名を取得 とありますが、Do文でできます。 やり方はテーブルの場合も変数の場合も一緒で、DoとLoopの間(ネスト)部分 がテーブルに格納か変数に格納かの違いです。 あと、サブフォルダもチェックする場合は、再起(ある関数内で現在の関数をもう一度呼ぶ)など使用してチェックします。

pooh_200x
質問者

お礼

返事が遅くなり申し訳ございません! 早速の回答ありがとうございます。 >Dirでファイル名を取得できた時点で存在チェックは、できているのでは? >>おっしゃる通りです。(笑) 質問がわかりにくく申し訳ありません。 Dirで取得した際の記述方法を教えて頂けますでしょうか? >>お願い致します。

関連するQ&A

  • windowNTの環境変数について

    お世話になります。 WindowsNT4.0サーバーにてDOSバッチで処理日のフォルダを作成したいのですが、win2k以上ではdateが環境変数で当日の日付が設定されているのにwinNTではdateが登録されていないことは確認済みで、winNTではDOSBバッチ処理で日付を取得することは不可能なのでしょうか?date /tで日付を表示することは出来るのですが。 NTという古いOSで申し訳ありませんが、ご存知の方ご教示願います。 バッチ処理は毎日1回実行して、日々のフォルダを作成する感じにしたいです。 なお、環境はwindowsNTサーバー4.0SP6 以上、よろしくお願いします。

  • バッチファイルの親フォルダを取得するには

    WindowsのDOSコマンドを用いたバッチファイルで、バッチファイルと同じフォルダにある実行ファイルを起動したいのですが、どのようにするのがよいのでしょうか? 実行ファイルのファイル名は既知で固定なので、バッチファイルの親フォルダが取得できれば、連結して起動すればよいです。 しかし、バッチファイルの親フォルダの取得方法が分かりません。 カレントフォルダは%CD%で取得できるのですが、バッチファイルの親フォルダがカレントフォルダとは限りません。 バッチファイルのフルパスは%0で取得できるのですが、そこからフォルダ部のみを抽出する方法が分かりません。 よろしくお願いします。

  • DIRで取得パス名のループ

    お世話になります。 バッチファイルであるフォルダーのファイル一覧を別のフォルダに出力する作業を行っています。 下記のようにすると、ファイルがありませんとエラーになりますが、 取得するフォルダの「G%%k¥D0%%l」をたとえば、G2¥D01のようにすると、 うまくうごきます。 取得するフォルダには変数のようなものは使えないのでしょうか。 よろしくお願い致します。 for /L %%k in (2,1,7) do ( for /L %%l in (1,1,10) do ( dir folder1¥G%%k¥D0%%l¥*.txt /b > folder1¥G%%k¥D0%%l¥a.txt ) )

  • カレントディレクトリ配下のフォルダパス取得方法

    現在バッチを作成しているのですが、 バッチファイルのカレントの下にあるフォルダのパスを 変数に格納し使用する方法を探しています。 構成としましては バッチフォルダ(C:\batch)の中に test.bat  folder1 folder2 の3つが格納されている状態を想定しています。 このfolder1とfolder2のファイルパスの取得方法を探しています。 ファイル名は不定であり、直接名前を指定する事が出来ないため 変数に格納しバッチ処理で使用したいと考えています。 環境はWindowsXPです。 何か上手い方法がありましたらお教え下さい。 以上です。よろしくお願いします。

  • NT3.51とNT4.0のファイルコピーについて

    NT3.51のOS上で実行していたDOSバッチのファイルコピーの処理をNT4.0のOS上で実行すると 処理に時間が掛かってしまいました。 他PCの同じOSで試しても同じでした。 Fujitsu製の機種を使用しておりNT4.0側の方が性能は上でそれ以外通信速度等は同じです。 何が原因なのでしょうか? 使用しているDOSコマンド COPY C:\共有フォルダ\フォルダー\ファイル名 /B \\PC名\共有フォルダー\フォルダー /B /V > C:\共有フォルダ\ファイル名

  • バッチファイル

    コマンドプロンプトから実行するコマンド 2つを、100回繰り返したいのですが、 バッチファイルで100回繰り返すにはどうしたらよいでしょうか? 単純にForで出来ると思っていたのですが、 dosのバッチファイルのforはちょっと違うみたいで、ほかの言語のように for(){繰り返したい処理} ということが出来ないみたいで、 しかも変数<100というのも出来ない? ようで(INで0 1 2 3・・・のように指定するのですね・・・?) 戸惑っています。 変数を使ってインデントして100で終了させようと思ったのですが、変数も使えない・・・??のですね。(使えるのでしょうか??) そこでWSHで一セット分のコマンドのバッチファイルを作ってWSHからそれを100回呼ぼうかと思ったのですが、いまいち方法がわかりません。 また、wshの中で直接dosコマンドが使えると最もよいのですが・・・。 詳しい方がいましたら教えていただけると幸いです。

  • VBAでコンピューター名を取得したい

    こんにちは Office2000使ってます ExcelやAccessのVBAで作業しているコンピューター名を 取得し 変数に入れたいのですがどうすればできますか? ご存知の方教えてください VBA初心者です よろしくお願いします

  • カレントディレクトリの取得

    お世話になります。 バッチファイルでの処理中にカレントディレクトリをフルパスで取得し 変数に値を格納したいのですが、やり方が分かりません。。 いろいろ調べた結果、カレントディレクトリの取得は「CD」 変数への格納は、「==」or「set」なのかな?ってぐらいの知識レベルです。 上記のコマンド以外でも構いませんので、カレントディレクトリを取得し 変数に値を格納する方法を、記述の仕方を含めてご教示くださいませ。 宜しくお願い致します。

  • バッチ処理でファイル名に日付を指定したい

    こんにちは。 使用OS:WindowsNT4.0 Server バッチファイルで、 c:\>dir >yymmdd.dat というコマンドを実行させたいのですが、ファイル名としてyymmddのところを実行した日付にしたいのです。 で、yymmddの値が正しくなるようにバッチ処理中に日付を取得して、その値を変数に代入しなければならないと考えるのですが、変数に日付を代入するコマンドがわかりません。 そもそも無理なことなのかもしれませんが、バッチ処理でシンプルに行えたらなと考えております。 方法はありますでしょうか? その後に予想される問題なのですが、仮に変数に日付が代入されたとしても、その変数の内容をファイル名の一部として指定できるかどうかも分かりません。 重ねて質問ですがこれが無理な場合、何か代替案はないでしょうか? 何がしたいかと言うと、ドライブの空き容量を定期的に自動で吐き出させたいのです。 ソフト(フリーも含めて)に頼る方法が有るのでしょうが、基本的にソフトの導入は敬遠したいと考えております。 宜しくお願い致します。

  • dosでのファイルリスト取得について

    初歩的な質問ですいません。 以下のバッチファイルを作成しようと思っています。 ・特定のフォルダ配下にあるcsvファイルをバッチファイルの引数に設定したいと思っています。 例) フォルダに A.csv B.csv C.txt があるとすると バッチファイル A.csv バッチファイル B.csv を実行する。 いまいち、ファイルリストを取得してるループ処理させる方法がわかりません。

専門家に質問してみよう