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

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

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

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

Access

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

Q&A

1回答

1405閲覧

Access2021 他のPCでの実行時エラー'-2147467259(80004005)が解決できない

syuu07

総合スコア14

VBA

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

Access

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

0グッド

0クリップ

投稿2024/04/02 23:58

編集2024/04/06 02:18

実現したいこと

Accessでリンクテーブルが設定されているツールでのエラーが発生してしまいます。自分のPCで開いた時には発生しなかったのですが、どうすれば解決できるでしょうか?
初心者で申し訳ございませんが、ご教授の方よろしくお願いします。

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

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

エラーメッセージ

error

1実行時エラー'-2147467259(80004005)': 2ODBC--'接続先'への接続が失敗しました。  3

該当のソースコード

VBA

1エラーが発生したVBAコード 2 3Dim strSQL As String 4Dim rs As ADODB.Recordset 5Dim cn As ADODB.Connection 6Dim str社員コード As String 7Dim strパスワード As String 8Dim int権限区分 As Integer 9 10str社員コード = Me.txt社員コード & "" 11strパスワード = Me.txtパスワード & "" 12 13strSQL = "SELECT [社員リスト].[社員コード], [社員リスト].[社員名], [パスワードリスト].[パスワード], [パスワードリスト].[権限区分]" 14strSQL = strSQL & "FROM [社員リスト] LEFT JOIN [パスワードリスト] ON [社員リスト].[社員コード] = [パスワードリスト].[社員コード]" 15strSQL = strSQL & "WHERE [社員リスト].[社員コード] = '" & str社員コード & "' AND [パスワードリスト].[パスワード] = '" & strパスワード & "' " 16 17 18 19Set cn = CurrentProject.AccessConnection 20Set rs = New ADODB.Recordset 21 22エラーの線がある場所 23 24----------------------------------- 25rs.Open strSQL, cn, adOpenKeyset, adLockOptimistic 26----------------------------------- 27 28If rs.EOF = False Then 29 30MsgBox "ようこそ" 31int権限区分 = rs![権限区分] 32 33'メニューを開く 34DoCmd.OpenForm "メインメニュー" 35 36'権限を確認して「環境設定ボタン」を制御する 37If int権限区分 = 9 Then '0:一般ユーザー 9:管理者 38Forms.メインメニュー.btn設定.Enabled = True 39Else 40Forms.メインメニュー.btn設定.Enabled = False 41End If 42 43'この画面を閉じる 44DoCmd.Close acForm, Me.Name 45 46Else 47 48MsgBox "データは存在しません" 49 50End If 51 52rs.Close: Set rs = Nothing 53cn.Close: Set cn = Nothing 54 55

試したこと・調べたこと

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

・teratailで同じエラーを見つけましたがODBCの32bitや64bit関連のエラーかと推測しました。
しかし、どのように変更すればいいのかがわかりません。
該当するSQLServerにある、ODBCのプラットフォームを見ても「32/64ビット」と書かれており問題があるかが不明です。

補足

Microsoft Access 2021(.accdb)

・ODBC  プラットフォーム 32/64ビット ドライバー  SQL Server

・リンクテーブルにてODBC接続

参考にした動画(16:00~)
https://www.youtube.com/watch?v=V75qtW-VBUw&list=PLK0z_eKZxdJs53V8Tw_svmfVI1RyhNw33&index=50

・参照設定
イメージ説明

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

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

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

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

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

sk.exe

2024/04/03 01:53 編集

> 別のパソコンで同じaccessのデータを実行時にエラーが出ました。 > ODBC--'接続先'への接続が失敗しました。 「別のパソコン」上でリンクテーブルを開くことが出来ていない(SQL Server データベースとの接続が確立されていない)からではないでしょうか。 例えばナビゲーションウィンドウからいずれかのリンクテーブルを選択し、データシートビューで開こうとした際に何らかのエラーメッセージが返されるか、IDとパスワードの再入力を求めるダイアログが開かれる状況ならば、そのリンクテーブルのリンクの再更新を行う必要があります。 その場合は、その .accdb ファイル上の全てのリンクテーブルのリンクの再更新を実行するプロシージャをあらかじめ作成しておき、Access上でその .accdb ファイルが開かれた際(AutoExec マクロやスタートアップフォームの Open イベントなど)にそのプロシージャを呼び出すようになさればよいと思います。
syuu07

2024/04/03 06:06

コメントありがとうございます。 別のPCでもSQL Server データベースとの接続をすることにしました。 結果、動くことができました。 しかし、最後の文を処理にすることができずスタートアップフォームの Open イベントににそのプロシージャを呼び出すようにするにはどうすればよいでしょうか? Accessの起動時にフォームを呼び出すことは「Accessのオプション」から可能ですが、処理としてプロシージャを呼び出せるのでしょうか?
sk.exe

2024/04/03 06:41

> Accessの起動時にフォームを呼び出すことは「Accessのオプション」から可能 起動時に開くフォーム(スタートアップフォーム)が既に設定されているのであれば、 標準モジュール上に作成した「その .accdb ファイル上の全てのリンクテーブルの リンクの再更新を実行する Function プロシージャ」を Call するコードを そのフォームのイベントプロシージャ( Form_Open )に記述なさればよろしいでしょう。 スタートアップフォームを設定しない場合は、"AutoExec" という名前の マクロオブジェクト(起動時自動実行マクロ)を作成し、そのマクロの [プロシージャの実行]アクションによって上記の Function プロシージャを 呼び出すようにしておきます。 あとはその Function プロシージャをどのように記述するかの問題です。
syuu07

2024/04/03 08:16 編集

