【FSO】FileSystemObject 従業員ごとのフォルダ、一瞬で作成! 7回

【FSO】FileSystemObject 従業員ごとのフォルダ、一瞬で作成!

マクロ講座 動画入門編EX7回
マクロ講座

動画でExcel 【FSO】FileSystemObject 従業員ごとのフォルダ、一瞬で作成!

【FSO】FileSystemObject 従業員ごとのフォルダ、一瞬で作成!

動画版「マクロ講座」です。今回もExcelのブックを大量に作ろうと思います。
ただ大量に作るのではなくて、特定のフォルダーを指定して、その中にさらに従業員の名前のフォルダーを作って、 その中にさらに従業員の名前のブックを作る、という内容になります。

(サンプルファイルは、こちらです。 【FSO】FileSystemObject 従業員ごとのフォルダ、一瞬で作成!、サンプル7回

マクロ動画 【FSO】FileSystemObject 従業員ごとのフォルダ、一瞬で作成!

https://youtu.be/EfZ6XaksfKk

従業員ごとのブックを従業員ごとのフォルダに一括作成する

そして作成したそのブックの中には、これからデータを書き込んでいくための、ひな形をコピーしてやる、 というような、ちょっと作業をさせるという形のブックの大量生産です。

NAMAE1

フォルダーも大量生産するので、Microsoft Scripting Runtime Libraryを参照することにします。

NAMAE2

Sheet1、こちらに従業員の氏名一覧があって、 Sheet2というのはデータ用のひな形があるという設定にします。

NAMAE2

今回はシートの名前をデフォルト設定のまま、Sheet1、Sheet2というその名前のまま使っています。 特にコード名を変更するということはしてません。
Dim ws As Worksheet
wsはワークシートの意味の略で変数にして使いやすくしているのです。
Set ws = ThisWorkbook.Sheets("Sheet1")
wsというワークシート変数をSheet1の意味で使いますと設定しています。

NAMAE3

コードの最初には Application.ScreenUpdating = False と記述し
終わりには終わったということで
このApplication.ScreenUpdating = True
にしてやっています。

NAMAE4

FileSystemObjectのCreateFolder メソッド を使用しますので、以下のように宣言します。
Dim fso As FileSystemObject
Set fso = New FileSystemObject
 
宣言とセットの部分を1行にまとめて記述することもできます。
Dim fso As FileSystemObject: Set fso = New FileSystemObject
ここまでのコードは前置きで、いわゆる設定部分です。

NAMAE5

フォルダを指定するパスやフォルダ名、ファイル名の指定方法

メインのコードがこちらになります。
For i = 1 To lastRow
’間にコード
Next i

までの部分です。

NAMAE6

実行すると、指定したフォルダに従業員名のフォルダが作成され、その中には従業員名のブックがひな形をコピーした形で作成されています。これなら手間なしです。

NAMAE7

コードに戻ります。
fnameは、wsに記述してある従業員の名前です。そしてfPath というのは、これからフォルダ作成に使うパスですが、 そのフォルダパスにはfnameが含まれていますので、従業員の名前のフォルダパスということになります。

        Dim fPath As String, fname As String
        fname = ws.Cells(i, "A").Value
        fPath = "D:\従業員\" & fname

NAMAE8

次のコードは、もし指定したパスにフォルダーが無ければ、フォルダーを作りなさいという命令です。
これにより、ws(Sheet1)に記述された従業員名でフォルダが作成されます。

        If Not fso.FolderExists(fPath) Then
            fso.CreateFolder (fPath)
        End If

NAMAE9

次のコード部分からブックを作成します。
Dim newbk As Workbook: Set newbk = Workbooks.Add
作成したブックにws2のUsedRangeをCopyします。
ws2.UsedRange.Copy newbk.Sheets(1).Range("A2")
作成したブックの名前を fnameにします。
newbk.Sheets(1).name = fname
さらにRange("A1").Valueに対してもfnameを入れています。
newbk.Sheets(1).Range("A1").Value = fname
以下のコードはfPathに fnameという名前をつけてブックを保存します。
newbk.SaveAs fPath & "\" & fname & ".xlsx"
作業の最後にCloseします。
newbk.Close

NAMAE10

指定したフォルダに従業員名のフォルダが作り同名のブックも作成して入れる。コード全体

動画で使用したマクロコード全体です。

Sub CreateFoldersAndWorkbooks()
    Application.ScreenUpdating = False
    Dim ws As Worksheet: Set ws = ThisWorkbook.Sheets("Sheet1")
    Dim ws2 As Worksheet: Set ws2 = ThisWorkbook.Sheets("Sheet2")

    Dim lastRow As Long
    lastRow = ws.Cells(ws.Rows.Count, "A").End(xlUp).Row
    Dim fso As FileSystemObject: Set fso = New FileSystemObject
    
    Dim i As Long
    For i = 1 To lastRow
        Dim fPath As String, fname As String
        fname = ws.Cells(i, "A").Value
        fPath = "D:\従業員\" & fname

        If Not fso.FolderExists(fPath) Then
            fso.CreateFolder (fPath)
        End If

        Dim newbk As Workbook: Set newbk = Workbooks.Add
        
        ws2.UsedRange.Copy newbk.Sheets(1).Range("A2")
        newbk.Sheets(1).name = fname
        newbk.Sheets(1).Range("A1").Value = fname
        newbk.SaveAs fPath & "\" & fname & ".xlsx"
        newbk.Close
    Next i
    Application.ScreenUpdating = True
    MsgBox "End"
End Sub

NAMAE11