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

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

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

Excel読み込み時の月で取得していく方法

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

■83045 / inTopicNo.1)  Excel読み込み時の月で取得していく方法
  
□投稿者/ ra (1回)-(2017/03/01(Wed) 11:30:32)

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

2017/03/01(Wed) 11:32:31 編集(投稿者)
2017/03/01(Wed) 11:32:28 編集(投稿者)

初めまして 教えてください

使用言語:VisualBasic 2013

現在 運用しているプログラムで行き詰りましたので。。


あるサーバー内のフォルダ内のエクセルを読み込み
VBプログラム内のデーターを書き出しているんですが

1月〜12月までのエクセルファイルが置いてあります

一日ごとに 業務終了時
サーバーフォルダ内ファイル取得→SheetへNow.Dayにて日付でファイルネーム指定
→上書き保存 という流れを毎日しています


しかし、月が替われば 2月というフルパスで取得してるため
現在は、3月になる前に 3月を取得とプログラムを書き換え
非常にめんどくさい事をしています

月が替わると 自動でファイルを検索して切り替える等できるのでしょうか??

よろしくお願い致します。
引用返信 編集キー/
■83067 / inTopicNo.2)  Re[1]: Excel読み込み時の月で取得していく方法
□投稿者/ 魔界の仮面弁士 (1156回)-(2017/03/03(Fri) 07:07:44)
No83045 (ra さん) に返信
> 一日ごとに 業務終了時
> サーバーフォルダ内ファイル取得→SheetへNow.Dayにて日付でファイルネーム指定
> →上書き保存 という流れを毎日しています

どういう日付の時に、どういうファイル名になるのか実例が無いため、
現在の処理イメージを想像できず、回答しにくいです。


> しかし、月が替われば 2月というフルパスで取得してるため
「2月というフルパス」というのが曖昧で良くわかりません。

たとえば 2017/02/28 だった場合には、
\\server\shared\2017-02\
などでは無く、全角数字な
\\server\shared\2月\
というパスになる、ということでしょうか。


> 現在は、3月になる前に 3月を取得とプログラムを書き換え
> 非常にめんどくさい事をしています
3月になると「3月」を取得するのではなく、
3月になると「3月」を取得するのですか?

先の説明だと、全角数字な2月だったはずですが、
今度の説明では、半角数字な 3月になっているようで。


> 月が替わると 自動でファイルを検索して切り替える等できるのでしょうか??
どういう条件で検索したいのか、運用ルールが分からないので回答しにくいです。
ファイル名ではなく、ファイルの作成日や更新日を検索したいという意味でしょうか?
引用返信 編集キー/
■83068 / inTopicNo.3)  Re[2]: Excel読み込み時の月で取得していく方法
□投稿者/ ra (2回)-(2017/03/03(Fri) 08:59:12)
No83067 (魔界の仮面弁士 さん) に返信
> ■No83045 (ra さん) に返信

魔界の仮面弁士様 お返事ありがとうございます

詳しくご質問して頂いたので
沿って回答致します。


> どういう日付の時に、どういうファイル名になるのか実例が無いため、
> 現在の処理イメージを想像できず、回答しにくいです。

3月になりましたら、「3月」という半角数字のファイルを読み込んでいます

> たとえば 2017/02/28 だった場合には、
> \\server\shared\2017-02\
> などでは無く、全角数字な
> \\server\shared\2月\
> というパスになる、ということでしょうか。

2017/2/28の場合
\\server\shared\2月\
を読み込み、書き込んでいる状態です。

そのファイルを、Worksheets.AddでNow.dayを使い 1,2.3日 とシートが追加されています


> 3月になると「3月」を取得するのではなく、
> 3月になると「3月」を取得するのですか?

2017/3/1になると3月というファイルを取得しています

> 先の説明だと、全角数字な2月だったはずですが、
> 今度の説明では、半角数字な 3月になっているようで。

すいません、全て数字は半角になります
>
>
>>月が替わると 自動でファイルを検索して切り替える等できるのでしょうか??
> どういう条件で検索したいのか、運用ルールが分からないので回答しにくいです。

2017/2/28の場合は 2月のファイルを取得
2017/3/1の場合は 3月のファイルを取得

仕様はこうなっています
月が替わると、取得を \\server\shared\2月\→ \\server\shared\3月\に手入力でコードを書き換えています
色々な処理があるため、数字を変えているのを

自動で検索して、3月に変わったら  \\server\shared\3月を取得してほしいですが

この場合、if文 Select Case文でNow.Timeなどで、日付を取得して
読み込むようにするのが一番正しいのか??

わからなくて質問致しました。

わかりづらい質問で、申し訳ございません

よろしくお願い致します。


引用返信 編集キー/
■83069 / inTopicNo.4)  Re[3]: Excel読み込み時の月で取得していく方法
□投稿者/ 魔界の仮面弁士 (1157回)-(2017/03/03(Fri) 10:04:37)
No83067 (魔界の仮面弁士 さん) に返信
>  1,2.3日 とシートが追加されています
1 カンマ 2 ドット 3 日???

