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

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

A 回答 (4件)

忘れてましたけどさっきのサンプルは


アクションクエリを使用しているため
ファイル名に’があるとエラー起こします。

回避方法は、アクションクエリをやめて、テーブルをOpenしてレコードに
AddNewしていってください。
ではでは

この回答への補足

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

補足日時:2001/11/28 11:09
    • good
    • 0
この回答へのお礼

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

お礼日時:2001/11/28 10:55

どうも、度々先回のサンプルは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
    • good
    • 0

返答遅れました。


ほんとは、自分で考えるのが一番なんですけど
サンプルで取得できます。

フォームにテキスト、ボタン、コンボ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
    • good
    • 0
この回答へのお礼

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

お礼日時:2001/11/28 02:55

こんにちは


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

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

お礼日時:2001/11/27 09:51

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

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


人気Q&Aランキング