64bit版ExcelでVBA⇔SAP連携を行う方法(特殊な環境で業務している人向け)


まず初めに

この記事に記載している方法は一部を除き非推奨な方法となります。
そのため、何らかの問題が発生してもすべて自己責任でお願いします。

正攻法でのSAP連携方法

いずれもSAP公式が提供しているミドルウェアとなります。
使用方法について、Qiitaでもいくつか記事がありますので、詳しく知りたい方はそちらを参照してみてください。(丸投げ)
どちらの手段にしても、JCO(NCO)を使用して作成されたアプリをVBAから呼び出す形で連携を行うことになります。

もちろんVBA以外での連携方法(PowerShellなど)もありますが、ここでは割愛します。

この記事の想定読者

さて、JCOやNCOは大変便利ですが、ミドルウェア(ライブラリ)のダウンロードにはS-Userが必要です。
…そう、S-Userが必要なんです。
この記事は、何らかの理由 (主に職場の環境面) でS-Userの利用ができない、でも64bit版のExcel(VBA)でSAP連携を行いたい人を対象としています。
そんな人どれだけいるんだ…?

解決方法

私の知る限りでは、以下3つの方法があります。
(他にもあるかもしれません)

方法① 32bit版Excelを使用する

一番お手軽な解決方法です。
しかし、64bit版を使用している状態から都度32bit版に切り替えるというのは現実的ではありません。
そのため、SAP連携用に32bit版Excelをインストールしている端末を用意するのが良いでしょう。
気軽に専用端末用意できるのであればS-Userくーださい

方法② レジストリを編集する ※非推奨

SAP Communityの記事を参照ください。
レジストリを編集することで、64bit版Excel(VBA)からでもSAP連携可能になるそうです。
が、当然敷居が高くなりますので、最終手段として考えておくのが良いでしょう。
私としても、これについては実践できていませんので、本当にSAP連携可能になるかどうかも保証できません。
そもそもレジストリ編集を許可する前にS-UserとVisual Studioくーださい

方法③ 64bit版Excel(VBA)から32bit版VBSを実行する

なんてことはありません。
64bit版で動かないなら、無理やり32bit版で動かせば良いのです。
この方法③について実装例を記載します。

実装例:VBAのコード

VBA側の実装は以下になります。

Sample
Dim WshShell as WshShell
Dim VBSReturnCode as Integer

Set WshShell = new WshShell
VBSReturnCode = WshShell.Run("cmd.exe /c C:\Windows\SysWOW64\cscript.exe [vbsの配置ディレクトリ]\SAPQueryRFCModule.vbs")

VBSをSysWOW64のcscriptで実行する。ただそれだけのコードとなります。
SAPログインユーザーや実行クライアントを固定値以外にする(入力させる)場合は、VBSの引数にそれを追加し、上記コードの実行引数に追加してください。

実装例:VBSのコード

VBS側の実装は以下になります。(ログインクライアントなどはすべて固定としています)

SAPQueryRFCModule.vbs
Option Explicit

Dim FunctionControl
Dim SapConnection

Set FunctionControl = CreateObject("SAP.Functions")
Set SapConnection = FunctionControl.Connection

SapConnection.Client = "xxx"
SapConnection.HostName = "hostname"
SapConnection.SystemNumber = "sysnum"
SapConnection.Language = "ja"
SapConnection.User = "user"
SapConnection.Password = "password"

If SapConnection.Logon(0, True) = False Then
  Wscript.Quit(-1)
End If

do something...

FunctionControl.Connection.Logoff
Wscript.Quit(0)

処理の本体となる部分は省略しています。
よくあるVBA⇔SAP連携のコードとほぼ同じですので、VBAで実装してあったものがほぼそのまま移植できます。

おわりに

方法③について、考え方はJCO(NCO)による連携と同じですね。
(SAP連携可能な外部実行ファイル(スクリプト)を呼び出す)

解決方法を難易度順にすると ①>③>② になります。
諸々を考慮すると ③>①>② になりそう

以上です。
ここまでお読みいただき、ありがとうございました。