[リストへもどる]
一括表示

投稿時間:2003/03/17(Mon) 14:19
投稿者名:よれ
Eメール:
URL :
タイトル:
DAO 実行時エラー3164
初めて質問します、よろしくお願いします。

実行時エラー3164「フィールドを更新できません」
というエラーが出て困っています。

MS-Excelのワークシートの内容を編集したいので、DAOを使っています。
読み込みは問題ありません。
また、書き込みは最初のレコードではうまくいくのですが、2番目以降の
レコードで、表題のエラーが発生してしまい、編集できません。

問題のソースを添付しますのでよろしくお願いします。
LeftByte関数は入力された文字列を、指定バイト数までで切り取る機能
です。
gsDBNameは、Excelですでに編集&保存してあるExcelのブック形式ファ
イルのファイル名が設定されています。

仕方なく、RS(レコードセット)を、1回編集ごとに作成&クローズする
方式に書き換えてもやはりだめでした。

皆さん、打開策をご教授よろしくお願いします。

Public Sub hosei()
    Dim DB  As DAO.Database
    Dim RS  As DAO.Recordset
    Dim MyData  As String
    Dim SeetName As String
    Dim i As Integer
    
    'open
    Set DB = OpenDatabase(gsDBName, False, False, "Excel 8.0;HDR=NO;")
    SeetName = DB.TableDefs(0).Name
    Set RS = DB.OpenRecordset(SeetName)
    Do Until RS.EOF
        With RS
            .Edit
            .Fields(0) = LeftByte(.Fields(0), 4)    ' ←ここを2度目に通過するときにエラー
            .Fields(1) = LeftByte(.Fields(1), 1)
            .Fields(2) = LeftByte(.Fields(2), 8)
            .Fields(3) = LeftByte(.Fields(3), 16)
            .Fields(4) = LeftByte(.Fields(4), 16)
            .Update
            .MoveNext
            Debug.Print .EditMode, .LockEdits
            MyData = .Fields(0) & vbTab & .Fields(1) & vbTab & .Fields(2)
            i = i + 1
            Debug.Print i, MyData
        End With
    Loop
    Set RS = Nothing
    Set DB = Nothing
End Sub

投稿時間:2003/03/17(Mon) 16:49
投稿者名:よれ
Eメール:
URL :
タイトル:
補足
説明不足がありました。Microsoft DAO3.6を使っています。

また、
  .Fields(n) = LeftByte(.Fields...
の部分は、
  .Fields(n) = 0
などとしても同じです。

よろしくお願いします。

投稿時間:2003/03/17(Mon) 17:03
投稿者名:LESIA
Eメール:
URL :
タイトル:
Re: 補足

プロパティを省略せずに、
.Fields(n) → .Fields(n).Value
とするとどうでしょうか?

投稿時間:2003/03/17(Mon) 17:27
投稿者名:よれ
Eメール:
URL :
タイトル:
Re^2: 補足
LESIAさま、どうもありがとうございます。
やってみましたが、残念ながら同じ状況でした。

しかし、このアドバイスをいただいたときに、ちょっとひらめいて
Excelのブックを再度作り直したらなんと、うまくいきました。
(.MoveNextの後にFieldを参照していた間抜け部分は修正しましたが)

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

壊れていたデータファイルのほうは、今から原因を探って見ます。
あまりこれだけに時間をかけられないので、完全に理由がわからないかも知れませんが、
取り急ぎ、お礼まで。

投稿時間:2003/03/17(Mon) 17:42
投稿者名:よれ
Eメール:
URL :
タイトル:
Re^2: 補足
やはりデータが悪かったようです。
データを作るときにあまり気にせずに、前方のデータを参照して
次のデータを作るような数式をセルに書き込んでいたので、それが原因でした。
(たとえば連番を作るのに上側のセル+1とか)
当たり前のことなのでしょうが、すべてのデータを「値」として
用意すればよかったようです。

おかげさまで、かいけつしました、ありがとうございました。

投稿時間:2003/03/18(Tue) 03:40
投稿者名:魔界の仮面弁士
Eメール:
URL :
タイトル:
今更の回答ですが
> 次のデータを作るような数式をセルに書き込んでいたので、それが原因でした。

JETのExcel IISAM機能では、「数式」のセルは読み取り専用となります。
「値のみ」が格納されたセルであれば、編集可能です。


なお、JETのI-ISAMの制限については、下記のページを御覧ください。
DAO 3.51 / JET 3.5x時代の資料ですが、DAO 3.6 / JET 4.0 でも基本的には同一です。
http://msdn.microsoft.com/library/en-us/office97/html/workingwithspreadsheets.asp

英語だと読む気が薄れる(?)かもしれませんので、とりあえず抜粋解説。

》* You cannot delete rows from Microsoft Excel worksheets or workbooks.
→追加/編集は出来ますが、削除はできません。

》* You can clear data from individual cells in a worksheet,
》 but you cannot modify or clear cells that contain formulas.
→個々のセルの内容をクリアする事ができますが、数式を含んだセルはクリアできません。

》* You cannot create indexes on Microsoft Excel worksheets or workbooks.
→DAOのCreateIndexメソッドなどを使って、インデックスを作成する事はできません。

》* You cannot read encrypted data through the Microsoft Excel installable ISAM.
》 You can’t use the PWD argument (PWD=password) in the connection string to
》 open an encrypted worksheet or workbook, even if you supply the correct
》 password. You must decrypt all Microsoft Excel worksheets or workbooks through
》 the Microsoft Excel user interface if you plan to link or open them in
》 your Microsoft Access database.
→Excelのパスワード保護された文書は、JETのI-ISAMでは開けません。接続パラメータで
 PWD=passwordの指定をしても無効です。ということで、もしパスワード保護された
 文書を読み書きしたい場合は、Excelそのものをオートメーション操作して読む事になります。