Access (VBA)

Access VBAに関するフォーラムです。
  • 掲示板への投稿には会員登録(無料)が必要です。会員登録がまだの方はこちら
  • 掲示板ご利用上のお願い」に反するご記入はご遠慮ください。
  • Q&A掲示板の使い方はこちらをご覧ください
トピックに返信
質問

 
(Windows 10 Home : Access 2010)
環境によるRUNTIMEの動作の違いについて
投稿日時: 20/11/19 23:57:15
投稿者: KO-YUTA

初めまして、宜しくお願い致します。
 
現在、Access2010で作成したaccdbを、3代のPCで、AccessRuntime2010で動かそうとしています。
それぞれ環境が異なっているせいなのか、実行結果が全く異なっていて、どう対応すべきかわかりません。
 
<環境>
 
<開発環境>   win10  Access2010
※実行環境PCとは別のPCです。
※リンク先も、このPCで作成したaccdbです。
 
<実行環境>
PC1     win10  AccessRuntime2010sp2(32bit)(インストールしているoffice=2010、Accessはなし)
PC2    win10  AccessRuntime2010sp2(32bit)(インストールしているoffice=365、Accessはなし)
PC3    win7SP1 AccessRuntime2010sp2(64bit)(インストールしているoffice=2010、Accessはなし)
 
参照設定
VisualBasicForApplication
MicrosoftAccess 14.0 ObjectLibrary
MicrosoftOffice 14.0 Access database engine ObjectLibrary
MicrosoftExcel 14.0 Object Library
MicrosoftOutlook 14.0 Object Library
Microsoft Office 14.0 Object Library
 
<モジュールの内容>
ファイルダイアログを表示し、選択したファイル(.accdb)内のテーブルにリンクする。
既にリンクテーブルは存在し、そのリンク先を変更する仕組み。
 
<実行結果>
PC1:エラーなしで、リンク成功。
PC2:ダイアログで選択したファイルをリンクするところでエラー
  (パスは正確に取得できている)
        TableDef.Connect = ";DATABASE=" & strPath & ";TABLE=" & TableDef.Name
        TableDef.RefreshLink ' リンク情報の更新
PC3:マクロ「autoexec」を指定しているとエラー
  (「autoexec」内で呼び出している、上記テーブルリンクのモジュールを、起動したフォームのボタンから呼び出して実行することは可能)
 
PC1は私の環境なのですが、私の環境では動いてしまっているうえ、PC2とPC3でも異なるエラーが出るので、対応しきれなくなっています。
 
何か根本的なことを間違えているのでしょうか。
RUNTIME版を使用するにあたって、
・RUNTIME版のバージョンとOfficeのバージョンまたはwindowsの組み合わせはあっているのか?
・32ビットと64ビット、両方で動くaccdbを作成することは可能なのか?そのためには何が必要なのか?
等、何かご存知のことがあれば教えてください。
 
宜しくお願い致します。

回答
投稿日時: 20/11/20 09:35:53
投稿者: Suzu

引用:
PC1は私の環境なのですが、私の環境では動いてしまっているうえ、PC2とPC3でも異なるエラーが出るので、対応しきれなくなっています。

 
そうならないよう、動作確認・テストを行います。
ソフトウェアは動作環境を明記されていますよね?
 
 
引用:
・RUNTIME版のバージョンとOfficeのバージョンまたはwindowsの組み合わせはあっているのか?

【合う】とは、どういう状況をおっしゃっていますか?
Runtime版が、そのWindowsにて使用(インストール)できるかという意味でしょうか?
 
 
基本は、開発環境は、使用環境に合わせる事です。
(Windows・Office・Runtime において、バージョン・ビット Accessのインストール有・無)
 
