次の方法で共有

AccessからVBAでExcelを操作する際に特定の操作をすると強制終了する

Anonymous
2020-07-09T09:20:51+00:00

明確な日付ではなく申し訳ございません。

少なくとも2020/05月中は問題なく動作しておりましたが、2020/07月に入ってから、

今まで発生しなかったエラーが発生するようになりました。

恐らくAccess側で例外処理を補足出来ていない為、Excel側で何か予期せぬエラーが発生しているのではないかと思います。

以下、一部コードを抜粋しております。

Set xls = CreateObject("Excel.Application")

Set wbf = xls.Workbooks.Open(CurrentProject.Path & "sample.xls")


省略


wb.Sheets(1).Cells(6 + Add_Row + j, 10) = rs!value 'このタイミングで養成終了

Accessバージョン:Microsoft 365 MSO (16.0.12827.20200) 32ビット

Excelバージョン:Microsoft 365 MSO (16.0.12827.20200) 32ビット

なお、Access2013で確認したところ、同様のコードでエラーは発生しませんでした。

何か原因等ございますでしょうか。

ご確認よろしくお願い致します。

開発者テクノロジ | Visual Basic for Applications

ロックされた質問。 この質問は、Microsoft サポート コミュニティから移行されました。 役に立つかどうかに投票することはできますが、コメントの追加、質問への返信やフォローはできません。

0 件のコメント コメントはありません

質問作成者が受け入れた回答

Anonymous
2020-07-15T07:21:55+00:00

強制終了の直接の原因までは今のところ分かりかねますが、

> 試しに以下の様に書き換えてみたところ、エラーが発生しなくなりました。

>

> wb.Sheets(1).Cells(6 + Add_Row + j, 10) = "サンプル"

>

> また、以下の様に一度変数に格納してからセットした場合にも同様にエラーが発生しなくなりました。

>

> tmp =  rs!value

>

> wb.Sheets(1).Cells(6 + Add_Row + j, 10) = tmp

文字列リテラルや Variant 型の変数の値( String 型のデータ)を

渡した場合は問題ないとのことでしたので、DAO.Field2 オブジェクトの

既定のプロパティである Value の指定を省略しなければ、

Excel.Range オブジェクト(の Value プロパティ)への

値渡しが適切に行われるはずだろう、と推論しただけです。

この回答は役に立ちましたか?

1 人がこの回答が役に立ったと思いました。
0 件のコメント コメントはありません

7 件の追加の回答

並べ替え方法: 最も役に立つ
  1. Anonymous
    2020-07-13T09:19:39+00:00

    ご返信ありがとうございます。

    >オブジェクトの型(クラス)ではなく、データベース上のテーブルに

    >定義されているフィールドのデータ型をご確認下さい。

    →大変失礼致しました。確認したところ「短いテキスト」となっておりました。

    >また、フィールドの名前を "value " にされるのは

    >出来るだけ避けた方がよいでしょう。

    →上記のご指摘ありがとうございます。

    こちらは本来xxx_nameというフィールド名でしたが、

    説明するに当たりましてvalueに変換して記載しておりました。

    紛らわしく申し訳ございません。

    上記で何かおわかりになりますでしょうか。

    この回答は役に立ちましたか?

    0 件のコメント コメントはありません
  2. Anonymous
    2020-07-13T00:13:50+00:00

    > なおデータ型についてとなりますが、

    > rs!valueにおいては、「Object/Field2」となっており、

    オブジェクトの型(クラス)ではなく、データベース上のテーブルに

    定義されているフィールドのデータ型をご確認下さい。

    また、フィールドの名前を "value " にされるのは

    出来るだけ避けた方がよいでしょう。

    この回答は役に立ちましたか?

    0 件のコメント コメントはありません
  3. Anonymous
    2020-07-10T08:40:38+00:00

    早速のご返信ありがとうございました。

    大変助かります。

    ご指摘頂きました内容を元に調査を致しましたところ、

    以下のコードを

    wb.Sheets(1).Cells(6 + Add_Row + j, 10) = rs!value '中身は半角カタカナの「サンプル」

    試しに以下の様に書き換えてみたところ、エラーが発生しなくなりました。

    wb.Sheets(1).Cells(6 + Add_Row + j, 10) = "サンプル"

    また、以下の様に一度変数に格納してからセットした場合にも同様にエラーが発生しなくなりました。

    tmp =  rs!value

    wb.Sheets(1).Cells(6 + Add_Row + j, 10) = tmp

    なおデータ型についてとなりますが、

    rs!valueにおいては、「Object/Field2」となっており、

    "サンプル"では、「Variant/String」でしたがこの違いによるものでしょうか、

    ただ、そうであった場合には、上記の様に一度変数に格納するなど必要になるのでしょうか。

    あまり理解できていない部分も有るため、恐縮ではございますが、

    何かおわかりになるようであれば、ご教授頂けますと幸いです。

    この回答は役に立ちましたか?

    0 件のコメント コメントはありません
  4. Anonymous
    2020-07-10T00:04:10+00:00

    > wb.Sheets(1).Cells(6 + Add_Row + j, 10) = rs!value

    rs が Access データベース上のテーブル/クエリを参照している Recordset オブジェクトである場合は、

    とりあえず、そのテーブルのフィールド[Value]のデータ型を確認されることをお奨めします。

    Access の VBA/DAO コードがクラッシュしたり、または10 進数の列の正しくないデータをレポートしたりすることがある

    ACCESSが強制終了される

    この回答は役に立ちましたか?

    0 件のコメント コメントはありません