前提・実現したいこと
下記で呼び出せるデータを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で、と考えました。
統計的な分析がしたいだけなので、他によい案があればご教示ください。
プログラミング自体、独学で必要なも調べては当座をしのいでいましたが、
今回のケースではとっかかりがなさ過ぎて質問させていただきました。
よろしくお願いいたします。
-
気になる質問をクリップする
クリップした質問は、後からいつでもマイページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
クリップを取り消します
-
良い質問の評価を上げる
以下のような質問は評価を上げましょう
- 質問内容が明確
- 自分も答えを知りたい
- 質問者以外のユーザにも役立つ
評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。
質問の評価を上げたことを取り消します
-
評価を下げられる数の上限に達しました
評価を下げることができません
- 1日5回まで評価を下げられます
- 1日に1ユーザに対して2回まで評価を下げられます
質問の評価を下げる
teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。
- プログラミングに関係のない質問
- やってほしいことだけを記載した丸投げの質問
- 問題・課題が含まれていない質問
- 意図的に内容が抹消された質問
- 過去に投稿した質問と同じ内容の質問
- 広告と受け取られるような投稿
評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。
質問の評価を下げたことを取り消します
この機能は開放されていません
評価を下げる条件を満たしてません
質問の評価を下げる機能の利用条件
この機能を利用するためには、以下の事項を行う必要があります。
- 質問回答など一定の行動
-
メールアドレスの認証
メールアドレスの認証
-
質問評価に関するヘルプページの閲覧
質問評価に関するヘルプページの閲覧
checkベストアンサー
+3
本件、興味が沸いたもので当方でも実際に製品を試して動かしていました。
「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コントロールを操作するには以下のようにします。
製品をインストールする。これで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のこの質問を開くには以下のようにします。
#!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とのインターフェースの便宜を図ろう、と言う目的であろうから)
さて、そんなわけで質問者様のケースではどうしたらよいのでしょうか。
私からひとつ提案できるのは、以下のような進め方です。
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コントロールを利用して、指定銘柄の指定範囲の株価の終値一覧を読み出すことができました。
具体的には以下のような簡単な手順で作ることができるようになります。
- 製品(相場アプリケーション)をインストールする。
- 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で処理することもできます。
投稿
-
回答の評価を上げる
以下のような回答は評価を上げましょう
- 正しい回答
- わかりやすい回答
- ためになる回答
評価が高い回答ほどページの上位に表示されます。
-
回答の評価を下げる
下記のような回答は推奨されていません。
- 間違っている回答
- 質問の回答になっていない投稿
- スパムや攻撃的な表現を用いた投稿
評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。
+2
COMは主として同一のPC上にある複数の異なるスレッド・プロセス上にあるソフトウェアコンポーネント同士でRPC的な連携をするものというのが自分の(かなり大雑把な)理解です。
COMコンポーネントの代表的なものの一つがActiveXコントロールで、「あるソフトウエェアが親画面を持っており、その親画面の下に自分の画面をはめ込んでもらい、さらにはそのソフトウェアからCOMインターフェースを通じて制御できるようなもの」と考えられると思います。
この「親画面を持っているソフトウェア」のことをActiveXコンテナアプリケーションと考えればよいと思います。ExcelやVBのフォームアプリがそういうものですよね。
ご質問にある部品はActiveXコントロールに類するものと思いますが、「親画面上にはめ込まれてコントロールとして動作することが必須」なのか「画面がないときでもCOMを通じたメソッド呼び出しが機能するように設計されたもの」なのかはそれぞれの作りによると思います。
本件は一般論として「うごくはずかどうか」答えられないと自分は思いますので、開発元に確認するのが一番よいと思います。
投稿
-
回答の評価を上げる
以下のような回答は評価を上げましょう
- 正しい回答
- わかりやすい回答
- ためになる回答
評価が高い回答ほどページの上位に表示されます。
-
回答の評価を下げる
下記のような回答は推奨されていません。
- 間違っている回答
- 質問の回答になっていない投稿
- スパムや攻撃的な表現を用いた投稿
評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。
15分調べてもわからないことは、teratailで質問しよう!
- ただいまの回答率 88.33%
- 質問をまとめることで、思考を整理して素早く解決
- テンプレート機能で、簡単に質問をまとめられる
2017/10/23 07:26