- PR -

VBSで作成したFunctionをC#側から呼びたい。

投稿者投稿内容
じゃんぬねっと
ぬし
会議室デビュー日: 2004/12/22
投稿数: 7811
お住まい・勤務地: 愛知県名古屋市
投稿日時: 2007-09-05 17:44
引用:

オウドーさんの書き込み (2007-09-05 17:24) より:

参照先にはExcel及び、Sprict Controlを設定しております。
これ以外に、必要な名前空間がいるみたいですね。


いいえ、ありません。 とりあえず ScriptControl をインスタンス化するだけならば、参照設定へは 「Microsoft Script Control」 を追加するのみで良いです。

引用:

尚、参照設定はしております。


と書いてはありましたが、念のため確認して頂きたかったのは、

コード:

    MSScriptControl.ScriptControl scr = new MSScriptControl.ScriptControl();


このコードでインテリセンスに表示されないのは、参照設定が正しくできていないくらいしか原因が思いつかなかったからです。 using ディレクティブは、ただ名前空間が省略できるという意味でしかないですので、そこに原因はないでしょう。

他に何らかの要因 (たとえば、IDE の不具合など) があるといけないので、新規のプロジェクトでも確認してみてください。

_________________
C# と VB.NET の入門サイト
じゃんぬねっと日誌
じゃんぬねっと
ぬし
会議室デビュー日: 2004/12/22
投稿数: 7811
お住まい・勤務地: 愛知県名古屋市
投稿日時: 2007-09-05 17:50
引用:

オウドーさんの書き込み (2007-09-05 17:24) より:

インテリセンスされませんでしたのでコードは作成しませんでした。
以下さらに編集です
---------------------
インテリセンスに出てきました!!
参照設定の項目を削除し、再び設定することによりちゃんと行われるようになりました。
ありがとうございました。


おk。 良かったです。 やはり新規プロジェクトなどで試すという行為は大切ですね。



orz

_________________
C# と VB.NET の入門サイト
じゃんぬねっと日誌
オウドー
ベテラン
会議室デビュー日: 2007/06/05
投稿数: 59
投稿日時: 2007-09-05 18:04
引用:

じゃんぬねっとさんの書き込み (2007-09-05 17:50) より:

おk。 良かったです。 やはり新規プロジェクトなどで試すという行為は大切ですね。



orz





色々なページを参照しているとじゃんぬさんのページにたどりつき気になる文章が・・・

>>個人的には COM を扱う場合は COM 専用の言語で実装することをお勧めします。VBA 側のマクロを .NET アプリケーションから呼び出す方法、VB または VBScript に処理を実装して呼び出す方法、あるいは ScriptControl を利用する方法があります。これらの方法であれば参照カウントの面倒はそれほど面倒ではありません。

今、私はC#上でVBSのFunctionを呼び出し、C#に返された値を使いデータベースに入れるといった処理を想定し、作成しております。

しかし、今さっき私が質問した内容などにはScriptControlをnewしてましたよね。
今、私がしているのはScriptControlを利用している方法に当たるのでしょうか?

個人的には、VBScriptをに処理を実装して呼び出す方法がいいんですが。

それとも、上記二つ両方含めた内容でしょうか。仮にそうであればじゃんぬさんの書いてることに矛盾すると思うのです。
じゃんぬねっと
ぬし
会議室デビュー日: 2004/12/22
投稿数: 7811
お住まい・勤務地: 愛知県名古屋市
投稿日時: 2007-09-05 18:32
引用:

オウドーさんの書き込み (2007-09-05 18:04) より:

しかし、今さっき私が質問した内容などにはScriptControlをnewしてましたよね。
今、私がしているのはScriptControlを利用している方法に当たるのでしょうか?


はい。 参照ページを見る限りその方法に当たると思います。

引用:

個人的には、VBScriptをに処理を実装して呼び出す方法がいいんですが。

それとも、上記二つ両方含めた内容でしょうか。


見方によっては両方になるでしょうね。 VBS ファイルで実行したいステートメントを動的に ExecuteStatement で流すことになるわけですから。

引用:

仮にそうであればじゃんぬさんの書いてることに矛盾すると思うのです。


そうですか? そのムジュンというのが気になりますね。

_________________
C# と VB.NET の入門サイト
じゃんぬねっと日誌
渋木宏明(ひどり)
ぬし
会議室デビュー日: 2004/01/14
投稿数: 1155
お住まい・勤務地: 東京
投稿日時: 2007-09-05 19:15
引用:

早速のお返事ありがとうございます。そうですね。ドキュメントに書いてない限り
完璧に動作するって保障がありませんね。



完璧どころか、期待通りの動作をする保証すらも無い(かもね)ってことです。
なんせ、コントロールを作った方にしてみれば想定外の使い方かもしれないわけなので。

仮に想定どおりに動いているように見えていても

・いつ何時破滅的な状況に陥るかもしれない
・正規のルートによるサポートは期待できない

ということは一応覚悟しておくべきです。

なんてことは既に承知の上かもしれませんが、リスクは多少大きめに評価しておいた方が無難だと思うので、一応念のため。


[ メッセージ編集済み 編集者: 渋木宏明(ひどり) 編集日時 2007-09-05 19:18 ]
オウドー
ベテラン
会議室デビュー日: 2007/06/05
投稿数: 59
投稿日時: 2007-09-06 17:46
コード:

ScriptControl SC = new ScriptControl();
Excel.Application excel = new Excel.Application();
string code = "";
using (StreamReader Vbsapp = new StreamReader("ファイルパス", System.Text.Encoding.Default))
{
while (!Vbsapp.EndOfStream)
{
string line = Vbsapp.ReadLine();
code += line + "\r\n";
}
}
SC.Language = "VBScript";
SC.AddCode(code);

object[] parameters = { excel, i };// パラメータ無しのとき

string a = SC.Run("test", ref parameters).ToString();
listView1.Items.Add(a);


以下VBSのコード

Public Function test(objExcel)
objExcel.Visible = False
objExcel.WorkBooks.Open("Excelファイルパス")
For X = 11 To 30 Step 1
test = objExcel.WorkSheets(1).Cells(X,1).Value
Next
objExcel.Quit
Set objExcel = Nothing
End Function




お返事ありがとうございます。
返信遅れました。VBSと格闘してました。
ようやく、VBS側から値をもらうってことが出来ました。
しかし、欲しいのは一つだけ値ではなく複数の値です。
セルA:1〜セルA:15までの値を欲しいといったときにいい形で取得できません。
無理やりC#側でforをまわし、VBSを何回も走らせる方法でやってみました。。
走らせるとき、引数にセル番号、Excelインスタンスを渡しました。
しかし、この方法だとパフォーマンスが最悪です。
何かいい方法はないでしょうか。キーワードだけでもいただきたいです。
よろしくお願いします。


[ メッセージ編集済み 編集者: オウドー 編集日時 2007-09-06 18:12 ]
オウドー
ベテラン
会議室デビュー日: 2007/06/05
投稿数: 59
投稿日時: 2007-09-06 18:02
引用:

じゃんぬねっとさんの書き込み (2007-09-05 17:50) より:
VBScript に処理を実装して呼び出す方法、あるいは ScriptControl を利用する方法があります


上記に矛盾があると思います。
この表現では、VBScriptとScriptControlは完全別々に扱い実装すると思ってしまいます。
私は、VBScriptとScriptControlの二つを使うことにより行いたい処理を実装できると思っております。勘違いならすいません。

引用:

完璧どころか、期待通りの動作をする保証すらも無い(かもね)ってことです。
なんせ、コントロールを作った方にしてみれば想定外の使い方かもしれないわけなので。

仮に想定どおりに動いているように見えていても

・いつ何時破滅的な状況に陥るかもしれない
・正規のルートによるサポートは期待できない

ということは一応覚悟しておくべきです。

なんてことは既に承知の上かもしれませんが、リスクは多少大きめに評価しておいた方が無難だと思うので、一応念のため。



そうですよね。完全どころか・・・(略


[ メッセージ編集済み 編集者: オウドー 編集日時 2007-09-06 18:04 ]
Jitta
ぬし
会議室デビュー日: 2002/07/05
投稿数: 6267
お住まい・勤務地: 兵庫県・海手
投稿日時: 2007-09-06 18:17
矛盾?

なんでも貫く矛と、必ず防ぐ盾を売る男が居た。この男に、ある人が聞いた。「その矛で、その盾を突くと、どうなるかね?」

矛盾って、二つの物事があると思っていた。
「VBScript に処理を実装して呼び出す方法、あるいは ScriptControl を利用する方法があります」
この表記には、一つの物事(呼び出す方法は二つある)しか書かれていないと思う。

スキルアップ/キャリアアップ(JOB@IT)