サイズが大きくなってもいいから…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()ってマクロを実行すると…
ファイルが保存されとる。
んまま、明日への自分へのメモってことで。