DOBON.NET DOBON.NETプログラミング掲示板過去ログ

VBでExcelのダイアログをだしたいんです。

環境/言語:[WinXp(SP3),VB.Net(2005),Excel(2003)]
分類:[.NET]

いつも皆さんの貴重なご意見参考にさせて頂いております。

早速なのですが質問させていただきます。
現在 Windows Xp(SP3)+VB.Net(2005)+Excel(2003)の環境で
とあるデータ(SQL2005)を読み込み、Excelのシートに貼り付け
PC上に保存する簡単な(はずの)プログラムを作っています。
Dim Ex_App As Object 'Excel.Application
Dim Ex_Book As Object 'Excel.Workbook
Dim Ex_Sheet As Object 'Excel.Worksheet

Ex_App = CreateObject("Excel.Application")
Ex_Book = Ex_App.Workbooks.Add
Ex_Sheet = Ex_Book.Worksheets(1)

  ここでDBから各セルにデータを貼り付け

Dim Ex_FilePath As String = "C:\hogehoge.xls"
Ex_Sheet.SaveAs(Ex_FilePath)

Ex_Sheet = Nothing
Ex_Book = Nothing
Ex_App.Quit()
Ex_App = Nothing

こんな感じで、正常に動作しています。
ただここで、チョット色気を出して、ファイル名を固定の名前じゃ無く
変更したいと考え、ダイアログを出す事を思いついたのですが、Excelって
xls形式だけじゃないんですよね。
それならと思い、Windowsの通常のダイアログじゃなくExcelのダイアログを
表示しようと思い、試行錯誤(ネットで色々調べたんですが)・・・
ExcelのVBAにはサンプルがあるのですが、純粋なVBでのサンプルが見当たりません。
ダイアログを表示して名称入力、ファイルタイプの変更は出来るのですが
情報を取得する方法が、わかりません。(やり方が違ってたらすみません。)
下記の様なコーディングをSaveAs命令の前に入れたんですがそこから先が・・・
あつかましいとは思いますが何方かお知恵をお貸し下さい。(返せるかどうか解りませんが)

Dim Ex_FileDialog As Microsoft.Office.Core.FileDialog

Ex_FileDialog = Ex_App.FileDialog(Microsoft.Office.Core.MsoFileDialogType.msoFileDialogSaveAs)
Ex_FileDialog.InitialFileName = Ex_FilePath
Ex_FileDialog.Show()

ちなみにExcelVBAでは、Show()で、(-1)が返ってきたら
Ex_FilePath = Ex_FileDialog.SelectedItems
で、パスが取得できると書いてありました。
http://blog.livedoor.jp/akf0/archives/51589923.html

プロパティ情報が、ExeclVBAとVB.Netでは違うようです。(当たり前か?)
よろしくお願いします。
2009/12/02(Wed) 09:37:18 編集(投稿者)

■No25935に返信(寅寅寅さんの記事)
> いつも皆さんの貴重なご意見参考にさせて頂いております。
なら、COM の解放処理くらい有名で何回も出てきている内容は知っていますよね?

> Ex_Sheet = Nothing
> Ex_Book = Nothing
> Ex_App.Quit()
> Ex_App = Nothing
.NET では COM の解放処理が必要です。
VB6.0 と違い、 Nothing の設定にほとんど意味は無くなってしまいました。
逆に、COM の解放処理を入れていないとエクセルのプロセスが終了せず、
プログラム終了後にエクセル操作をした場合に正常に表示できないなどの
実害が出るようになりました。

> Ex_Book = Ex_App.Workbooks.Add
COM の解放処理をする場合は、このコードでは Workbooks オブジェクトが
裏で使われる為 NG となります。