使用環境にてエラーが出るのであれば、そのバージョン・ビットに合わせた開発環境を用意します。
【AccessをRuntime版に移行する際の5つの注意点】
https://www.ait-labo.com/excel_access/1246/
 
 
引用:
・32ビットと64ビット、両方で動くaccdbを作成することは可能なのか?そのためには何が必要なのか?

 
32ビット/64ビット 環境違いにて問題となるのは、使用する DLL が違う事です。
DLLが違うという事で良く起こるのは、
・ODBCドライバ
・API宣言
になります。
 
 
今回は、
引用:
<モジュールの内容>
ファイルダイアログを表示し、選択したファイル(.accdb)内のテーブルにリンクする。
既にリンクテーブルは存在し、そのリンク先を変更する仕組み。

との事ですので、ODBCドライバの問題ではないのか と推測します。
 
【64ビットWindowsには、なぜ32ビットと64ビットのODBCが存在するのか?】
https://www.idearu.info/article/data/ds1034
辺りが参考になるでしょう。
 
 
ただ、ODBCやAPI のみに気をつければエラーが発生しないとは限りません。
なのでテストを行います。机上の推測で事足りる話ではありませんので
引用:
そのためには何が必要なのか?
をこれだけやれば大丈夫と断言はできません。
 
少なくとも
【Office の 32 ビット バージョンと 64 ビット バージョン間の互換性】
https://docs.microsoft.com/ja-jp/office/client-developer/shared/compatibility-between-the-32-bit-and-64-bit-versions-of-office
 
【Access アプリケーションを展開する】
https://support.microsoft.com/ja-jp/office/access-%E3%82%A2%E3%83%97%E3%83%AA%E3%82%B1%E3%83%BC%E3%82%B7%E3%83%A7%E3%83%B3%E3%82%92%E5%B1%95%E9%96%8B%E3%81%99%E3%82%8B-7bb4f2ba-30ee-458c-a673-102dc34bf14f
 
【Access2019ランタイムの動作確認方法おすすめ4つ】
https://access-support.jp/column/access-2019-runtime-4-way/
は読んでおいたほうが良いでしょう。

投稿日時: 20/11/20 13:07:28
投稿者: KO-YUTA

ご回答、ありがとうございます。
 
実行環境と同じ環境で開発する、ということが難しく(環境を同じくすることが可能なPCが見当たりません)、
実行してエラーがでて、開発環境で「ここかな?」というところをチェックするしかありませんでした。
 
ただ、教えて頂いたサイトでかなりのヒントを得ることができたので、
よく読み込んで、各実行環境で動くように修正を加えていきます。
 
まずは、

引用:
32ビット/64ビット 環境違いにて問題となるのは、使用する DLL が違う事です。
DLLが違うという事で良く起こるのは、
・ODBCドライバ
・API宣言
になります。
  
  
今回は、
 
<モジュールの内容>
ファイルダイアログを表示し、選択したファイル(.accdb)内のテーブルにリンクする。
既にリンクテーブルは存在し、そのリンク先を変更する仕組み。
 
との事ですので、ODBCドライバの問題ではないのか と推測します。
  
【64ビットWindowsには、なぜ32ビットと64ビットのODBCが存在するのか?】
https://www.idearu.info/article/data/ds1034
辺りが参考になるでしょう。

ここから取り組んでみます。
 
まだ不安がぬぐえませんので、もう少し、「解決済み」は保留にさせてください。
 
他にも何かあれば、ご指摘いただけると助かります。
宜しくお願い致します。

回答
投稿日時: 20/11/20 17:27:57
投稿者: Suzu

少なくとも、同じバージョンの Accessがあれば、
ランタイムモードで起動をする事はできますので、助けにはなるかと思います。
 
エラーが出ない様にするのは、一個一個確認し、改善するしかないと思います。
がんばってください。

投稿日時: 20/11/22 00:26:08
投稿者: KO-YUTA

引用:
少なくとも、同じバージョンの Accessがあれば、
ランタイムモードで起動をする事はできますので、助けにはなるかと思います。

  
そうなんですね、私のPCにだけACCESSを入れるのであればそこまでコストもかかりませんし、相談してみます。
 
