- PR -

検索結果をEXCELでグラフ表示したい

投稿者投稿内容
わしこ
常連さん
会議室デビュー日: 2005/10/18
投稿数: 35
投稿日時: 2006-05-26 14:39
「VB.NETで作成した検索条件入力画面で、
検索条件を入力し「検索」ボタンを押下すると、
その結果がEXCELに一覧とグラフで表示される」

という機能をもったプログラムを作成しようとしています。

EXCELに表示する意味は、表示されたものが
加工(印刷したりレイアウト変えたり等)しやすいからです。


わからない点は、
DB接続・データ抽出までをVB.NETでやった方がいいのか、
それとも検索条件をEXCELに渡してDB接続はVBAでやった方がいいのか、
どちらがいい方法なのか、という事です。

そもそもVB.NETからデータを渡して
VBAでそれを受け取りグラフ表示…ってできるのでしょうか?

相談のような内容になってしまいましたが、
.NET、VBAに精通された方おられましたら教えてください

[ メッセージ編集済み 編集者: わしこ 編集日時 2006-05-26 14:40 ]

[ メッセージ編集済み 編集者: わしこ 編集日時 2006-05-26 14:43 ]
じゃんぬねっと
ぬし
会議室デビュー日: 2004/12/22
投稿数: 7811
お住まい・勤務地: 愛知県名古屋市
投稿日時: 2006-05-26 14:43
引用:

わしこさんの書き込み (2006-05-26 14:39) より:

わからない点は、
DB接続・データ抽出までをVB.NETでやった方がいいのか、
それとも検索条件をEXCELに渡してDB接続はVBAでやった方がいいのか、
どちらがいい方法なのか、という事です。


どちらの方法も、さらにいろんな方法に分かれるので何とも言えないですね。
VSTO を利用するとか、COM Interop を利用するか、3rd パーティ製品を利用するなど。

引用:

そもそもVB.NETからデータを渡して
VBAでそれを受け取りグラフ表示…ってできるのでしょうか?


データを渡す方法はいくつかあります。
グラフで表示するならば、セルに直接値を埋め込むのが手軽かもしれません。

引用:

.NET、VBAに精通された方おられましたら教えてください


精通していない者の意見で申し訳ありませんがw どちらもアリじゃないかと思います。
COM Interop を使うよりは、VBA 側ですべてやった方が良いような気もしますが。

_________________
C# と VB.NET の入門サイト
じゃんぬねっと日誌
わしこ
常連さん
会議室デビュー日: 2005/10/18
投稿数: 35
投稿日時: 2006-05-26 14:52
じゃんぬねっと様、早速返答ありがとうございます。

引用:

データを渡す方法はいくつかあります。
グラフで表示するならば、セルに直接値を埋め込むのが手軽かもしれません。


ネットで検索しましたが、
なかなかそれらしいものがありませんでした。
検索の仕方が悪そうですね。

引用:

精通していない者の意見で申し訳ありませんがw どちらもアリじゃないかと思います。
COM Interop を使うよりは、VBA 側ですべてやった方が良いような気もしますが。


いえいえ、とんでもありません。いつもありがとうございます。
そうですね。検索条件をVBAに渡し、検索はVBAでやった方が
解りやすい方法である気がします。

VB.NETからVBAに値を渡す方法があると解っただけでも、
先に進めそうです。
ありがとうございます。
じゃんぬねっと
ぬし
会議室デビュー日: 2004/12/22
投稿数: 7811
お住まい・勤務地: 愛知県名古屋市
投稿日時: 2006-05-26 15:39
引用:

わしこさんの書き込み (2006-05-26 14:52) より:

そうですね。検索条件をVBAに渡し、検索はVBAでやった方が解りやすい方法である気がします。
VB.NETからVBAに値を渡す方法があると解っただけでも、先に進めそうです。


どうせなので、1 つの解決策として書いておきますね。
まず、Excel 側のマクロ関数を呼び出す例です。

「Microsoft Excel xx.x Object Library」を参照設定に追加してください。
(COM オブジェクトなので、ReleaseComObject メソッドで確実に参照を解放する必要があります)

