C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

Re[8]: ストアアプリ版のEXCELをCreateObjectする方法


(過去ログ 154 を表示中)

[トピック内 9 記事 (1 - 9 表示)]  << 0 >>

■89420 / inTopicNo.1)  ストアアプリ版のEXCELをCreateObjectする方法
  
□投稿者/ ぴち (1回)-(2018/11/28(Wed) 01:32:12)

分類:[VB6 以前] 

VB6で構築されたシステムをWindows10で動かしています。

いままでは普通に動作していたのですが、ストアアプリ版のEXCELがインストールされた
端末を増設したところ、下記のようなロジックでOn Error GoToでエラーロジックに
ジャンプしてしまいます。

Private Function ExcelCheck() As Boolean
    Dim objExcel    As Object

    ExcelCheck = False

    On Error GoTo Excel_Error
    Set objExcel = CreateObject("Excel.Application")

    ExcelCheck = True

    Exit Function

Excel_Error:
    MsgBox "本機能を使用するにはExcelがインストールされている必要があります。"

End Function

端末ごとに、どのバージョンのEXCELがインストールされているか判らないので、参照設定をする
アーリーバインドではなく、CreateObjectのレイトバインドでExcelがインストールされているかの
判断を行っている、そもそもその方法が一般的ではないのでしょうか?

ネットで色々検索を行ったのですが、デスクトップアプリ版をインストールし直す対処法しか
見つけられませんでした。今後はストアアプリ版のEXCELが入ったWindows10が主流になると
予想されるので、毎回ストアアプリ版を消してデスクトップアプリ版をインストールし直すのは
無駄な作業では?と感じております。

どうにかしてVB6からストアアプリ版のEXCELを動かすことは出来ないでしょうか?

引用返信 編集キー/
■89427 / inTopicNo.2)  Re[1]: ストアアプリ版のEXCELをCreateObjectする方法
□投稿者/ とっちゃん (553回)-(2018/11/28(Wed) 11:33:57)
No89420 (ぴち さん) に返信

> Set objExcel = CreateObject("Excel.Application")
>
ここでCreateObjectが失敗するということですよね?

ストア版をインストールしていないので詳細はわかりませんが
64bitOSなら、 "C:\Windows\SysWOW64\regedit.exe" を起動して、32bit環境のレジストリの
HKEY_CLASSES_ROOT\Excel.Application キーがあるかを確認してみてください。

それがない場合、少なくとも 32bit アプリから見た場合
「オートメーションで操作可能なExcelはそのマシンにはインストールされていない」
となります。

>
> 端末ごとに、どのバージョンのEXCELがインストールされているか判らないので、参照設定をする
> アーリーバインドではなく、CreateObjectのレイトバインドでExcelがインストールされているかの
> 判断を行っている、そもそもその方法が一般的ではないのでしょうか?
>
少なくともVB6においては一般的だと思います。

レイトバインドの是非という点であれば、バージョンは固定しているほうが安定しますが
その場合Offieの進化に合わせてアプリケーションも随時書き換えということになるのでそれはそれで結構面倒ですし。。。


> ネットで色々検索を行ったのですが、デスクトップアプリ版をインストールし直す対処法しか
> 見つけられませんでした。今後はストアアプリ版のEXCELが入ったWindows10が主流になると
> 予想されるので、毎回ストアアプリ版を消してデスクトップアプリ版をインストールし直すのは
> 無駄な作業では?と感じております。
>
> どうにかしてVB6からストアアプリ版のEXCELを動かすことは出来ないでしょうか?
>
ストア版Officeがどこまで外部制御できるようになっているかわからないので何とも言えませんが
少なくとも、32bitアプリ(VB6に限らない)からオートメーションでExcelを操作するという窓口はないのだと思います。

じゃぁ .NET にすればできるのか?というとおそらくそういうこともないと思うので、対応するとしたら
Excel側で対応(要するにアドイン作ってExcel内部から直接操作する)という形になると思います。

