Topへ

開発ブログ(Blog)

Accessラインタイムの要否とインストールbit数判定スクリプト

Microsoft-Accessはaccdb形式で実行するケースとaccde(コンパイル)形式で実行する場合で、実行可能環境が異なります。

accdb形式であれば、os及びofficeのbit数が32bitであろうと、64bitであろうと実行することが可能です。

ですがaccde形式の場合、MS-Accessの32bitがインストールしてあるマシンでコンパイルすると32bitモードでコンパイルされ、64bitがインストールされているマシンでコンパイルすると64bitモードでコンパイルされます。
64bitモードのaccdeファイルは32bitのofficeでは実行できませんし、32bitモードののaccdeファイルは64bitのofficeでは実行できません。

accdeファイルに変換するとどうなるかといいますと
・フォームの修正
・レポートの修正
・VBAコードの変更
ができなくなります。

OS及びインストールOfficeのbit数によって、アクセスランタイムとaccdeのbit数判定マトリックス

office

インストール

有無

access

バンドル有無

osの

bit数

officeの

bit数

Access

ランタイム

accdeファイル

あり

あり

32bit版

32bit版

不要

32bit版

あり

あり

64bit版

32bit版

不要

32bit版

あり

あり

64bit版

64bit版

不要

64bit版

あり

無し

32bit版

32bit版

32bit版

32bit版

あり

無し

64bit版

32bit版

32bit版

32bit版

あり

無し

64bit版

64bit版

64bit版

64bit版

無し

無し

32bit版

-

32bit版

32bit版

無し

無し

64bit版

-

64bit版

64bit版

無し

あり
32bit版

32bit版

-
 

不要

32bit版

無し

あり
64bit版

64bit版

-
 

不要

64bit版


※Office 2019以降のバージョンのインストールでは、 明示的に 32 ビット版を選択しなければ、64 ビット版の Office が自動的にインストールされます。

●判定バッチファイル
予約管理システムをaccdeファイルと読み替えてください。
以下の内容をコピーして拡張子をbatにして実行すると、必要なプログラムのbit数が判定できます。

@echo off

set isAccessExist=0
set officebit=0
rem ===== OSのbit数判定(共通プログラムフォルダ変数が空ならx86、それ以外ならx64)=====
call :osBitCheck

rem 予約システム(tineyReserve)インストール往路グラムのBit数判定と必要なランタイムモジュールの判定  updatedate 2022/02/03
rem 下記の例では拡張子.docxで判断している(officeには必ずwordが付いているため)
rem 関連付け判定  Wordなら .docx  Excelなら .xlsx Accessなら.accdb
rem assocでファイルタイプはWord.Document.12とわかり
for /f "tokens=2 delims==" %%a in ('assoc .docx') do @set workrel=%%a
rem ftypeでWord.Document.12に対応した起動アプリのフルパスがわかる"C:\Program Files (x86)\Microsoft Office\Root\Office16\WINWORD.EXE" /n "%1" /o "%u"
for /f "tokens=2 delims==" %%a in ('ftype %workrel%') do @set workpath=%%a

rem ==== Officeインストール判定 (wordが無ければofficeはインストール無しと見なす)=====
echo %workpath% | find /i "winword.exe" > nul
if %errorlevel% geq 1 goto notExistOffice

rem officeのbitcheck
call :officeBitCheck
call :accessCheck
if %isAccessExist%==1 (
  goto existAccess ) else (
  goto notExistAccess
)

:accessCheck
rem -------------------------------------------
rem accessがインストールされているかチェック
rem -------------------------------------------
for /f "tokens=2 delims==" %%a in ('assoc .accdb') do @set workrel=%%a
for /f "tokens=2 delims==" %%a in ('ftype %workrel%') do @set workpath=%%a
echo %workpath% | find /i "msaccess.exe" > nul
if %errorlevel%==0 (
   rem Accessインストール
   set isAccessExist=1
) else (
    rem Access未インストール
    set isAccessExist=0
)
call :officeBitCheck
exit /b

:osBitCheck
rem -------------------------------------------
rem OSビット数チェック
rem -------------------------------------------
echo %PROCESSOR_ARCHITECTURE% | find /i "x86" > nul
if %errorlevel%==0 (
    set bit=32
) else (
    set bit=64
)
exit /b

rem -------------------------------------------
rem Officeビット数チェック
rem -------------------------------------------
:officeBitCheck
rem ===== OSが32bitなら強制的にofficebitも32bitに設定 =====
if %bit%==32 (
    set officebit=32
    exit /b
    )
echo %workpath% | find /i "%ProgramFiles(x86)%" > nul
if %errorlevel%==0 (
       set officebit=32
 ) else (
       set officebit=64
 )
exit /b

rem ===== OfficeがインストールされているがAccessは含まれない場合 =====
:notExistAccess
echo ====================================================================================
echo %officebit%bit版ランタイムモジュールををダウンロード&実行してから、予約管理システム(tinyReserve:%officebit%bit版)をダウンロード&実行してください。
rem 2022/02/02現在 access365ランタイムがダウンロードできないため Access2016ランタイムのページを表示
rem start https://www.microsoft.com/ja-jp/download/details.aspx?id=50040
echo ====================================================================================
pause
exit /b

