ACCESS VBA ヘッダなしCSVの入力について

このQ&Aのポイント
  • ACCESS VBAを使用してヘッダがないCSVファイルを入力する方法について教えてください。
  • 商品管理.mdbというデータベースには、商品TBLというテーブルがあります。このテーブルには商品ID、納入日、仕入NO、管理コードの列があります。
  • また、管理.csvというCSVファイルもあります。このファイルには納入日、仕入NO、管理コードの列があります。これらの列が一致した場合、管理.csvの管理コードを商品TBLの管理コードに入力したいです。現在は商品TBLにデータを追加することしかできていません。
回答を見る
  • ベストアンサー

ACCESS VBA ヘッダなしCSVの入力について

ACCESS VBA ヘッダなしCSVの入力について ”商品管理.mdb”の中に 下のような”商品TBL”があります 商品ID   納入日     仕入NO    管理コード  9   20100305     25596 10   20100326     19229 11   20100412     65841 12   20100423     26845 上の商品TBLテーブルの管理コードを入れる元データとして 下のような”管理.csv”があります 20100326,20100305,123 20100326,20100326,456 20100326,20100412,222 20100326,20100423,1111 ヘッダーはありませんが 1列目:納入日、2列目:仕入NO、3列目:管理コード になります。 やりたいことは ”商品TBL”の ”納入日”と”仕入NO”と 管理.csvの”納入日”と”仕入NO”(ヘッダーはありませんが1カラムと2カラム) が一致した場合、管理.csvの管理コード(3カラム目)を ”商品TBL”の管理コードに入力したいのです。 色々参考にしているのですがやり方がわかりません 今何とか”商品TBL”に管理.csvを読み込ませる所までは出来ましたが ただ単にデータを追加させる事が出来た程度です。 商品TBLと管理CSVを比較してマッチしたら管理コードを入力できる方法を どなたか、お教え願います。 以下現在の状況です Private Sub コマンド0_Click() Const adOpenStatic = 3 Const adLockOptimistic = 3 Const ForReading = 1 Set objConnection = CreateObject("ADODB.Connection") Set objRecordSet = CreateObject("ADODB.Recordset") objConnection.Open _ "Provider = Microsoft.Jet.OLEDB.4.0; " & _ "Data Source = c:\test\商品管理.mdb" objRecordSet.Open "SELECT * FROM 商品TBL", _ objConnection, adOpenStatic, adLockOptimistic Set objFSO = CreateObject("Scripting.FileSystemObject") Set objFile = objFSO.OpenTextFile("C:\test\管理.csv") Do Until objFile.AtEndOfStream strkanri = objFile.ReadLine MsgBox strkanri arrkanri = Split(strkanri, ",") objRecordSet.AddNew objRecordSet("納入日") = arrkanri(0) objRecordSet("仕入NO") = arrkanri(1) objRecordSet("管理コード") = arrkanri(2) objRecordSet.Update Loop objRecordSet.Close objConnection.Close End Sub

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

  • ベストアンサー
  • 30246kiku
  • ベストアンサー率73% (370/504)
回答No.2

#1です 以下のようにしてみてどうなりますか。   Do Until objFile.AtEndOfStream     strkanri = objFile.ReadLine     MsgBox strkanri     arrkanri = Split(strkanri, ",")     objRecordSet.Filter = "納入日=" & arrkanri(0) _               & " AND 仕入NO ='" & arrkanri(1) & "'"     Do While (Not objRecordSet.EOF)       objRecordSet("管理コード") = arrkanri(2)       objRecordSet.Update       objRecordSet.MoveNext     Wend   Loop ※ 「仕入NO」がテキスト型であれば、' ' で arrkanri(1) の内容を囲います。 複数あるのであれば、絞り込まれた分を、ぐるぐる回します。

matupo
質問者

お礼

30246kiku様 貴重なアドバイスありがとうございます!! おかげさまで希望通りの動作が出来ました。 ありがとうございます。

その他の回答 (2)

  • 30246kiku
  • ベストアンサー率73% (370/504)
回答No.3

#2です 記述間違いです。     Do While (Not objRecordSet.EOF) は     While (Not objRecordSet.EOF) です。

  • 30246kiku
  • ベストアンサー率73% (370/504)
回答No.1

