[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]
『ブックを開かずにコピーする方法+α』(初心者)
フォルダAの中にフォルダBとマクロ有効ブック、
フォルダBの中にフォルダ複数(最大30,そのときによる)、
この複数あるフォルダの中に、それぞれ「データシート」という名前のエクセルファイルが入っています。
また、フォルダBの名前はそのときによります。
最後の複数あるフォルダの名前もそのときによりますが、マクロを書きにくいのであれば、1から順に数字を振ることもできます。
このとき、それぞれの「データシート」というエクセルファイル内の「○○」と書いているセル右から3列目の数値について、マクロ有効ブックのA列にコピーしたいです。
順番は、フォルダBの中の名前順にしたいです。
どのように書けば良いか、悩んでいるので、教えて頂けないでしょうか。
< 使用 Excel:Excel2013、使用 OS:Windows10 >
おはようございます ^^ >>「データシート」というエクセルファイル内の「○○」と書 >>いているセル右から3列目の数値 シート名、セル番地がわかる表形式でご説明戴くと、たくさん 、アドバイスが有ると思います。←多分。。。^^; 素直にブック、開いた方が、格段にやりやすいかと。。。どうせ マクロなので、自動ですから。。。(^◇^)v 同名ブックなら。開けては閉じ開けては閉じで。。。( ̄▽ ̄) でわ m(_ _)m (隠居Z) 2021/10/08(金) 05:49
各フォルダの階層はこうなっています。
フォルダA,フォルダ1〜フォルダ30の名前は固定、フォルダBの名前はそのときによります(作成した日付になる)。
フォルダA>フォルダB(名前はそのときによる)>フォルダ1>データシート.xlsx
フォルダA>フォルダB(名前はそのときによる)>フォルダ2>データシート.xlsx
…
フォルダA>フォルダB(名前はそのときによる)>フォルダ30>データシート.xlsx
フォルダA>マクロ有効ブック.xlsm
また、フォルダ1~30にあるデータシート.xlsxは、ファイル名と中身の基本骨格(例:●、●●、△△、〇〇など)は同じですが、書いてある数値がそれぞれ違います。
【フォルダ1のデータシート.xlsxの場合】
A B C D E F 1| ● ●● △△ 2| 〇〇 111 222 333 3|
【フォルダ2のデータシート.xlsxの場合】
A B C D E F 1| ● ●● △△ 2| 〇〇 10 222 12 3|
このとき、フォルダ1~30それぞれのデータシート.xlsxの「〇〇」と書いているセルの右横3つ目(333と12)を、フォルダA内のマクロ有効ブックのA列にコピー&ペーストしたいです。
333と12の順番は、フォルダ1、フォルダ2の順にしたいです。
【マクロ有効ブック】
A B 1| 333 2| 12 3|
(初心者) 2021/10/08(金) 17:28
こんばんわ ^^ フォルダA配下のフォルダB[名前変動]は一つだけでせうか。 >>333と12の順番は、フォルダ1、フォルダ2の順にしたいです。 フォルダ名を全て読み込んだ上で読み込みたい順に並び替えて配列 に格納後、配列を基準に読み込めば良いかと思います。フォルダ名は 何でも構いませんが、最初か最後に桁数を合わせた、番号で規則性を 持たすと処理しやすいので、命名ルールを差支えなければ教えて下さい。 フォルダ1、フォルダ2でよければもちろんそれでも。。あ!よくないっす 30あるなら二桁でフォルダ01、フォルダ02 か フォルダ←XDFGでも、左の文字数が変わらなければそれでもOKかも^^; でわ。m(__)m (隠居Z) 2021/10/08(金) 17:50
こんばんは。
はい、フォルダA配下のフォルダB[名前変動]は1つだけです。
フォルダ1〜30の命名ルールは、01〜30の二桁数字でお願い致します。
(初心者) 2021/10/08(金) 18:42
E2セルで固定という意味でしょうか
シート名は固定でしょうか
(マナ) 2021/10/08(金) 18:47
こんにちは。
できれば、「○○」の右3つ目、と指示したいのですが、厳しいようでしたらE2セル固定でお願い致します。
シート名は固定です。
(初心者) 2021/10/08(金) 22:42
Sub test() Dim p As String Dim cmd As String, s, k As Long Dim fn As String, wsn As String
fn = "データシート.xlsx" wsn = "Sheet1"
p = ThisWorkbook.Path & "\" & fn cmd = "cmd /c dir """ & p & """ /b/s/a-d" s = Split(CreateObject("wscript.shell").exec(cmd).stdout.readall, vbCrLf) ' For k = 0 To UBound(s) - 1 ' s(k) = "='" & Replace(s(k), fn, "") & "[" & fn & "]" & wsn & "'!E2"
s(k) = "=vlookup(""〇〇"",'" _ & Replace(s(k), fn, "") & "[" & fn & "]" & wsn & "'!B:E,4,false)" Next
With Worksheets.Add.Cells(1).Resize(UBound(s)) .Value = Application.Transpose(s) .Value = .Value End With
End Sub
(マナ) 2021/10/08(金) 22:45
所々丸投げっぽい書きぶりになってますが、自力で作ろうとされているのですよね?
既に回答が付いてますが、アイデア出しとして投稿してきます。
■1
フォルダの構成はこんな感じということですよね。たぶん。
C;\フォルダA │ マクロ有効ブック.xlsm └20211009 ├いろは │ データシート.xlsx ├にほへ │ データシート.xlsx ├とちり │ データシート.xlsx ├ぬるを │ データシート.xlsx ├わかれ │ データシート.xlsx ├よたれ │ データシート.xlsx ├そつね │ データシート.xlsx └ならむ データシート.xlsx
「マクロ有効ブック.xlsm」の所属フォルダである「フォルダA」の配下に"フォルダ"は「20211009」しかないということであれば、Dir関数を使えば「フォルダB」の特定は容易ですね。
■2
>最後の複数あるフォルダの名前もそのときによりますが、
>マクロを書きにくいのであれば、1から順に数字を振る
>こともできます。
それはご自身が判断すればよいでしょう。
>順番は、フォルダBの中の名前順にしたいです。
↑はマクロ側で実装するんじゃなくて、せっかくExcelVBAを使うのですから、フォルダ名も含めてシートに出力した後に【並び替え】を実行すればよいとおもいます。
そして、フォルダBの配下たる「フォルダ1〜30」については「For Each 〜 Next」と「FileSystemObject」を組み合わせて、フォルダBのサブフォルダ群の中から1フォルダずつ取り出して処理していく方法でも対処可能だと思います
(うまくいけば、名前順にもなるかもですし)
■3
>ブックを開かずに
こちらも既にコメントがありますが、開きたくない理由はなんですか?
シート名やセルが固定されているなら、対処の方法も思いつきますが、開かないことにさほどメリットがあるとも思えないので、再検討してみてはどうですか?
(以下、ブックを開くことを前提にしています)
■4
>エクセルファイル内の「○○」と書いているセル右から3列目の数値
Findメソッドを使って【○○」と書いているセル】を探してみてはどうでしょうか。
セルさえ特定できれば↓のように値が取得できますよね。
見つかったセル.Offset(,3).Value
■5
ちょっと順番が前後しますが、Excelブックの場合↓のような構造になっています。
ブック └シート │ └セル └シート └セル
よって、どの【シート】に対する処理なのかといったことも非常に重要です。
なので、ブックに1シートが1つしかないといった状態でも↓のように対象シートを明示することを強くお勧めします。
ワークブック.Worksheets(1)
■6
ということで
(1)ThisWorkbook.Pathから「フォルダB」を特定する (2)For Each〜Nextステートメントを使い「フォルダB」のSubFoldersを1つずつ巡回する (3)↑のフォルダにある「データシート.xlsx」を【開く】 (4)↑のシート、セル範囲を指定して「Findメソッド」で「○○」と書いているセルを探す (5)自ブックの、結果を書き込みたいシートの書き込みたい行のA列に(2)のフォルダ名、 B列に(4)のセルからOffset(,3)したセルの値を書き込む (6)開いたブックを保存せずに閉じる
(3)〜(6)を繰り返す
(7)結果を書き込んだシートのA列を基準に並び替えをする
といった処理でも目的は達成できるかとおもいますので研究してみてはいかがでしょうか?
詰まった場合は、現状のコードを示して
××の箇所で、「実行時エラー×× ××××」というエラーが出る ××になるはずが○○になってしまう
のように具体的に聞いてみると解決につながるアドバイスが得られるとおもいます。
(もこな2) 2021/10/09(土) 09:43
という質問は、ネット上に山ほどありますが、
ファイルを開いたり閉じたりする時間を節約できるとお考えかと思いますが、
素直に開いたり閉じたりをすることをお勧めします。
他の方法は逆に遅くなったり、VBAで何かをしようと思いつく程度の知識では、
たちうちできない方法になるかと思います。
手軽に開発できるのがVBAの魅力ですので、処理速度はいいところで折り合いをつけましょう。
画面の更新を止めることで、
ファイルを開いたように見せないことが可能になりますし、
画面表示の分の時間が節約できると思いますので、
画面の更新を止める VBA で調べてみてください。
その他の部分は他の方の書き込みに譲ります。
(まっつわん) 2021/10/09(土) 15:24
[ 一覧(最新更新順) ]
YukiWiki 1.6.7 Copyright (C) 2000,2001 by Hiroshi Yuki.
Modified by kazu.