ストア版でもアドインは使えるらしいので(COM版もできるそうですが、持ってないので詳細は不明)
そっちの方向で検討することを考えたほうがいいと思います。

ただ、VB6でOfficeのアドインは作れないと思うので、開発環境の刷新とかそういうところからになりますが。。。

引用返信 編集キー/
■89431 / inTopicNo.3)  Re[2]: ストアアプリ版のEXCELをCreateObjectする方法
□投稿者/ とっちゃん (554回)-(2018/11/28(Wed) 16:18:55)
追記。

もしかすると、"Excel.Application.16" ならつながるとかはありませんか?
そうだとすると、ストア版では、"Excel.Application" はセットアップせず、特定バージョンのProgIdしかセットアップしないということになると思います。

その場合でも、レイトバインドは可能で、現状のコードはProgIdだけ変えればいいということになりますが、その場合、本来想定していたバージョン非依存な処理は、接続するという一番最初の行為の時点で覆されてしまう(Excel.Application.16につなごうとする時点で特定バージョンに限定されるため)ことになります。

このあたりは、インストール環境のHKEY_CLASSES_ROOT配下を確認しないとわからないですけどね。
引用返信 編集キー/
■89438 / inTopicNo.4)  Re[3]: ストアアプリ版のEXCELをCreateObjectする方法
□投稿者/ Azulean (1012回)-(2018/11/28(Wed) 22:10:43)
No89431 (とっちゃん さん) に返信
> このあたりは、インストール環境のHKEY_CLASSES_ROOT配下を確認しないとわからないですけどね。

下記でユーザー権限によって結果が変わったという話もあります。
https://social.msdn.microsoft.com/Forums/ja-JP/fc797a6b-26dd-4ad8-b76a-abf7aec9abfc/uacclsidfromprogid?forum=vcgeneralja

このことから、1703 あたりで追加された UWP の Packaged COM の仕組みではないか?と思います。
その場合、レジストリを見ても何も見つからないという可能性もありますが…。
https://blogs.windows.com/buildingapps/2017/04/13/com-server-ole-document-support-desktop-bridge/


// 注意:UWP 版 Office をインストールして観察したことがないので、間違っているかもしれません。
引用返信 編集キー/
■89439 / inTopicNo.5)  Re[4]: ストアアプリ版のEXCELをCreateObjectする方法
□投稿者/ Azulean (1013回)-(2018/11/28(Wed) 22:34:20)
2018/11/28(Wed) 23:42:04 編集(投稿者)

No89438 (Azulean さん) に返信
> // 注意:UWP 版 Office をインストールして観察したことがないので、間違っているかもしれません。

実験環境にインストールして見たところ以下の点を確認できました。

・レジストリエディタで HKEY_CLASSES_ROOT に Excel で始まるキーは存在しない。
・Excel の UWP 版のインストール先 C:\Program Files\WindowsApps\Microsoft.Office.Desktop.Excel_16050.11029.20079.0_x86_8wekyb3d8bbwe に AppxManifest.xml があり、その中に COM の定義がある。

一応、AppxManifest.xml の中には VersionIndependentProgId="Excel.Application" とあるので考慮はされていそうな感じはあります。

-----
私の認識としては COM 生成のいくつかの API がインストール済みの UWP に含まれる AppxManifest.xml を加味した振る舞いをしている。
この結果、レジストリに登録がなくても COM オブジェクトは生成できる。
引用返信 編集キー/
■89440 / inTopicNo.6)  Re[5]: ストアアプリ版のEXCELをCreateObjectする方法
□投稿者/ Azulean (1014回)-(2018/11/28(Wed) 23:26:04)
VB6 で提示されたコードを書いた exe を実験環境に放り込んだところ、エラーになりませんでした。
(Windows 10 1803 + UWP Excel 2016)

もしかして、管理者権限で実行していますか?
現状、管理者権限では UWP の ProgId は解決できないようです。


・管理者権限での運用を諦める
・UWP 版 Excel を諦める
・先に書いた MSDN フォーラムの質問者のように CLSID で解決を図る

