• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:フォルダー名変更(指定文字を移動、削除))

フォルダー名変更の方法を教えてください。

このQ&Aのポイント
  • フォルダー名変更方法について教えてください。
  • 指定ディレクトリーのフォルダー名を変更する方法を教えてください。
  • 議事録保存のフォルダー名を日付順にする方法を教えてください。

質問者が選んだベストアンサー

  • ベストアンサー
回答No.9

しつこくて申し訳ありません。 閉じていなかったので覗いてしまいました。 #7の補足を読んでしまいましたので、、つい 無視していただいて結構ですが、#5のコードに追加しました。 Sub sample1() 'Microsoft Scripting Runtime 参照設定 Dim FSO As FileSystemObject Dim Fol As Folder, sfl As Folder Dim pF As String, pcnt As Integer Dim Ft As Integer, cnt As Integer Dim buf As String, RE, reMatch, reValue   Set FSO = New FileSystemObject   With Application.FileDialog(msoFileDialogFolderPicker)    .InitialFileName = CreateObject("WScript.Shell").SpecialFolders("desktop")    If .Show = True Then     pF = .SelectedItems(1) & "\"    End If   End With   If pF = "" Then Exit Sub   Ft = Application.InputBox(Prompt:="左から何番目の4桁ですか?", Type:=1)   If Ft = 0 Then Exit Sub   Set Fol = FSO.GetFolder(pF)   On Error Resume Next   For Each sfl In Fol.SubFolders    cnt = 1    buf = sfl.Name    With CreateObject("VBScript.RegExp")     .Pattern = "\d+"     .Global = True     Set reMatch = .Execute(buf)     If reMatch.Count > 0 Then       For Each reValue In reMatch        If Len(reValue) = 4 Then         If Ft = cnt Then           buf = reValue & Replace(buf, reValue, "")           pcnt = pcnt + 1         End If         cnt = cnt + 1        End If       Next reValue     End If    End With    sfl.Name = buf   Next   Set FSO = Nothing   If pcnt > 0 Then    MsgBox (pcnt & "件処理をしました。")   Else    MsgBox (cnt & " 番目の4桁数字を見つけられませんでした。")   End If End Sub 参考まで

NuboChan
質問者

お礼

>しつこくて申し訳ありません。 いえいえ、そんな事は少しも思っていません。 マクロを書いていただく初心者の私には大変嬉しいです。 ------------------------ 「ファイル名に4桁の数字が2か所以上ある」のコードありがとうございます。 (検証して4桁に数字が先頭に移動するのを確認しました。) こちらのコードは、他の用途に利用できそうなので  横型配置+同コピペ方式のマクロコードと共にこれから利用させていただきます。 最後までお付き合い願い改めてお礼申し上げます。

その他の回答 (9)

  • SI299792
  • ベストアンサー率47% (772/1616)
回答No.10

回答No.7のプログラムですが、必ず6桁の数字があることを前提にしています。 6桁の数字がないものに関してじは、ファイル名が変換されたりされなかったりします。また、全てのファイル名の6桁の数字が同じ位置にあることが前提です。 4桁なら最初からそう書いて下さい、と言いたい所ですが、これは私が先走って頼まれてもいないのに付けた機能なので文句は言えません。   RegExp.Pattern = "\d{4}" にすれば、4桁の数字の位置を表示するようになりますが、今度は4桁の数字のないものが、変換されたりされなかったりします。 4桁に固定していいのか、4桁6桁両対応にする必要があるのか。 私の所では、全てのフォルダに6桁の数字が同じ位置にあれば正しく動きます。もし全てのフォルダに6桁の数字が同じ位置にあるのに正しく動かないのであれば、詳細を書いていただけますか。

回答No.8

>10種類ほどのパターンがあります。 パターン化されたフォルダーを個別に仕分けしてホルダーに格納して 初めからパターンを示して頂ければ、一気にできると思いますが、、 >S1299792さんのNo4の回答にある横型配置+同コピペ方式で処理が高速になりそうなメドが立ちました。 何よりで良かったです。 スレッドお借りして恐縮ですが、、 また、余計なお世話かもしれませんが、#7さん まだリネームに不具合があるように思いますが、、見直して見てくださいね。

  • SI299792
  • ベストアンサー率47% (772/1616)
回答No.7

