C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

Re[3]: Excelを年月日をつけて保存したのですが、


(過去ログ 64 を表示中)

[トピック内 5 記事 (1 - 5 表示)]  << 0 >>

■36926 / inTopicNo.1)  Excelを年月日をつけて保存したのですが、
  
□投稿者/ jin (7回)-(2009/06/10(Wed) 09:26:52)

分類:[VB.NET/VB2005 以降] 

お世話になります。jinです。
VB2008にてWindowsフォームを開発しているのですが、
以前、VBからSQLを実行し、その結果をExcelに書き込むという
質問をさせていただき、無事行えるようになりました。
今回の質問は、その保存方法についてお聞きしたいと思っております。
まず、以下のソースをご覧いただきたいと思います。
'変数に今日の日付をつける
	   Dim day As String = Format$(Now, "yyyy/MM/dd hhmmss")

            '===========================
            ' 新規のEXCELファイルを開く。
            '===========================
	   Dim xlApp As Excel.Application
            Dim xlBook As Excel.Workbook
            Dim xlSheet As Excel.Worksheet

            xlApp = New Excel.Application
            xlApp.Visible = True 'EXCELの表示
            xlApp.Workbooks.Add() '新規ブックを作成する
            xlBook = xlApp.ActiveWorkbook 'Workbook
            xlSheet = DirectCast(xlBook.ActiveSheet, Excel.Worksheet) 'Worksheet

	    '*******************************************************
	  'Excelへの書き込みを行った後にcsvファイルとして保存する。
	    '*******************************************************

	    
	   '解放の処理を行う。
	  xlApp.DisplayAlerts = False 

	   'TEMPというフォルダに保存する。
            xlSheet.SaveAs("C:\TEMP\'" & day & "'.csv")

            MRComObject(xlSheet)       '←xlSheet のMarshal.ReleaseComObject

            MRComObject(xlBook)        '←xlBook のMarshal.ReleaseComObject
             
            MRComObject(xlApp)         '←xlApp のMarshal.ReleaseComObject

            xlSheet = Nothing
            xlBook = Nothing
            xlApp = Nothing

上記のソースはExcelの立ち上げから解放までのソースです。
書き込みについては問題が無いので、載せていません。

'************************************************************
問題は、Excelのファイルを保存する際、タイトルに
時刻を含めた今日の日付を設定したいということです。
名前を付けて保存する際、
「day」という今日の日付を設定した変数を名前に指定すると、
以下のエラーが出ます。
'************************************************************

ファイル 'C:\TEMP\集計(月次)'2009\06' にアクセスできません。
次のいずれかの理由が考えられます。  
&#8226; ファイル名またはパス名が存在しない可能性があります。 
&#8226; 開こうとしているファイルは、ほかのユーザーまたはプログラムによって開かれています。
ほかのプログラムで開いている場合、ファイルを閉じた後、もう一度実行してください。 
&#8226; 保存しようとしているファイルと同じ名前のファイルが、
既に読み取り専用のファイルとして保存されています。別の名前で保存してみてください。

非常に長いのですが、以上がエラーの内容になります。

目的としては何度同じ動作を行っても、
それぞれ別の名前で保存したということです。
そこで考えましたのが、時刻を含めた名前を付けるということです。

申し訳ないのですが、日付を設定してファイルを保存する方法を
ご教授願えないでしょうか、




引用返信 編集キー/
■36927 / inTopicNo.2)  Re[1]: Excelを年月日をつけて保存したのですが、
□投稿者/ よねKEN (348回)-(2009/06/10(Wed) 09:36:21)
2009/06/10(Wed) 09:42:39 編集(投稿者)

> '変数に今日の日付をつける
> Dim day As String = Format$(Now, "yyyy/MM/dd hhmmss")

この処理の結果、変数dayはどんな値になっていることを期待しているのでしょう?
また、実際に変数dayの値はどんな値になったのかを確認しましたか?

> xlSheet.SaveAs("C:\TEMP\'" & day & "'.csv")

つまり、ここで決めるcsvファイル名はどんな名前になることを期待しているのですか?

ちなみに「Format$(Now, "yyyy/MM/dd hhmmss")」という記述で取得できる文字列は、
実行環境の「地域と言語のオプション」で結果が変わってきます。

