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

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

新規登録して質問してみよう
ただいま回答率
85.50%
Windows 10

Windows 10は、マイクロソフト社がリリースしたOSです。Modern UIを標準画面にした8.1から、10では再びデスクトップ主体に戻され、UIも変更されています。PCやスマホ、タブレットなど様々なデバイスに幅広く対応していることが特徴です。

VBA

VBAはオブジェクト指向プログラミング言語のひとつで、マクロを作成によりExcelなどのOffice業務を自動化することができます。

Access

Accessはマイクロソフトによるリレーショナルデータベース管理システムです。オブジェクト指向のアプリケーション作成に対応しており、テーブルや編集をはじめ、クエリ生成、入力フォーム作成、レポート作成など一通りの機能を備えています。

Q&A

解決済

3回答

12114閲覧

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

takepon1017

総合スコア13

Windows 10

Windows 10は、マイクロソフト社がリリースしたOSです。Modern UIを標準画面にした8.1から、10では再びデスクトップ主体に戻され、UIも変更されています。PCやスマホ、タブレットなど様々なデバイスに幅広く対応していることが特徴です。

VBA

VBAはオブジェクト指向プログラミング言語のひとつで、マクロを作成によりExcelなどのOffice業務を自動化することができます。

Access

Accessはマイクロソフトによるリレーショナルデータベース管理システムです。オブジェクト指向のアプリケーション作成に対応しており、テーブルや編集をはじめ、クエリ生成、入力フォーム作成、レポート作成など一通りの機能を備えています。

0グッド

0クリップ

投稿2019/03/06 07:52

編集2019/03/11 00:25

前提・実現したいこと

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に出力していくコードを記述しています。
ざっくりと書くと以下のような感じです。
実際には中略部分に、レコードがない時の中断や、保存先を決めるための処理などがあります。

VBA

1 2Private Sub 出力_Click() 3 4 Dim xls As Excel.Application 5 Dim lngRow As Long 6 Dim lngCol As Long 7 8~中略~ 9 10 DoCmd.Echo False 11 12 Set xls = New Excel.Application 13 14 With xls 15 .ScreenUpdating = False 16 .Workbooks.Add 17 .Worksheets(1).Name = "hogehoge" 18 19 For lngCol = 1 To 3 20 .Cells(2, lngCol).Value = Me.Recordset.Fields(lngCol - 1).Name 21 Next lngCol 22 23 lngRow = 3 24 DoCmd.GoToRecord acDataForm, Me.Name, acFirst 25 26 Do 27 .Cells(lngRow, 1).Value = Me.cmb.Column(1) 28 .Cells(lngRow, 2).Value = Me.txt_01.Value 29 .Cells(lngRow, 3).Value = Me.txt_02.Value 30 31 If Me.CurrentRecord = Me.Recordset.RecordCount Then 32 Exit Do 33 Else 34 lngRow = lngRow + 1 35 DoCmd.GoToRecord acDataForm, Me.Name, acNext 36 End If 37 Loop 38 39 .Columns("B:B").NumberFormat = "yyyy/m/d" 40 .Columns("C:C").NumberFormat = "[h]:mm" 41 .Columns("A:C").AutoFit 42 43 .DisplayAlerts = False 44 .ActiveWorkbook.SaveAs "C:\hogehoge\asdf.xlsx" 45 .DisplayAlerts = True 46 .Quit 47 End With 48 49 Set xls = Nothing 50 51 DoCmd.Echo True 52 53 MsgBox "出力が完了しました。 ", vbInformation 54End Sub

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

PC環境

動作する環境1動作する環境2エラーの出る環境
2015年購入 lenovo製2019年2月購入 hp製2019年2月購入 富士通製
Intel Core i3-6100 3.70GHzIntel Core i5-8500 3.00GHzIntel Core i3-8100 3.60GHz
HDD 1TBSSD 500GBHDD 500GB
Windows10 Pro 64bitWindows10 Pro 64bitWindows10 Pro 64bit
Access Runtime 2013 32bitAccess Runtime 2013 32bitAccess Runtime 2013 32bit
Excel 2016 32bitExcel 2016 32bit OEMExcel 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のデバッグ→コンパイルは通っている状態です。

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

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

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

