xlwingsを使うぜ


まえがき

Excel Advent Calendar 2014
に空きがあったので、
前々からやりたかった「xlwings」の記事を書いた。
ちなみに僕はBlogあるので、Qiitaに何もなかったからいい機会だ。

xlwingsとは?

VBAでマクロなんて書きたくない人用にPythonでマクロが書けるモジュール。

公式サイトはここですね。
xlwings

インストール

pip install xlwings

virtualenvでインストールすると上手く実行できないようだ(多分)。
OSのPythonにインストールした方がいい。

サンプルの実行

ここにクイックスタートが有る。
しかし、僕は少しハマったのでクイックではなくなったが・・。

まず、Excel自体をどこかに保存しておく。
僕はMac OS Xを使ってるので、

/Users/shinriyo/Documentsへ、「ブック1.xlsx」の名前でExcelファイルを保存した。
※日本語でOK!でしたが、怖い人は半角英数字で。

mymodule.py
#!/usr/bin/env python
# -*- coding: utf-8 -*-

import numpy as np
from xlwings import Workbook, Range

def rand_numbers():
    """ produces standard normally distributed random numbers with shape (n,n)"""
    wb = Workbook.caller()  # Creates a reference to the calling Excel file
    n = Range('Sheet1', 'B1').value  # Write desired dimensions into Cell B1
    rand_num = np.random.randn(n, n)
    Range('Sheet1', 'C3').value = rand_num

のように「mymodule.py」を「ブック1.xlsx」と同じ階層に置く。
同じ階層に置くことが重要!(大事なことなので二回言いました。)

/Library/Python/2.7/site-packages/xlwingsxlwings.basファイルがあるはず。

↓このように。

マクロを作成し、

VBAのコードは

Sub RandomNumbers()
    RunPython ("import mymodule; mymodule.rand_numbers()")
End Sub

そうしましたら、マクロ上でこのようにインポート。

そして、Excel上のB1には任意の数字を記載。

RandomNumbersを実行!

すると先ほどの画像のようになる。
たてよこに5追加される。

Range('Sheet1', 'C3').value = u'日本語'

などで日本語も出来るので実験してみるといい。