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

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

新規登録して質問してみよう
ただいま回答率
85.47%
VBA

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

Access

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

Q&A

解決済

2回答

331閲覧

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

syuu07

総合スコア11

VBA

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

Access

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

0グッド

0クリップ

投稿2024/04/22 02:06

編集2024/04/23 04:22

実現したいこと

Microsoft Access 2021(.accdb)で作成したaccessファイルを他のPCにあるMicrosoft Access 2016 runtimeで起動したいのですが、エラーが発生してしまい実行することができません。
自分のPCで開いた時には発生しなかったのですが、どうすれば解決できるでしょうか?
初心者で申し訳ございませんが、ご教授の方よろしくお願いします。

発生している問題・分からないこと

テーブルを開きボタンをクリック時に発生するVBAが実行されると、下記のエラーが発生しています。
自分のパソコンではエラーは表示されず実行できましたが、別のパソコンで同じaccessのデータを実行時にエラーが出ました。

エラーメッセージ

error

1「実行時エラーが発生したため、このアプリケーションの実行は中断しました。 2アプリケーションを続行できません。システムはシャットダウンされます。」

該当のソースコード

'ボタンを押した際のイベント Private Sub btnログイン_Click() Dim strSQL As String Dim rs As ADODB.Recordset Dim cn As ADODB.Connection Dim str社員コード As String Dim strパスワード As String Dim int権限区分 As Integer str社員コード = Me.txt社員コード & "" strパスワード = Me.txtパスワード & "" strSQL = "SELECT [社員リスト].[社員コード], [社員リスト].[社員名], [パスワードリスト].[パスワード], [パスワードリスト].[権限区分]" strSQL = strSQL & "FROM [社員リスト] LEFT JOIN [パスワードリスト] ON [社員リスト].[社員コード] = [パスワードリスト].[社員コード]" strSQL = strSQL & "WHERE [社員リスト].[社員コード] = '" & str社員コード & "' AND [パスワードリスト].[パスワード] = '" & strパスワード & "' " 'Call ADO内部接続 'またはADO外部接続 Set cn = CurrentProject.AccessConnection Set rs = New ADODB.Recordset rs.Open strSQL, cn, adOpenKeyset, adLockOptimistic If rs.EOF = False Then MsgBox "ようこそ" int権限区分 = rs![権限区分] 'メニューを開く DoCmd.OpenForm "メインメニュー" '権限を確認して「環境設定ボタン」を制御する If int権限区分 = 9 Then '0:一般ユーザー 9:管理者 Forms.メインメニュー.btn設定.Enabled = True Else Forms.メインメニュー.btn設定.Enabled = False End If 'この画面を閉じる DoCmd.Close acForm, Me.Name Else MsgBox "データは存在しません" End If rs.Close: Set rs = Nothing cn.Close: Set cn = Nothing End Sub 'フォームの[開く時]イベントの処理 Public Function RefreshAllTableLinks() As Boolean On Error GoTo Err_RefreshAllTableLinks '既定の戻り値(失敗時)は False RefreshAllTableLinks = False Dim db As DAO.Database Dim tdf As DAO.TableDef Dim strConnect As String Dim lngRefreshedCount As Long strConnect = "ODBC;DRIVER=SQL Server との接続に用いるドライバー名;" & _ "SERVER=SQL Server インスタンス名;" & _ "UID=接続ユーザー名;" & _ "PWD=パスワード;" & _ "DATABASE=データベース名;" Debug.Print strConnect Application.Echo False, "リンクテーブルの再リンクを実行しています" 'カレントデータベースの参照 Set db = CurrentDb 'データベースの全てのテーブル定義を順次参照する For Each tdf In db.TableDefs 'ODBCリンクテーブルである場合 If (Not tdf.Name Like "MSys*") And (tdf.Connect Like "ODBC;*") Then Debug.Print "テーブル定義[" & tdf.Name & "]を参照中" '接続文字列を更新 tdf.Connect = strConnect 'リンクのリフレッシュ tdf.RefreshLink '再リンクカウンターをインクリメント lngRefreshedCount = lngRefreshedCount + 1 Debug.Print "再リンク成功" End If Next Debug.Print lngRefreshedCount & " 個のリンクテーブルの再リンクを実行しました。" Application.Echo False, "パススルークエリの接続文字列の再設定を実行しています" Dim qdf As DAO.QueryDef lngRefreshedCount = 0 'データベースの全てのクエリ定義を順次参照する For Each qdf In db.QueryDefs 'パススルークエリである場合 If (qdf.Type = dbQSQLPassThrough) And (qdf.Connect Like "ODBC;*") Then Debug.Print "パススルークエリ[" & qdf.Name & "]を参照中" '接続文字列を更新 qdf.Connect = strConnect '再リンクカウンターをインクリメント lngRefreshedCount = lngRefreshedCount + 1 Debug.Print "接続文字列の再設定成功" End If Next Debug.Print lngRefreshedCount & " 個のパススルークエリの接続文字列の再設定を実行しました。" '全て成功したら True を返す RefreshAllTableLinks = True Exit_RefreshAllTableLinks: Application.Echo True, "" Set tdf = Nothing Set db = Nothing Exit Function 'エラー時処理 Err_RefreshAllTableLinks: Application.Echo True, "" Dim strErrMsg As String strErrMsg = "再リンク処理中に以下の実行時エラーが発生しました。" & vbCrLf & _ Err.Number & ": " & Err.Description Debug.Print strErrMsg MsgBox strErrMsg, _ vbCritical, _ "実行時エラー(RefreshAllTableLinks)" Resume Exit_RefreshAllTableLinks End Function 'フォームの[開く時]イベント Private Sub Form_Open(Cancel As Integer) 'リンクテーブルの再リンク処理を実行 If RefreshAllTableLinks() = False Then '失敗した場合はこのイベントをキャンセルする(このフォームを開くのを止める) Cancel = True Exit Sub End If End Sub