以上のいずれかになるのでは?という感じです。
引用返信 編集キー/
■89441 / inTopicNo.7)  Re[6]: ストアアプリ版のEXCELをCreateObjectする方法
□投稿者/ ぴち (2回)-(2018/11/29(Thu) 00:03:11)
とっちゃんさん、Azuleanさん
回答、情報提供および動作確認ありがとうございます。

はい、管理者権限での運用を行っております。

現状を白状しますと↓
パソコンを購入し、独自のシステムをインストールして店舗に送っているので、
ストアアプリ版のEXCELが入ったWindows10の実機が現在は手元にありません。

「『Excelがインストールされている必要があります。』というメッセージが
表示され、印刷(EXCELの起動)が出来ない」という質問が現場から来たので、
ソースの該当箇所が原因ではないか?と当たりを付けましたが、ステップ実行を
して確認したわけではないので、実際どんなエラーが出ているかも判らない状態です。
ごめんなさい。

納品した端末のためVB6をインストールし、IDEからステップ実行して確認することも
出来ませんし、ログ吐き出し機能を盛り込んだ調査プログラムを送りつけて
おばちゃん職員に実行してもらう事すら出来るレベルか怪しい状況です。
ましてやレジストリエディタを起動して・・・なんてさせられません。

会社にストアアプリ版が入ったテスト端末を用意してもらうしかなさそうです。



Set objExcel = CreateObject("Excel.Application")
でエラーになったら更に
Set objExcel = CreateObject("Shell.Application").ShellExecute "Microsoft.Office.Excel_8wekyb3d8bbwe!microsoft.excel"
を実行する・・・みたいな形で、ちょっとした修正で何とかならないかと思ったのですが・・・

いずれにしろ実機がないことにはトライ&エラーも出来ません。

そもそも、元号対応、消費税対応などを控えて、このままレガシーな言語で騙し騙し動かしていくのか?
何か大きな話に発展しそうです。

引用返信 編集キー/
■89442 / inTopicNo.8)  Re[7]: ストアアプリ版のEXCELをCreateObjectする方法
□投稿者/ Azulean (1015回)-(2018/11/29(Thu) 06:28:57)
No89441 (ぴち さん) に返信
> Set objExcel = CreateObject("Shell.Application").ShellExecute "Microsoft.Office.Excel_8wekyb3d8bbwe!microsoft.excel"
> を実行する・・・みたいな形で、ちょっとした修正で何とかならないかと思ったのですが・・・

そのコードの戻り値は Excel の COM オブジェクトではないので無理そうです。

> そもそも、元号対応、消費税対応などを控えて、このままレガシーな言語で騙し騙し動かしていくのか?
> 何か大きな話に発展しそうです。

今回の話は言語を変えても、管理者権限である限り発生するので、管理者権限なしで実行できるような設計を考えないと解決になりません。

引用返信 編集キー/
■89581 / inTopicNo.9)  Re[8]: ストアアプリ版のEXCELをCreateObjectする方法
□投稿者/ ぴち (3回)-(2018/12/05(Wed) 23:38:01)
返信に時間がかかってしまい申し訳ありません。

結論としては、当面はインストール手順書を改版し、ストアアプリ版を消してデスクトップアプリ版を
インストールし直すという、何の解決にもならない方法で回避することになりました。

MicrosoftがVB6も元号対応の対象とするとか、Format関数でgggeeを指定すると「平成01年」ではなく
「平成元年」に変換するとか、色々情報が錯綜していて、そちらの対応に全力を投入することになりそうです。


話は変わりますが、私個人的にはトピックを立てた質問者が「解決済み」にする べき だと考えているので、
上でも書いた通り、「何の解決にもならない方法」を採用しましたが、このトピックは解決とさせていただきます。
解決済み
引用返信 編集キー/


トピック内ページ移動 / << 0 >>

このトピックに書きこむ

過去ログには書き込み不可

管理者用

- Child Tree -