Access VBA質問箱 IV

当質問箱は、有志のボランティア精神のおかげで成り立っています。
問題が解決したら、必ずお礼をしましょうね。
本サイトの基本方針をまとめました。こちら をご一読ください。

投稿種別の選択が必要です。ご注意ください。
迷惑投稿防止のため、URLの入力を制限しています。ご了承ください。


927 / 2272 ツリー ←次へ | 前へ→

【9482】効率の良い書き方 探検 07/5/31(木) 9:09 質問[未読]
【9483】Re:効率の良い書き方 hatena 07/5/31(木) 11:09 回答[未読]
【9485】Re:効率の良い書き方 探検 07/5/31(木) 12:01 お礼[未読]

【9482】効率の良い書き方
質問  探検  - 07/5/31(木) 9:09 -

引用なし
パスワード
   おはようございます。
Access2002でプログラムを作成しております。

Excelで作成されたデータをアクセスで取込み、そのデータを保存用テーブルに移し変えるプログラムを作成しています。
保存用テーブルに既に同じ情報がある場合はデータの更新を、同じ情報が無い場合は新規に追加をするようにしているつもりです。

作成してみて、一応思い通りに動くのですが、作り方がヘタなのでプログラムが長々となってしまっています・・・

同じようなパターンのプログラムを後いくつか作るつもりなのですが、もう少し効率の良いプログラムの書き方があったらアドバイスをお願いします。

以下作成したプログラム

Private Sub 給与勤怠取込_Click()

