質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
VBA

VBAはオブジェクト指向プログラミング言語のひとつで、マクロを作成によりExcelなどのOffice業務を自動化することができます。

Q&A

解決済

2回答

1172閲覧

VBA サブフォルダ名をExcelファイルのセル値に変更したい

debiranian

総合スコア2

VBA

VBAはオブジェクト指向プログラミング言語のひとつで、マクロを作成によりExcelなどのOffice業務を自動化することができます。

0グッド

0クリップ

投稿2021/11/15 01:56

お世話になります。

状況、試したこと:

1 複数のサブフォルダ内すべてにExcelファイルが保存されています。
2 Excelファイルのセル値(C9)から値を取得し、各サブフォルダ名を変更することを考えています。
3 サブフォルダ名をフルパスで指定することが困難であるため、Getfolder、ForNext構文を使用し、すべてのサブフォルダを探し、中のExcelファイルを取得し、フォルダ名を変更しようとしましたがスルーされてしまい動きません。
###イメージ:
〔全てのファイル保存先〕→〔A○○○○〕→Excelファイル
※〔全てのファイル保存先〕は親フォルダ。
※〔A○○○○〕はサブフォルダ。中にExcelファイルが入っている。このフォルダ名を変えたい。
###コード:

Sub() Dim fso As FileSystemObject Set fso = New FileSystemObject Dim wb As Workbook Dim ws As Worksheet Dim Target_Folder As Folder Dim P_Folder As Folder Dim File_Name As String Dim Folder_Name As String Dim Target_File As File Set P_Folder = fso.GetFolder("\全ての受領データ保存先\") For Each Target_Folder In P_Folder.SubFolders For Each Target_File In Target_Folder.Files File_Name = Target_File.Name Folder_Name = Target_Folder.Name If File_Name = "*.xlsx" Then Workbooks(File_Name).Activate Folder_Name = ActiveWorkbook.ActiveSheet.Range("C9").Value File_Name = ActiveWorkbook.ActiveSheet.Range("C9").Value End If Next Next Set fso = Nothing End Sub

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

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

フォルダ名を変更しようとしましたがスルーされてしまい動きません。

現状のコードにはどこにもフォルダー名を変更するコードがありません。スルーされているのではなく処理自体がないので何もおきないのです。

やりたいことは下記のようなことでしょうか。

サブフォルダ内になるエクセルファイルを開いて、その最初のシートのC9セルの値を取得して、その値でサブフォルダー名を変更する。

もし、そうなら、このようなことは不可能です。
エクセルファイルを開いていたら、そのサブフォルダーの名前は変更できません。

エクセルファイルを開いてC9セルの値を取得したら、それと変更前のサブフォルダー名をいったん配列に格納します。その後エクセルファイルは閉じます。
その後、配列をループしながら、サブフォルダー名を変更する。

というような設計にする必要があるでしょう。

エクセルファイルを開かずにシートの値を取得する方法もありますが、その場合もいったん配列に格納してから処理するほうがいいでしょう。
サブフォルダーを探索中に、その名前を変更するのは、危険ですので。

投稿2021/11/15 03:00

hatena19

総合スコア34075

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

debiranian

2021/11/15 07:39

確かにおっしゃるとおりでした。 設計を今一度考えなおしてみます。 ありがとうございました。
guest

0

ベストアンサー

完全な解決ではないと思いますが

If File_Name = "*.xlsx" Then Workbooks(File_Name).Activate Folder_Name = ActiveWorkbook.ActiveSheet.Range("C9").Value File_Name = ActiveWorkbook.ActiveSheet.Range("C9").Value End If

の部分を

If File_Name Like "*.xlsx" Then Application.ScreenUpdating = False Set wb = Workbooks.Open(Target_Folder + "\" + File_Name, ReadOnly:=True) Target_Folder.Name = wb.ActiveSheet.Range("C9").Value wb.Close Application.ScreenUpdating = True End If

このようにすれば求めている結果に近づく気がします。
このコードですと変更しようとしている名前のフォルダが既にある場合にエラーになる等の問題も残ります。

投稿2021/11/15 02:58

bebebe_

総合スコア513

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

debiranian

2021/11/15 07:42

無事にできました! 私が思い描いていた動きをしてくれて感動しました。 このマクロに関係する事務において、同名の名称が存在することはないので問題ありません! 一層の勉強を重ねていきたいと思います。 ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問