引用:
エラーが出ない様にするのは、一個一個確認し、改善するしかないと思います。
がんばってください。

 
ありがとうございます、頑張ります!
分かったことなどあれば、また、ご報告させて頂きます。

投稿日時: 20/12/09 15:54:10
投稿者: KO-YUTA

御世話になります。
その後、いくつか対応を行いました。
 
・Office2010Win32API_Ptrsafe.exe を、32ビット、64ビット両方にインストール
・各モジュールに、以下文言を追加
 
**********
#If Win64 Then
   Public Declare PtrSafe Function MyMathFunc Lib "User32" (ByVal N As LongLong) As LongLong
    Public Declare PtrSafe Function RegOpenKeyA Lib "advapi32.dll" (ByVal Key As LongPtr, ByVal SubKey As String, NewKey As LongPtr) As Long
    'Declare PtrSafe Function RegOpenKeyA Lib "advapi32.dll" (ByVal Key As LongPtr, ByVal SubKey As String, NewKey As LongPtr) As Long
     
    Public Declare PtrSafe Function SHBrowseForFolder Lib "shell32.dll" _
      Alias "SHBrowseForFolderA" (lpBrowseInfo As BROWSEINFO) As Long
#Else
   Public Declare Function MyMathFunc Lib "User32" (ByVal N As Long) As Long
    Public Declare Function RegOpenKeyA Lib "advapi32.dll" (ByVal Key As LongPtr, ByVal SubKey As String, NewKey As LongPtr) As Long
    'Declare PtrSafe Function RegOpenKeyA Lib "advapi32.dll" (ByVal Key As LongPtr, ByVal SubKey As String, NewKey As LongPtr) As Long
     
    Public Declare Function SHBrowseForFolder Lib "shell32.dll" _
  Alias "SHBrowseForFolderA" (lpBrowseInfo As BROWSEINFO) As Long
#End If
********
**********
#If Win64 Then
    Private Declare PtrSafe Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long)
#Else
    Private Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long)
#End If
*********
 
上記対応で、「ファイル選択ダイアログ」が表示され、サーバにあるaccdbが選択可能になり、テーブルのリンクが成功しました。
 
しかしこの後、32ビットだけが、
実行ファイルが持っているテーブルに対して、更新・削除を行おうとすると、
更新の時のエラー3073:更新可能なクエリであることが必要です
削除の時のエラー3027:データベースまたはオブジェクトは読み取り専用なので更新できません
と表示されてしまい、処理が進みません。
 
更新は、モジュールにて
        strSQL = "UPDATE TM_Dataファイルパス SET " & _
                      " TM_Dataファイルパス.[パス] = '" & strPath & "'" & _
                      " WHERE (((TM_Dataファイルパス.ID)=1));"
    Set db = CurrentDb
    Set rs = db.OpenRecordset("TM_希望地")
        DoCmd.SetWarnings False
        DoCmd.RunSQL strSQL
        DoCmd.SetWarnings True
 
削除は、ボタンクリック時のマクロで
メッセージの表示:いいえ
SQLの実行:delete * from TW_物件元データ;
     (トランザクションの使用:はい)
メッセージの表示:はい
フォームを開く:F_物件情報登録
 
上記のように、ごく簡単なsqlです。
 
また、「削除」の失敗のあと、どのボタンを押しても反応なしとなってしまいます。
 
問題が別の事に移ってしまいましたが、32ビット、64ビットで異なる動きをするという
大枠では同じなので、この質問で継続させてください。
 
どなたか、この状況の問題点・解決方法が分かる方がいらっしゃったら
どうか教えてください。
宜しくお願い致します。
 
 
 

回答
投稿日時: 20/12/09 17:04:36
投稿者: Suzu

VBA(SQL) でエラーになるのであれば、まず、手動(クエリ)で確認しましょう。
 