Dim myDB1 As DAO.Database
Dim myRS1 As DAO.Recordset
Dim mySQL1 As String
Dim myDB2 As DAO.Database
Dim myRS2 As DAO.Recordset
Dim mySQL2 As String
Dim R_Flg As Integer


  DoCmd.TransferSpreadsheet acImport, , _
           "テーブル1", "c:\勤怠.xls", True

  R_Flg = 0
  Set myDB1 = CurrentDb
  Set myRS1 = myDB1.OpenRecordset("テーブル1", dbOpenDynaset)
  Set myDB2 = CurrentDb
  Set myRS2 = myDB1.OpenRecordset("既存蓄積テーブル", dbOpenDynaset)
    Do Until myRS1.EOF
      myRS2.MoveFirst
      Do Until myRS2.EOF
        If myRS2!社員コード = myRS1!社員_コード Then
         If myRS2!支給年月 = myRS1!支給年月 Then
         myRS2.Edit
         If IsNull(myRS1!弁当代) Or myRS1!弁当代 = "" Then
          myRS2!控除4 = 0
         Else
          myRS2!控除4 = myRS1!弁当代
         End If
         If IsNull(myRS1!特別手当) Or myRS1!特別手当 = "" Then
          myRS2!手当4 = 0
         Else
          myRS2!手当4 = myRS1!特別手当
         End If
         If IsNull(myRS1!その他_支給額) Or myRS1!その他_支給額 = "" Then
          myRS2!手当9 = 0
         Else
          myRS2!手当9 = myRS1!その他_支給額
         End If
         If IsNull(myRS1!その他_控除額) Or myRS1!その他_控除額 = "" Then
          myRS2!控除5 = 0
         Else
          myRS2!控除5 = myRS1!その他_控除額
         End If
         If IsNull(myRS1!出勤_日数) Or myRS1!出勤_日数 = "" Then
          myRS2!出勤日数 = 0
         Else
          myRS2!出勤日数 = myRS1!出勤_日数
         End If
         If IsNull(myRS1!所定労働_時間) Or myRS1!所定労働_時間 = "" Then
          myRS2!所定内労働通常時間 = 0
         Else
          myRS2!所定内労働通常時間 = myRS1!所定労働_時間
         End If
         If IsNull(myRS1!普通_残業) Or myRS1!普通_残業 = "" Then
          myRS2!普通残業時間数 = 0
         Else
          myRS2!普通残業時間数 = myRS1!普通_残業
         End If
         If IsNull(myRS1!深夜_残業) Or myRS1!深夜_残業 = "" Then
          myRS2!深夜残業時間数 = 0
         Else
          myRS2!深夜残業時間数 = myRS1!深夜_残業
         End If
         If IsNull(myRS1!総労働_時間) Or myRS1!総労働_時間 = "" Then
          myRS2!総労働時間数 = 0
         Else
          myRS2!総労働時間数 = myRS1!総労働_時間
         End If
         If IsNull(myRS1!有給_日数) Or myRS1!有給_日数 = "" Then
          myRS2!有給 = 0
         Else
          myRS2!有給 = myRS1!有給_日数
         End If
         If IsNull(myRS1!欠_勤) Or myRS1!欠_勤 = "" Then
          myRS2!欠勤日数 = 0
         Else
          myRS2!欠勤日数 = myRS1!欠_勤
         End If
         R_Flg = 1
        
         myRS2.Update
         End If
        End If
       If R_Flg = 1 Then
        Exit Do
       End If
       myRS2.MoveNext
      Loop
      If R_Flg = 0 Then
        myRS2.AddNew
         myRS2!役職コード = myRS1!役職コード
         myRS2!所属コード = myRS1!所属コード
         myRS2!社員コード = myRS1!社員_コード
         myRS2!支給年月 = myRS1!支給年月
         myRS2!氏名 = myRS1!氏名
         If IsNull(myRS1!弁当代) Or myRS1!弁当代 = "" Then
          myRS2!控除4 = 0
         Else
          myRS2!控除4 = myRS1!弁当代
         End If
         If IsNull(myRS1!特別手当) Or myRS1!特別手当 = "" Then
          myRS2!手当4 = 0
         Else
          myRS2!手当4 = myRS1!特別手当
         End If
         If IsNull(myRS1!その他_支給額) Or myRS1!その他_支給額 = "" Then
          myRS2!手当9 = 0
         Else
          myRS2!手当9 = myRS1!その他_支給額
         End If
         If IsNull(myRS1!その他_控除額) Or myRS1!その他_控除額 = "" Then
          myRS2!控除5 = 0
         Else
          myRS2!控除5 = myRS1!その他_控除額
         End If
         If IsNull(myRS1!出勤_日数) Or myRS1!出勤_日数 = "" Then
          myRS2!出勤日数 = 0
         Else
          myRS2!出勤日数 = myRS1!出勤_日数
         End If
         If IsNull(myRS1!所定労働_時間) Or myRS1!所定労働_時間 = "" Then
          myRS2!所定内労働通常時間 = 0
         Else
          myRS2!所定内労働通常時間 = myRS1!所定労働_時間
         End If
         If IsNull(myRS1!普通_残業) Or myRS1!普通_残業 = "" Then
          myRS2!普通残業時間数 = 0
         Else
          myRS2!普通残業時間数 = myRS1!普通_残業
         End If
         If IsNull(myRS1!深夜_残業) Or myRS1!深夜_残業 = "" Then
          myRS2!深夜残業時間数 = 0
         Else
          myRS2!深夜残業時間数 = myRS1!深夜_残業
         End If
         If IsNull(myRS1!総労働_時間) Or myRS1!総労働_時間 = "" Then
          myRS2!総労働時間数 = 0
         Else
          myRS2!総労働時間数 = myRS1!総労働_時間
         End If
         If IsNull(myRS1!有給_日数) Or myRS1!有給_日数 = "" Then
          myRS2!有給 = 0
         Else
          myRS2!有給 = myRS1!有給_日数
         End If
         If IsNull(myRS1!欠_勤) Or myRS1!欠_勤 = "" Then
          myRS2!欠勤日数 = 0
         Else
          myRS2!欠勤日数 = myRS1!欠_勤
         End If
         myRS2.Update
       
      End If
      
      R_Flg = 0
      myRS1.MoveNext
    Loop
  Set myRS1 = Nothing
  Set myDB1 = Nothing
  Set myRS2 = Nothing
  Set myDB2 = Nothing

  CurrentDb.Execute "DELETE * FROM テーブル1;"
 
  MsgBox "取込処理終了"
 
End Sub

【9483】Re:効率の良い書き方
回答  hatena  - 07/5/31(木) 11:09 -

引用なし
パスワード
   レコードセットで回すより、
クエリの方が速いしシンプルでしょう。

まず、
既存蓄積テーブル と テーブル1 をキーフィールドで内部結合して、
既存蓄積テーブル から テーブル1と一致するデータを削除する
削除クエリを作成します。

つぎに、テーブル1 のデータを既存蓄積テーブルに追加する追加クエリ
を作成します。

この2つを順に実行します。

一つめのクエリは、
既存蓄積テーブル と テーブル1 をキーフィールドで内部結合して、
既存蓄積テーブル を テーブル1 のデータで更新する更新クエリ
でもいいですね。

キーフィールドが主キーかインデックス(重複無し)に設定しておけば、
重複するデータははじかれて追加されますので。

クエリは、SQLでコード上に直接記述してもOKです。

【9485】Re:効率の良い書き方
お礼  探検  - 07/5/31(木) 12:01 -

引用なし
パスワード
   hatenaさんありがとうございます。

クエリで一致するデータを削除して、その後追加するですね。

なるほど。削除という考えが浮かびませんでした。

教えていただいた方法でやってみます。

ありがとうございました。

927 / 2272 ツリー ←次へ | 前へ→
ページ:  ┃  記事番号:
1078201
(SS)C-BOARD v3.8 is Free