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

Back to archive index

fukum****@amber***** fukum****@amber*****
2010年 1月 7日 (木) 09:32:36 JST


福光です。

回答ありがとうございました。

アドバイスを元に以下のように修正してみましたが、
残念ながら、まだうまく動きません。。。

' 以下コード **************************

' MeCab: 0.98(Windowsバイナリ) + Excel2003
'
' 「問題が発生したため、Microsoft Office Excel を終了します。」で
' 異常終了してしまう。

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

Sub MorphTest2()

    Dim SouceText As String
    SouceText = "すもももももももものうち"

    PtrMecab = mecab_new2(vbNullString)

    Debug.Print mecab_sparse_tostr(PtrMecab, 文字列)

    Call mecab_destroy(PtrMecab)

End Sub
' コードここまで。**********************


> mecab_new2 の引数に渡す文字列は、SouceText ではありませんよ。

VB2005のサンプルコードで String.Empty を渡しているものがあったので、
vbNullString を渡してみました。
http://homepage1.nifty.com/yasunari/VB/VB2005/MeCab.htm

お気づきの点等ありましたら、アドバイス等いただければ幸いです。



----- Original Message ----- 
From: "Tadamasa Teranishi" <yw3t-****@asahi*****>
Cc: <mecab****@lists*****>
Sent: Thursday, January 07, 2010 5:18 AM
Subject: [mecab-users 393] Re:Excel VBA からMeCabを使用するには?


> 寺西です。
>
> 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 mailing list
> mecab****@lists*****
> http://lists.sourceforge.jp/mailman/listinfo/mecab-users
>




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