###前提・実現したいこと
下記で呼び出せるデータを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で、と考えました。
統計的な分析がしたいだけなので、他によい案があればご教示ください。
プログラミング自体、独学で必要なも調べては当座をしのいでいましたが、
今回のケースではとっかかりがなさ過ぎて質問させていただきました。
よろしくお願いいたします。
気になる質問をクリップする
クリップした質問は、後からいつでもMYページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
回答2件
0
ベストアンサー
本件、興味が沸いたもので当方でも実際に製品を試して動かしていました。
「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コントロールを操作するには以下のようにします。
0. 製品をインストールする。これでActive XコントロールがWindows に登録され、外部のプログラムから参照/利用できるようになる。(もちろん、インストーラーに依存する)
- 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のこの質問を開くには以下のようにします。
Python
1#!C:\Python\36-32\python.exe 2import win32com.client 3 4ie = win32com.client.Dispatch('InternetExplorer.Application') 5ie.Visible = True 6ie.Navigate('https://teratail.com/?questions/96315')
このようなかんじで他のActive Xコンポーネントも操作できるのですが、質問者様がご利用になりたい今回の製品では実際のところどうなるのでしょうか。一部のみ示しますが、以下のようになります。
Python
1#!C:\Python\36-32\python.exe 2# -*- coding: utf-8 -*- 3 4import win32com.client 5import pywintypes 6 7code = "<銘柄コード>" # 銘柄コード 8 9# "Pan Active Market Database 1.3" 10cal = win32com.client.Dispatch("ActiveMarket.Calendar") 11prices = win32com.client.Dispatch("ActiveMarket.Prices") 12if prices: 13 # "0001/01/01 00:00:00" 相当のSystem.DateTimeで引数をセットしなければならないが... 14 # pywintypes.Timeで設定不可能なのでprices.Read()が失敗する。 15 t = pywintypes.Time(0) #エラーになります!! 16 prices.Read(code, t, 0)
ただし、残念ですがこれらを使ってプログラムを作り込むのは困難を伴いそうです。
製品のサンプルコードのページ「その他のサンプルプログラム(※あえてリンクは示していません)」で、各種のExcelVBAでのサンプルアプリケーションが紹介されています。実際にやりたいことはこれらのExcelVBAのサンプルを参考に、Python + win23comモジュールで実装していければ良いのですが、一部のコード ActiveMarket.Prices.Read()
メソッドに関してPython win32comモジュールのインターフェースではActive Xコントロール側へ正しい値を渡せない問題がありました。(上記サンプルコードで一部を示していますが、これも不完全です)
これはどちらのバグと言う訳ではなく、制限事項になることだと考えています。(もともとPython win32comモジュールは、Windowsとのインターフェースの便宜を図ろう、と言う目的であろうから)
さて、そんなわけで質問者様のケースではどうしたらよいのでしょうか。
私からひとつ提案できるのは、以下のような進め方です。
-
Python + win32com は利用しない。なぜならば、Active Xコンポーネントの使い方+win32comモジュールの使い方+"Pan Active Market Database 1.3" Active X固有の使い方それぞれを覚えなければ使えず、困難を伴う。私(dodox86)が遭ったような問題がまた別にあるかもしれず、解決が難しいことも考えられる。
-
まずはExcelVBAでのサンプルソースをもとに当該Active Xコントールを使って目的の機能を簡単に作り、習熟する。
-
C# なりなんなりで、Visual Studio で.NET Frameworkベースの製品版のアプリを作る。
Visual Studio で.NET Frameworkベースの言語でActive Xコントロールを使用するのは、簡単です。実際、Visual Studio 2012 + C#でテストプログラムを作り、今回の"Pan Active Market Database 1.3" Active Xコントロールを利用して、指定銘柄の指定範囲の株価の終値一覧を読み出すことができました。
具体的には以下のような簡単な手順で作ることができるようになります。
0. 製品(相場アプリケーション)をインストールする。
- Visual StudioでC#のプロジェクトを作成し、プロジェクトで「参照」"Pan Active Market Database 1.3" を追加する。
抜粋ですが、コードの実例を示します。WPFアプリケーションです。
C#
1// 抜粋 2 3// "Pan Active Market Database 1.3"を参照に追加すること 4using ActiveMarket; 5 6namespace WpfApp1 7{ 8 public partial class MainWindow : Window 9 { 10 public MainWindow() 11 { 12 InitializeComponent(); 13 } 14 15 private void Button_Click(object sender, RoutedEventArgs e) 16 { 17 // 銘柄コード 18 string code = "nnnn"; 19 try 20 { 21 // "0001/01/01 00:00:00" 22 var dtDefault = new DateTime(); 23 // GoldenX.xlsのVBAで、不正値を "1E + 100"としていたので 24 double invalid = Double.Parse("1.0E+100"); 25 var cal = new ActiveMarket.Calendar(); 26 var prices = new ActiveMarket.Prices(); 27 prices.Read(code); 28
各種のメソッドやその引数は、Visual Studio に標準で装備されている「オブジェクトブラウザー」で確認することができます。これとExcelVBAのサンプルを参考に実装していけばよろしいかと思います。クラスやメソッドの細かい使用方法については、販売元/開発元に正規のライセンスに沿って尋ねていくのが順当でしょう。
全てのコードを貼り付けるのは止めておきました。teratailおよび製品の規約には抵触しないようでしたが、有償の製品でもありますし、はばかられたのもありますのでその点はご容赦ください。
ソフトの機能や作りにもよるかとは思いますが、GUIだから遅い、CUIだから速いようなケースは避け得るはずです。例えばデータベースへのアクセスだけは集中して行い、テキストベースでファイルを保存してしまいば、後でゆっくり、使いやすいPythonで処理することもできます。
投稿2017/10/15 13:54
編集2017/10/15 14:18総合スコア9183
0
COMは主として同一のPC上にある複数の異なるスレッド・プロセス上にあるソフトウェアコンポーネント同士でRPC的な連携をするものというのが自分の(かなり大雑把な)理解です。
COMコンポーネントの代表的なものの一つがActiveXコントロールで、「あるソフトウエェアが親画面を持っており、その親画面の下に自分の画面をはめ込んでもらい、さらにはそのソフトウェアからCOMインターフェースを通じて制御できるようなもの」と考えられると思います。
この「親画面を持っているソフトウェア」のことをActiveXコンテナアプリケーションと考えればよいと思います。ExcelやVBのフォームアプリがそういうものですよね。
ご質問にある部品はActiveXコントロールに類するものと思いますが、「親画面上にはめ込まれてコントロールとして動作することが必須」なのか「画面がないときでもCOMを通じたメソッド呼び出しが機能するように設計されたもの」なのかはそれぞれの作りによると思います。
本件は一般論として「うごくはずかどうか」答えられないと自分は思いますので、開発元に確認するのが一番よいと思います。
投稿2017/10/15 11:06
総合スコア18394
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
あなたの回答
tips
太字
斜体
打ち消し線
見出し
引用テキストの挿入
コードの挿入
リンクの挿入
リストの挿入
番号リストの挿入
表の挿入
水平線の挿入
プレビュー
質問の解決につながる回答をしましょう。 サンプルコードなど、より具体的な説明があると質問者の理解の助けになります。 また、読む側のことを考えた、分かりやすい文章を心がけましょう。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2017/10/22 22:26