こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

締切り済みの質問

ExcelからAccess2013DBを更新する時

Excel2013 vba-> Access2013 mdbファイル

問題点:以下のソースを実行すると、エラーが発生します。このエラーをなくしてアクセスデータベースのテーブルの情報の更新、新規追加、削除を行いたいです。

エラー内容:実行時エラー'3251' 現在のRecordsetは更新をサポートしていません。プロバイダーか、選択されたロックタイプの限界の可能性があります。

ソース:
Sub 登録処理()
  Dim Rst As adodb.Recordset
  Dim SQL As String
  Dim Rg As Range
  Dim RgData As Range
  Dim lngLastRow As Long
  Dim RgDel As Range
  
  On Error GoTo errH
  
  Set RgData = mySh.Range("B2")
  lngLastRow = RgData.End(xlDown).Row
  Set RgData = mySh.Range(RgData, mySh.Range("AB" & lngLastRow))
  
  SQL = "Select * from [会社管理テーブル]"
  Call DBconection2
  Set Rst = New adodb.Recordset
  With Rst
    .ActiveConnection = Cn
    'SQL文でテーブル名と抽出条件を指定する
    .Source = SQL
    .CursorLocation = 3 ' クライアントサイドカーソルに変更
    .Open
    
  End With
  
  Dim y As Long
  
  Sheets("会社管理").Select
  
  If Rst.EOF = False And Rst.BOF = False Then
    
    For i = 1 To RgData.Rows.Count
      
      If Cells(i + 1, 1).Value = "変更" Then
        Rst.MoveFirst
        Rst.Find "[施工会社ID]=" & RgData(i, 1).Value
        If Rst.EOF Then
          
        Else
          Rst.Fields("会社ID").Value = RgData(i, 2).Value
          Rst.Fields("会社名").Value = RgData(i, 3).Value
          Rst.Fields("フリガナ").Value = RgData(i, 4).Value
  
          Rst.Update
        End If
        Cells(i + 1, 1).Value = ""
      ElseIf Range(i, 1).Value = "削除" Then
        Rst.MoveFirst
        
        Rst.Find "[会社ID]=" & RgData.Cells(i, 1).Value
        If Rst.EOF Then
          
        Else
          Rst.Delete
        End If
        Set RgDel = Rows(i + 1 & ":" & i + 1)
        RgDel.Select
        RgDel.Delete
        
      ElseIf Range(i, 1).Value = "新規" Then
        Rst.AddNew
        Rst.Fields("会社ID").Value = RgData(i, 2).Value
        Rst.Fields("会社名").Value = RgData(i, 3).Value
        Rst.Fields("フリガナ").Value = RgData(i, 4).Value
        Rst.Update
        Cells(i + 1, 1).Value = ""
      End If
      
    Next i
    
  End If

exitH:
  
  Rst.Close: Set Rst = Nothing
  Call DBclose2
  Exit Sub
  
    
errH:
  MsgBox Err.Number & "(" & Err.Description & ")"
  GoTo exitH
  
End Sub
Sub DBconection2()
  Set Cn = New adodb.Connection
  Cn.Provider = "Microsoft.Jet.OLEDB.4.0"
  Cn.Open modPublic.DBPATH
  
End Sub
Function MakeDBconection() As adodb.Connection
  Set Cn = New adodb.Connection
  Cn.Provider = "Microsoft.Jet.OLEDB.4.0"
  Cn.Open modPublic.DBPATH
  
  Set MakeDBconection = Cn
  
End Function

Sub DBclose2()
  Cn.Close
  Set Cn = Nothing
End Sub
Sub EraseContents(s_Rg As Range)
  s_Rg.ClearContents
  
End Sub


誰か、解決方法がおわかりの方がいましたら、アドバイスをよろしくお願いします。

投稿日時 - 2015-01-24 10:42:47

QNo.8902143

すぐに回答ほしいです

このQ&Aは役に立ちましたか?

7人が「このQ&Aが役に立った」と投票しています

回答(1)

ANo.1

>Sheets("会社管理").Select
この辺で止めて
debug.print Rst.locktype
してみてください。

以下Access2010のヘルプより
LockTypeEnum

編集時にレコードに適用されるロックの種類を表します。

定数 値 説明
adLockBatchOptimistic 4 共有的バッチ更新を示します。バッチ更新モードの場合に必要です。
adLockOptimistic 3 レコード単位の共有的ロックを示します。Update メソッドを呼び出した場合にのみ、プロバイダーは共有的ロックを使ってレコードをロックします。
adLockPessimistic 2 レコード単位の排他的ロックを示します。プロバイダーは、レコードを確実に編集するための措置を行います。通常は、編集直後にデータ ソースでレコードをロックします。
adLockReadOnly 1 読み取り専用のレコードを示します。データの変更はできません。
adLockUnspecified -1 ロックの種類を指定しません。複製の場合、複製元と同じロックの種類が適用されます。

で、
LockType プロパティ (ADO)

編集時にレコードに適用されるロックの種類を示します。

設定値と戻り値
LockTypeEnum の値を設定または取得します。既定値は adLockReadOnly です。☆★☆注目!

解説
プロバイダーが Recordset を開くときに使用するロックの種類は、LockType プロパティを使用して事前に設定します。開いている Recordset オブジェクトで使用されているロックの種類は、このプロパティを取得することで確認できます。

プロバイダーによってはすべての種類のロックをサポートしていないものもあります。要求した LockType 設定をプロバイダーがサポートしていない場合は、他の種類のロックに置き換えられます。Recordset オブジェクトで実際に使用可能なロック機能を調べるには、adUpdate と adUpdateBatch で Supports メソッドを使用します。

CursorLocation が adUseClient に設定されている場合、adLockPessimistic 設定はサポートされません。サポートされていない値を設定してもエラーにはなりませんが、サポートされる LockType のうち、最も近いロックが使用されます。

LockType プロパティは、Recordset が閉じているときは読み取り/書き込み可能で、開いているときは読み取り専用になります。

リモート データ サービスでの使用 クライアント側の Recordset オブジェクトで使う場合、LockType プロパティは adLockBatchOptimistic にのみ設定できます

投稿日時 - 2015-01-24 12:13:22

あなたにオススメの質問