こんにちは。あるフォルダの中に、物件ごとにフォルダを作って各物件データを保存していきます。各物件データには同名ファイルが存在し(例:ABC.xls)、そのABC.xlsファイルのみ別のフォルダにコピーしたいと思います。同名ですのでコピーする時にリネームも同時に行いたいのですが、リネームルールは【親フォルダ名_元ファイル名】にしたいと考えています。対象ファイルは全て、各物件フォルダの第一階層に格納されています。以下、現時点で考えれているところまで記載しますが、これではABC.xls以外のファイルもコピーされてしまって行き詰っています。宜しくお願いいたします。
Sub try()
Dim FSO
Dim Folname
Dim Fname
Dim Cpname As String
Dim Psname As String
Dim v, vv
Cpname = "コピー元の親フォルダ" '
Psname = "コピー先のフォルダ" '
Set FSO = CreateObject("Scripting.FileSystemObject")
For Each Folname In FSO.GetFolder(Cpname).SubFolders
For Each Fname In FSO.GetFolder(Folname).Files
v = Split(Folname, "\")
vv = Split(Fname, "\")
FSO.GetFile(Fname).Copy Psname & "\" & v(UBound(v)) & "_" & vv(UBound(vv))
Next
Next
Set FSO = Nothing
End Sub
http://madia.world.coocan.jp/cgi-bin/VBBBS2/wwwlng.cgi?print+200902/09020010.txt
現在まで考えれているところまで・・・。
質問して、自分は何も考えず放り投げる、では回答し辛いです
6時間の成果を見せてください、全く進展なしですか?
厳しいご指摘ですが・・・
生憎一昨日から考え、昨日ようやくここまで出来たところです。今行き詰っているところで一晩考えましたが、解決できずにこちらで質問させて頂きました。私も当然考えておりますが、月曜日に実際始まる仕事で、抽出、リネーム作業を約一万件行わなくてはならなく時間が無いのです。
ちなみにランク初心者と明示しているように、今回初めてVBに挑んでいます。こちらは質問掲示板かと認識しておりましたので、大げさでなく藁にも縋る思いで質問させて頂いたのですが、お分かりになる方はご教授いただけないのでしょうか?逆に聞きますが、知識あるものが進展の発表を見てほくそ笑むためのサイトなのでしょうか?
偉そうなことを書いておりますが、本当に困っているのです。
書き込み内容、態度に疑問もありますが下記の様なものでは如何?
適宜自分の環境、仕様に合わせて修正して下さい。
下記の VBレスキュー(花ちゃん) さんのホームページの
VB6.0関係 カテゴリ別一覧 FileSystemObject の中の
指定のファイルをコピー・削除・移動する
ドライブ名・ファイル名・Folderオブジェクト・パス等の取得
指定フォルダー以下(サブフォルダー内を含む)の全ファイルを列挙する
...などを参考にさせて頂きました。 (感謝)
http://hanatyan.sakura.ne.jp/
Option Explicit
Dim Fso As New FileSystemObject
Dim Cpname As String
Dim Psname As String
Dim Schname As String
Private Sub Command1_Click()
Cpname = "C:\tmp1" '"コピー元の親フォルダ" '
Psname = "C:\tmp4" '"コピー先のフォルダ" '
Schname = "BU_2.xls" 'コピーしたいファイル
'指定のフォルダを指定
Call sFolderSearch2(Fso.GetFolder(Cpname))
Set Fso = Nothing
End Sub
Private Sub sFolderSearch2(ByVal myFolder As Object)
Dim mySubFolder As Folder
Dim myFile As File
Dim v As Integer
Dim i As Integer
Dim tmp As String
Dim dat() As String
'現在のフォルダ内のファイルを取得
For Each myFile In myFolder.Files
'指定の拡張子のファイルを取得する場合
If myFile.Name = Schname Then
dat = Split(myFolder & "\" & myFile.Name, "\")
tmp = Cpname
tmp = Replace(tmp, ":\", "_")
For i = 2 To UBound(dat) - 1
tmp = tmp & "_" & dat(i)
Next i
Fso.GetFile(myFolder & "\" & myFile.Name).Copy Psname & "\" & tmp & "_" & myFile.Name
End If
Next
With myFolder
'サブフォルダ数を取得
If .SubFolders.Count > 0 Then
For Each mySubFolder In .SubFolders
'サブフォルダがある場合再帰的に繰り返す
Call sFolderSearch2(mySubFolder)
Next
End If
End With
Set myFile = Nothing
Set mySubFolder = Nothing
End Sub
2月さん、ありがとうございます。早速試させていただきます。
態度に疑問が・・・ということで、お気を悪くされたのなら申し訳ございません。
私は純粋にVB初心者で、行き詰ったことを質問掲示板で質問したつもりです。あくまでも質問掲示板ですから、分からない人が質問して分かる人が助けてあげる、そういう場所だと思っておりました。私の認識がすこし違っていたようです。
人にモノを尋ねる時には、なにわともあれ丁寧に聞くことです。
何か言われて腹がたっているように取られる書き込みは厳禁でしょう。
「質問掲示板」とは言え、何でも教えてもらえると思うのは間違いでしょう。
仕事で納期が迫っているので急いでいるとかは、ここを見ている方には
関係の無い事です。 仕事なら同僚、先輩、上司に聞いたら如何ですか?
「VB初心者」との自覚があるなら、自分でもっと大いに調べる事も必要かも。
書き忘れましたが
Visual Basic 初心者掲示板
http://madia.world.coocan.jp/cgi-bin/VBBBS2/wwwlng.cgi?print+200902/09020010.txt
...にもコピペと投稿していますよね?
こういうのは「マルチポスト」と呼ばれて歓迎されない事が多いです。
掲示板のマナー、ルールも調べて、それなりに対応された方が良いかと。
こんな苦情ばかり書くのも歓迎されませんが。
最初にあっちを見たので、あっちに返事してしまった。
はずかしー。
>kouさん
技術系の掲示板なのをまず理解して下さい。
あなたの主張とか思想には誰も付き合ってくれませんよ。
そういうのはチラシの裏に書いて下さい。
質問掲示板に質問を書いて、何が間違っているのですか?私の質問は丁寧ではなかったですか?「何でも教えてもらえると思うのは間違い」「自分でもっと大いに調べる事も必要」とありますが、自分で大いに調べて分からなかったことを質問したつもりです。質問に当たっては、ここで質問するに至った経過を逐一報告しないといけないのでしょうか?「マルチポスト」の件は申し訳ありません。私に非があると思います。技術系の掲示板であることは当然理解して質問しています。質問に主張や思想を訴えたつもりは毛頭ありません。わたしが納得できなかったのは、質問掲示板とは、困ったことを質問し、解決方法の分かる方が救いの手を差し伸べてくれるのだと思っていました。当然自分で努力した結果、自分で解決できなかった場合の話です。横須賀の熊さんの回答で、何を根拠に「自分で何もせず放り投げる」と言われる筋合いがあるのか?という点にどうしても納得できず、こちらの状況を説明したつもりです。解決方法が分かる方は、その方法を示してはくれないのか?困っている人に対して、努力の跡を見せろと言う為の場所ではないはずだと思うのですがいかがでしょうか?少なくとも、努力の跡として、質問時に考えたコードを示しています。私の考えはそんなにおかしいですか?
編集 削除はい。多分あなたがおかしいです(読んでないけど)
そんな長文を書く暇があったら問題の解決に頭を回して
みてはいかがですか?
1万件でも100万件でも、あなたがどんなに急いでいても
回答者は関係ないのは理解してもらえますか?
そして感情的になった貴方のレスに回答が付きにくい事も
考えてみて下さいね。
だから技術系だって言ったのに・・・
ここでこれ以上、言い合うのは掲示板の趣旨とは異なるので止めましょう。
私のサンプルから1日が過ぎましたが試されましたか? 結果は?
感情的になっておられるようですが、冷静に。
それと改行は適宜に行いましょう。
ネット、メールなどにおいては
未改行の文章ほど読みにくいものはないです。
本題ですが、状況がイマイチ掴みにくいです。
質問その1
同名ファイルがあった場合にコピーするファイルとは、
すでにあるファイルなのか、これから作るファイルなのか?
質問その2
別のフォルダに保存するので、リネームの必要性がないのではないか?
すでにある同名ファイルと、同じフォルダに保存したいとなれば
リネームの必要性はありますが・・・
質問その3
リネームルールは【親フォルダ名_元ファイル名】とあるが、
すでにこのファイル名も存在した場合はどうするのか?
たとえば、同名ファイルが3つあった場合
1つ目:普通に保存
2つ目:リネームルールに従って保存
3つ目:リネームルールに従うと2つ目とバッティングする
となります。3つ目のファイル名はどうなりますか?
同名ファイルが100個あったらどうなりますか?
--------
同名ファイルだけコピーしたいのであれば、
そのファイル名でIf文を作って、分岐させれば
いいんじゃないでしょうか?
ファイル一覧を取得する
↓
ABC.xlsが存在したら、それだけをコピーする
以上
kouさんから、その後どうなったか書かれませんね・・・
2月さんが提案したプログラムを試すということでしたが
こちらも音沙汰なしのようですね。
> 困ったことを質問し、解決方法の分かる方が
> 救いの手を差し伸べてくれるのだと思っていました。
同時に、質問者がきちんと受け答えするという
当たり前のことを忘れているようですね。
礼儀を知らないようで困ったものです。
昔から言われ続けていること
http://members.at.infoseek.co.jp/ms_mzn/
前提:ここは質問掲示板で完動コードを貰う場所じゃないよ。
> 何を根拠に「自分で何もせず放り投げる」と言われる
あれだと、回答待ち(自分で何もせず放り投げる)だけに時間を費やしたようにしか見えない。(前に投稿した時刻〜この掲示板に投稿した時刻の間は何をしていたのかと。)
> 努力の跡を見せろと言う為の場所ではないはずだと思う
実際、努力の跡を見せてもらわないと質問者が分かっていないとこが、回答者に伝わないよ。(適切な回答が出来ない。)
自分で考えたコードをどこまで理解できているかとかね。
> 少なくとも、努力の跡として、質問時に考えたコード・・・
それは間違ってはいないだろうけど↓のパクリのように見えるのは気のせい?
http://qanda.rakuten.ne.jp/qa4690849.html
時間制限つきの質問は久しぶりに見ました。
私も書きたい事が色々ありますが、この質問は月曜日までの条件付きなので
もうそっとしておいてあげては?
>> 少なくとも、努力の跡として、質問時に考えたコード・・・
> それは間違ってはいないだろうけど↓のパクリのように
> 見えるのは気のせい?
> http://qanda.rakuten.ne.jp/qa4690849.html
リンク先を見て愕然としました。
リンク先で教えてもらったコードがうまくいかなかったので
ここで質問したんですね。ホント呆れますわ。
自分で考えようとしない、無能なプログラマーですね。
人間的にも失格。ありえない。