[[20170603160424]] 『データ無しの時の飛ばし方について』(JK) ページの最後に飛ぶ

[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]

 

『データ無しの時の飛ばし方について』(JK)

いつもお世話になっています。

表題の通り、データ無しの時の対応について教えてください。

下記、ロジックがありますが、これはデータが必ず有るを前提に
作っています。
場合によってデータが無い場合があることが判明し
だが上手く対応できるやり方が分かりません。
if文かなと思っているのですが…。

製品検査をする際に「検査データのロード」のステップで
csvファイル(yymmdd.csv)を読み込むようにしています。
検査予定が無いとここのファイルが作成されません。
その場合には「(3)作業日テーブルの更新」だけして
「ファイル無」のポップアップを表示させ終了させたいのです。

if文でstrFilenameが""(空)であればと思ったのですが、
「991231.csv」というのを格納され、ファイルが見つからないというエラーで止まります。
何かいい方法ありますでしょうか?

Sub logLoad()

    Dim db As ADODB.Connection
    Dim rs As ADODB.Recordset
    Dim cmd As ADODB.Command
    Dim SQL As String
    Dim strFilename As String '作成する予定データのフォルダ場所とファイル名
    Dim Filename As String '参照するDBのフォルダ場所とファイル名
    Dim i As Long
    Dim x1 As String, x2 As Variant

        '(1)平常予定テーブルのクリア
    SQL = "DELETE FROM tbl平常予定"

    '顧客管理のACCDBファイルに接続します
    Set db = New ADODB.Connection
    Filename = ThisWorkbook.Path & "\test\管理DB.accdb"
    db.Open "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" & Filename

    'レコードセットを開きます
    Set rs = New ADODB.Recordset
    Set cmd = New ADODB.Command
    Set cmd.ActiveConnection = db
    'SQLをセット
    cmd.CommandText = SQL
    Set rs = cmd.Execute

    With rs
        '(2)検査予定テーブルの更新
        .Open Source:="tbl平常予定", ActiveConnection:=db, _
              CursorType:=adOpenKeyset, LockType:=adLockOptimistic

        i = 1
        '検査データのロード ←←← このファイルが無かった時
        strFilename = Worksheets("config").Cells(3, 5) & Format(hiduke + 1, "yymmdd") & ".csv"
        Open strFilename For Input As #1
            Do Until EOF(1)
                Line Input #1, x1
                x2 = Split(x1, ",")
                .AddNew
                .Fields("登録No").Value = i ' "N" & Format(i, "00000")
                .Fields("構成").Value = x2(0)
                .Fields("効能").Value = x2(1)
                .Fields("役割").Value = x2(2)
                i = i + 1
            Loop
        Close #1
        .Update
        .Close

        '(3)作業日テーブルの更新
        .Open Source:="T_作業日", ActiveConnection:=db, _
              CursorType:=adOpenKeyset, LockType:=adLockOptimistic
        .Fields("作業日").Value = hiduke + 1
        .Update
        .Close

    End With

    Set rs = Nothing
    Set db = Nothing

End Sub

< 使用 Excel:Excel2010、使用 OS:Windows7 >


Dir関数を使えば、そのファイルの有無を判定できます。
 

(γ) 2017/06/03(土) 16:35


γ様

 アドバイス、ありがとうございます。

Dir関数ですね。確かにその説明のページを見ていました。
固定ファイル名(例:170601.csv)の場合は理解したのですが、
流動するファイル名の場合の指定が分かりませんでした。

strFilenameに指定されたCSVファイルが
フォルダ内になければ後続処理に飛ぶというところの指定がまだ分かっていません。

教えていただいているのに申し訳ございません。

(JK) 2017/06/05(月) 21:41


>固定ファイル名(例:170601.csv)の場合は理解したのですが、
どのようにするのですか?
固定でないときも同じはずです。
 
返り値が""であるかどうかの判断なので、
固定も何もないと思いますが。
Dir関数のヘルプはご覧になったのですか?

(γ) 2017/06/06(火) 01:13


γ様

 夜中にすいません。またこちらの説明不足で申し訳ございません。

Sub Sample()

    Const Target As String = "\\test\sample\170601.csv"
    If Dir(Target) <> "" Then
        ファイルがあった時の処理
    Else
        日付更新の処理
    End If
End Sub
をイメージしております。

srtFilenameが""(空白)であれば「作業日テーブルの更新」のみ実行とも考えていましたが
「strFilename = Worksheets("config").Cells(3, 5) & Format(hiduke + 1, "yymmdd") & ".csv"」
strFilenameは必ずネットワークパス含むファイル名(\\test\sample\yymmdd.csv形式)が入っております。
なお、configシートには各種ファイルが格納されているパスが記述されています。

動きとしては
1.今日の日付がstrFilenameとして格納される
2.csvが格納されているフォルダ内を見に行く
3.1と同じファイル名のcsvファイルを引っ張ってくる
(私が説明しなくてもγ様も見たら分かっておられると思いましたがすいません)

よってstrFilenameが""(ブランク)の時ではなく、
strFilenameと同じcsvファイルが無かった時ということのコードが
分からないというわけです。