rem ===== Officeがインストールされていない場合 =====
:notExistOffice
call :accessCheck
rem OfficeがインストールされていなくてAccess単体でインストールされている場合
if %isAccessExist% == 1 goto existAccess
echo ====================================================================================
echo %bit%bit版ランタイムモジュールををダウンロード&実行してから、予約管理システム(tinyReserve:%bit%bit版)をダウンロード&実行してください。
rem 2022/02/02現在 access365ランタイムがダウンロードできないため Access2016ランタイムのページを表示
rem start https://www.microsoft.com/ja-jp/download/details.aspx?id=50040
echo ====================================================================================
pause
exit /b

rem ===== Office&Accessがインストールされている場合 =====
:existAccess
echo ============================================================================
echo 予約管理システム(tinyReserve:%officebit%bit版)のみをダウンロード&実行してください。
echo ============================================================================
pause
exit /b
 

RepaintとRefreshの違い

●Repaint
Repaint メソッドは、Access が他のタスクを実行している間に再描画が遅延した場合、画面を更新します。

●Refresh
フォームおよびデータシートに現在表示されているレコードに対してユーザーまたは他のユーザーが、基になるレコード ソースに対して行った変更を表示します。

関連するコマンド

●Echo
再描画をオンまたはオフにする

●DoEvents
クリックやキー入力や描画の処理を直ちに実行します。Repaintと似たような動作になりますが、ちらつきが少ないです。

DNSサーバーとメールサーバーのお引越し

昨年末から年明けにかけて、使用していたお名前.comの仮想サーバーからさくらインターネットへ移設しました。

旧dns:dns.trust.or.jp(157.7.213.145)
新dns:ns1.trust.or.jp(153.126.216.144)
ネットワーク

手順としましては
①2020/12/21 新サーバーにdnsサービスとメールサーバーをインストール(PostOffice)。

②2020/12/22 旧DNSから新DNSへゾーン転送してデータをコピー
ゾーン転送を停止後、新DNSでdnsのアドレスとメールサーバーのアドレスを変更。

③2020/12/23 さくらインターネットに対してレジストリ変更申請(メールにて)。

④2020/12/24 さくらインターネットから新規dns(ns1.trust.or.jp)のレジストリ登録完了メール到着ドメイン管理画面からwhois情報の変更を実施後、旧メールサーバーのデータをバックアップ

③2020/12/29 ここで問題が発生。弊社のdns管理下で動作している顧客のdnsのレジストラは同じさくらインターネットなのですが個別契約になっているのを忘れていて、whois情報で指定しているドメイン名の変更をしていませんでした。
顧客からの連絡で、メールの送受信ができないと連絡がありました。
慌ててwhois情報のdns名称を変更したところ、しばらくしてメール送信できるようになりました。
その後、旧メールサーバーのバックアップと新サーバーのメール情報をマージ。

④2021/02/04 知り合いにメールしたらメールが届かないとのこと。messengerで連絡したら下記のようなログが出力されているとのこと
            Thu, 4 Feb 2021 17:43:51:SMTP:mid=20210204174351376000_:Warning Primary DNS:02.dnsv.jp No GetMX Recipient=xxx@trust.or.jp
            Thu, 4 Feb 2021 17:43:51:SMTP:mid=20210204174351376000_:Secondary DNS Get MX completed: MxCount=1 Recipient=xxx@trust.or.jp
            何やら先方のプライマリdnsが弊社のdns情報を正しく認識できていない様子。dnsのキャッシュ情報が更新されていないのかと考え、様子をみることに。
            プロイダ系のdnsは接続数が大量なのでdnsのSOAレコードのexpireの値が長いんですよね。
            調べてみると
     dnsv.jp
        primary name server = 01.dnsv.jp
        responsible mail addr = hostmaster.dnsv.jp
        serial  = 2020073000
        refresh = 3600 (1 hour)
        retry   = 300 (5 mins)
        expire  = 3600000 (41 days 16 hours)
        default TTL = 7200 (2 hours)
    01.dnsv.jp      internet address = 157.7.32.53
    01.dnsv.jp      AAAA IPv6 address = 2400:8500:3300::53
         案の定長い。41日と16時間

⑤2021/02/12 dnsサーバーの逆引き設定が正しくないのを発見したので修正。

⑥2021/02/19 今まで迷惑メールフォルダーに振り分けられていたyahooのアカウントにメールを送ってみると、通常の受信箱に受信していて今までメールヘッダーにX-YahooFilteredBulk: 153.126.216.144と付加されていたものがなくなっている。(おそらくこれは逆引き設定を変更した効果)

⑥2021/02/20 2/4にメールエラーが発生した人に再度メールを送ってみるとちゃんと届いているとのこと。

とりあえずこれで2年間も、伸ばしに伸ばしていた案件が完了ということで。一安心!