回答No.6、バグあり、差し替えです。 Option Explicit ' Sub Macro1()   Dim PathName As String   Dim FileName As String   Dim Start As Integer   Dim RegExp As Object   Dim Execute As Object '   With Application.FileDialog(msoFileDialogFolderPicker)     .Title = "フォルダを選択" '     If Not .Show Then       End     End If     PathName = .SelectedItems(1) & "\"   End With '   FileName = Dir(PathName & "*.", vbDirectory)   Set RegExp = CreateObject("VBScript.RegExp")   RegExp.Pattern = "\d{6}" '   While FileName > "" '     If Start = 0 Then       Set Execute = RegExp.Execute(FileName) '       If Execute.Count > 0 Then         Start = Execute(0).FirstIndex + 1         Start = "0" & InputBox(FileName, _           "開始位置が違っていれば修正して下さい", Start) '         If Start = 0 Then           End         End If       End If     End If '     If Start > 0 Then       Name PathName & FileName As PathName & Mid(FileName, Start, 6) & _         Left(FileName, Start - 1) & Mid(FileName, Start + 6)     End If     FileName = Dir   Wend '   If Start = 0 Then     MsgBox "6桁の数字のあるフォルダはありませんでした", vbCritical   Else     MsgBox "終了しました"   End If End Sub

NuboChan
質問者

補足

せっかくコードを提示して頂いたので、  「ファイル名に6桁の数字が2か所以上ある」場合の想定では無く     「ファイル名に4桁の数字が2か所以上ある」想定でのコードで修正いただければ幸いです。 -------------------------------- 残念ですが、#7の 提示いただいたマクロをそのままコピペして   親のサンプルフォルダーにいくつかターゲットフォルダーを入れてチェックしてみましたが #8のQchan1962さんのコメントにもありますように  マクロを起動させてもリーネームが上手く出来ません。

  • SI299792
  • ベストアンサー率47% (772/1616)
回答No.6

ファイル名に6桁の数字が2か所以上あるなら、このような方法でどうでしょうか。 プログラムを動かすと、親フォルダを選択します。すると、最初の子フォルダから、6桁の数字を探して場所を表示します。それでよければそのままOK、違っていれば手作業で場所を指定。以下、最初の入力に従って処理されます。場所指定の手間は軽減されると思います。 Option Explicit ' Sub Macro1()   Dim PathName As String   Dim FileName As String   Dim Start As Integer   Dim RegExp As Object   Dim Execute As Object '   With Application.FileDialog(msoFileDialogFolderPicker)     .Title = "フォルダを選択" '     If Not .Show Then       End     End If     PathName = .SelectedItems(1) & "\"   End With '   FileName = Dir(PathName & "*.", vbDirectory)   Set RegExp = CreateObject("VBScript.RegExp")   RegExp.Pattern = "\d{6}" '   While FileName > "" '     If Start = 0 Then       Set Execute = RegExp.Execute(FileName) '       If Execute.Count > 0 Then         Start = Execute(0).FirstIndex + 1         Start = "0" & Start = "0" & InputBox(FileName, _           "開始位置が違っていれば修正して下さい", Start) '         If Start = 0 Then           End         End If       End If     End If '     If Start > 0 Then       Name PathName & FileName As PathName & Mid(FileName, Start, 6) & _         Left(FileName, Start - 1) & Mid(FileName, Start + 6)     End If     FileName = Dir   Wend '   If Start = 0 Then     MsgBox "6桁の数字のあるフォルダはありませんでした", vbCritical   Else     MsgBox "終了しました"   End If End Sub

回答No.5

