サイズが大きくなってもいいから…Excelファイルにオブジェクトの挿入で別のExcelファイルを埋め込んでおいて、VBAでいじって保存できんかなと…やってみるとできるもんだな。
今回のポイントはこんな感じ…ちょっと手抜きあり。
- OLEObjectsの中にある埋め込んだExcelファイルを開く
- ActiveWorkbookのSaveAsメソッドでファイルを保存する
まずはメインになるサンプルのExcelを用意。
とりあえずこんな感じでMain.xlsmってファイルを作った。
んで、埋め込むExcelファイルはこんな感じでSub.xlsxってファイルを作った。
Main.xlsmにSub.xlsxを埋め込んだときの手順はこんな感じ。
- Excelの”挿入”ってタブの右の方にある”オブジェクト”ってボタンをクリックする。

- オブジェクトの挿入って画面が表示されるので、”ファイルから”ってタブをクリックする。

- ファイルからってタブの画面に切り替わるので、ファイル名を直接入力するか参照ってボタンでSub.xlsxファイルを選ぶ。

- 画面の右下にあるOKボタンをクリックする。

追加したらこんな感じ。

で、コードはこんな感じ。
Main.xlsmのシートのオブジェクト名はMainSheetって名前にしてある。
Public Sub Main()
' 変数を宣言する
Dim objObject As OLEObject
Dim strPath As String
Set objObject = Nothing
' 処理を開始する
On Error GoTo MethodEnd
' Main.xlsmと同じ場所に保存したいのであらかじめパスを作成しておく
' ※Pathプロパティは最後に区切り文字\がないのでファイル名の前に追加する必要がある
strPath = ActiveWorkbook.Path & "\Output.xlsx"
If Dir(strPath) <> "" Then
' 既にファイルがある場合は上書き保存が失敗するので終了する
' ※強制的に上書きすればこの処理は要らない
' ⇒Application.DisplayAlerts = Falseがヒント
GoTo MethodEnd
End If
' オブジェクトの挿入で追加したExcelシートを取得する
' ※本当はタイプを見て名前を見て...なんだけど今回は省略...
' ※今回は1個しかないはずなのでリストの1番目を指定する
If MainSheet.OLEObjects.Count <> 1 Then
' 1個でなかったら動かないので終了する
GoTo MethodEnd
End If
Set objObject = MainSheet.OLEObjects(1)
' オブジェクトを開く
objObject.Verb xlVerbOpen
' アクティブブックになっているので保存する
ActiveWorkbook.SaveAs strPath
' 一応閉じておく
ActiveWorkbook.Close
' 終了処理をする
MethodEnd:
' オブジェクトを開放する
If Not objObject Is Nothing Then
Set objObject = Nothing
End If
End Sub
で、実行してみる。
Main.xlsmを開いてさっきのMain()ってマクロを実行すると…
ファイルが保存されとる。
んまま、明日への自分へのメモってことで。