試したこと・調べたこと

  • teratailやGoogle等で検索した
  • ソースコードを自分なりに変更した
  • 知人に聞いた
  • その他
上記の詳細・結果

https://t-yumi.jp/gengo/access/201809251222501031.html
→Set rec = db.OpenRecordset(strSql, dbOpenDynaset)がないため変更不可

https://pentan.net/access-pro-runtime-kidouhouhou/
→自分のPCで.accdrに変更し実行したがエラーは起きなかった

・再起動→意味なし
・データベースの最適化、修復→意味なし

補足

自分のPC
Microsoft Access 2021(.accdb)
・ODBC  プラットフォーム 32/64ビット ドライバー  SQL Server
・リンクテーブルにてODBC接続
・Windows11
・64bit
・参照設定
イメージ説明

エラーが起きるPC
・Microsoft Access 2016 runtime
・Windows11

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

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

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

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

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

sazi

2024/04/23 01:11

解決済みですが、根本の原因については解決してはいないと思いますが大丈夫でしょうか。
syuu07

2024/04/23 01:55

コメントありがとうございます。 事前バインディングと実行時バインディングの違いを理解していないため現状は別のやり方で動かすことにしました。 行き詰った場合はコードを書き直し新たな質問として投稿することにします。
sazi

2024/04/23 03:47 編集

Runtimeのバージョン違いは、バインディングとは関係ありません。 単に回避によって問題を先送りしているだけなので、後にRuntimeの再配布などにならなければいいですけど。
syuu07

2024/04/23 04:21 編集

コメントありがとうございます。 https://support.microsoft.com/ja-jp/office/microsoft-365-access-runtime-%E3%82%92%E3%83%80%E3%82%A6%E3%83%B3%E3%83%AD%E3%83%BC%E3%83%89%E3%81%97%E3%81%A6%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%88%E3%83%BC%E3%83%AB%E3%81%99%E3%82%8B-185c5a32-8ba9-491e-ac76-91cbe3ea09c9 バージョン違いについてですが、上記のサイトにて32ビットと64ビットのruntimeがダウンロードできると思うのですが、動かない場合こちらのビット数を変えないと根本的に意味がないということでしょうか?
sazi

