@IT会議室は、ITエンジニアに特化した質問・回答コミュニティ「QA@IT」に生まれ変わりました。ぜひご利用ください。
- PR -

VB2005からマクロ(EXCEL2003)呼出時の戻り値

投稿者投稿内容
はし
会議室デビュー日: 2007/09/27
投稿数: 5
お住まい・勤務地: 東京都
投稿日時: 2007-09-27 22:41
現在VB2005からExcel2003のマクロを呼び出していますが、
戻り値の取得方法が分からなく調べています。

マクロが実行できることは確認しています。
戻り値はそもそも取得できるのでしょうか?

現在行っているやり方ではNULLしか取れません。

行っている処理は以下の通りです。

■VB側■
Dim oExcel As New Excel.ApplicationClass()
Dim oBook As Excel.WorkbookClass
Dim filePath As String = "参照XLSファイルパス"
Dim oBooks As Excel.Workbooks = oExcel.Workbooks

oExcel.Visible = False
oBook = oBooks.Open(filePath)

'ここで戻り値を取得したいです。
Dim ans As String = CType(oExcel.Run("'" & oBook.Name & "'!ThisWorkbook.DoKbTestWithParameter", "テスト"), String)

System.Runtime.InteropServices.Marshal.ReleaseComObject(oBook)
oBook = Nothing
System.Runtime.InteropServices.Marshal.ReleaseComObject(oBooks)
oBooks = Nothing
oExcel.Quit()
System.Runtime.InteropServices.Marshal.ReleaseComObject(oExcel)
oExcel = Nothing

■EXCE側■
Public Function DoKbTestWithParameter(sMsg As String)
MsgBox sMsg
DoKbTestWithParameter = "VBA関数戻り値"
End Function

ご教授お願いします。
渋木宏明(ひどり)
ぬし
会議室デビュー日: 2004/01/14
投稿数: 1155
お住まい・勤務地: 東京
投稿日時: 2007-09-27 23:16
引用:

Dim ans As String = CType(oExcel.Run("'" & oBook.Name & "'!ThisWorkbook.DoKbTestWithParameter", "テスト"), String)



PIA 使ってるんですよね?
Excel.Run() の戻り値の型は何になってます?
はし
会議室デビュー日: 2007/09/27
投稿数: 5
お住まい・勤務地: 東京都
投稿日時: 2007-09-28 09:36
返信ありがとうございます。

引用:
--------------------------------------------------------------------------------
PIA 使ってるんですよね?
--------------------------------------------------------------------------------

すいません。PIA調べてみたのですが意味が良く分かりません。
「OfficeのAPIを使う」という感じでしょうか?


引用:
--------------------------------------------------------------------------------
Excel.Run() の戻り値の型は何になってます?
--------------------------------------------------------------------------------
戻り値はオブジェクト型になっています。
じゃんぬねっと
ぬし
会議室デビュー日: 2004/12/22
投稿数: 7811
お住まい・勤務地: 愛知県名古屋市
投稿日時: 2007-09-28 09:38
まず、VBA 側のプロシージャの戻り値の型を設定してください。 ついでに VB8 側では TryCast ステートメントを使うようにしましょう。

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

はしさんの書き込み (2007-09-28 09:36) より:

すいません。PIA調べてみたのですが意味が良く分かりません。
「OfficeのAPIを使う」という感じでしょうか?


検索すればすぐにヒットしますが、念のため貼っておきます。Office と相互運用するにおいて最低限知っておかねば致命傷になるものがいくつかあります。

_________________
C# と VB.NET の入門サイト
じゃんぬねっと日誌
はし
会議室デビュー日: 2007/09/27
投稿数: 5
お住まい・勤務地: 東京都
投稿日時: 2007-09-28 11:00
返信ありがとうございます。

引用:
--------------------------------------------------------------------------------    まず、VBA 側のプロシージャの戻り値の型を設定してください。 ついでに VB8 側では TryCast ステートメントを使うようにしましょう。
--------------------------------------------------------------------------------

確かに。以下の通りに変更しました。
■VB側■
Dim ans As String = TryCast(oExcel.Run("'" & oBook.Name & "'!ThisWorkbook.DoKbTestWithParameter", "テスト"), String)

■EXCE側■
Public Function DoKbTestWithParameter(sMsg As String) As String
MsgBox sMsg
DoKbTestWithParameter = "VBA関数戻り値"
End Function

PIAの参考リンクありがとうございました。勉強しておきます。

現在の状況なのですが、以前と変わらない状況です。
戻り値が必ずNULLしか取得できません。

昨日に引き続き今日も色々調べているのですが、中々参考サイトなどがヒットしません。。
じゃんぬねっと
ぬし
会議室デビュー日: 2004/12/22
投稿数: 7811
お住まい・勤務地: 愛知県名古屋市
投稿日時: 2007-09-28 11:26
引用:

はしさんの書き込み (2007-09-28 11:00) より:

現在の状況なのですが、以前と変わらない状況です。
戻り値が必ずNULLしか取得できません。


サンプルどおりの単純なメソッドであれば間違いなく取れるハズです。 やり方は合っているので参考サイトなどは不要ですよ。

ただ疑問に思うところはあります。 先ほど Object 型だと言っていたのは何でしょうか? 先ほどの実装例では VBA は Variant 型になりますので私は VB8 側のことだと捉えました。 Nothing には型などありませんから Object 型だという時点で何らかのインスタンスが返されているということになります。

コード:

    Dim ans As Object = oExcel.Run("'" & oBook.Name & "'!ThisWorkbook.DoKbTestWithParameter", "テスト")

    If ans IsNot Nothing Then
        MessageBox.Show(ans.ToString())
    End If


VBA 側のコードは確実に実行されているのであれば、上記のようなコードで確認できると思います。

_________________
C# と VB.NET の入門サイト
じゃんぬねっと日誌
はし
会議室デビュー日: 2007/09/27
投稿数: 5
お住まい・勤務地: 東京都
投稿日時: 2007-10-01 20:02
返信ありがとうございます。

引用:
--------------------------------------------------------------------------------  
Object 型だと言っていたのは何でしょうか?
--------------------------------------------------------------------------------
oExcelオブジェクトのRunメソッドの戻り値がObject型だったので、Object型ではないかと。。

以前私は:
--------------------------------------------------------------------------------  
現在行っているやり方ではNULLしか取れません。
--------------------------------------------------------------------------------
と書いていましたが、正しくはNothingでした。申し訳ありませんでした。

現在の状況ですが、やはり戻り値が取得できない状況です。
戻り値が取得できた方がいたら、サンプルコードを見せて頂きたいと思います。
よろしくお願いします。

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