[mecab-users 393] Re: Excel VBA からMeCabを使用するには?

Back to archive index

Tadamasa Teranishi yw3t-****@asahi*****
2010年 1月 7日 (木) 05:18:51 JST


寺西です。

fukum****@amber***** wrote:
> 
> ' MeCab: 0.98(Windowsバイナリ) + Excel2003
> '
> ' PtrMecab = mecab_new2(SouceText) のところで
> ' 「実行時エラー'49': DLLが正しく呼び出せません。」というエラーが出てしまう。

宣言に問題ありますから...。

> Declare Function mecab_destroy Lib "libmecab.dll" (ByVal m As String)
> Declare Function mecab_sparse_tostr Lib "libmecab.dll" (ByVal m As String,
> ByVal str As String)
> Declare Function mecab_new2 Lib "libmecab.dll" (ByVal arg As String)

以下の3つの関数だけ使うのなら

mecab_t *mecab_new2 (const char *arg)
const char *mecab_sparse_tostr (mecab_t *m, const char *str)
void mecab_destroy(mecab_t *m)

mecab_destroy は値を返さない関数なので Function じゃなくて Sub では
ないかと思います。
また、mecab_new2 と mecab_sparse_tostr は Function なので戻り値の型を
宣言しないといけないと思います。

Declare Sub mecab_destroy Lib "libmecab.dll" (ByVal m As String)
Declare Function mecab_sparse_tostr Lib "libmecab.dll" (ByVal m As
String,
ByVal str As String) As String
Declare Function mecab_new2 Lib "libmecab.dll" (ByVal arg As String)
As Long

としてみてはどうでしょう。
# 未確認なので動かなくても許してくださいね。
 
> Sub MorphTest()
> 
>     Dim SouceText As String
> 
>     SouceText = "すもももももももものうち"
>     PtrMecab = mecab_new2(SouceText)
>     Debug.Print mecab_sparse_tostr(PtrMecab, SouceText)
> 
> End Sub

mecab_new2 の引数に渡す文字列は、SouceText ではありませんよ。
どこかで mecab_destroy を呼ばないとメモリリークになりますよ。

> (1) Declareステートメントで宣言する際、引数の型および戻り値の型に何を使用すればよいか?

Cの関数仕様に合わせて対応するものを指定しなければなりません。

ユーザ定義の (mecab_t *) については中身を VBA 側で触らないのなら
Long で良いのではないかと思います。

> (2) ByRef(参照渡し), ByVal(値渡し)どちらを使うのが適切なのか?

これについてはきちんと調べた方が良いですよ。重要な話ですから。
今回の3つの関数の引数の場合は ByVal で良いと思います。
 
> 解決に必要な知識はMeCabから少しそれてしまっている気もしますが。。。

まぁ、VBA から使えるとうれしいという方もいらっしゃるでしょうから、
良いのではないでしょうか。
-- 
=====================================================================
寺西 忠勝(TADAMASA TERANISHI)  yw3t-****@asahi*****
http://www.asahi-net.or.jp/~yw3t-trns/index.htm
Key fingerprint =  474E 4D93 8E97 11F6 662D  8A42 17F5 52F4 10E7 D14E




mecab-users メーリングリストの案内
Back to archive index