2024/04/23 07:46 編集

> 動かない場合こちらのビット数を変えないと根本的に意味がないということでしょうか? Runtimeへの下位互換があるかどうかが明確なら問題無いでしょうけど、Accessのバージョンを合わせるのは、ビット数以前の話だと思います。 その上で、ビット数による制限がありかつ利用環境によりビット数が制限されるなら、両方作成して配布という事が必要になるかもしれません。
syuu07

2024/04/23 08:14

https://tasukete-access.com/2021/05/18/accessintro_runtime/ accessとruntimeについて調べたのですが、上記のサイトによると「ACCESS2019以降の方はMicrosoft365のACCESS Runtimeが利用できる」と記述されています。 自分のPCであるaccessが「Microsoft Access 2021」のため、「Microsoft 365 Access Runtime」に合わせる必要があるでしょうか?
sazi

2024/04/23 13:39 編集

> 自分のPCであるaccessが「Microsoft Access 2021」のため、「Microsoft 365 Access Runtime」に合わせる必要があるでしょうか? どういう事を言われているのかよく理解できませんが、Runtimeに合わせるなどという場面は普通発生しません。 開発したACCESSのバージョンに合わせて、Runtimeを用意するのが普通です。 既に導入しているRuntimeがあり、それが変えられないという場合があるなら、そのRuntimeのバージョンに合わせたAccessで開発が必要です。 尤も、そういった場合でも、新しいRuntimeとするのが一般的です。
syuu07

2024/04/23 23:38

今回の場合、自分のPCであるaccessが「Microsoft Access 2021」のため、「Microsoft 365 Access Runtime」で起動させる必要があるということでしょうか?
sazi

2024/04/24 01:42 編集

「Microsoft Access 2021」で開発したものをRuntimeで動作させるなら、そのバージョンは「Microsoft 365 Access Runtime」という事になります。 新たに追加された機能などは、古いバージョンでは機能そのものが無く動作するはずもないので。
syuu07

2024/04/24 04:03

ご回答ありがとうございます。 runtimeのバージョンを変えるようにします。
sazi

2024/04/24 05:12

他の質問でもそうですけど、経過(どのように理解したかとか)の情報を含めずに、結果だけを返されるので、意図したことが伝わっているのか分からないんですよね・・・
syuu07

2024/04/24 07:16

大変申し訳ございません。 要望通りの経過を書けるように精進します。
guest

回答2

0

ベストアンサー

他のパソコンに配布する場合は、参照設定のバージョン違い問題が発生する可能性があるので、
実行時バインディングに変更してから配布すべきです。

事前バインディングと実行時バインディングの違い


環境によるバージョン違い等の影響を受けるADODBの代わりにDLookup関数を使う方法に書き換えるコード例です。

vba

1'ボタンを押した際のイベント 2Private Sub btnログイン_Click() 3 Dim str社員コード As String 4 Dim strパスワード As String 5 Dim var権限区分 As Variant 6 str社員コード = Me.txt社員コード 7 strパスワード = Me.txtパスワード 8 var権限区分 = DLookup("権限区分", "パスワードリスト", "社員コード='" & str社員コード & "' AND パスワード='" & strパスワード & "'") 9 10 If IsNull(var権限区分) Then 11 MsgBox "データは存在しません" 12 Else 13 MsgBox "ようこそ" 14 'メニューを開く 15 DoCmd.OpenForm "メインメニュー" 16 '権限を確認して「環境設定ボタン」を制御する 17 If var権限区分 = 9 Then '0:一般ユーザー 9:管理者 18 Forms.メインメニュー.btn設定.Enabled = True 19 Else 20 Forms.メインメニュー.btn設定.Enabled = False 21 End If 22 'この画面を閉じる 23 DoCmd.Close acForm, Me.Name 24 End If 25End Sub