yoorwm

2019/03/06 08:00

これはつまり、accdbを共有サーバに置いて、複数人で使っている、という事ですか?
sazi

2019/03/06 08:48

リンクテーブルをNASではなくローカルに配置してもエラーは発生しますか?
takepon1017

2019/03/08 01:02

すみません、言葉足らずでした。 システムは入力・集計用のフロントエンドと、データベース用のバックエンドの2つのファイルに分かれており、バックエンド上のテーブルをフロントエンドがリンクテーブルとして読み書きしている状態です。 フロントエンドは各PCのローカルに同一のものを配布しており、バックエンドは各PCが見られるNAS上に置いています。 また、バックエンドをローカルに移しリンクテーブルの再設定をしてみましたが、特に変化は見られませんでした。 お二方、ご指摘ありがとうございました。 この内容は質問本文にも追記させていただきます。
yoorwm

2019/03/08 01:07

saziさんの書かれている通り、一旦、両方ともローカルに置いてエラーが出る事があるのか?を調べてみると良いかと思います。 というか、accdbって、複数人で使うように出来ていないと思いますよ?ちょっと調べて見てください。 (確か、大昔にうちで動かしていたAccessのシステムは、バックエンドがPostgreSQLでした。)
sazi

2019/03/08 02:00 編集

コメントしたのは、PC環境にはネットワーク構成も含まれていると思ったからです。 リンクテーブルをローカルに配置して、エラーが発生しなければ、ネットワーク環境が要因とも考えられるからです。
sazi

2019/03/08 02:36

BIOSのアップデートが無いか確認してみて下さい。
takepon1017

2019/03/08 04:31

フロントエンドについては当初よりローカルに配置しています。 今朝のテストではバックエンドをローカルに移し、あえてネットワークを遮断した上で実行していました。 もともと1ファイルのシステムだったものを、無理やり複数のPCで使えるようにしているような経緯もあります。 PCによって問題なく動作もしていますが、この際ちゃんとした複数台への対応を考えた方が良いかもしれませんね…。
takepon1017

2019/03/11 00:22 編集

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

2019/03/12 14:43

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

2019/03/13 04:55

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

回答3

0

ベストアンサー

ランタイムも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/21 00:39

sazi

総合スコア25138

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

takepon1017

2019/03/22 06: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』に関しては、デフォルトでチェックが付いていたことと、外そうとすると『使用中のコントロールまたは参照を削除することはできません』とメッセージが出ることから、そのままにしてあります。
sazi

2019/03/22 07:46

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

0

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

複数の環境で動作させる場合は、参照設定は必要最小限に留める。

Dim xls As Excel.Application

Dim xls As Object

Set xls = New Excel.Application

Set xls = CreateObject("Excel.Application")

投稿2019/03/07 03:48

iruyas

総合スコア1067

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

takepon1017

2019/03/08 01:47

お教えいただいた通りコードを編集し、参照設定からEXCEL Object Libraryを外したところ、EXCEL.EXEのダイアログは出なくなりました。 結果としては、今まで見逃していたであろう『MSO.DLL を検索しています』が一度だけ表示される形となりましたが、これも同じく参照設定からOfficeを外すようにコードを編集すれば何とかなりそうです。 Excelの操作を行うには参照設定が必須なものと思い込んでいました。 体系的でなく行き当たりばったりの独学で学ぶと、理由もわからないまま使う『おまじない』のようなものが多いなぁと反省しているところです。 ご回答ありがとうございました。
guest

0

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

投稿2019/03/13 12:19

iruyas

総合スコア1067

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

takepon1017

2019/03/14 04:29

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問