質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

90.03%

Accessランタイムで環境によって実行時エラーが出るのを解消したい

解決済

回答 3

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 5,415

takepon1017

score 7

前提・実現したいこと

Access2013で作成した現在運用中の弊社システムを、新しく導入したPCでも利用したいです。

発生している問題・エラーメッセージ

新しく導入したPCのうち特定の型式で、弊社システムを開いたときや特定のフォームを開いたときなどに、以下の2種類のエラーが発生します。

参照エラー?

※解決済み(3/11 追記)

『参照ファイル EXCEL.EXE を検索しています』というタイトルのダイアログが、いくつも出ては一瞬で消えを1秒ほど繰り返します。
フォームを開くときForm_Loadが発生するより前に発生するエラーで、いくつかの特定のフォームで発生しますが、1度発生するとAccess終了までは発生しなくなります。

実行時エラー

実行時エラーが発生したため、このアプリケーションの実行は中断しました。

アプリケーションを続行できません。システムは シャットダウンされます。

以上のダイアログが表示された後、フォームが開きなおされ(Form_Loadの発生を確認)その後Accessが特にダイアログ等もなく落ちます。
発生箇所としては以下の通りです。

  • いくつかの特定のフォームが開いた後Form_Loadが発生する前
  • フォームにある特定のコンボボックスの値を変更しAfter_Updateが発生する前
  • フォームにあるExcel出力用のボタンをクリックしClickが発生する前

該当のソースコード

参照設定

弊社システムが参照設定でチェックマークを付けているのは以下の通りです。

  • Visual Basic For Applications
  • Microsoft Access 15.0 Object Library
  • OLE Automation
  • Microsoft Office 16.0 Object Libray
  • Microsoft DAO 3.6 Object Library
  • Microsoft Excel 16.0 Object Library

コンボボックス

コンボボックスは値集合ソースとしてクエリを使用していますが、同じクエリを使用したコンボボックスでAfterUpdateの設定がないものについては、エラーは発生しません。

エラー発生箇所のコンボボックスのAfterUpdateでは、フォームのフィルターMe.Filterの更新を行っています。
ただし、これは他のエラーの出ないコンボボックスと共通のFunctionプロシージャを呼んでいるものです。
他のコンボボックスを変更した場合には、問題なくフィルターの更新が行われます。

出力ボタン

Excel出力用のボタンでは、フォームで開いているクエリをExcelに出力していくコードを記述しています。
ざっくりと書くと以下のような感じです。
実際には中略部分に、レコードがない時の中断や、保存先を決めるための処理などがあります。

Private Sub 出力_Click()

    Dim xls As Excel.Application
    Dim lngRow As Long
    Dim lngCol As Long

~中略~

    DoCmd.Echo False

    Set xls = New Excel.Application

    With xls
        .ScreenUpdating = False
        .Workbooks.Add
        .Worksheets(1).Name = "hogehoge"

        For lngCol = 1 To 3
            .Cells(2, lngCol).Value = Me.Recordset.Fields(lngCol - 1).Name
        Next lngCol

        lngRow = 3
        DoCmd.GoToRecord acDataForm, Me.Name, acFirst

        Do
            .Cells(lngRow, 1).Value = Me.cmb.Column(1)
            .Cells(lngRow, 2).Value = Me.txt_01.Value
            .Cells(lngRow, 3).Value = Me.txt_02.Value

            If Me.CurrentRecord = Me.Recordset.RecordCount Then
                Exit Do
            Else
                lngRow = lngRow + 1
                DoCmd.GoToRecord acDataForm, Me.Name, acNext
            End If
        Loop

        .Columns("B:B").NumberFormat = "yyyy/m/d"
        .Columns("C:C").NumberFormat = "[h]:mm"
        .Columns("A:C").AutoFit

        .DisplayAlerts = False
        .ActiveWorkbook.SaveAs "C:\hogehoge\asdf.xlsx"
        .DisplayAlerts = True
        .Quit
    End With

    Set xls = Nothing

    DoCmd.Echo True

    MsgBox "出力が完了しました。 ", vbInformation
End Sub

質問が長くなってしまうので、必要であれば詳細を追記させていただこうかと思います。

PC環境

動作する環境1 動作する環境2 エラーの出る環境
2015年購入 lenovo製 2019年2月購入 hp製 2019年2月購入 富士通製
Intel Core i3-6100 3.70GHz Intel Core i5-8500 3.00GHz Intel Core i3-8100 3.60GHz
HDD 1TB SSD 500GB HDD 500GB
Windows10 Pro 64bit Windows10 Pro 64bit Windows10 Pro 64bit
Access Runtime 2013 32bit Access Runtime 2013 32bit Access Runtime 2013 32bit
Excel 2016 32bit Excel 2016 32bit OEM Excel 2016 32bit OEM

弊社システムの開発環境は、動作する環境2にAccess 2013をインストールしたものです。

試したこと

  • エラーが特定の箇所で起きるため、その洗い出しを行う
  • Form_LoadなどのイベントにMsgboxを差し込んで、エラーの発生タイミングを確認
  • 同時に購入した同じ型式のPCで試すと、結果は型式ごとで同じであることがわかった
  • ランタイムの再インストールをしたり、2013の64bitや2016に変えても改善はせず
  • 参照設定にExcel 16.0 Object Libraryを含む別のAccdbファイルは、どのPCでも正常に動作していた
  • エラーの出るPCにOffice Personal 2013をインストールしても結果は変わらず
  • NASにあったシステムを全てローカルに移してみるも結果は変わらず(3/8 追記)

