Access (VBA)

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

 
(Windows 10 Home : Access 2010)
データの更新が出来ない エラーメッセージの内容が変化する
投稿日時: 21/08/13 09:55:44
投稿者: mmiwa

いつもありがとうございます
 
モジュール、マクロ、クエリなどを作成する際に
アクセスに格納したデータテーブルをUSBメモリに入れて持ち出すことがあります
万一USBメモリを紛失しても情報漏洩を回避できるように
持ち出す際にはテーブル内の情報の一部を「$」で置き換えてしまおうと思っています
 
以下のようなコードを作成しましたが
特定のレコードの特定のフィールドのデータを更新しようとすると
エラーが出ます
 
エラー内容は
「指定されたデータ量がフィールドサイズを超えています。データ量を減らし、挿入または貼り付けを行ってください」でした
新たに入力したいデータは「2*→*5*5*h*木*土*」ですのでデータ量が多いとはとても思えません
エラー表示後、コードの変更をしない状態で、「Sub/ユーザーフォームの実行」をクリックすると
「UpdateまたはCancelUpdateメソッドには、対応するAddNewまたはEditメソッドが必要です」とエラー内容が変化します
 
特定のレコードのみエラーになるので、根本的にコードが間違っているわけではないように思います
また、データサイズが大きすぎるとも思えません
更に、エラー内容が変化することにも合点が行きません
 
申し訳ありませんが、どの辺りに解決の糸口があるのか教えていただけませんか
よろしくお願いいたします
 
コード
 
Dim myCon As ADODB.Connection
Dim myRS As ADODB.Recordset
Dim myRS2 As ADODB.Recordset
Dim mySQL As String
Dim c As Integer
Dim i As Integer
Dim buf As String
 
Set myCon = CurrentProject.Connection
Set myRS = New ADODB.Recordset
Set myRS2 = New ADODB.Recordset
 
mySQL = "select msysobjects.name as Tbl名 from msysobjects where msysobjects.type=1 and msysobjects.flags=0;"
 
myRS.Open mySQL, myCon, adOpenStatic, adLockPessimistic
 
Do Until myRS.EOF
 
If Left(myRS!Tbl名, 3) <> "XYZ" Then GoTo 1000
 
mySQL = "select * from " & myRS!Tbl名 & ";"
myRS2.Open mySQL, myCon, adOpenStatic, adLockPessimistic
 
Do Until myRS2.EOF
 
    For c = 1 To myRS2.Fields.Count - 1
     
    buf = ""
     
    If myRS2.Fields(c).Type = 202 Or myRS2.Fields(c).Type = 203 Then
     
        If IsNull(myRS2.Fields(c).Value) = False Then
         
            For i = 1 To Len(myRS2.Fields(c).Value) Step 2
             
            buf = buf & Mid(myRS2.Fields(c).Value, i, 1) & "$"
             
            Next i
         
        End If
         
        Debug.Print myRS2.Fields(c).Name & ":" & buf
         
        myRS2.Fields(c).Value = buf
     
    End If
     
    Next c
     
myRS2.Update
myRS2.MoveNext
Loop
 
myRS2.Close
 
1000
 
myRS.MoveNext
Loop
 
myRS.Close
myCon.Close
 
Set myRS = Nothing
Set myRS2 = Nothing
Set myCon = Nothing

回答
投稿日時: 21/08/14 08:10:53
投稿者: よろずや

mmiwa さんの引用:
エラー内容は
「指定されたデータ量がフィールドサイズを超えています。データ量を減らし、挿入または貼り付けを行ってください」でした
フィールドサイズが奇数で同サイズのデータのとき1文字長くしていますね。
 
mmiwa さんの引用:
エラー表示後、コードの変更をしない状態で、「Sub/ユーザーフォームの実行」をクリックすると
「UpdateまたはCancelUpdateメソッドには、対応するAddNewまたはEditメソッドが必要です」とエラー内容が変化します
更新エラーになったら、
(1) データを訂正して更新する
(2) 更新を諦めてキャンセルする
のどちらかを実行しなければなりません。
それをせずに再実行してはいけません。
 
プログラムを強制終了すれば、(2)を実行した状態になります。

投稿日時: 21/08/14 15:33:38
投稿者: mmiwa

よろずや 様
 
本当に助かりました
ありがとうございました
 
データの長さを
書き換え前と書き換え後とで
同じ長さにしたら
エラーが出なくなりました
 
差し支えなければ教えてください
 
フィールドのデータ型がテキストの場合
最大255文字まで格納できたと思いますが
既に存在するデータを書き換える場合に限っては
1文字長くなると書き換えできないということなのでしょうか?

回答
投稿日時: 21/08/14 22:32:26
投稿者: よろずや

mmiwa さんの引用:

フィールドのデータ型がテキストの場合
最大255文字まで格納できたと思いますが
既に存在するデータを書き換える場合に限っては
1文字長くなると書き換えできないということなのでしょうか?

テーブルのフィールドを定義するときに最大文字数を指定できます。
そのときに最大255文字まで指定可能ということです。
各フィールドの最大文字数を確認しましょう。

投稿日時: 21/08/15 17:40:40
投稿者: mmiwa

よろずや 様
 
なるほど
かなり理解が深まったように思います
 
勉強させていただきました
ありがとうございました
 
解決済みにさせていただきます
また困ったことがあれば投稿させていただきます
その節はよろしくお願いいたします