- ベストアンサー
ファイルコピーとコードの綺麗な書き方について
- ファイルコピーとコードの綺麗な書き方について質問です。特定のファイル名を複数コピーする場合、理想な処理はなんでしょうか?コードが綺麗に見えて、尚且つ他人がわかりやすい処理構造とは何でしょうか?また、IF文を500行ほど書いているが、より綺麗に書く方法はあるかもしれません。お答えお願いします。
- ファイルコピー方法の最適なコードと、IF文をより綺麗に書く方法について質問です。コードを綺麗に書くための工夫や処理構造について教えてください。また、IF文を500行ほど書いているが、もっと綺麗に書く方法はありますか?回答お願いします。
- ファイルコピーとコードの綺麗さについて質問です。特定のファイル名を複数コピーする場合、どのような処理が理想的でしょうか?また、コードを綺麗に見えるようにするためにはどのような工夫が必要でしょうか?IF文を500行ほど書いているが、より綺麗に書く方法はありますか?ご回答お願いします。
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
・ファイル名は配列(やコレクション)に入れてループさせる。 ・コピー元ファイルが無かった場合は例外FileNotFoundExceptionが発生するのでこれをcatchする。 とかすれば良いんじゃないでしょうか。 コードは、MSDNの例が結構きれいだったのでとりあえずこれ見てみると良いです。 File.Copy メソッド (String, String) (System.IO) https://msdn.microsoft.com/ja-jp/library/c6cfw35a%28v=vs.110%29.aspx?cs-save-lang=1&cs-lang=vb#code-snippet-2
その他の回答 (2)
- imogasi
- ベストアンサー率27% (4737/17069)
・したいことが質問文に十分書けていないので、回答しにくい。 ーーー ・>「特定のファイル名」とは、役人がよく使う用語だが、使う本人にしか、よくわからない。慎重に使え。前もって説明や・定義しておくとか。「除く」方を説明するとか。 ・>複数コピーする場合 は、「複数のファイルをコーピーする、」の意味だろう。 Nー>Nであって、N->(N1,N2,N3・・)ではないのだろう。プログラマは仕様書など書くときに、表現には神経質になれ。修飾・限定語を置く位置に十分注意すること。書いた後に、限定したくなって、それをそこに入れると、わかりにくい場合がある。 ・「コピー処理」 コピー先は? ・「 *.txtにファイル名を予め書き込んでおいて」 ガコピー元のファイル名だろうが、たとえば、全数を、エクセルの1シートのある列に書き込めるようなら、それをもとに処理が進められるので、ロジックは簡単になり、メンバーに共通属性はない場合でも、自由になり、コードをつく方も、読む方も修正する方も、判りやすい。 第3者者への説明も易しいし、対象ファイルのリストに漏れていたような場合も、その表を修正・追加すれば済む場合が多い。ロジック(コード文)の変更はない場合が多い。 しかし往々にして、列挙できない場合(数が多いや、属性だけで処理しなければならない=具体的存在数やリストが不明の場合)がむしろ多いケースだと思う。 ・{質問の「あと」以下は、こんな繰り返しはプログラマとして、論外と思って勉強のこと。IF文やCase文は3つぐらいまででしょう。 ・「一つ一つ・・」はどういう事態か? ・IF文は一つ一つ並べるのは論外としても、最小限、見つかったか、の結果などの判定に使わざるを得ないだろう。神経質に撲滅を図らない方がよい。 Findメソッドを使っても、ありなしの判定ではIFが必要になる。 ・処理ロジック(アルゴリズムより少し上のレベル)を考えて、日本語の(箇条書き)にでもして書いて、(数日間はね)考えてみることだ.。日本語で複雑なら、そのロジックは適してないと思え。 その「日本語の文章で表される処理」を、実現するコードについてなら、もし判らないなら、数日考えてもわからないことが多いから、こういう質問のコーナに聞け。熟練者がその質問を見ていて優れたアイデアが回答されるかもしれない。 ーー ・大きなロジックでは (1)テーブル(を作りその中に存在するか)索引法<-テーブルを作れるか? (2)属性を調べ、該当するか総なめ判別法 <-初心者が思いつく方法 (3)関数などでそれができるものがないか探す。FindやExistやSQLのWhereのようなもの。 上記文章は、若い人には「上から目線だ」と好まないかもしれないと思うが、プログラマとして、質問者のそばに、聞く人がいないのが最大の問題だと思う。それを何かの方法でカバーしないと。とりあえずは、本を多く読むしかないだろう。
補足
回答して頂けるのは嬉しいですが、まず他回答を見ても日本語を理解してないようですね。理解してから回答をお願いします。
- dogs_cats
- ベストアンサー率38% (278/717)
コピー元ファイルのどちらかが存在するかをまず確認するコードを作成して、全てのコピー元ファイルが存在する事を確認後、ファイルコピールーチンに移行した方が良いように思います。 理由は500もあるのに、コピー元ファイルが2つとも存在しない場合は毎回コードを中断し、ファイルをダウンロード、再度最初からコピーを開始では効率が悪いと思います。 存在しないファイル数が多数にのぼるとメッセージでは処理しきれませんので、シートの一覧表に存在しないファイル名と指定フォルダ名を記入すると良いかと思います。その場合、2つのファイルは不要なのでしょうからA列のファイルを指定するというルーツを決めておく。 下記はファイルが存在するか確認するコードです。 確認はdir関数で行っています。 2回目のループ処理でコピーもとファイルを指定してコピーすれば良いでしょう。そのコードは簡単なので記載しません。 添付画像は存在しないファイルの表示の一例です。 Sub test() Dim i, j, k As Integer Dim MaxR, cnt, PLen As Integer Dim flag As Boolean Dim Pname, Fname As String 'コピー元ファイルが存在するか確認 With Worksheets("sheet1") MaxR = Cells(Rows.Count, 1).End(xlUp).Row i = 2 flag = True Do While i < MaxR + 1 'コピー元ファイルが両方存在しない場合はA列のファイルをD列に、フォルダ名をE列に記入 If Dir(.Cells(i, 1).Value) = "" And Dir(.Cells(i, 2).Value) = "" Then PLen = InStrRev(.Cells(i, 1).Value, "\") Pname = Left(.Cells(i, 1).Value, PLen) Fname = Mid(.Cells(i, 1).Value, PLen + 1) .Cells(i, 4).Value = Fname .Cells(i, 5).Value = Pname cnt = cnt + 1 flag = False Else .Cells(i, 4).Value = "" .Cells(i, 5).Value = "" End If i = i + 1 Loop If flag = False Then MsgBox "存在しないファイルが" & cnt & "個あります、sheet1のD列のファイルをダウンロードして下さい" Exit Sub End If 'これ以降はご自身で解決下さい。 i = 2 Do While i < MaxR + 1 i = i + 1 Loop End With End Sub
補足
このカテゴリはVBAではありません。
お礼
例外エラーを使った方法…いいですね! MSDNは割と綺麗なんですが、分かりづらくないですか? うーん…回答ありがとです
補足
配列ループですか…?何か参考になるコードなどありますでしょうか? 配列に関して勉強不足でして…