「納入日」「仕入NO」は、数値型と仮定します。 Do Loop 部分を以下にしてどうなりますか。   Do Until objFile.AtEndOfStream     strkanri = objFile.ReadLine     MsgBox strkanri     arrkanri = Split(strkanri, ",")     objRecordSet.Filter = "納入日=" & arrkanri(0) _               & " AND 仕入NO =" & arrkanri(1)     If (objRecordSet.EOF) Then       objRecordSet.AddNew       objRecordSet("納入日") = arrkanri(0)       objRecordSet("仕入NO") = arrkanri(1)     End If     objRecordSet("管理コード") = arrkanri(2)     objRecordSet.Update   Loop ※ 1度「納入日」「仕入NO」で絞込みします。 結果、なければ全部を追加し、あれば「管理コード」のみを更新します。 ただし、絞り込んだ際に1件しかないはず、、が前提条件となります。 「商品ID」との関係がわからないので、あった時だけとすると、     If (Not objRecordSet.EOF) Then       objRecordSet("管理コード") = arrkanri(2)       objRecordSet.Update     End If の方が良いかも? データ量は見ていないので、使えるものなのかは判断してください。

matupo
質問者

お礼

30246kiku様 アドバイスありがとうございます、 希望の動きが出来ました。 また落とし穴的な注意点も非常に助かります。 もしよろしければ 2点ほど30246kiku様のアドバイスをお聞きしたいのですが、 ・仕入NOが0から始まるものもあるのでフィールドを文字型にしています、その場合対処法 ・商品TBLに同じ値の「納入日」「仕入NO」の行もあります、それらには同じ管理コードを  付け足していく場合の方法 お手間をかけますが、もう少しお付き合い願えれば大変ありがたいです。 なにとぞよろしくお願いいたします。

