ExcelVBA

Excel VBAで指定したエクセルファイルを編集する処理を実装してみた

Excel VBAでは、他のエクセルファイルを開き、編集し、保存するような処理を実装することができる。今回は、その処理を行うサンプルプログラムを作成してみたので、共有する。

前提条件

下記記事の「ExcelファイルをExcel マクロ有効ブックとして保存」まで行い、ファイル名「EditExcel.xlsm」で保存済みであること。

Excel VBAを利用してみたExcel VBAを利用すると、Excelファイルを編集する定型的な業務を自動化することができ、他の言語の開発現場でも、Excel VB...

また、「C:\tmp\テスト.xlsx」を作成し、ワークシート名を「テスト」とし、以下の内容で作成済であること。
テスト用のファイル



サンプルプログラムの作成

ファイル「EditExcel.xlsm」を開き、Sheet1シートを以下のように編集する。
作成したプログラムのエクセル_1

作成したプログラムのエクセル_2

セルC5に、編集するファイル名を指定するようになっている。
また、「編集」ボタンはフォームコントロールで作成したボタンで、ボタンが押下されたときに「editExcel」サブプロシージャが呼ばれるようになっている。

さらに、「編集」ボタンが押下されたときに呼ばれる「editExcel」サブプロシージャと、「editExcel」サブプロシージャから呼ばれる「openExcel」ファンクションの内容は、以下の通りで、指定したファイルを開き、一定の編集を行い、保存して閉じるようになっている。

Option Explicit  '変数の宣言を必須にする

'-----------------------------------------------------------
' 機能: 指定したエクセルファイルを編集する
' 引数: なし
' 返り値: なし
'-----------------------------------------------------------
Sub editExcel()
    'ファイルパスを取得する
    Dim filePath As String
    filePath = Range("C5").Value
    
    'ファイルパスが未指定の場合は、処理を終了する
    If filePath = "" Then
        MsgBox "ファイルパスが指定されていません、処理を終了します"
        Exit Sub
    End If
    
    'ファイル名を取得する
    Dim fileName As String
    fileName = Dir(filePath)
   
    '指定したエクセルファイルを開く
    'ファイルが開けなかった場合は、処理を終了する
    If openExcel(filePath, fileName) = False Then
        Exit Sub
    End If
   
    '指定したエクセルファイルを編集する
    Dim ws As Worksheet
    For Each ws In Worksheets
        'テストというシートのセルB5に、編集しましたと記載する
        If ws.Name = "テスト" Then
            Workbooks(fileName).Sheets("テスト").Range("B5").Value = "編集しました"
            Exit For
        End If
    Next ws
    
    '指定したエクセルファイルを保存して閉じる
    Workbooks(fileName).Save
    Workbooks(fileName).Close
    
    '完了メッセージを表示
    MsgBox filePath + "の編集が完了しました"
End Sub

'-----------------------------------------------------------
' 機能: 引数で指定したエクセルファイルを開く
' 引数: filePath/ファイルパス、fileName/ファイル名
' 返り値: openExcel/ファイルを開けたかどうか
'-----------------------------------------------------------
Function openExcel(filePath As String, fileName As String)
    'ファイルが存在しなければ、処理を終了する
    If fileName = "" Then
        MsgBox filePath + "が存在しません、処理を終了します"
        openExcel = False
        Exit Function
    End If
    
    'ファイルがエクセルファイルでなければ、処理を終了する
    With CreateObject("Scripting.FileSystemObject")
        If .GetFile(filePath).Type <> "Microsoft Excel ワークシート" Then
            MsgBox fileName + "はエクセルファイルではありません、処理を終了します"
            openExcel = False
            Exit Function
        End If
    End With
   
    '指定したファイルが開いていれば、処理を終了する
    Dim wb As Workbook
    For Each wb In Workbooks
        If wb.Name = fileName Then
            MsgBox fileName + "が既に開いています、処理を終了します"
            openExcel = False
            Exit Function
        End If
    Next wb
    
    '指定したファイルを開く
    Workbooks.Open filePath
    openExcel = True
End Function



サンプルプログラムの実行結果

前提条件のファイル「C:\tmp\テスト.xlsx」を作成し、ファイル「EditExcel.xlsm」の編集ファイル名が「C:\tmp\テスト.xlsx」の状態で「編集」ボタンを押下した結果は、以下の通り。
サンプルプログラムの実行結果_1

サンプルプログラムの実行結果_2

実行後の「C:\tmp\テスト.xlsx」の内容は以下の通りで、セルB5に「編集しました」と表示されている。
サンプルプログラムの実行結果_3

また、編集ファイル名を指定しなかった場合の実行結果は、以下の通り。
サンプルプログラムの実行結果_4

さらに、編集ファイル名のファイルが存在しない場合の実行結果は、以下の通り。
サンプルプログラムの実行結果_5

また、編集ファイル名がで指定したファイルがエクセルファイルでない場合の実行結果は、以下の通り。
サンプルプログラムの実行結果_6

さらに、編集ファイル名で指定したファイルが既に開いているファイルの場合の実行結果は、以下の通り。
サンプルプログラムの実行結果_7

要点まとめ

  • Excel VBAでは、他のエクセルファイルを開き、編集し、保存するような処理を実装することができる。
  • ファイル名は「Dir([ファイルパス])」で取得できる。
  • ファイルを開く処理は「Workbooks.Open [ファイルパス]」で、ファイルを保存する処理は「Workbooks([ファイル名]).Save」で、ファイルを閉じる処理は「Workbooks([ファイル名]).Close」で、それぞれ実装できる。