質問: ### 前提・実現したいこと 下記で呼び出せるデータをpythonで計算したいです。 OS ◇Microsoft Windows XP以降 コンテナ ◇Microsoft Excelや Misrosoft Visual Basicなどの、いわゆる ActiveX (COM) コンテナアプリケーション データベース ◇パンローリング 相場アプリケーション 試用版では最新のデータをお使いいただけませんが、プログラムは製品版と同様に動作します。 ・参考URL http://www.panrolling.com/pansoft/amarket/ ### 発生している問題・エラーメッセージ 「ActiveX (COM) コンテナアプリケーション」がそもそも何なのかわからず、 調べたのですが、要領を得ないものばかりです。 ### 該当のソースコード ### 試したこと PythonからPyWin32などを通じてVBA呼び出し(失敗) ### 補足情報(言語/FW/ツール等のバージョンなど) Excelで呼び出し計算させるには描画などの関係で時間がかりそうだったので、 CUIでできるPythonで、と考えました。 統計的な分析がしたいだけなので、他によい案があればご教示ください。 プログラミング自体、独学で必要なも調べては当座をしのいでいましたが、 今回のケースではとっかかりがなさ過ぎて質問させていただきました。 よろしくお願いいたします。
回答: 本件、興味が沸いたもので当方でも実際に製品を試して動かしていました。 「Active X COMコンテナアプリケーション」との言い方は、先にご回答をいただいていたようにActive Xコンポーネントを含めた/載せた(コンテナ)アプリケーションとの意味であり、MicrosoftのInternet Explorer やWord等のMicrosoft Officeアプリケーションに代表されるようなプログラム、加えてActive Xコントロールを載せた自分で開発したプログラムを指します。 ちなみに、Microsoft Office製品群の機能のコア部分は、Active Xコンポーネントとして外部のアプリケーションが利用しやすくなっていることが多いです。Internet Explorerは本体がほとんどそれそのものと言っても良いです。 1つ目の質問の「ActiveX (COM) コンテナアプリケーションとは何ですか」の回答としては以上です。では、2つ目の「Pythonから呼び出せますか?」への回答ですが、基本的に「はい」です。 ただし、質問者様が使いたいと考えている製品のActive Xコントロールは、Python からは使うのが困難なようです。(後述します) 基本的に、PythonからActive Xコントロールを操作するには以下のようにします。 1. 製品をインストールする。これでActive XコントロールがWindows に登録され、外部のプログラムから参照/利用できるようになる。(もちろん、インストーラーに依存する) 2. Python のwin32com モジュールを使用し、Active X コントロールを操作する。ここで注意しなければならないことは、Pythonもwin32comモジュールも32ビット版を使用することです。(Active Xコントロールが32ビット版であればそれに合わせる) 当方では以下の環境で試していますので、以下の説明もこれに沿います。 * Windows 7 Enterprise Edition (64ビット) * Visual Studio 2012 Professional (Update5) * Python 3.6.3 (32ビット) * pywin32-221.win32-py3.6 (32ビット) 例:Internet Explorer を操作して、teratailのこの質問を開くには以下のようにします。 ``` #!C:\Python\36-32\python.exe import win32com.client ie = win32com.client.Dispatch('InternetExplorer.Application') ie.Visible = True ie.Navigate('https://teratail.com/?questions/96315') ``` このようなかんじで他のActive Xコンポーネントも操作できるのですが、質問者様がご利用になりたい今回の製品では実際のところどうなるのでしょうか。一部のみ示しますが、以下のようになります。 ``` #!C:\Python\36-32\python.exe # -*- coding: utf-8 -*- import win32com.client import pywintypes code = "<銘柄コード>" # 銘柄コード # "Pan Active Market Database 1.3" cal = win32com.client.Dispatch("ActiveMarket.Calendar") prices = win32com.client.Dispatch("ActiveMarket.Prices") if prices: # "0001/01/01 00:00:00" 相当のSystem.DateTimeで引数をセットしなければならないが... # pywintypes.Timeで設定不可能なのでprices.Read()が失敗する。 t = pywintypes.Time(0) #エラーになります!! prices.Read(code, t, 0) ``` ただし、残念ですがこれらを使ってプログラムを作り込むのは困難を伴いそうです。 製品のサンプルコードのページ「その他のサンプルプログラム(※あえてリンクは示していません)」で、各種のExcelVBAでのサンプルアプリケーションが紹介されています。実際にやりたいことはこれらのExcelVBAのサンプルを参考に、Python + win23comモジュールで実装していければ良いのですが、一部のコード `ActiveMarket.Prices.Read()` メソッドに関してPython win32comモジュールのインターフェースではActive Xコントロール側へ正しい値を渡せない問題がありました。(上記サンプルコードで一部を示していますが、これも不完全です) これはどちらのバグと言う訳ではなく、制限事項になることだと考えています。(もともとPython win32comモジュールは、Windowsとのインターフェースの便宜を図ろう、と言う目的であろうから) さて、そんなわけで質問者様のケースではどうしたらよいのでしょうか。 私からひとつ提案できるのは、以下のような進め方です。 1. Python + win32com は利用しない。なぜならば、Active Xコンポーネントの使い方+win32comモジュールの使い方+"Pan Active Market Database 1.3" Active X固有の使い方それぞれを覚えなければ使えず、困難を伴う。私(dodox86)が遭ったような問題がまた別にあるかもしれず、解決が難しいことも考えられる。 2. まずはExcelVBAでのサンプルソースをもとに当該Active Xコントールを使って目的の機能を簡単に作り、習熟する。 3. C# なりなんなりで、Visual Studio で.NET Frameworkベースの製品版のアプリを作る。 Visual Studio で.NET Frameworkベースの言語でActive Xコントロールを使用するのは、簡単です。実際、Visual Studio 2012 + C#でテストプログラムを作り、今回の"Pan Active Market Database 1.3" Active Xコントロールを利用して、指定銘柄の指定範囲の株価の終値一覧を読み出すことができました。 具体的には以下のような簡単な手順で作ることができるようになります。 1. 製品(相場アプリケーション)をインストールする。 2. Visual StudioでC#のプロジェクトを作成し、プロジェクトで「参照」"Pan Active Market Database 1.3" を追加する。 抜粋ですが、コードの実例を示します。WPFアプリケーションです。 ``` // 抜粋 // "Pan Active Market Database 1.3"を参照に追加すること using ActiveMarket; namespace WpfApp1 { public partial class MainWindow : Window { public MainWindow() { InitializeComponent(); } private void Button_Click(object sender, RoutedEventArgs e) { // 銘柄コード string code = "nnnn"; try { // "0001/01/01 00:00:00" var dtDefault = new DateTime(); // GoldenX.xlsのVBAで、不正値を "1E + 100"としていたので double invalid = Double.Parse("1.0E+100"); var cal = new ActiveMarket.Calendar(); var prices = new ActiveMarket.Prices(); prices.Read(code); ``` 各種のメソッドやその引数は、Visual Studio に標準で装備されている「オブジェクトブラウザー」で確認することができます。これとExcelVBAのサンプルを参考に実装していけばよろしいかと思います。クラスやメソッドの細かい使用方法については、販売元/開発元に正規のライセンスに沿って尋ねていくのが順当でしょう。 全てのコードを貼り付けるのは止めておきました。teratailおよび製品の規約には抵触しないようでしたが、有償の製品でもありますし、はばかられたのもありますのでその点はご容赦ください。 ソフトの機能や作りにもよるかとは思いますが、GUIだから遅い、CUIだから速いようなケースは避け得るはずです。例えばデータベースへのアクセスだけは集中して行い、テキストベースでファイルを保存してしまいば、後でゆっくり、使いやすいPythonで処理することもできます。