Excel VBA質問箱 IV

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

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


12493 / 13645 ツリー ←次へ | 前へ→

【10184】データの存在の確認方法 take 04/1/9(金) 19:11 質問
【10187】Re:データの存在の確認方法 Ron 04/1/9(金) 21:46 回答
【10228】Re:データの存在の確認方法 take 04/1/13(火) 19:26 お礼
【10192】Re:データの存在の確認方法 Kein 04/1/10(土) 2:12 発言

【10184】データの存在の確認方法
質問  take  - 04/1/9(金) 19:11 -

引用なし
パスワード
   お世話になっております。

Excel97からAccess97へDaoにより接続し、データを保存しています。
(注文番号、お客様、工程、工程数量など)
そこでExcelからAccessへデータを保存する場合、同一の注文番号がAccess側に
データが存在するかどうか確認し、なければ保存し、あればデータの更新を
するかどうかのメッセージが出るようにしたいのです。
DBに関しては初心者ですのでさっぱり分からない状態です。

今後作成する予定なのですがExcel側から注文番号でお客様を出せるように
したいと考えています。こちらに関しても教えて頂けますでしょうか。

勝手なことばかり言いますがよろしくお願いします。

【10187】Re:データの存在の確認方法
回答  Ron E-MAIL  - 04/1/9(金) 21:46 -

引用なし
パスワード
   こんばんは。
サンプルを考えてみました。
エクセルシートとアクセステーブルのフィールドが一致しているのが条件です。
エクセルの1行目が項目行(=アクセスのフィールド名)
2行目以降にデータがあるものとします。

>Excel97からAccess97へDaoにより接続し、データを保存しています。
>(注文番号、お客様、工程、工程数量など)
>そこでExcelからAccessへデータを保存する場合、同一の注文番号がAccess側に
>データが存在するかどうか確認し、なければ保存し、あればデータの更新を
>するかどうかのメッセージが出るようにしたいのです。

以下標準モジュールに
Sub test01()

  Const DATA_BASE_NAME As String = "I:\MDB\dbTest01.mdb"
  Const TABLE_NAME As String = "acsTable01"
  Dim myWS As Workspace
  Dim myDB As Database
  Dim myTable As Recordset
  Dim myID As String
  Dim i As Long, j As Long
  Set myWS = DBEngine.Workspaces(0)
  Set myDB = myWS.OpenDatabase(DATA_BASE_NAME)
  Set myTable = myDB.OpenRecordset(TABLE_NAME, dbOpenDynaset)
  
  With myTable
    For i = 2 To Range("a65536").End(xlUp).Row
      myID = Cells(i, 1).Value
      .FindFirst "注文番号=" & myID
      .Edit
      If .NoMatch = False Then
        If MsgBox("受注番号 " & myID & " が見つかりました" & _
          Chr(10) & "データを更新しますか?", vbOKCancel) = vbOK Then
            For j = 2 To Range("IV1").End(xlToLeft).Column
              .Fields(j - 1) = Cells(i, j).Value
            Next
        End If
      Else
        .AddNew
        For j = 1 To Range("IV1").End(xlToLeft).Column
          .Fields(j - 1) = Cells(i, j).Value
        Next
      End If
      .Update
    Next
  End With
  myDB.Close
  myWS.Close

End Sub

>
>今後作成する予定なのですがExcel側から注文番号でお客様を出せるように
>したいと考えています。こちらに関しても教えて頂けますでしょうか。
>
>勝手なことばかり言いますがよろしくお願いします。

A列に注文番号を入れると表示します
以下対象シートのモジュールに
Private Sub Worksheet_Change(ByVal Target As Range)

  Const DATA_BASE_NAME As String = "I:\MDB\dbTest01.mdb"
  Const TABLE_NAME As String = "acsTable01"
  Dim myWS As Workspace
  Dim myDB As Database
  Dim myTable As Recordset
  Dim myID As String
  Dim i As Long, j As Long
  
  With Target
    If .Count > 1 Then Exit Sub
    If .Value = "" Then Exit Sub
    If .Row = 1 Then Exit Sub
    If .Column <> 1 Then Exit Sub
    myID = .Value
  End With
  
  Set myWS = DBEngine.Workspaces(0)
  Set myDB = myWS.OpenDatabase(DATA_BASE_NAME)
  Set myTable = myDB.OpenRecordset(TABLE_NAME, dbOpenDynaset)
    
  With myTable
    .FindFirst "注文番号=" & myID
    If .NoMatch = False Then
      For j = 1 To .Fields.Count - 1
        Cells(Target.Row, j + 1).Value = .Fields(j)
      Next
    Else
      MsgBox "注文番号 " & myID & " が見つかりません"
    End If
  End With
  myDB.Close
  myWS.Close

End Sub

お試しください。
では

【10192】Re:データの存在の確認方法
発言  Kein  - 04/1/10(土) 2:12 -

引用なし
パスワード
   注文番号のフィールドにIndexをつけること、重複入力を許可しない設定にすること。
それで DAO のコードにエラートラップでもかけておけば、大丈夫でしょう。

【10228】Re:データの存在の確認方法
お礼  take  - 04/1/13(火) 19:26 -

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

教えて頂いた方法で作り、できるようなりました。
ありがとうございます。

Keinさんのに関しては
プログラム作成が未熟なもので未だエラー時の処理の
方法が分からずじまいでいますのでちょっとできない状態です。
エラー時に関わらずほとんどできず、例を元にしか何も
できない状態なのですがね。

時間がかかっても徐々に覚えていきたいと思っています。
こんな私ですが今後もお助け願いますでしょうか。
よろしくお願いします。

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