投稿2024/04/22 02:58

編集2024/04/22 16:42
hatena19

総合スコア33757

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

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

syuu07

2024/04/22 05:01 編集

ご回答ありがとうございます。 実行時バインディングで試したところエラーが発生しました。どのように変更すれば解決できるでしょうか? 'ボタンを押した際のイベント Private Sub btnログイン_Click() Dim strSQL As String Dim rs As ADODB.Recordset Dim cn As ADODB.Connection Dim str社員コード As String Dim strパスワード As String Dim int権限区分 As Integer 追加したコード -------------------------------------- Dim fso As Object Dim f As Object Set fso = CreateObject("Scripting.FileSystemObject") Set f = fs.GetFolder("C:\Users\Documents") ----------------------------------------------------------- str社員コード = Me.txt社員コード & "" strパスワード = Me.txtパスワード & "" strSQL = "SELECT [社員リスト].[社員コード], [社員リスト].[社員名], [パスワードリスト].[パスワード], [パスワードリスト].[権限区分]" strSQL = strSQL & "FROM [社員リスト] LEFT JOIN [パスワードリスト] ON [社員リスト].[社員コード] = [パスワードリスト].[社員コード]" strSQL = strSQL & "WHERE [社員リスト].[社員コード] = '" & str社員コード & "' AND [パスワードリスト].[パスワード] = '" & strパスワード & "' " 'Call ADO内部接続 'またはADO外部接続 Set cn = CurrentProject.AccessConnection Set rs = New ADODB.Recordset rs.Open strSQL, cn, adOpenKeyset, adLockOptimistic If rs.EOF = False Then MsgBox "ようこそ" int権限区分 = rs![権限区分] 'メニューを開く DoCmd.OpenForm "メインメニュー" '権限を確認して「環境設定ボタン」を制御する If int権限区分 = 9 Then '0:一般ユーザー 9:管理者 Forms.メインメニュー.btn設定.Enabled = True Else Forms.メインメニュー.btn設定.Enabled = False End If 'この画面を閉じる DoCmd.Close acForm, Me.Name Else MsgBox "データは存在しません" End If rs.Close: Set rs = Nothing cn.Close: Set cn = Nothing End Sub エラー内容 コンパイルエラー: 変数が定義されていません 変数定義後 Dim fso As Object Dim f As Object Dim fs As Object Set fso = CreateObject("Scripting.FileSystemObject") Set f = fs.GetFolder("C:\Users\Documents") 実行エラー'91'; オブジェクトまたはWithブロック変数が設定されていません。
hatena19

2024/04/22 16:21

リンク先のコードはFileSystemObject オブジェクトを使う場合の一例ですので、そのコードをそのままコピーしても無意味です。 事前バインディングと実行時バインディングの違いを理解してもらうために紹介したものですので、まずは内容を理解してください。 「VBA 事前バインディング 実行時バインディング」で検索すると解説ページがいろいろ見つかるのでそこで研究してみてください。 ADODBを使っている部分の実行時バインディングに書き方は、下記にコード例があります。 https://ray88.hatenablog.com/entry/2020/07/19/103915
hatena19

2024/04/22 16:43

質問のコードを精査してみましたが、わざわざADODBを使わなくてもDLookup関数で代用できる内容でした。 回答のほうにADODBを使わないコードを追記しておきますのでそれで試してみてください。
syuu07

2024/04/23 00:24

丁寧なご回答ありがとうございます。 事前バインディングと実行時バインディングについて勉強不足で申し訳ございません。 サイトからコードを試し勉強していきます。 追記されたコードを確認したところ、無事動くことができました。 ここまで教えてくださって本当にありがとうございました。
guest

0

投稿2024/04/22 02:27

sazi

総合スコア25197

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

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

syuu07

2024/04/22 05:03

ご回答ありがとうございます。 他のPCにあるMicrosoft Access 2016 runtimeのビット数を変えて実行してみます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.47%

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

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

質問する

関連した質問