私も分からないなりの説明でγ様もごちゃごちゃさせてしまっているかもしれませんが、どうぞよろしくお願いします。

(JK) 2017/06/06(火) 02:08


    If Dir(strFilename) <> "" Then
        ファイルがあった時の処理
    Else
        日付更新の処理
    End If
ではなぜだめなのですか?

「ネットワークパス+ファイル名」を表す文字列なのに、
文字列定数ではできて、文字列変数では不可と考える理由を
説明してください。
こちらが説明を見落としている、なにか別の条件があるのでしょうか?
 
(γ) 2017/06/06(火) 07:04


γ様

 たびたびのご指摘、ありがとうございます。

ご指摘箇所見直しましたら完全に私が間違っておりました。

    If Dir(strFilename) <> "" Then
        ファイルがあった時の処理
    Else
        日付更新の処理
    End If

これで判定できました。

それを基に

        '検査データのロード ←←← このファイルが無かった時
        strFilename = Worksheets("config").Cells(3, 5) & Format(hiduke + 1, "yymmdd") & ".csv"

    If Dir(strFilename) <> "" Then
        Open strFilename For Input As #1
            Do Until EOF(1)
                Line Input #1, x1
                x2 = Split(x1, ",")
                .AddNew
                .Fields("登録No").Value = i ' "N" & Format(i, "00000")
                .Fields("構成").Value = x2(0)
                .Fields("効能").Value = x2(1)
                .Fields("役割").Value = x2(2)
                i = i + 1
            Loop
        Close #1
        .Update
        .Close
Else
msgbox("ファイル無")
EndIf    
        '(3)作業日テーブルの更新
        .Open Source:="T_作業日", ActiveConnection:=db, _
              CursorType:=adOpenKeyset, LockType:=adLockOptimistic
        .Fields("作業日").Value = hiduke + 1
        .Update
        .Close

    End With

    Set rs = Nothing
    Set db = Nothing

End Sub

としましたところ、
実行エラー3705
「オブジェクトが開いている場合は、操作は許可されません」
と出力しました。

オブジェクト・・・メッセージボックスを想像しましたが、他に何か起因が
あるのでしょうか?

前回の私の説明で誤りがありました。

    If Dir(strFilename) <> "" Then
        ファイルがあった時の処理
    Else
        日付更新の処理
    End If

ですが正確には

    If Dir(strFilename) <> "" Then
        ファイルがあった時の処理
    Else
        ファイル無のメッセージボックス
    End If
  日付更新の処理 ← ファイルがあってもなくても日付更新処理は必要でした。

重ねて申し訳ございませんが、この辺り分かりますでしょうか?
 
(JK) 2017/06/06(火) 23:29


エラーからすると、tblに対し、オープン→処理→クローズというところ、
既に開いている?

ただ、下記のように

    If Dir(strFilename) <> "" Then
        ファイルがあった時の処理
    Else
        日付更新の処理
    End If
を入れなかった場合はエラー無しで通ります。

    With rs
        '(2)検査予定テーブルの更新
        .Open Source:="tbl平常予定", ActiveConnection:=db, _
              CursorType:=adOpenKeyset, LockType:=adLockOptimistic

        i = 1
        '検査データのロード ←←← このファイルが無かった時
        strFilename = Worksheets("config").Cells(3, 5) & Format(hiduke + 1, "yymmdd") & ".csv"
        Open strFilename For Input As #1
            Do Until EOF(1)
                Line Input #1, x1
                x2 = Split(x1, ",")
                .AddNew
                .Fields("登録No").Value = i ' "N" & Format(i, "00000")
                .Fields("構成").Value = x2(0)
                .Fields("効能").Value = x2(1)
                .Fields("役割").Value = x2(2)
                i = i + 1
            Loop
        Close #1
        .Update
        .Close

        '(3)作業日テーブルの更新
        .Open Source:="T_作業日", ActiveConnection:=db, _
              CursorType:=adOpenKeyset, LockType:=adLockOptimistic
        .Fields("作業日").Value = hiduke + 1
        .Update
        .Close

    End With

・・・少し私には高度過ぎたか。

まだ理解には程遠いですが、もう少し試してみます。
(JK) 2017/06/07(水) 02:56


ファイルがなかったときに、
recordset が closeされないままで
別のものを開こうとしているからです。

(γ) 2017/06/07(水) 05:54


γ様

 朝早くよりありがとうございました。

close処理だったんですね。
「(3)作業日テーブルの更新」の最後のcloseが聞くものだと思って…。
すいません、全く分かっていませんでした。
おかげさまでエラーは解消されたみたいです。
あとはテストデータで繰り返し大丈夫か見てみます。

今回、私としてはかなりハードルが高く、テンパっていました。

何度もアドバイスいただき、大変助かりました。

まだ何度もここに来ることになるかもしれませんが、どうぞよろしくお願いします。

私も動きを見ながら勉強していきたいと思います。

ありがとうございました。
(JK) 2017/06/07(水) 07:27


コメント返信:

[ 一覧(最新更新順) ]


YukiWiki 1.6.7 Copyright (C) 2000,2001 by Hiroshi Yuki. Modified by kazu.