引用:
実行ファイルが持っているテーブルに対して、更新・削除を行おうとすると、
更新の時のエラー3073:更新可能なクエリであることが必要です
削除の時のエラー3027:データベースまたはオブジェクトは読み取り専用なので更新できません
と表示されてしまい、処理が進みません。
  
更新は、モジュールにて
        strSQL = "UPDATE TM_Dataファイルパス SET " & _
                      " TM_Dataファイルパス.[パス] = '" & strPath & "'"
& _
                      " WHERE (((TM_Dataファイルパス.ID)=1));"

 
テーブル『TM_Dataファイルパス』は、各実行ファイル側で間違いないですか?
 
そのテーブルを操作できるフォームを作成し、ランタイムにしたとき、
そのフォームから レコードの編集はできますか?

回答
投稿日時: 20/12/09 17:23:30
投稿者: Suzu

更新先が、リンクテーブル なのであり、
フォームでも更新できないのであれば、
  
リンクテーブルの設定 (ODBC) が正しく設定されているか確認してください。
  
  
それと、、
SQLでは、フォームの ID を使用しています。
このフォームは連結フォームですか?
  
その場合、そのフォームが、フォームのレコードソースとなるテーブルのレコードを
ロックしていることになります。
  
その上で、DAO の レコードセット と Docmd.RunSQL これらは
フォームとは、別ユーザー扱いになる事があります。
  
マクロで、SQLの実行 命令 トランザクションを使用している と仰っていますが、どうやって??
トランザクション ロールバック・コミット、マクロではできませんよね。。
 
 
少なくとも、ランタイム 配布の前に、クライアント/サーバー 環境での 開発をされた事はありますか?
開発用マシンの他に、テスト用の Accessの入ったマシンを用意し テスト等は実施されていますか?
  
その上で、ランタイムに着手するなら 出来ると思いますが、
クライアント/サーバー の開発経験がない状態で、
クライアント/サーバー と、ランタイム 共に初めての経験の中で 開発を作成するのは
とても敷居が高いと思いますよ。

投稿日時: 20/12/10 08:16:00
投稿者: KO-YUTA

引用:

テーブル『TM_Dataファイルパス』は、各実行ファイル側で間違いないですか?
  
そのテーブルを操作できるフォームを作成し、ランタイムにしたとき、
そのフォームから レコードの編集はできますか?

 
はい、実行ファイルで間違いありません。
64ビットPC、私の32ビットPCで実行できていたので、「テーブルを操作できるフォーム」という考えが思いつきませんでした。
やってみます!
 
引用:
QLでは、フォームの ID を使用しています。
このフォームは連結フォームですか?

   
削除の方は、連結フォームで使用しているテーブルをクリア(全件削除)してから、そのフォームを開きます。なので、
 
引用:
その場合、そのフォームが、フォームのレコードソースとなるテーブルのレコードを
ロックしていることになります。
   
その上で、DAO の レコードセット と Docmd.RunSQL これらは
フォームとは、別ユーザー扱いになる事があります。

   
この状態は起きていないと思います。更新クエリは、フォームとは連結しておらず、パスを保存しておくためだけのテーブルです。
 
引用:
マクロで、SQLの実行 命令 トランザクションを使用している と仰っていますが、どうやって??
トランザクション ロールバック・コミット、マクロではできませんよね。。

  
すみません、マクロで「SQLの実行」を選択した時にデフォルトで「トランザクション=はい」になっていたので、深く考えていませんでした。
 
引用:
少なくとも、ランタイム 配布の前に、クライアント/サーバー 環境での 開発をされた事はありますか?
開発用マシンの他に、テスト用の Accessの入ったマシンを用意し テスト等は実施されていますか?

 
開発をしたことはありますが、かなり以前の経験で、今の環境では、では、開発マシンの他にACCESSを入れる費用がなく、私のPCでランタイムを動かすことをテストとしていました。
私のPCだけでも、ACCESSを入れてみないと駄目ですね…相談してみます。
[/quote]

トピックに返信