[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]
『データ無しの時の飛ばし方について』(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 >
(γ) 2017/06/03(土) 16:35
アドバイス、ありがとうございます。
Dir関数ですね。確かにその説明のページを見ていました。
固定ファイル名(例:170601.csv)の場合は理解したのですが、
流動するファイル名の場合の指定が分かりませんでした。
strFilenameに指定されたCSVファイルが
フォルダ内になければ後続処理に飛ぶというところの指定がまだ分かっていません。
教えていただいているのに申し訳ございません。
(JK) 2017/06/05(月) 21:41
(γ) 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
ただ、下記のように
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
(γ) 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.