> ダイアログを出す事を思いついたのですが、Excelって
> xls形式だけじゃないんですよね。
> それならと思い、Windowsの通常のダイアログじゃなくExcelのダイアログを
意味が分かりません。ファイルの保存ダイアログ自体はファイルパスを指定する
だけなのでファイル形式は関係ありません。拡張子を限定したいなら、通常の
ファイルの保存ダイアログのプロパティで指定する内容なので、
> ExcelのVBAにはサンプルがあるのですが、純粋なVBでのサンプルが見当たりません。
VB で操作しておきながら、わざわざエクセルのダイアログ操作をするような
サンプルは少なくて当然かと。

> プロパティ情報が、ExeclVBAとVB.Netでは違うようです。(当たり前か?)
それはありません。
違うなら、違うオブジェクトを見ているか、勘違いだと思われます。
■No25938に返信(るしぇさんの記事)
> ファイルの保存ダイアログ自体はファイルパスを指定する
> だけなのでファイル形式は関係ありません。
いいえ、パスを指定するためだけではなく、ファイル形式の指定にも使われます。

たとえば html 形式で保存する事を選択した場合、ファイルパスだけではなく、
ページタイトルの指定や、選択したシートのみかブック全体の保存かの選択も、
このダイアログ上にて指定できるようになっています。


>> Dim Ex_FileDialog As Microsoft.Office.Core.FileDialog
MsoFileDialogType.msoFileDialogSaveAs な FileDialog オブジェクトの場合、
Show メソッドを呼び出すと保存ダイアログが表示されますが、それだけでは
保存処理は行われません。Show の後で Ex_FileDialog.Execute を
呼び出すことで、実際に保存される事になります。

ちなみに、XlBuiltInDialog.xlDialogSaveAs な Dialog オブジェクトの
場合には、Show メソッドのみで保存まで行われます。ただし、FileDialog の
方がより細かい制御を行う事ができます。

このほか、Application オブジェクトの GetSaveAsFilename メソッドでも
保存ダイアログを表示できます(こちらには、保存機能はありません)。
るしぇ ファミリーさん、魔界の仮面弁士さん 御回答ありがとうございます。

■No25938に返信(るしぇさんの記事)
> なら、COM の解放処理くらい有名で何回も出てきている内容は知っていますよね?
申し訳ありません。急いで記入していたもので、サンプルに使っていたVB6のコーディングを
載せてしまってました。

> 意味が分かりません。ファイルの保存ダイアログ自体はファイルパスを指定する
> だけなのでファイル形式は関係ありません。拡張子を限定したいなら、通常の
> ファイルの保存ダイアログのプロパティで指定する内容なので、
意味はあります。Windows標準のダイアログは、おっしゃっている内容通りの機能しか
ありませんが、Office内のダイアログは、そのOfficeが持っている保存機能(?)を
実現しており、一々フィルタの指定等をしなくても、インストールされているOfficeの
バージョンにより実現できるものが可能となります。
また、その機能によりファイルの保存形式を使用者がフィルタ上で選択する事で
切り替える事が出来るのです。


■No25939に返信(魔界の仮面弁士さんの記事)
> MsoFileDialogType.msoFileDialogSaveAs な FileDialog オブジェクトの場合、
> Show メソッドを呼び出すと保存ダイアログが表示されますが、それだけでは
> 保存処理は行われません。Show の後で Ex_FileDialog.Execute を
> 呼び出すことで、実際に保存される事になります。
ありがとうございます。保存されました。
以前に見たVBAのサンプルでは、保存パス名を取得する様な書き方がしてあったので
Show メソッドの後に、取得情報からSaveAs を実行するものだと信じていました。
目からうろこです。

これで、どんな形式のファイル出力にも対応できます。(無敵艦隊みたいです。)
ありがとうございました。
解決済み!
■No25943に返信(寅寅寅さんの記事)
なるほど、
http://msdn.microsoft.com/ja-jp/library/aa288625(VS.71).aspx#wrgrfexcelapplicationobjectpropertiesanchor4
これの
> FileDialog プロパティ
ですか。全く知らない内容でした。ごめんなさい。
解決済み!

DOBON.NET | プログラミング道 | プログラミング掲示板