こんにちは、ユーキです。
Mac用Excelマクロで複数ファイルを1ファイルにまとめるマクロの作成方法を紹介します。
先日、Mac用Excelマクロを作成してみたのですが、Windowsと異なる点がいくつかありました。作成には大変苦労をしました。その経験を踏まえ、Mac用Excelで複数ファイルを1ファイルにまとめるマクロを作成する方法を紹介します。
前提
私の環境はWindows(Windows10。Excel2013)です。Mac端末はもっていません。
作成したMac用マクロは友人に使ってもらっているので、動作検証は取れています。ただ、最適解はほかにある可能性もある点、ご了承ください。
仕様
今回、作成する機能は以下になります。
- 読み込むフォルダは1か所を指定する
- 読み込みフォルダ内の対象ファイルは複数存在する
- 読み込み対象ファイルの拡張子は「.xlsx」のみとする
- 読み込んだ結果を出力先は新規ファイルとし、保存は行わない
Windowsでの完成コード
まずはWindowsで作成したコードです。詳細は以下の記事にまとめています。
ファイル一覧作成関数と、ファイルを読み込む関数を記載しておきます。
Public Sub FileList()
Dim rowIdx As Long
Dim path As String
Dim fs As Object
Dim f As Object
path = ActiveSheet.Cells(2, 3).Value
Set fs = CreateObject("Scripting.FileSystemObject")
'先頭行を設定。10行目からスターとするようにします。
rowIdx = 10
For Each f In fs.GetFolder(path).Files
If fs.GetExtensionName(f.path) = "xlsx" Then
ActiveSheet.Cells(rowIdx, 2).Value = f.path 'B列にフルパスを表示
rowIdx = rowIdx + 1
End If
Next f
'ファイルを読み取り専用で開いて転記をする
Call CombineFiles(ActiveSheet)
End Sub
Private Sub CombineFiles(sh As Worksheet)
Dim cnt As Long
Dim rowIdx As Long
Dim readWb As Workbook
Dim newWb As Workbook
cnt = 0
rowIdx = 1
While sh.Cells(10 + cnt, 2).Value <> ""
If cnt = 0 Then
Set newWb = Workbooks.Add
'新規Workbookを作成する
End If
'ファイルを読み取り専用で開く
Set readWb = Workbooks.Open(sh.Cells(10 + cnt, 2).Value, ReadOnly:=True)
readWb.Sheets(1).UsedRange.Select
readWb.Sheets(1).UsedRange.Copy
'転記
newWb.Sheets(1).Paste Destination:=newWb.Sheets(1).Range("A" & rowIdx)
readWb.Application.CutCopyMode = False
rowIdx = rowIdx + readWb.Sheets(1).UsedRange.Rows.Count
readWb.Close
cnt = cnt + 1
Wend
End Sub
Macだと動かないWindowsとの相違点
ボタンが動かない
ActiveXコントロールのボタンが使えません。そのため、フォームコントロールのボタンに変更する必要があります。
フォームコントロールのボタンを追加すると、どの関数を実行するかの選択画面が現れます。作成済みのFileListを指定しましょう。
Scripting.FileSystemObjectが使えない
ファイルの一覧を取得するScripting.FileSystemObjectがMac版Excelでは使用できませんでした。
Scripting.FileSystemObjectが使えないので、ファイルの一覧はDir関数で行うように修正します。Dir関数の使い方は以下の記事を参考にしてください。
Scripting.FileSystemObjectでファイル一覧を取得していた部分をDir関数に置き換えると、以下になります。
Dim path As String
Dim fileName As String
Dim rowIdx As Long
fileName = Dir(path & ":" & "*.xlsx")
Do While fileName <> ""
sh.Cells(rowIdx, 2).Value = fileName
rowIdx = rowIdx + 1
fileName = Dir()
Loop
1ファイルずつアクセス権の付与が必要
ここまでのソースである程度は動きます。ただ、Macにはファイルのアクセス権がWindowsよりも厳しいようで、アクセス権がないファイルを読もうとするとアクセス権を求めるダイアログが表示されてしまいます。
ダイアログが表示されると、処理が一度、中断してしまいます。これは多くのファイルを扱う場合、非常に面倒です。そのため、何らかの対策をしておくほうが無難です(ダイアログ表示が許容できるのであれば、この対策は不要です)。
残念ながら、VBAで対象ファイルに権限を付ける方法がわからりませんでした。「chmod」コマンドを出力して、ユーザに実行してもらうというやり方で乗り切りました。…無念。
まとめ
今回は、Macで複数ファイルを1ファイルにまとめるマクロを作成する方法を紹介しました。
- ActiveXコントロールが使えない
- Scripting.FileSystemObjectが使えない
- 対象ファイルすべてにアクセス権の付与が必要
少しでもお役に立てば、幸いです。