よくわかりませんが、ワークブックとしては 1 ファイルしかなく、
その中に日付別のシートが最大31シート生成されていくということでしょうか。


> 2017/2/28の場合
> \\server\shared\2月\
> を読み込み、書き込んでいる状態です。
末尾が \ ということは、「2月」というフォルダーになるのでしょうか。

数字は半角で、1桁月は02月ではなく2月表記で。


> 2017/3/1になると3月というファイルを取得しています
2017/02/28 の場合に「\\server\shared\2月\」という『フォルダー』で
2017/03/01 の場合に「3月」というファイルという『ファイル』なのですか?

ファイルだったら、"3月.xlsm" とか "3月.xlsx" とか "3月.xlsb" とかに
なりそうなものですが、拡張子に関する表記が無いということは、
「3月というファイル」ではなく、
「3月というフォルダーの中にあるファイル」の書き間違いでしょうか。



> 月が替わると、取得を \\server\shared\2月\→ \\server\shared\3月\に手入力でコードを書き換えています
未だに仕様が読み取れないのですが、たとえば
\\server\shared\3月\日報.xlsx に対する操作なら、

Dim dt As Date = Now
Dim worksheetName As String = dt.Day & "日"
Dim folderName As String = "\\serveer\shared\" & CStr(dt.Month) & "月\"
Dim fileName As String = "日報.xlsx"
Dim fullPath As String = System.IO.Path.Combine(folderName, fileName)

のようにすれば、変数 fullPath に "\\server\shared\3月\日報.xlsx" という
文字列をセットすることができます。


> この場合、if文 Select Case文でNow.Timeなどで、日付を取得して
> 読み込むようにするのが一番正しいのか??
どういうコードをイメージしているのか分からなかったので、
それが正しいのかどうかを判断できそうにありません。


> 自動で検索して、3月に変わったら  \\server\shared\3月を取得してほしいですが
検索、というのは、3月フォルダーの中にあるファイルを列挙する、ということでしょうか。
それとも、その中にさらにサブフォルダーがあって再帰的に探索したいということでしょうか。

フォルダー内のファイル名を列挙するのであれば、
My.Computer.FileSystem.GetFiles メソッドもしくは
System.IO.Directory.GetFiles メソッドを使えば OK です。

ファイルの作成日や更新日なども調べる必要がある場合は、
My.Computer.FileSystem.GetFileInfo メソッドで列挙すれば OK です。
もしくは列挙したファイルを System.IO.File.GetLastWriteTime メソッドや
System.IO.FileInfo クラスで調べてもよいでしょう。
引用返信 編集キー/
■83070 / inTopicNo.5)  Re[4]: Excel読み込み時の月で取得していく方法
□投稿者/ ra (3回)-(2017/03/03(Fri) 11:16:15)
No83069 (魔界の仮面弁士 さん) に返信
> ■No83067 (魔界の仮面弁士 さん) に返信

伝えるのが下手くそで申し訳ないです

> 1 カンマ 2 ドット 3 日???
>
> よくわかりませんが、ワークブックとしては 1 ファイルしかなく、
> その中に日付別のシートが最大31シート生成されていくということでしょうか。

ワークブックが1ファイル(月) その中に最大31シート生成です
>
>>2017/2/28の場合
>>\\server\shared\2月\
>>を読み込み、書き込んでいる状態です。
> 末尾が \ ということは、「2月」というフォルダーになるのでしょうか。

\\server\shared\記録\2月.xlsx です


>>2017/3/1になると3月というファイルを取得しています
> 2017/02/28 の場合に「\\server\shared\2月\」という『フォルダー』で
> 2017/03/01 の場合に「3月」というファイルという『ファイル』なのですか?
>
> ファイルだったら、"3月.xlsm" とか "3月.xlsx" とか "3月.xlsb" とかに
> なりそうなものですが、拡張子に関する表記が無いということは、
> 「3月というファイル」ではなく、
> 「3月というフォルダーの中にあるファイル」の書き間違いでしょうか。

フォルダは記録というフォルダ
ファイルなので2月.xlsx 3月.xlsx になっています


>>この場合、if文 Select Case文でNow.Timeなどで、日付を取得して
>>読み込むようにするのが一番正しいのか??
> どういうコードをイメージしているのか分からなかったので、
> それが正しいのかどうかを判断できそうにありません。

今は、

'エクセルApp変数とNew インスタンス
Dim ExcelApp As Excel.Application = New Excel.Application()
'Bookを宣言
Dim Book As Workbook
'ワークシートを宣言
Dim newWorksheet As Worksheet
'エクセルファイルを読み込む
Book = ExcelApp.Workbooks.Open(\\server\shared\記録\2月.xlsx )
'シートを追加する
newWorksheet = Book.Worksheets.Add
'シートの名前を決める
Book.Worksheets(1).Name = Now.Day