動作検証していませんが、私の環境なら、日付の区切り文字の設定が"/"のため
「2009/06/10 093512」のような文字列になります。
この"/"はファイル名に含むことのできない文字です。

"/"はパスの区切りと判断され、TEMPフォルダの2009フォルダの06フォルダの
"10 093512.csv"というファイルとみなされるので、
2009や06といった途中のフォルダがないためエラーになるでしょう。

引用返信 編集キー/
■36930 / inTopicNo.3)  Re[1]: Excelを年月日をつけて保存したのですが、
□投稿者/ 魔界の仮面弁士 (1130回)-(2009/06/10(Wed) 10:01:44)
本題はよねKENさんが既に回答されているので、今回の問題とは別の点について指摘。

■No36926 (jin さん) に返信
> Dim day As String = Format$(Now, "yyyy/MM/dd hhmmss")

$ は冗長なので、単に Format でよいかと思いますよ。

Excel VBA や VB6 等では、Format と Format$ の 2 種類がありましたが、
VB.NET では Format しかありません。

'-------------
 ' 旧 VB
 Dim V As Variant
 V = Now()
 'V = Null    ' Null を渡すと、$版はエラーになる。
 Debug.Print Format(V, "yyyyMMdd_hhmmss")
 Debug.Print Format$(V, "yyyyMMdd_hhmmss")
 Debug.Print [_B_var_Format](V, "yyyyMMdd_hhmmss")
 Debug.Print [_B_str_Format](V, "yyyyMMdd_hhmmss")
'-------------

VB.NET で関数名に $ を付けるというのは、
  Function Sample(ByVal n As Integer) As String
    Return CStr(n)
  End Function
を、
  Dim x As String = Sample(100)
  Dim y As String = Sample$(100)
のいずれでも呼び出せる程度の意味しかなかったりします。
旧VB のように、「$付きの方が処理効率が良い」といった効能は無いのでご注意を。



> xlApp.Workbooks.Add() '新規ブックを作成する
> xlBook = xlApp.ActiveWorkbook 'Workbook
これは問題があるかと思います。この場合は、

 Dim xlBooks As Excel.Workbooks = xlApp.Workbooks
 Dim xlBook  As Excel.Workbook  = xlBooks.Add()

が適切です。


> xlSheet.SaveAs("C:\TEMP\'" & day & "'.csv")
この場合、「'」もファイル名の一部となり、
シングルクォーテーション付きで保存されますが、それで良いのでしょうか?

引用返信 編集キー/
■36932 / inTopicNo.4)  Re[2]: Excelを年月日をつけて保存したのですが、
□投稿者/ jin (8回)-(2009/06/10(Wed) 10:21:39)
2009/06/10(Wed) 10:24:55 編集(投稿者)

よねKEN さん、
魔界の仮面弁士さん、
回答ありがとうございます。

よねKENさん
> '変数に今日の日付をつける
> Dim day As String = Format$(Now, "yyyy/MM/dd hhmmss")

>この処理の結果、変数dayはどんな値になっていることを期待しているのでしょう?
>また、実際に変数dayの値はどんな値になったのかを確認しましたか?

私が想定していたのは、
dayという変数の値を
2009/06/10 100933
という書式に設定したいと考えて、
最終的にcsvファイルのタイトルを
「2009/06/10 100933.csv」
というタイトルに保存したいと考えておりました。

>ちなみに「Format$(Now, "yyyy/MM/dd hhmmss")」という記述で取得できる文字列は、
>実行環境の「地域と言語のオプション」で結果が変わってきます。

全く知りませんでした・・・。
年月の書式設定で調べていたので、
実行したときの環境のこと等は考えておりませんでした。

>動作検証していませんが、私の環境なら、日付の区切り文字の設定が"/"のため
>「2009/06/10 093512」のような文字列になります。

デバック処理でdayの値を確かめると、確かにその書式と同じであり、
私が期待していた値でした。
ですが、

>この"/"はファイル名に含むことのできない文字です。
気づきませんでした・・・。

