VBAで新規フォルダ作成時の名前の指定

このQ&Aのポイント
  • VBAで新規フォルダを作成する際、特定の文字列を除いた名前でフォルダを作成したい場合、どのように変更すれば良いですか?
  • 特定のフォルダ内に年月を付けたフォルダを作成するVBAコードについて、同じ年の場合にはファイルのみを作成する方法を教えてください。
  • VBAを使用して、あるフォルダ内に新しいフォルダを作成し、そのフォルダ名には特定の文字列を含めずに年月を付ける方法を教えてください。
回答を見る
  • ベストアンサー

vbaで新規フォルダ作成時の名前の指定

「あいいうえお」フォルダの中に年が変わったら「2015年」という名前でフォルダの作成を行いたいのですが、下記のコードでは「あいうえお2015年」という名前のフォルダを作成してしまいます。フォルダの作成で、「あいうえお」を除いたものを作成するにはどう変えればよいでしょうか? (12月のファイルで実行した時に例えば「2015年」フォルダを作成して、その中に「あいうえお2015-1月.xlsm]ファイルを作成します。同じ年なら「あいうえお11月.xlsm]などファイルのみを作成します。) お手数をおかけしますがどうぞよろしくお願いいたします。 Sub ブックコピー自動翌月分作成() Dim i As Integer Dim wb As Workbook Dim myDir_path As String, myNew_path As String 'フォルダパスとファイルパスを作成 myDir_path = Left(ThisWorkbook.FullName, InStrRev(ThisWorkbook.FullName, "\") - 1) myNew_path = "あいうえお" & Format(DateAdd("m", 1, Replace(Replace(ThisWorkbook.Name, "あいうえお", ""), "月.xlsm", "")), "yyyy-m") & "月.xlsm" myDir_path = Left(myDir_path, InStrRev(myDir_path, "\")) & Left(myNew_path, 9) & "年\" 'フォルダの有無を確認、なければ作成 With CreateObject("Scripting.FileSystemObject") If Not .FolderExists(myDir_path) Then MkDir myDir_path 'MsgBox myDir_path & "を作成しました" 'MsgBox Left(myDir_path, InStrRev(myDir_path, "\")) & "に" & vbNewLine & MsgBox Left(ThisWorkbook.FullName, InStrRev(ThisWorkbook.FullName, "\") - 12) & "に" & vbNewLine & _ Left(myNew_path, 9) & "年" & "フォルダを新たに作成しました" End If End With 'ファイルの有無を確認、なければ保存,あれば処理中止 If Dir(myDir_path & myNew_path) = "" Then ThisWorkbook.SaveCopyAs myDir_path & myNew_path MsgBox myNew_path & "のファイルを新たに作成しました" Else MsgBox "翌月分のファイルはすでに存在するので処理を中止します", vbOKOnly, "処理中止" Exit Sub End If '新規作成したブックを開く,既に開いていれば処理中止 For Each wb In Workbooks If wb.Name = myNew_path Then MsgBox myNew_path & "は既に開いているので処理を中止します", vbOKOnly, "処理中止" Exit Sub End If Next Workbooks.Open myDir_path & myNew_path Workbooks(myNew_path).Activate End Sub

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

  • ベストアンサー
  • mt2008
  • ベストアンサー率52% (885/1701)
回答No.2

自ブックがフルパスで↓の時、マクロを動かすと  \\192.168.1.100\工作\生産\あいうえお\2014年\あいうえお2014-12月.xlsm 新たにフォルダを作って以下の様に保存されれば良いのですね  \\192.168.1.100\工作\生産\あいうえお\2015年\あいうえお2015-1月.xlsm ようやくパスが解りました。 コードの中で自ブックのパスと名前を使っているのですから、質問の際にはその情報も最初からつけてください。 修正はコレだけで良いです。 myDir_path = Left(myDir_path, InStrRev(myDir_path, "\")) & Left(myNew_path, 9) & "年\"  ↓ myDir_path = Left(myDir_path, InStrRev(myDir_path, "\")) & Mid(myNew_path, 6, 4) & "年\"

hinoki24
質問者

お礼

質問の情報が不足していたようで、お手数をおかけしました。 修正したら理想通りにできました。 ほんの少しの違いで結果に差がでますね。 どうもありがとうございました。これだけのことですがやっと解放されました。 ありがとう。

その他の回答 (1)

  • mt2008
  • ベストアンサー率52% (885/1701)
回答No.1

自ブック名やパスが不明なので思い違いをしている可能性は有りますが、とりあえず以下の様な変更でどうでしょう? myDir_path = Left(myDir_path, InStrRev(myDir_path, "\")) & Left(myNew_path, 9) & "年\"  ↓ myDir_path = Left(myDir_path, InStrRev(myDir_path, "\")) & "あいうえお\" & Mid(myNew_path, 6, 4) & "年\"

hinoki24
質問者

補足

ありがとうございます。 試してみたのですが、新規フォルダ作成の、 MkDir myDir_path の所でパスがみつかりません、となります。元に戻すと「あいうえお2014年」フォルダを作成してくれます。 教えていただいたものは、近いところにはきている感じはしますがうまくいきません。 実際の具体的なパスは以下のような感じになります。現在のファイルがあるファルダ名を例えば「2015年」にしたいところが「あいうえお2015年」という名前で作成されます。 \\192.168.1.100\工作\生産\あいうえお\2014年\あいうえお2014-11月.xlsm

関連するQ&A

  • ExcelVBA一つ上までのフォルダ作成

    ExcelVBA2007以上で質問です。 現在のファイルのあるフォルダは例えば「11月分」という名前になっています。 もうひとつ上は「2014年」というフォルダになっています。 コードを実行すると、翌月のフォルダとファイルを作成するようになっています。 現在11月なので、実行すると「12月分」というフォルダを作成して、「AAA2014-12」というファイルを作成します。さらにこれを実行して、例えば "D:\YM\Desktop\AAA\2015年\1月分"\AAA2015-1.xlsm のように2015年のフォルダを作成してさらにその中に1月分のフォルダを作成したいのですが、2014年フォルダの中に1月分フォルダが作成されるだけで、どうすればいいのか分かりません。 今の所、月のフォルダと、ファイル名は翌月取得が下記のコードで実現できています。 最後のコードに手を加える必要があると思いますが、どうすればよいでしょうか? Sub AAA翌月ファイル作成() Dim myDir_path As String, myNew_path As String '現在ファイルがあるフォルダパスを取得 myDir_path = Left(ThisWorkbook.FullName, InStrRev(ThisWorkbook.FullName, "\") - 1) '翌月分のファイル名を取得 myNew_path = "在庫数" & Format(DateAdd("m", 1, Replace(Replace(ThisWorkbook.Name, "AAA", ""), ".xlsm", "")), "yyyy-m") & ".xlsm" '翌月のファイルを保存するフォルダ名を取得   あとは、年が変わったら1年繰り上げたものを取得したい myDir_path = Left(myDir_path, InStrRev(myDir_path, "\")) & Format(DateAdd("m", 1, Replace(Replace(ThisWorkbook.Name, "AAA", ""), ".xlsm", "")), "m") & "月分\"

  • エクセルVBAで指定場所にフォルダー作成

    エクセルのVBAマクロ機能を使い、 自動フォルダー作成&リンクするマクロを作成したのですが、 現在のマクロですと「A(仮名)」の中にフォルダーに作ってしまいますので 下記の様に階層で指定出来る様にしたいのですが、教えて頂けないでしょうか? 出来れば、そのままマクロ貼り付けで使える様にしたいので、 下記に途中までのマクロを編集して頂ければ助かります。 「A(仮名)」と言うフォルダーの中にエクセルファイルの管理表を入れ 「A」のフォルダーの中に「B(仮名)」と言うフォルダーを作り、 その中に管理台帳で自動作成されるフォルダーがつくられる様にしたい。 現在のマクロ Sub MakeHyLink() Dim wkStr As String If ActiveCell.Column <> 1 Then Exit Sub If ActiveCell.Value = "" Then MsgBox "アクティブセルは未入力、やり直し" Exit Sub End If wkStr = ThisWorkbook.path & "\" & ActiveCell.Value If Dir(wkStr, vbDirectory) = "" Then MsgBox "フォルダー:" & wkStr & vbLf & " を、作成します。" MkDir wkStr Else MsgBox "フォルダー:" & wkStr & vbLf & " は、存在します。" End If ActiveSheet.Hyperlinks.Add Anchor:=ActiveCell, Address:=wkStr End Sub

  • VBAによるカレントフォルダのファイルを検索し開く

    カレントフォルダ内にファイル(コ―ド.xls)を見つけ開き、無ければMSG表示したい。 どのように、したらいいですか? 考えているのは、 Application.DefaultFilePath = ThisWorkbook.Path If ??? Then Workbooks.Open "コード.xls" else msgbox (ThisWorkbook.Path & "にコード.xlsを置いて下さい。") Exit sub end If です。 この???の部分を教えて頂きたいと思います。 よろしくお願いします。

  • エクセルvbaブック名の年を進めたい

    エクセル2013vbaです。 2014年という名前のファイルがあります。 vbaで、 Sub test() Dim myNew_path As String myNew_path = Format(DateAdd("yyyy", 1, Replace(ThisWorkbook.Name, "年.xlsm", "")), "yyyy") End Sub を実行すると、"1906/07/06"を取得しており、"1906"となってしまいます。 無理やりDateAddで110を足せば"2015"の取得はできますが、どうしてでしょうか? どのように修正すればまともにDateAddに1を足して"2015"を取得できるのでしょうか? すいませんが、お願いいたします。

  • VBAでの疑問

    以下のようなコードを見ました。 Private Sub Workbook_BeforeClose(Cancel As Boolean) With ThisWorkbook Application.DisplayAlerts = False If .Name <> .FullName Then SaveAs Else Me.Saved = True End If Application.DisplayAlerts = True End With End Sub これは何のためのコードでしょうか? If .Name <> .FullName Then って、パスなしのBOOK名とパス付BOOK名が同じじゃないのは当然で、同じになるのは新規に作成したばかりで保存する前のファイルくらいしか思いつきません。これでは必ず上書きされてしまうと思いますが、どういう意図が考えられるのかお分かりの方教えていただけないでしょうか?

  • エクセルVBAでフォルダの作成-2

    先ほどダブルクリックすると、クリックしたその名前にしたフォルダを作成して、ハイパーリンクを設定する、ということで質問させていただき、良い回答を頂き質問を閉じましたが、また質問があります。 A列をクリックするとイベントを発生させるのを、 A4セルから、その下のデータが入っているセルまで をイベントが有効な範囲にしたいと思い、考えています。 「If Target.Column = 1 Then」の部分がそれだと思い、 If Target.Range("A4", Range("A" & Rows.Count).End(xlUp)) Then のように考えて実行しましたが、これはダメでした。 このように限られた範囲に変更すにはどのようにすればいいでしょうか? Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean) Const path As String = "D:\TEMP\倉庫\" Dim wkStr As String  If Target.Column = 1 Then   wkStr = path & Target.Value   If Dir(wkStr, vbDirectory) = vbNullString Then    MsgBox wkStr & "フォルダがありません。作成します。"    MkDir wkStr   Else    MsgBox wkStr & "フォルダは存在します。"   End If   ActiveSheet.Hyperlinks.Add Anchor:=Target, Address:=wkStr  End If End Sub

  • フォルダー名一覧を作成するVBAでのエラー

    ここで教えていただいたフォルダー名一覧を作成するVBAがあります。 共有ドライブやMyDocumentなどのサブフォルダーは綺麗に階層別に抜き出してくれて助かっています。 ところが、Cドライブ(ローカルディスク)に対して実行すると必ず「実行時エラー70 書き込みできません」になります。 ワークシートにそれまで記入されたフォルダー名を見ると [Config.Msi] となっています。 ただエクスプローラで見てもConfig.Msiというフォルダーは見当たりません。 おそらく隠しフォルダーなのでしょう。 Cドライブを検索する場合、隠しフォルダーは広わなくてもいいので、エラーにならないようするにはどう直せばよいのでしょうか? エクセル2000です。 ' [参照設定]・Microsoft Scripting Runtime Option Explicit Private g_cntPATH As Long Sub SEARCH_FOLDER() Dim objFSO As FileSystemObject Dim strPATHNAME As String Dim myObj As Object Dim myDir As String Set myObj = CreateObject("Shell.Application"). _ BrowseForFolder(0, "フォルダを選択してください", 0) If myObj Is Nothing Then Exit Sub If myObj = "デスクトップ" Then myDir = CreateObject("WScript.Shell").SpecialFolders("Desktop") Else myDir = myObj.Items.Item.Path End If strPATHNAME = myDir Cells.ClearContents Set objFSO = New FileSystemObject Call SEARCH_SUB_FOLDER(objFSO.GetFolder(strPATHNAME), 0, 0) Set objFSO = Nothing MsgBox "処理が完了しました。" & vbCr & vbCr & _ "フォルダ数=" & g_cntPATH & vbCr, vbInformation End Sub 'フォルダ単位のサブ処理(再帰動作,引数はFile-Object,行,カラム) Private Sub SEARCH_SUB_FOLDER(ByVal objPATH As Folder, ByRef GYO As Long, ByVal COL As Long) Dim objPATH2 As Folder g_cntPATH = g_cntPATH + 1 '参照フォルダ数を加算 GYO = GYO + 1 ' 行を加算 COL = COL + 1 ' カラムを加算 Cells(GYO, COL).Value = "[" & objPATH.Name & "]" For Each objPATH2 In objPATH.SubFolders 'サブフォルダを探索するループ処理 Call SEARCH_SUB_FOLDER(objPATH2, GYO, COL) 'フォルダ単位のサブ処理(再帰呼び出し) ’←ここでエラー Next objPATH2 Set objPATH = Nothing ' 参照OBJECTを破棄 End Sub

  • エクセルVBA自動ハイパーリンクフォルダー指定場所

    管理台帳を作成したく、下記のVBAを作りました。 マクロ内容は、Aセルに管理番号を入力しマクロ実行ボタンにて、 入力した番号と同じフォルダーを作成しハイパーリンクする自動フォルダー作成&ハイパーリンクマクロです。 現在のフォルダー作成場所はローカルのDドライブ直下に作る様に指定しているのですが、 エクセルVBAがある場所と同じ場所に、上記のマクロで作るフォルダーが出来る様にしたいのですが、 見よう見まねでVBAを何とか作ったのですが、知識がなくこれ以上が解りません。 出来れば、下記のVBAを編集して頂、教えて頂いたVBAをそのままコピペすれば使える状態で教えて頂ければ助かります。 宜しくお願い致します。 Sub MakeHyLink() Const path As String = "D:\" Dim wkStr As String If ActiveCell.Column = 1 Then wkStr = path & ActiveCell.Value If Dir(wkStr, vbDirectory) = vbNullString Then MsgBox wkStr & "フォルダがありません。作成します。" MkDir wkStr Else MsgBox wkStr & "フォルダは存在します。" End If ActiveSheet.Hyperlinks.Add Anchor:=ActiveCell, Address:=wkStr End If

  • VBAで新しいフォルダを作成するには

    エクセル2010です。 新しいフォルダを作成するにはMkDir関数というのはわかりますが、フォルダがなければ作る、あれば作らないようにしたいのです。 そのやりかたをお教えいただけませんでしょうか? やりたいことは以下のようなことです。 まず、対象フォルダを指定します。 その中に多数のエクセルのBOOKがあります。 このマクロがあるBOOKのSheet1のA列に「名前リスト」があります。 名前が一致するものを、ファイルコピーして、「名前リスト」の右隣B列のセルにある「区分リスト」と同じ名前のサブフォルダ(このマクロがあるBOOKのフォルダのすぐ下です。)に貼り付ける。 ここまでは、以下のコードで少量のデータでのテストはうまくいきました。 しかし、実際には対象が1,000件近くあり、事前に作っておかなければいけないサブフォルダも何十かになります。 そこで、あらかじめサブフォルダを用意するのではなく、このマクロを作動させると自動的にサブフォルダまで作るようにできないかと欲張った質問です。 Sub TEST01()   Dim myPth(1) As String   Dim myCl As Range   Dim wb As Workbook      Set wb = ThisWorkbook   myPth(0) = wb.Path      With Application.FileDialog(msoFileDialogFolderPicker)     If .Show = True Then       myPth(1) = .SelectedItems(1) '対象フォルダ指定     Else       MsgBox "キャンセル"       Exit Sub     End If   End With      With wb.Sheets("Sheet1")     For Each myCl In .Range("A2:A11")       FileCopy myPth(1) & "\" & CStr(myCl.Value) & ".xlsx", myPth(0) & "\" & myCl.Offset(, 1).Value & "\" & CStr(myCl.Value) & ".xlsx"       myCl.Offset(, 2).Value = "完了"     Next myCl   End With End Sub

  • オブジェクトモジュールにメンバーの追加(エクセルVBA)

    エクセルのVBAで、オブジェクトモジュールに(クラスの?)メンバーを追加したいと考えています。(そんな使い方すべきでないとの意見もありそうな問題ですが・・?) Thisworkbookのモジュールに次のコードを書いてみたのですが、test_bookを動かすと(1)~(3)は問題ないのですが、(4)がエラーになります。(自動メンバー表示もされません。且つ、???に何を入れればいいのか?判りません) で、質問ですが、オブジェクトモジュールに、プロパティ、メゾッドは追加できるのでしょうか?追加したプロパティ、メゾッドは、自動メンバー表示に加えることが出来るのでしょうか?その時は、やはり、Enum を使うのでしょうか?ご指導のほどよろしくお願い致します。 Private enum ?? ???? End Enum dim ??? as ??? Sub test_book()   MsgBox Name & FullName & FolderName  '(1) MsgBox ThisWorkbook.Name & _      TisWorkbook.FullName       '(2) MsgBox Me.Name & Me.FullName      '(3) MsgBox Name & FullName & _      ThisWorkbook.FolderName      '(4) End Sub Private Property Get FolderName() As String FolderName = "test"   '所属するフォルダー名を返すプロパティーを借りに想定して単に"test"を返して実験してみました。実際にやりたいことは、別にあります。 End Property 具体的に何をやりたいのかを明示できなくてすみません。宜しくお願い致します。

専門家に質問してみよう