>フォルダーの中には、数値が2箇所以上有る場合があるので必要な数字が   最初の数字とか後からの数字とか一概に判断できず   最終的には   人間の判断が必要となり一概に数値を見つけて書き出して処理は   上手く処理できません。 つまり、規則性が無いと理解して良いのでしょうか? >数値が2箇所以上有る場合が 3か所も可能性があるのなら、最初からでも後から操作しても 一様な処理は出来ないと思いますが、、 一応、6桁の数値を判断して先頭に持ってくる場合は、条件を1つ加えるだけです。 Sub sample1() 'Microsoft Scripting Runtime 参照設定 Dim fso As FileSystemObject Dim Fol As Folder, sfl As Folder Dim pF As String Dim Ft As Integer, Trg As Integer Dim buf As String, RE, reMatch, reValue   Set fso = New FileSystemObject   With Application.FileDialog(msoFileDialogFolderPicker)    .InitialFileName = CreateObject("WScript.Shell").SpecialFolders("desktop")    If .Show = True Then     pF = .SelectedItems(1) & "\"    End If   End With   If pF = "" Then Exit Sub   Set Fol = fso.GetFolder(pF)   On Error Resume Next   For Each sfl In Fol.SubFolders    buf = sfl.Name    With CreateObject("VBScript.RegExp")     .Pattern = "\d+"     .Global = True     Set reMatch = .Execute(buf)     If reMatch.Count > 0 Then       For Each reValue In reMatch       If Len(reValue) = 6 Then '6桁が複数ある場合、後の6桁が前に来ます。        buf = reValue & Replace(buf, reValue, "")      End If       Next reValue     End If    End With    sfl.Name = buf   Next   Set fso = Nothing MsgBox ("完了") End Sub

NuboChan
質問者

お礼

何度もありがとうございます。 >つまり、規則性が無いと理解して良いのでしょうか? 年度や記載担当者によって記載方法が変わっていますが  全く規則性が無い訳ではではなく10種類ほどのパターンがあります。 パターン化されたフォルダーを個別に仕分けしてホルダーに格納して S1299792さんのNo4の回答にある横型配置+同コピペ方式で処理が高速になりそうなメドが立ちました。 Qchan1962さん、最後までお付き合い願いありがとうございます。 改めてお礼申し上げます。

  • SI299792
  • ベストアンサー率47% (772/1616)
回答No.4

ダイアログボックスで開くようにしました、同時に若干仕様変更しました、 開始位置はB2、文字数はC2に入力してください。 というのは、いろいろなパターンがあるでしょうから、それを入力しておきます。実行時にB2~C2へコピペすれば、指定が楽になります。 他の方が既に上げてますが、私も一応上げます。 Option Explicit ' Sub Macro1()   Dim PathName As String   Dim OldName As String   Dim NewName As String   Dim Length As Long '   With Application.FileDialog(msoFileDialogFolderPicker)     .Title = "フォルダを選択" '     If Not .Show Then       End     End If     PathName = .SelectedItems(1) & "\"   End With '   OldName = Dir(PathName & "\*.", vbDirectory) '   While OldName > ""     NewName = "" '     If Left(OldName, 1) = "." Then     ElseIf [B2] > 0 Then       NewName = Mid(OldName, [B2], [C2]) & _         Left(OldName, [B2] - 1) & Mid(OldName, [B2] + [C2])     Else       Length = Len(OldName)       NewName = Right(OldName, [C2]) & Left(OldName, Length - [C2])     End If '     If NewName <> "" Then       Name PathName & OldName As PathName & NewName     End If     OldName = Dir   Wend   MsgBox "終了しました" End Sub 最初に作った時は思い至らなかったのですが、多分このフォルダはこの位置というのは決まっているのではないですか。であれば、ミスを防ぐためにダイアログボックスはやめて、私が最初に上げたプログラムで、 [B1]→[A2] [B3]→[C2] と痴漢すれば、フォルダ名、開始位置、文字数を横並びにできます。 下に、一覧を作っておき、必要に応じて2行目にコピペするという方法もあります。 >フォルダーの中には、数値が2箇所 6桁の数字が2か所以上にあるのならやむ負えません。 普通はそんなに長いファイル名を付けないと思います。もし、日付以外の数字が6桁でないなら、自動判断は可能です。

NuboChan
質問者

お礼

>多分このフォルダはこの位置というのは決まっているのではないですか。 そのとうりです。 No2さんの補足コメントにも記載しましたが フォルダーの中には、数値が2箇所以上有る場合があるので必要な数字が   最初の数字とか後からの数字とか一概に判断できず   最終的には   人間の判断が必要となり一概に数値を見つけて書き出して処理は   上手く処理できません。   (つまり、どの位置に必要な数値があるかは、人間が判断して     めんどうでもそれぞれ別のホルダーにタイプ別に仕分けして     それぞれ別途処理することになります。) >であれば、ミスを防ぐためにダイアログボックスはやめて そうですね。  最初のマクロを横型(横並び)に修正して  一覧表を先に作っておいてコピペ(A2,B2、C2)して行くようにすれば処理は簡単になりますね。 私がマクロを使って処理する時は、最初のマクロを横型に修正したマクロを利用したいと思います。 EXCELに不慣れな人も処理で使う予定なので  ダイアログボックスを使ったマクロも別途作成しておきたいと思います。 >日付以外の数字が6桁でないなら、自動判断は可能です。 心遣いありがとうこざいます。 現状、教えて頂いた処理コードで十分な処理速度アップが見込めるので  今回は自動判断までは望みません。 ------------------------------------------ 問題も無事解決しました。 色々教えていただきありがとうございます。  