'レンジでセル取得から書き込み処理
With Book.Worksheets(1)

処理は長いので省略

Dim FilePath As String
FilePath = System.IO.Path.Combine(
Environment.GetFolderPath(Environment.SpecialFolder.Desktop),
"\\server\shared\記録\2月.xlsx)

Book.Save()

Book.Close()
ExcelApp.Quit()

オブジェクトの解放
プロセスKill


’エクセルファイルを読み込むのが2月.xlsxファイル
3月になれば 3月.xlsxを読み込む必要があるので

手入力で3月に変えているのを

自動で月が変わったら取得して
自動で月が変わったら書き込み処理をしたいのです


>>自動で検索して、3月に変わったら  \\server\shared\3月を取得してほしいですが
> 検索、というのは、3月フォルダーの中にあるファイルを列挙する、ということでしょうか。
> それとも、その中にさらにサブフォルダーがあって再帰的に探索したいということでしょうか。

記録フォルダの中のファイルです

お手数をかけて申し訳ないです。



引用返信 編集キー/
■83075 / inTopicNo.6)  Re[5]: Excel読み込み時の月で取得していく方法
□投稿者/ 魔界の仮面弁士 (1158回)-(2017/03/03(Fri) 17:34:43)
No83070 (ra さん) に返信
> \\server\shared\記録\2月.xlsx です
今月のパスを動的生成するために
 Dim fullPath As String = "\\server\shared\記録\" & CStr(Month(Now)) & "月.xlsx"
あるいは
 Dim fullPath As String = String.Format("\\server\shared\記録\{0:M}月.xlsx", Now)
としておいたうえで、
 Dim oBook As Excel.Workbook = oBooks.Open(fullPath)
という感じで書くことができます。


> Book = ExcelApp.Workbooks.Open(\\server\shared\記録\2月.xlsx )
「"」が無いと文法エラーになりますよ…。

> newWorksheet = Book.Worksheets.Add
> Book.Worksheets(1).Name = Now.Day

「ExcelApp.Workbooks.Open」や「Book.Worksheets.Add」のように、
「オブジェクト.プロパティ.メソッド」と、COM オブジェクトの
多段呼び出しが行われていますが、それだとオブジェクト解放漏れの要因となりえるため
好ましいコードではありません。(これが VBA なら問題無いのですが)

掲示板への投稿の際に端折っているだけなのかもしれませんが、
一応念のため、正しい手順を紹介しておきます。
http://blogs.timberlandchapel.com/blogs/timberlandchapel/articles/1149.aspx
http://hanatyan.sakura.ne.jp/dotnet/Excel08.htm


> FilePath = System.IO.Path.Combine(
> Environment.GetFolderPath(Environment.SpecialFolder.Desktop),
> "\\server\shared\記録\2月.xlsx)
「"」が一つ抜け落ちているのはさておき、上記の結合処理は無意味です。

第二引数の先頭が \ で始まっているため、第一引数が無視され、
 FilePath = "\\server\shared\記録\2月.xlsx"
と同じ意味にしかなりません。

今回の場合、フォルダ名が固定で、ファイル名が変動するだけのようなので、
 Dim FilePath = System.IO.Path.Combine(
   "\\server\shared\記録",
   Today.ToString("M月") & ".xlsx")
で良いと思います。


もし、デスクトップ上の 2月.xlsx ファイルという意味なら、
 FilePath = System.IO.Path.Combine( _
   System.Environment.GetFolderPath(Environment.SpecialFolder.Desktop), _
   "2月.xlsx")
となりますし、上記の第二引数を、元の UNC パスから切り出して渡すなら
 FilePath = System.IO.Path.Combine( _
   System.Environment.GetFolderPath(Environment.SpecialFolder.Desktop), _
   System.IO.Path.GetFileName("\\server\shared\記録\2月.xlsx"))
です。


> プロセスKill
これって、Excel の強制終了でしょうか。
正規の手順で終わらせるようにした方がよいですよ。
引用返信 編集キー/
■83076 / inTopicNo.7)  Re[6]: Excel読み込み時の月で取得していく方法
□投稿者/ ra (4回)-(2017/03/03(Fri) 17:58:36)
No83075 (魔界の仮面弁士 さん) に返信

魔界の仮面弁士様

ありがとうございます、なんとかできました!

色々抜けているところは、機密上出せない名前のため
ご指摘ありがとうございます

ファイルを扱うのがどうも苦手でして。。
少しずつ、やっていきたいと思います

オブジェクトの解放をしても エクセルが馬鹿みたいに
プロセスに残り killして消していました

これも、自分が間違った書き方をしているのでしょうね
提示して頂いたアドレスを見ながら

一から勉強していきたいと思います

ありがとうございました!

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

このトピックをツリーで一括表示


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

このトピックに書きこむ