質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
VBA

VBAはオブジェクト指向プログラミング言語のひとつで、マクロを作成によりExcelなどのOffice業務を自動化することができます。

Visual Studio

Microsoft Visual StudioはMicrosoftによる統合開発環境(IDE)です。多種多様なプログラミング言語に対応しています。

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

解決済

2回答

6714閲覧

ActiveX (COM) コンテナアプリケーションとは何ですか?Pythonから呼び出せますか?

Sat6x

総合スコア7

VBA

VBAはオブジェクト指向プログラミング言語のひとつで、マクロを作成によりExcelなどのOffice業務を自動化することができます。

Visual Studio

Microsoft Visual StudioはMicrosoftによる統合開発環境(IDE)です。多種多様なプログラミング言語に対応しています。

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

0グッド

0クリップ

投稿2017/10/14 10:30

編集2017/10/14 10:35

###前提・実現したいこと
下記で呼び出せるデータを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ページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答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 に登録され、外部のプログラムから参照/利用できるようになる。(もちろん、インストーラーに依存する)

  1. 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とのインターフェースの便宜を図ろう、と言う目的であろうから)

さて、そんなわけで質問者様のケースではどうしたらよいのでしょうか。
私からひとつ提案できるのは、以下のような進め方です。

  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コントロールを利用して、指定銘柄の指定範囲の株価の終値一覧を読み出すことができました。

具体的には以下のような簡単な手順で作ることができるようになります。
0. 製品(相場アプリケーション)をインストールする。

  1. 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
dodox86

総合スコア9183

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Sat6x

2017/10/22 22:26

ご回答ありがとうございます。詳細に記してくださったおかげで、方針が見えてきました。
guest

0

COMは主として同一のPC上にある複数の異なるスレッド・プロセス上にあるソフトウェアコンポーネント同士でRPC的な連携をするものというのが自分の(かなり大雑把な)理解です。

COMコンポーネントの代表的なものの一つがActiveXコントロールで、「あるソフトウエェアが親画面を持っており、その親画面の下に自分の画面をはめ込んでもらい、さらにはそのソフトウェアからCOMインターフェースを通じて制御できるようなもの」と考えられると思います。

この「親画面を持っているソフトウェア」のことをActiveXコンテナアプリケーションと考えればよいと思います。ExcelやVBのフォームアプリがそういうものですよね。

ご質問にある部品はActiveXコントロールに類するものと思いますが、「親画面上にはめ込まれてコントロールとして動作することが必須」なのか「画面がないときでもCOMを通じたメソッド呼び出しが機能するように設計されたもの」なのかはそれぞれの作りによると思います。

本件は一般論として「うごくはずかどうか」答えられないと自分は思いますので、開発元に確認するのが一番よいと思います。

投稿2017/10/15 11:06

KSwordOfHaste

総合スコア18394

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Sat6x

2017/10/22 22:25

ご回答ありがとうございます。ものによるということで、開発元にも確認してみようと思います。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問