コード:

    Private Sub Button1_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles Button1.Click
        Dim xlApplication As Excel.Application

        Try
            xlApplication = New Excel.Application()
            xlApplication.Visible = True
            Dim xlWorkbooks As Excel.Workbooks

            Try
                xlWorkbooks = xlApplication.Workbooks
                Dim xlWorkbook As Excel.Workbook

                Try
                    xlWorkbook = xlWorkbooks.Open("C:\Maki.xls")
                    xlApplication.Run("MosaMosaAA", "もっさもっさー", "と、文字列を渡してみる")
                Finally
                    If Not xlWorkbook Is Nothing Then
                        System.Runtime.InteropServices.Marshal.ReleaseComObject(xlWorkbook)
                    End If
                End Try
            Finally
                If Not xlWorkbooks Is Nothing Then
                    System.Runtime.InteropServices.Marshal.ReleaseComObject(xlWorkbooks)
                End If
            End Try
        Finally
            If Not xlApplication Is Nothing Then
                System.Runtime.InteropServices.Marshal.ReleaseComObject(xlApplication)
            End If
        End Try
    End Sub


ここでは、Maki.xls という Excel Book にある MosaMosaAA という名前の関数を実行します。
実行するにあたり、2 つの文字列を引数として渡しています。

以下は、その呼び出される側 (Excel Book) 側の関数です。

コード:

    Public Sub MosaMosaAA(ByVal stTitle As String, ByVal stMessage As String)
        Call MsgBox(stMessage, vbOKOnly Or vbInformation, stTitle)
    End Sub


ここでは、2 つの文字列を受け取り、メッセージ ボックスを表示します。

_________________
C# と VB.NET の入門サイト
じゃんぬねっと日誌
わしこ
常連さん
会議室デビュー日: 2005/10/18
投稿数: 35
投稿日時: 2006-05-26 17:22
じゃんぬねっと様、具体的なコードまでありがとうございます。

いただいたコードを実行してみたところ
.NET側で関数MosaMosaAAを参照するところで
******
'System.Runtime.InteropServices.COMException' のハンドルされていない例外が WindowsApplication1.exe で発生しました。

追加情報 : マクロ 'MosaMosaAA' が見つかりません。
******
なるエラーでとまってしまいます。

明らかにVBA側の関数の書く場所が悪いのだと思っています。

以下のソースをSheet1,Sheet2,Sheet3,ThisWorkBook
新しいモジュールなど、どこに書いても同じ現象が起こってしまいました。


引用:

コード:

    Public Sub MosaMosaAA(ByVal stTitle As String, ByVal stMessage As String)
        Call MsgBox(stMessage, vbOKOnly Or vbInformation, stTitle)
    End Sub


ここでは、2 つの文字列を受け取り、メッセージ ボックスを表示します。
[/code]



参照設定は行いました。
じゃんぬねっと
ぬし
会議室デビュー日: 2004/12/22
投稿数: 7811
お住まい・勤務地: 愛知県名古屋市
投稿日時: 2006-05-26 17:51
引用:

わしこさんの書き込み (2006-05-26 17:22) より:

明らかにVBA側の関数の書く場所が悪いのだと思っています。


そうですね、標準モジュールに書いてください...

引用:

以下のソースをSheet1,Sheet2,Sheet3,ThisWorkBook
新しいモジュールなど、どこに書いても同じ現象が起こってしまいました。


Σ(;゚Д゚) えーっ!!
絶対できるハズなんですが... (;~_~)

開いているファイルが違っていたりとか、そんなことはないですよね...?

_________________
C# と VB.NET の入門サイト
じゃんぬねっと日誌
マー帽
常連さん
会議室デビュー日: 2006/01/31
投稿数: 21
投稿日時: 2006-05-26 23:54
横から失礼します。

引用:

いただいたコードを実行してみたところ
.NET側で関数MosaMosaAAを参照するところで
******
'System.Runtime.InteropServices.COMException' のハンドルされていない例外が WindowsApplication1.exe で発生しました。

追加情報 : マクロ 'MosaMosaAA' が見つかりません。



ThisWorkbookに作成して、下記の様に記述すれば実行出来るのではないでしょうか?

コード:
    xlApplication.Run("ThisWorkbook.MosaMosaAA", "もっさもっさー", "と、文字列を渡してみる")


じゃんぬねっと
ぬし
会議室デビュー日: 2004/12/22
投稿数: 7811
お住まい・勤務地: 愛知県名古屋市
投稿日時: 2006-05-27 00:07
いえ、標準モジュールに書いてあれば、普通にできるハズなのでそれに驚いています。
(なんせ、私も動作確認していますから...)

_________________
C# と VB.NET の入門サイト
じゃんぬねっと日誌

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