回答No.3

追加回答します。 >逆に ? 不規則なのでしょうか? >180224(2018年2月24日)をフォルダー名の先頭に来るようにしたい。 取り敢えず、 180224 (など)がフォルダ名に含まれており、それを名前の頭に持ってくれば 良いのであれば、下記でいかがでしょう。 文字数などは設定不要、数値部分を抜き出し 名前頭に移動します。 (正しくは、削除して加える) 標準モジュール Sub sample1() 'Microsoft Scripting Runtime 参照設定 Dim fso As FileSystemObject Dim Fol As Folder, sfl As Folder Dim pF As String Dim Ft As Integer, Trg As Integer Dim buf As String, RE, reMatch, reValue   Set fso = New FileSystemObject   With Application.FileDialog(msoFileDialogFolderPicker)    .InitialFileName = CreateObject("WScript.Shell").SpecialFolders("desktop")    If .Show = True Then     pF = .SelectedItems(1) & "\"    End If   End With   If pF = "" Then Exit Sub   Set Fol = fso.GetFolder(pF)   For Each sfl In Fol.SubFolders    buf = sfl.Name    With CreateObject("VBScript.RegExp")     .Pattern = "\d+"     .Global = True     Set reMatch = .Execute(buf)     If reMatch.Count > 0 Then       For Each reValue In reMatch        buf = reValue & Replace(buf, reValue, "")       Next reValue     End If    End With    sfl.Name = buf   Next   Set fso = Nothing End Sub

NuboChan
質問者

補足

早速、訂正いただき感謝します。 以下の申し出ですが、 >180224 (など)がフォルダ名に含まれており、それを名前の頭に持ってくれば >良いのであれば、下記でいかがでしょう。 NO1さんも以下のように数値検索して先頭に書き出すではだめなのか? と申し出が有りましたが >6桁の数字を検索してそれを銭湯(先頭)に移動するプログラムの方がいい気がします。 >そうすれば、位置を指定する必要がありません。 フォルダーの中には、数値が2箇所以上有る場合があるので必要な数字が   最初の数字とか後からの数字とか一概に判断できず   最終的には   人間の判断が必要となり一概に数値を見つけて書き出して処理は   上手く処理できません。   (つまり、どの位置に必要な数値があるかは、人間が判断して     めんどうでもそれぞれ別のホルダーにタイプ別に仕分けして     それぞれ別途処理することになります。)

回答No.2

>作成年月日でソートを 沢山あると言う事ですかね。 全フォルダを同じ規則でリネームすれば良いでしょうか? 標準モジュールに Option Explicit Sub sample() ’実行プロシージャ 'Microsoft Scripting Runtime 参照設定必須 Dim fso As FileSystemObject   Set fso = New FileSystemObject   Dim Fol As Folder, sfl As Folder   Dim pF As String   Dim Ft As Integer, Trg As Integer   With Application.FileDialog(msoFileDialogFolderPicker)    .InitialFileName = CreateObject("WScript.Shell").SpecialFolders("desktop")    If .Show = True Then     pF = .SelectedItems(1) & "\"    End If   End With   If pF = "" Then Exit Sub   Set Fol = fso.GetFolder(pF)   Ft = Application.InputBox(Prompt:="start位置", Type:=1)   If Ft = 0 Then Exit Sub   Trg = Application.InputBox(Prompt:="文字数", Type:=1)   If Trg = 0 Then Exit Sub   For Each sfl In Fol.SubFolders    sfl.Name = Name_change(sfl.Name, Ft, Trg)   Next   Set fso = Nothing End Sub Function Name_change(trgName As String, Ft As Integer, Trg As Integer) As String Dim Ln As String, reName As String, Rn As String   Ln = Left(trgName, Ft - 1)   reName = Mid(trgName, Ft, Trg)   Rn = Right(trgName, Len(trgName) - (Ft + Trg) + 1)   Name_change = reName & Ln & Rn End Function 親フォルダをダイアログで選択、例の場合、例の様に5、3とインプットボックスに入力してください。 すべてのフォルダを同じフォルダに入れて実行してください。 検証は、少ないフォルダでお願いします。 対象になったフォルダすべてが同じ規則で(リネーム)書き換えられます。 エラー処理は行っていません。

