Excel」タグアーカイブ

Prolog を Excel で使う。

またしても、不思議なことをしてみました。

359779196

今回解かせたのは、
http://www.geocities.jp/m_hiroi/prolog/prolog01.html#chap4
こちらのウェブサイトで紹介されている、「家系図」の問題。

ダウンロードに関して
ソースコード: https://github.com/mimura1133/mm_Prolog_for_Excel
バイナリ:http://mimumimu.net/beta/programs/PrologExcel.zip

コードの紹介は今回は割愛しますが、
導入の方法について、かなり変態的なので紹介します。


導入編。

image

ファイルを展開すると、このようなファイルが入っています。

image

この中から、 install.bat を探し、右クリック –> 管理者として実行

実行したら、 Excel を立ち上げます。

image

ファイルメニュー内の「オプション」をクリック

image

開いたダイアログから、「アドイン」を選び、
一番下の管理について、「Excel アドイン」を選んで、「設定」を押します。

image

そして、オートメーションをクリック。

image

中から、PrologExcel.PrologExcel を選んで、OK を押す。

image

PrologExcel.PrologExcel が追加されるので、チェックを付けて OK を押す。


利用編

このアドインには大きく2つの関数があります。

1.Prolog_List 関数

Prolog_List()

Input : Excel List
Output: Prolog List

この関数は、


male taro
male ichiro
male jiro
male saburo

というような一覧が存在したとき、

male(taro).
male(ichiro).
male(jiro).
male(saburo).

このような、Prolog のリスト形式に変換してくれます。

さんぷる:
image

また、下記のように、いくつもリストがある場合、

image

特に難しい事はしていませんので、 Excel の通常の文字列結合同様、
「&」マークで結合すれば問題ありません。

image

2.Prolog 関数

Prolog()

Input : Program, Query
Output : Answer

第一引数に、リスト定義などを与え、
第二引数に、クエリを与えます。

image

クエリを投げる際は、

:- parents_of(X, ichiro).

のように、「?-」 ではなく、「:-」として投げるようです。

(・・私は Prolog を使う人じゃ無いのでよく分かりません・・。)

なお、この関数が実行される際、多少ラグが発生するのでご了承下さい。


とりあえず、こんな感じで。であであ。

Excel のマクロを Python で書く。

みむらです。IronPython ってのがあるので、ちょちょいと。

仕組みとしては、Visual Studio の VSTO (Visual Studio Tools for Office) を使って、
Office 向けのアドインを作って、その中で IronPython を動かそうーってこと。

359870206

結果としてはこんな感じ!

とりあえず、VSTO の書き方とかは割愛して。

ソースはここに:
https://github.com/mimura1133/mm_Python_for_Excel

using Microsoft.Scripting.Hosting;
using IronPython.Hosting;

namespace ExcelAddIn1
{
    public partial class ThisAddIn
    {
        public static string Code = "";

        static ScriptEngine _python;
        static ScriptScope _python_scope;

        private void ThisAddIn_Startup(object sender, System.EventArgs e)
        {
            _python = Python.CreateEngine();
            _python_scope = _python.CreateScope();
            _python_scope.SetVariable("Application", Application);
            _python_scope.SetVariable("Function", Application.WorksheetFunction);
            _python_scope.SetVariable("Cells", Application.Cells);
        }

        private void ThisAddIn_Shutdown(object sender, System.EventArgs e)
        {
        }

        public static void Run()
        {
            var cc =_python.CreateScriptSourceFromString(Code);
            cc.Execute(_python_scope);
        }

        #region VSTO generated code

        /// <summary>
        /// Required method for Designer support - do not modify
        /// the contents of this method with the code editor.
        /// </summary>
        private void InternalStartup()
        {
            this.Startup += new System.EventHandler(ThisAddIn_Startup);
            this.Shutdown += new System.EventHandler(ThisAddIn_Shutdown);
        }

        #endregion
    }
}

メインソースはこんな感じ!

Python.CreateEngine() で、 Python のエンジン作って、

Scope に対して、 SetVariable を使って、参照をがしがし。( python で言うところの、 import )

あと、どこかから Run が実行されたらコンパイルして実行する仕掛け。

動作例ですと、「Run」 ボタンですね。

これ使った場合、 Function 以下に、Excel の関数が存在していて、

Cells 以下に、各セル情報が入っているので、キー入力を捕まえてくれば、Python によるマクロも可能かも。

制作時間30分だから、とっても汚くて、実装がふざけた感じになっているけど、許してね。