Access (VBA)

Access VBAに関するフォーラムです。
  • 解決済みのトピックにはコメントできません。
このトピックは解決済みです。
質問

 
(Windows 10 Pro : Access 2016)
ファイル取込み時の絞り込み
投稿日時: 19/02/27 07:50:20
投稿者: ゴマゴマ

お世話になります。
 
注文内容をCSVファイルから取込み時に、既にテーブルに取り込んでいる注文は注文番号と行番で判断し新規注文と取込み済み注文に分け、それぞれのファイルに出力したいと思っています。ただし取込み済み注文は納期が変わっている場合があるので「デーブルデータと比べ注文番号行番と納期まで同じ」と「デーブルデータと比べ注文番号行番は同じだが納期が違う」のファイル二つにしたい。下記コードの(※)の書き方が分からないのでご教示願います。今のところIf〜Elseの書き方から進めていません。納期はvarData(0)です。
 

Option Compare Database
Option Explicit

Sub torikomi()
    Dim cn As ADODB.Connection
    Dim rs As ADODB.Recordset
    Dim strm As ADODB.Stream
    
    Set cn = CurrentProject.Connection
    Set rs = New ADODB.Recordset
    Set strm = New ADODB.Stream
    
    Dim strLine As String
    Dim varData As Variant
    
    Dim newData As Variant  '新規注文
    Dim stldData As Variant 'SettledData 取込み済み注文
    Dim newFile As String
    Dim stldFile As String
    Dim newCnt As Long
    Dim stldCnt As Long
    Dim csvFile As String
        
    rs.Open "T_テーブル名", cn, adOpenKeyset, adLockOptimistic, adCmdTableDirect
    rs.Index = "PrimaryKey" 'varData(1):注文番号、varData(2):行番
    csvFile = "C:\CSVファイル名.csv"
       
    With strm
        .Charset = "UTF-8"
        .Open
        .LoadFromFile csvFile
        .SkipLine

        Do Until .EOS
            strLine = .ReadText(adReadLine)
            varData = Split(strLine, ",", , vbTextCompare)
                rs.Seek Array(varData(1), varData(2)), adSeekFirstEQ
                If rs.EOF Then  '新規注文だったら
                    newData = newData & strLine & vbCrLf
                Else '同一注文番号行番だったら←本当は同一注文番号の納期違いにしたい(※)
                    stldData = stldData & strLine & vbCrLf
                End If
        Loop
        .Close
    End With
    rs.Close: Set rs = Nothing: cn.Close: Set cn = Nothing
            
    newFile = "C:\新規注文.csv" '出力先
    stldFile = "C:\取込み済み注文.csv" '出力先
       
    With strm
        .Charset = "UTF-8"
        .Open
        .WriteText newData
        .SaveToFile newFile, adSaveCreateOverWrite
        .WriteText stldData
        .SaveToFile stldFile, adSaveCreateOverWrite
        .Close
    Set strm = Nothing
    End With
End Sub

 
以上

回答
投稿日時: 19/02/27 10:06:16
投稿者: Suzu

せっかくのデータベースなのですから
VBAでゴリゴリするよりは、全部取り込んで、SQLで判断した方が楽ではありませんか?

投稿日時: 19/02/27 16:59:31
投稿者: ゴマゴマ

Suzu 様
 
ご回答ありがとうございます。ただいまVBA勉強中でしてAccess内に取り込んでからの作業であればできると思うのですが、折角なのでVBAをもう少し深堀したいと思っています。これまではクエリの数が増えるのに困っていましたがVBAではクエリを作らなくて出来ることが多いので大変良いと感じています。
 
以上

回答
投稿日時: 19/02/27 17:25:31
投稿者: hatena
投稿者のウェブサイトに移動

引用:
下記コードの(※)の書き方が分からないのでご教示願います。今のところIf〜Elseの書き方から進めていません。納期はvarData(0)です。

 
            Else '同一注文番号行番だったら←本当は同一注文番号の納期違いにしたい(※)

 
ここを゛
 
            ElseIf CDate(varData(0)) <> rs!納期 Then

 
でどうだろう。(納期フィールドは日付/時刻型)
Null とか日付以外のエラー処理は必要に応じて追加してください。
 
 
ちなみに私もSQLでするかな。VBAでも DAO か ADO 経由なら、SQL使えるので。

投稿日時: 19/02/28 08:30:29
投稿者: ゴマゴマ

 hatena様
 
ご教示ありがとうございます。
おかげさまで望みのものができました。
hatena様、Suzu様言われる通り今後はSQLも勉強して積極的に使っていきたいと思います。
 
以上