NuboChan
質問者

お礼

コードの提示感謝します。 先にコードを提示いただいたNO1さんの検証で  Qchan1962さんのコードがUPされていたのに気づくのが遅くなりました。 コードを標準モジュールにコピペして検証を始めましたが、  Dim fso As FileSystemObject で   コンパイルエラー:ユーザー定義型は定義されていません。  とエラーになります。 「Microsoft Scripting Runtime」をライブラリーに追加しないと行けないと気づいてエラーはなくなりました。 先頭から指定する場合は、上手く処理できました。 最後部から指定する処理がコードに無いと思うのですが?   出来ればNO1さんのようにstart位置に「0」(ゼロ)を指定した場合は   最後部からの処理であるとのFLAGを使えるようにできませんか ? ------------------------------------ FileSystemObjectでNO1さんにお願いした   ダイアログボックスが表示されてエキスプローラー感覚で   親フォルダーを指定する事ができるので嬉しいです。

  • SI299792
  • ベストアンサー率47% (772/1616)
回答No.1

ディレクトリー、フォルダー、フィルダーなど、いろいろな表現をしていますが、 親フォルダーを指定して、その中の子フォルダーの名前を変えるという事ですね。 拡張子のついていないものをフォルダとみなして改名します。 まず、図の様に入力してください。 B1に親フォルダ名、 B2に銭湯に移動する文字の開始位置、但し、最後部からの場合は0 B3に銭湯に移動する文字数を指定して下さい。 testABSmoji →ABStestmoji B2: 5 B3: 3 TEST_TEST_oemm →oemmTEST_TEST_ B2: 0 B3: 4 Option Explicit ' Sub Macro1()   Dim OldName As String   Dim NewName As String   Dim Length As Long '   OldName = Dir([B1] & "\*.", vbDirectory) '   While OldName > ""     NewName = "" '     If Left(OldName, 1) = "." Then     ElseIf [B2] > 0 Then       NewName = Mid(OldName, [B2], [B3]) & _         Left(OldName, [B2] - 1) & Mid(OldName, [B2] + [B3])     Else       Length = Len(OldName)       NewName = Right(OldName, [B3]) & Left(OldName, Length - [B3])     End If '     If NewName <> "" Then       Name [B1] & "\" & OldName As [B1] & "\" & NewName     End If     OldName = Dir   Wend End Sub 話を読んでいると、6桁の数字を検索してそれを銭湯に移動するプログラムの方がいい気がします。そうすれば、位置を指定する必要がありません。ファイル名の付け方が不明なので、この方法が有効かどうかわかりません。その方がよければ補足かお礼に書いて下さい。明日になるけど作ります。

NuboChan
質問者

お礼

マクロコードの提示ありがとうございます。 検証結果、思っていた処理が出来ました。 先頭からと最後部からの2つのマクロが必要と思っていましたが 最後部からの場合は0を指定するアイデアは「なるほど」と感心しました。 >6桁の数字を検索してそれを銭湯(先頭)に移動するプログラムの方がいい気がします。 >そうすれば、位置を指定する必要がありません。 フォルダーの中には、数値が2箇所以上有る場合があるので必要な数字が   最初の数字とか後からの数字とか一概に判断できず人間の判断が必要となります。 -------------------------------------- できればマクロを少し改造したいと思います。   B1セルで親フォルダーを指定していますが、   マクロを起動した時に最初に親フォルダーを指定する   ダイアログボックスが表示されてエキスプローラー感覚で   親フォルダーを指定するようにしたいです。 マクロコードの訂正ができればお願いします。

NuboChan
質問者

補足

お礼の書き込みでお願いした以下の追加の件ですが、 >マクロを起動した時に最初に親フォルダーを指定する >ダイアログボックスが表示されてエキスプローラー感覚で >親フォルダーを指定するようにしたいです。 NO2さんが「FileSystemObject」ライブラリーを利用する事で   希望のダイアログボックスがでました。 検討のほどお願いベースですがよろしくお願いします

関連するQ&A