コメントありがとうございます。 概要は理解しました。ODBC接続の場合PCの度に接続しないといけないんですね。 起動時に開くフォーム(スタートアップフォーム)が既に設定されているため、そのフォームにあるForm_Openにコードを入れるつもりです。 「 .accdb ファイル上の全てのリンクテーブルのリンクの再更新を実行する Function プロシージャ」 しかし、Function プロシージャについての理解が全くないため勉強してから入れようと思います........。
guest

回答1

0

起動時に開くフォーム(スタートアップフォーム)が既に設定されているため、そのフォームにあるForm_Openにコードを入れるつもりです。

.accdb ファイル内の全てのリンクテーブルの参照先データべースが同一である場合は、
例えば次のようなイメージとなるでしょう。

標準モジュール

vba

1Public Function RefreshAllTableLinks() As Boolean 2On Error GoTo Err_RefreshAllTableLinks 3 4 '既定の戻り値(失敗時)は False 5 RefreshAllTableLinks = False 6 7 Dim db As DAO.Database 8 Dim tdf As DAO.TableDef 9 Dim strConnect As String 10 Dim lngRefreshedCount As Long 11 12 strConnect = "ODBC;DRIVER=SQL Server との接続に用いるドライバー名;" & _ 13 "SERVER=SQL Server インスタンス名;" & _ 14 "UID=接続ユーザー名;" & _ 15 "PWD=パスワード;" & _ 16 "DATABASE=データベース名;" 17 18 Debug.Print strConnect 19 20 Application.Echo False, "リンクテーブルの再リンクを実行しています" 21 22 'カレントデータベースの参照 23 Set db = CurrentDb 24 25 'データベースの全てのテーブル定義を順次参照する 26 For Each tdf In db.TableDefs 27 'ODBCリンクテーブルである場合 28 If (Not tdf.Name Like "MSys*") And (tdf.Connect Like "ODBC;*") Then 29 Debug.Print "テーブル定義[" & tdf.Name & "]を参照中" 30 '接続文字列を更新 31 tdf.Connect = strConnect 32 'リンクのリフレッシュ 33 tdf.RefreshLink 34 '再リンクカウンターをインクリメント 35 lngRefreshedCount = lngRefreshedCount + 1 36 Debug.Print "再リンク成功" 37 End If 38 Next 39 40 Debug.Print lngRefreshedCount & " 個のリンクテーブルの再リンクを実行しました。" 41 42 Application.Echo False, "パススルークエリの接続文字列の再設定を実行しています" 43 44 Dim qdf As DAO.QueryDef 45 46 lngRefreshedCount = 0 47 48 'データベースの全てのクエリ定義を順次参照する 49 For Each qdf In db.QueryDefs 50 'パススルークエリである場合 51 If (qdf.Type = dbQSQLPassThrough) And (qdf.Connect Like "ODBC;*") Then 52 Debug.Print "パススルークエリ[" & qdf.Name & "]を参照中" 53 '接続文字列を更新 54 qdf.Connect = strConnect 55 '再リンクカウンターをインクリメント 56 lngRefreshedCount = lngRefreshedCount + 1 57 Debug.Print "接続文字列の再設定成功" 58 End If 59 Next 60 61 Debug.Print lngRefreshedCount & " 個のパススルークエリの接続文字列の再設定を実行しました。" 62 63 '全て成功したら True を返す 64 RefreshAllTableLinks = True 65 66Exit_RefreshAllTableLinks: 67 68 Application.Echo True, "" 69 70 Set tdf = Nothing 71 Set db = Nothing 72 73 Exit Function 74 75'エラー時処理 76Err_RefreshAllTableLinks: 77 78 Application.Echo True, "" 79 80 Dim strErrMsg As String 81 82 strErrMsg = "再リンク処理中に以下の実行時エラーが発生しました。" & vbCrLf & _ 83 Err.Number & ": " & Err.Description 84 85 Debug.Print strErrMsg 86 87 MsgBox strErrMsg, _ 88 vbCritical, _ 89 "実行時エラー(RefreshAllTableLinks)" 90 91 Resume Exit_RefreshAllTableLinks 92End Function

(2024/04/09 14:01 パススルークエリの接続文字列の再設定を行うコードを追記しました)

スタートアップフォームのフォームモジュール

vba

1'フォームの[開く時]イベント 2Private Sub Form_Open(Cancel As Integer) 3 4 'リンクテーブルの再リンク処理を実行 5 If RefreshAllTableLinks() = False Then 6 '失敗した場合はこのイベントをキャンセルする(このフォームを開くのを止める) 7 Cancel = True 8 Exit Sub 9 End If 10 11End Sub

留意点

  • 各リンクテーブルに設定する接続文字列は、既存のリンクテーブルに設定されているもの等を参考にして適宜書き換えること。

  • 実際の運用(作成した .accdb ファイルをフロンドエンドとして配布する際)において、SQL Server との接続に用いるユーザーIDとパスワード等をモジュールにハードコーティングすることは(セキュリティの観点から)極力避けること。

投稿2024/04/03 08:53

編集2024/04/09 05:01
sk.exe

総合スコア908

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

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

syuu07

2024/04/06 04:22 編集

回答ありがとうございます。 無事再リンクすることができましたが別フォームにて同様のエラーが発生しました。 実行エラー 3151 ODBC--'接続先'への接続が失敗しました。  ODBC接続文字列:ODBC;ODBC;DSN=データソース名;UID=ユーザー名;PWD=パスワード;DATABASE=DB名;LANGUAGE=日本語 パススルークエリを使ったフォームのみ接続先へ開けなくなったのですが何か原因があるでしょうか? Functionにコードを入れる前は接続先へアクセスできていました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.40%

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

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

質問する

関連した質問