関連するQ&A

  • VBAからcsvを読み込みテープルに追加する際日付型にしたいのですが?

    VBAからcsvを読み込みテープルに追加する際日付型にしたいのですが? ACCESS2003を使用しています 商品管理.mdbの中に 下のような商品TBLがあります 商品ID(aut_no)  納入日(日付/時刻型) 仕入NO(キスト型) 管理コード(キスト型) 12          2010/03/26       36542 22          2010/05/21       69856         256 25          2010/06/03       58596         123 30          2010/07/10       25546 管理.csvがあり、下記の内容です(左カラムから納入日,仕入NO,管理コード) 20100228,2566,256 20100326,6824,123 20101226,6589,566 20100425,2548,456 20100603,6879,222 20100326,1175,1111 商品管理.mdbから管理.csvを読み込み 納入日と仕入れNOがマッチした場合に管理コードを商品TBLに追加するといったものを作りたいと思っています。 商品管理.mdbの商品TBL   納入日(日付/時刻型)をテキスト型にして 20100228といった8桁表記にすれば以下のコードで出来るのですが データベースの仕様上納入日(日付/時刻型)にしないといけないのです、 そうすると実行時エラー'-2147352571 (800020005)'種類か一致しません。 とエラーがでてうまくいきません。 どなたかお知恵をお貸しください。 Private Sub コマンド0_Click() Const adOpenStatic = 3 Const adLockOptimistic = 3 Const ForReading = 1 Dim tuika_no As Integer Set objConnection = CreateObject("ADODB.Connection") Set objRecordSet = CreateObject("ADODB.Recordset") objConnection.Open _ "Provider = Microsoft.Jet.OLEDB.4.0; " & _ "Data Source = c:\test\商品管理.mdb" objRecordSet.Open "SELECT * FROM 商品TBL", _ objConnection, adOpenStatic, adLockOptimistic Set objFSO = CreateObject("Scripting.FileSystemObject") Set objFile = objFSO.OpenTextFile("C:\test\管理.csv") tuika_no = 0 Do Until objFile.AtEndOfStream strkanri = objFile.ReadLine       objRecordSet.Filter = "納入日=" & arrkanri(0) _ & " AND 仕入NO =" & arrkanri(1) If (Not objRecordSet.EOF) Then objRecordSet("管理コード") = arrkanri(2) objRecordSet.Update End If tuika_no = tuika_no + 1 Loop MsgBox "管理番号を取込みました。" objRecordSet.Close objConnection.Close End Sub

  • コンパイルエラー 変数が定義されていません

    コンパイルエラー 変数が定義されていません 下記URLの質問を参考にVBAに挑戦しています http://questionbox.jp.msn.com/qa5863136.html 下記コードを既存のACCESSの中に新規作成したコマンドボタンに 組み込んで実行したところ 下記変数にコンパイルエラー 変数が定義されていませんと出てきます、 objConnection objRecordSet strkanri arrkanri 自分なりに Dim ~としたのですがうまくいきません どのように変数を宣言してよいかお教え願います。 記述コード Private Sub コマンド0_Click() Const adOpenStatic = 3 Const adLockOptimistic = 3 Const ForReading = 1 Set objConnection = CreateObject("ADODB.Connection") Set objRecordSet = CreateObject("ADODB.Recordset") objConnection.Open _ "Provider = Microsoft.Jet.OLEDB.4.0; " & _ "Data Source = c:\test\商品管理.mdb" objRecordSet.Open "SELECT * FROM 商品TBL", _ objConnection, adOpenStatic, adLockOptimistic Set objFSO = CreateObject("Scripting.FileSystemObject") Set objFile = objFSO.OpenTextFile("C:\test\管理.csv") Do Until objFile.AtEndOfStream     strkanri = objFile.ReadLine     MsgBox strkanri     arrkanri = Split(strkanri, ",")     objRecordSet.Filter = "納入日=" & arrkanri(0) _               & " AND 仕入NO ='" & arrkanri(1) & "'"     Do While (Not objRecordSet.EOF)       objRecordSet("管理コード") = arrkanri(2)       objRecordSet.Update       objRecordSet.MoveNext     Wend   Loop objRecordSet.Close objConnection.Close End Sub

  • CSVファイル

    CSVファイルを1行ずつ比較して読み込み、一致した行を別ファイルに記述していこうと思っています。 現在、csvファイルを読み込む所まで出来ています。 比較して別ファイルに記述する方法を教えて下さい。 もしくはアドバイスください。 【ファイルの中身】 "09/09/2005 0:00:00,aaa,bbb,ccc" 【比較条件】 当日の日付を取得し、年月日だけで比較する Dim objFSO ' FileSystemObject Dim objFile ' ファイル読み込み用 Set objFSO = WScript.CreateObject("Scripting.FileSystemObject") Set objFile = objFSO.OpenTextFile("c:\test.csv") Do while objFile.ReadLine <> ""         'IF文を記述(条件:日付)        '別ファイルに記述する Loop objFile.close Set objFileSystem = Nothing Set objFile = Nothing

  • 特定のワークシートcsvファイル書き出しほか

    エクセルブックの中身が、 1番目 graphシート 2番目から19番目 ワークシート で構成されているエクセルファイルが100個 AAAというフォルダに入っています。 それぞれのエクセルブックにあるシートを、ブックのファイル名にしたフォルダを作成し、その中にcsvで書き出すプログラムを作りました。 また、AAAのフォルダの1つ上のフォルダ(VBA実行するカレントフォルダ)には、テキストファイルもあり、作成されたフォルダに合わせてコピーするようにしています。 一応、期待通りの動作をしましたが、スッキリとしたプログラムとするために、アドバイスをいただけないでしょうか? また、できれば、それぞれのブックの2番目から7番目のワークシートのみをcsvファイルで書き出したいと思い、シートを2番目から順にアクティブにして書き出すように変更しても1番目のグラフシートからcsvになってしまいました。 特定のワークシートのみをcsvファイルで書き出すにはどのように書いたら良いでしょうか? よろしくおねがいしむす Sub ファイル一括作成()     Application.ScreenUpdating = False         '対象ブックの選択     'フォルダ内のブックを順次選択     Dim FolderPath As String     Dim objFSO As Object     Dim objBook As Object     Dim objFiles As Object     Dim objFile As Object     Dim mysma4 As Object     Set objFSO = CreateObject("Scripting.FileSystemObject")     FolderPath = ActiveWorkbook.Path & "\AAA"     Set objBook = objFSO.GetFolder(FolderPath)     Set objFiles = objFSO.GetFolder(FolderPath).Files     Set mysma4 = objFSO.GetFile(ActiveWorkbook.Path & "\fig_all.TXT")     For Each objFile In objFiles      If objFSO.GetExtensionName(Path:=objFile) Like "xlsx" Then     'ベースファイル名フォルダ作成&sma4ファイルコピー       objFSO.CreateFolder Path:=FolderPath & "\" & objFSO.GetBaseName(objFile)       mysma4.Copy Destination:=FolderPath & "\" & objFSO.GetBaseName(objFile) & "\fig_all.TXT"     '各ファイルcsv書き出し      Workbooks.Open objFile.Path       For Each ws In Worksheets '各シートに対して処理を繰り返す           ws.Activate           'ベースファイルと同じ階層に出力           ActiveWorkbook.SaveAs _           Filename:=FolderPath & "\" & objFSO.GetBaseName(objFile) & "\" & ws.Name & ".csv", _           FileFormat:=xlCSV       Next ws       ActiveWorkbook.Close SaveChanges:=False      Else      End If     Next     MsgBox "ファイル作成が完了しました。"     Set objFSO = Nothing     Set objBook = Nothing     Set objFiles = Nothing     Set mysma4 = Nothing     Application.ScreenUpdating = True End Sub

  • vbsで最後の行を削除する

    csvファイル(test.csv)からフラグが1のものを抽出するのですが 最終行に改行がはってしまうので、最終行を削除してcsvファイルを保存したいのですが、 うまくいきません。ご教授ください。 Dim objADO Dim i Dim wsql Dim rs Dim wHeader Dim wData Dim objFSO Dim objFile Set objADO = CreateObject('ADODb.connection') objADO.Open "Driver={Microsoft Text Driver (*.txt;*csv)};"&_ "DBQ=C:\test;"&_ "ReadOnly=1" '抽出条件 wsql="select * from test.csv where フラグ='1'" Set rs =objADO.Execute(Wsql) 'ヘッダ部 wHeader='ID,商品名,商品番号,フラグ" 'データ部 wData="" Do While rs.EOF=False For i = 0 to rs.fields.count - 1 if i = (rs.fields.count -1) then wData = wData & chr(34) & rs.Fields.ltem(i) & chr(34) & chr(13) else wData = wData & chr(34) & rs.Fields.ltem(i) & chr(34) & "," end if next rs.MoveNext loop '最終改行削除? rs = Left(wData,Len(wData) - Len(chr(13))) 'ファイル出力 set objFSO = createObject("Scripting.FileSystemObject") set objFile = objFSO.OpentextFile("c:\test\test.csv",2, true) if err.Number = 0 then objFile.WriteLine(wHeader) objFile.WriteLine(wData) objFile.close end if set objFile = Nothing set objFSO = Nothing set objADO = Nothing ****************************************** ID,商品名,商品番号,フラグ 100,パソコン,100-12,1 200,ペン,200-11,1 ***ここの改行を削除する***** 〔EOF〕

  • 【ACCESS】インポート定義を使わないCSVインポート

    ACCESS VBAにてMDBにSQL文でCSVデータをINSERTしようとしています。INSERT自体はうまくいったのですが、データの型をうまくそろえられません。2日程ネットサーフィンしているものの良いサンプルを見つけられません。有識者の方、ご存知でしたら是非教えてください! まず、CSVデータは以下のようなものです。 ===aaa.csv=== 00000001,2009/1/31 00000002,2009/1/31 ・ ・ A000001,2009/1/31 Z000002,2009/1/31 ========== これを 既存テーブル:aaa_TBLに取り込ませたく、以下のSQL文を書きました。 INSERT INTO aaa_TBL(カラム1,カラム2) SELECT FORMAT([aaa#CSV].F1,'0000000'),[aaa#CSV].F2 FROM aaa#csv IN 'C:\' 'Text;HDR=NO' これにて「0000001」と「000002」等のレコードは正常に取り込むことができましたが、「A000001」「B000002」等のデータは取り込まれず、NULLにて登録されておりました。 (aaa_TBL自体はカラム1=テキスト型、カラム2=日付型でCreateされております。) これを回避したく、いろんなサイトを訪問したのですが、ほとんどがインポート定義を使った方法を推奨しておりました。 しかしながら、私にはどうしてもインポート定義が理解できないんです! 「VBAにて○○.iniを作成する方法」などをよく見かけるんですが、できるだけ他の方法を検討したいと考えております。(今後、ACCESS VBAから他言語への乗り換えを考えているとか、他CSVにてインポートされるテーブルの数が30個程あるので、インポート定義ファイルの管理がつらいな・・・とか色々他にも理由はあるんですが・・・・) 何か良い方法はないでしょうか?! やはりインポート定義を作らないとだめでしょうか?! その場合、簡単なサンプルコードなどを頂けますと非常に助かります。。。(MSサイトのサンプルコードは理解できませんでした。。。) まだVBAを勉強し始めて2週間なので、色々突っ込みどころはあると思いますが、どうぞよろしくお願いしますm(_ _)m

  • 入力ボックス閉じた時間を出力する方法

    こんにちは。 下記に記載しましたスクリプトは、 VBSファイルを実行することにより入力ボックスが表示され、 入力ボックスに文字列を入力すると、 「Active.csv」というファイルに 『現在の時間』と『入力文字列』が出力されます。 このVBSスクリプト内に入力ボックスにて「OK」を 押したときの時間を拾っていれたいと思っております。 どのような手法が考えられますでしょうか? ご教授のほど、よろしくお願いします。 Option Explicit On Error Resume Next Dim objFSO ' FileSystemObject Dim objFile ' ファイル書き込み用 Dim Reason ' ファイル入力 Reason = InputBox("何かいれてください。") Set objFSO = WScript.CreateObject("Scripting.FileSystemObject") If Err.Number = 0 Then Set objFile = objFSO.OpenTextFile("Active.csv", 8, True) If Err.Number = 0 Then objFile.Write(Date()) objFile.Write(",") objFile.Write(Time()) objFile.Write(",") objFile.Write(Reason) objFile.Write(",") 'ここに入力ボックスにて「OK」を押したときの時間を拾っていれたいです。 objFile.Write(",") objFile.Write(vbNewLine) objFile.Close Else WScript.Echo "ファイルオープンエラー: " & Err.Description End If Else WScript.Echo "エラー: " & Err.Description End If

  • VBSでファイル作成後、書き込みできない

    ファイルが存在している場合は、ファイルをオープンして書き込み、ファイルが存在していない場合は、ファイルを作成後、オープンして書き込みを行わせたいと考えています。 しかし、ファイルが存在していないとき、ファイルは作成されるのですが、『エラー:800A0046 書き込みできません。VBScript実行時エラー』が出て、書き込みができません。モードをWritingにしても同じでした。 お手数をおかけしますが、ご教示いただけますようお願いいたします。 Option Explicit '■ オブジェクトの宣言 Dim objFSO Dim objFile '■ 定数の宣言 Const strFileName = "C:\VBS\TEST.TXT" '■ 定数の宣言 '// ファイル入出力モード(8:追加書き込み) Const ForAppending = 8 Set objFSO = CreateObject("Scripting.FileSystemObject") If objFSO.FileExists(strFileName) Then WScript.Echo "ファイルが見つかりました" Else WScript.Echo "ファイルが見つかりませんでした" Set objFile = objFSO.CreateTextFile(strFileName) If IsObject(objFile) Then WScript.Echo "ファイルを作成しました" Else WScript.Echo "ファイルを作成できませんでした" WScript.Quit(1) End If End If '// ファイルのオープン Set objFile = objFSO.OpenTextFile(strFileName,ForAppending) objFile.WriteLine "2012/12/21,100,ブレーキパッド,35000"

  • VBscriptで「改行」と「"」を置換させる

    VBスクリプトを使ってファイルを置換したいと考えています。 以下のVBSファイルとコマンドを使って、置換することはできました。 が、置換対象が「改行」と「"」の場合、エラーとなって置換できません。 どうすればいいのでしょうか。 よろしくおねがいします。 ********コマンド******** (1)cscript replace.vbs "C:\test.txt" "Jim" "Jane" (2)cscript replace.vbs "C:\test.txt" ""_\n" "a_test" ********VBSファイル(replace.vbs)******** Const ForReading = 1 Const ForWriting = 2 strFileName = Wscript.Arguments(0) strOldText = Wscript.Arguments(1) strNewText = Wscript.Arguments(2) Set objFSO = CreateObject("Scripting.FileSystemObject") Set objFile = objFSO.OpenTextFile(strFileName, ForReading) strText = objFile.ReadAll objFile.Close strNewText = Replace(strText, strOldText, strNewText) Set objFile = objFSO.OpenTextFile(strFileName, ForWriting) objFile.WriteLine strNewText objFile.Close (1)のコマンドを実行すると、 「Jim」は「Jane」に置換されますが、 (2)のコマンドを実行すると、エラーになり置換されません。 エラーメッセージ: 「Microsoft VBScript 実行時エラー: インデックスが有効範囲にありません。」 よろしくおねがいします。

  • VBAでフォルダ内の全てのcsvファイルからコピペ

    マクロ超初心者です。 フォルダ内のすべてのcvsファイル(500程度)の5列目(500行程度)を新規ファイルの1列目から順にコピーしていきたいのです。 ちなみに元のcvsファイルのシート数は一つだけでシート名には全てファイル名が付いています。 (つまり全てのファイルのシート名が異なる) 見よう見真似で似たようなマクロから意味もわからないまま つぎはぎして下記作りましたが やっぱり動きません。 どなたか詳しい方どうかよろしくお願いします。 Sub Sample() Const FolderPath As String = "C:\data" Dim objFSO As Object Dim objBook As Object Dim lngRow As Long Application.ScreenUpdating = False Set objFSO = CreateObject("Scripting.FileSystemObject") For Each objBook In objFSO.GetFolder(FolderPath).Files lngcolumn = ThisWorkbook.Sheets("sheet1").Range("A" & Columns.Count).End(xlToRight).Column + 1 Workbooks.Open objBook.Path With ActiveWorkbook .Worksheets(1).Column("5").Copy ThisWorkbook.Sheets("sheet1").End(xlToRight).Offset(0, 1) .Close End With Next Set objFSO = Nothing Application.ScreenUpdating = True End Sub

専門家に質問してみよう