Excel VBAメモ Excelファイルにオブジェクトの挿入で埋め込んだExcelファイルを別名で保存してみる

VBA

サイズが大きくなってもいいから…Excelファイルにオブジェクトの挿入で別のExcelファイルを埋め込んでおいて、VBAでいじって保存できんかなと…やってみるとできるもんだな。

今回のポイントはこんな感じ…ちょっと手抜きあり。

  • OLEObjectsの中にある埋め込んだExcelファイルを開く
  • ActiveWorkbookのSaveAsメソッドでファイルを保存する

まずはメインになるサンプルのExcelを用意。
とりあえずこんな感じでMain.xlsmってファイルを作った。

んで、埋め込むExcelファイルはこんな感じでSub.xlsxってファイルを作った。

Main.xlsmにSub.xlsxを埋め込んだときの手順はこんな感じ。

  1. Excelの"挿入"ってタブの右の方にある"オブジェクト"ってボタンをクリックする。
  2. オブジェクトの挿入って画面が表示されるので、"ファイルから"ってタブをクリックする。
  3. ファイルからってタブの画面に切り替わるので、ファイル名を直接入力するか参照ってボタンでSub.xlsxファイルを選ぶ。
  4. 画面の右下にある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()ってマクロを実行すると…

ファイルが保存されとる。

んまま、明日への自分へのメモってことで。