>"/"はパスの区切りと判断され、TEMPフォルダの2009フォルダの06フォルダの
>"10 093512.csv"というファイルとみなされるので、
>2009や06といった途中のフォルダがないためエラーになるでしょう。

デバック処理の中で、
「TEMPフォルダの2009フォルダの06フォルダの"10 093512.csv"」
は、確かに存在しません。
存在しないファイルを見つけようとしてのエラーということでしょうか、
そのようでしたら、エラーの意味と原因が理解できます。
ありがとうございました。


魔界の仮面弁士さん、
>Excel VBA や VB6 等では、Format と Format$ の 2 種類がありましたが、
>VB.NET では Format しかありません。

VBでのFormatの使い方と理解そのものを間違っていました。

> xlApp.Workbooks.Add() '新規ブックを作成する
> xlBook = xlApp.ActiveWorkbook 'Workbook
>これは問題があるかと思います。この場合は、

> Dim xlBooks As Excel.Workbooks = xlApp.Workbooks
> Dim xlBook As Excel.Workbook = xlBooks.Add()
>が適切です。

ご教授ありがとうございます。
早速、提示してくださった形に訂正します。


引用返信 編集キー/
■36935 / inTopicNo.5)  Re[3]: Excelを年月日をつけて保存したのですが、
□投稿者/ jin (9回)-(2009/06/10(Wed) 10:59:53)
> 2009/06/10(Wed) 10:24:55 編集(投稿者)

よねKENさん、
魔界の仮面弁士さん、

ありがとうございました。
無事、日付をつけての保存が出来るようになりました。
最終的にのソースとなりました。

            '変数に今日の日付をつける
	   Dim day As String = Format(Now, "yyyyMMdd hhmmss")

	   '=========================================================
            ' 新規のEXCELファイルを開きDataGridViewの内容を書き込む。
            '=========================================================
            Dim xlApp As Excel.Application
            Dim xlSheet As Excel.Worksheet

            '======================
            ' EXCELファイルを開く。
            '======================
            xlApp = New Excel.Application

            Dim xlBooks As Excel.Workbooks = xlApp.Workbooks
            Dim xlBook As Excel.Workbook = xlBooks.Add()
            xlApp.Visible = True 'EXCELの表示
            xlSheet = DirectCast(xlBook.ActiveSheet, Excel.Worksheet) 'Worksheet            

	    '*******************************************************
	  'Excelへの書き込みを行った後にcsvファイルとして保存する。
	    '*******************************************************

	    '=============================
	    '解放の処理を行う。
   	  '=============================
	  xlApp.DisplayAlerts = False 

	    'TEMPというフォルダに保存する。
            xlSheet.SaveAs("C:\TEMP\" & day & ".csv")

            MRComObject(xlSheet)       '←xlSheet のMarshal.ReleaseComObject

            MRComObject(xlBook)        '←xlBook のMarshal.ReleaseComObject

            MRComObject(xlBooks)       '←xlBooks の Marshal.ReleaseComObject
             
            MRComObject(xlApp)         '←xlApp のMarshal.ReleaseComObject

            xlSheet = Nothing
            xlBook = Nothing
            xlBooks = Nothing
            xlApp = Nothing

よねKENさんの
>この"/"はファイル名に含むことのできない文字です。

形としては、
"/"を外しただけなのですが、
「20090610 102035.csv」
というタイトルでの保存が出来るようになり、
常に個別のタイトルを付けての保存が出来るように
なりました。


さらに、魔界の仮面弁士さんがご教授してくださった、
Excelの立ち上げに関しまして、

>Dim xlBooks As Excel.Workbooks = xlApp.Workbooks
>Dim xlBook  As Excel.Workbook  = xlBooks.Add()
>が適切です。

という形に変えましたところ、
解放処理が問題なく出来るようになりました。

実をいうと、今回の仕様について、
解放処理がうまくいかないことがありました。
タスクマネージャーのプロセスに
EXCEL.EXEが残ってしまうことがあったのですが、
魔界の仮面弁士さんのご指摘どおりに訂正したところ、
そちらも解決することができました。

ありがとうございます。

解決済み
引用返信 編集キー/


トピック内ページ移動 / << 0 >>

このトピックに書きこむ

過去ログには書き込み不可

管理者用

- Child Tree -