同じWin10 & AccessRuntime2013 & Excel2016でもエラーの出ない環境があるから環境のせい?
他のシステムでExcelを使ってもエラーが出ないからシステムのせい?
原因がつかめない状態です。

補足情報(FW/ツールのバージョンなど)

システムは入力・集計用のフロントエンドと、データベース用のバックエンドの2つのファイルに分かれており、バックエンド上のテーブルをフロントエンドがリンクテーブルとして読み書きしている状態です。 フロントエンドは各PCのローカルに同一のものを配布しており、バックエンドは各PCが見られるNAS上に置いています。 (3/8 加筆修正)

Visual Basic Editorのデバッグ→コンパイルは通っている状態です。

その他、何か状況の特定に必要な情報があれば、教えていただければと思います。
詳しい方のお力をお借りできますと幸いです。よろしくお願いいたします。

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正、ベストアンサー選択の依頼

  • takepon1017

    2019/03/08 13:32 編集

    BIOSを確認しアップデートも行いましたが、特にエラー状況に変化はありませんでした。

    キャンセル

  • sazi

    2019/03/12 23:43

    プレインストールされているソフトとかが影響していないでしょうか?
    サービス等最低限以外を停止させて確認するとか。

    キャンセル

  • takepon1017

    2019/03/13 13:55

    ご指摘ありがとうございます。
    セーフモードも用いて色々止めた上で試してみましたが、エラー状況は変わりませんでした。

    キャンセル

回答 3

checkベストアンサー

+3

ランタイムもoffice系のバージョンに合わせた方が良い気がします。
また、OSは64bit版ですので、ランタイムやエクセルも64bit版に合わせてみて下さい。

特に「Microsoft DAO 3.6 Object Library」が64/32のどちらになっているのか気になりますので。

関連して気になる情報。
※正式なものではないので確かかどうかは分かりませんが、何かはあるのかもしれない。
Access VBA: 64bit でも 32bit でもDAOを動かす方法(検証中)

Access2010 以降、DAOの標準ライブラリが "Microsoft Office 14.0 Access database engine Object Library" となりました。

これにより、Access2010 で作成したDAOを利用したAccessVBAアプリケーションが、2010より古いバージョンで動かなくなることがあります。

また、参照設定で「Microsoft Access 15.0 Object Library」の目的は何ですか?
特定のフォームで関係している参照設定は何でしょうか?

蛇足かもしれませんが、ご参考
AccessをRuntime版に移行する際の5つの注意点

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2019/03/22 15:46

    ご回答ありがとうございます。
    『Microsoft DAO 3.6 Object Library』が気になるというお話と、引用いただいた文章(DAOの標準ライブラリの話)が初耳だったことから、まずは参照設定より『Microsoft DAO 3.6 Object Library』のチェックを外し『Microsoft Office 16.0 Access database engine Object Library』に切り替えてみました。
    その後、上書きではなく『名前を付けて保存』したAccdbファイルで検証したところ、エラーが発生しなくなりました。

    現在エラーの出ていない環境で同じファイルを使っても正常に動作したため、問題としては解決できたようです。
    最初の投稿時より長らくお付き合いいただきまして、ありがとうございました。

    Access2013で制作していたにも関わらず、私はDAOの扱いに関してえらく古い情報を参照していたようですね…。
    改めて色々と学びなおす必要を感じます。

    ちなみに『Microsoft Access 15.0 Object Library』に関しては、デフォルトでチェックが付いていたことと、外そうとすると『使用中のコントロールまたは参照を削除することはできません』とメッセージが出ることから、そのままにしてあります。

    キャンセル

  • 2019/03/22 16:46

    >『Microsoft Access 15.0 Object Library』
    2013でしたね、失礼しました。

    キャンセル

+1

>弊社システムが参照設定でチェックマークを付けているのは以下の通りです。
複数の環境で動作させる場合は、参照設定は必要最小限に留める。

Dim xls As Excel.Application

Dim xls As Object

Set xls = New Excel.Application

Set xls = CreateObject("Excel.Application")

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2019/03/08 10:47

    お教えいただいた通りコードを編集し、参照設定からEXCEL Object Libraryを外したところ、EXCEL.EXEのダイアログは出なくなりました。
    結果としては、今まで見逃していたであろう『MSO.DLL を検索しています』が一度だけ表示される形となりましたが、これも同じく参照設定からOfficeを外すようにコードを編集すれば何とかなりそうです。

    Excelの操作を行うには参照設定が必須なものと思い込んでいました。
    体系的でなく行き当たりばったりの独学で学ぶと、理由もわからないまま使う『おまじない』のようなものが多いなぁと反省しているところです。
    ご回答ありがとうございました。

    キャンセル

0

アクセスファイルは壊れやすいです。
最適化/修復をお試しください。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2019/03/14 13:29

    ご回答ありがとうございます。
    フロントエンド・バックエンド共に最適化/修復をしてみましたが、特にエラー状況は変わりませんでした。

    キャンセル

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 90.03%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる