Excel VBAでは、他のエクセルファイルを開き、編集し、保存するような処理を実装することができる。今回は、その処理を行うサンプルプログラムを作成してみたので、共有する。
前提条件
下記記事の「ExcelファイルをExcel マクロ有効ブックとして保存」まで行い、ファイル名「EditExcel.xlsm」で保存済みであること。
また、「C:\tmp\テスト.xlsx」を作成し、ワークシート名を「テスト」とし、以下の内容で作成済であること。
サンプルプログラムの作成
ファイル「EditExcel.xlsm」を開き、Sheet1シートを以下のように編集する。
セルC5に、編集するファイル名を指定するようになっている。
また、「編集」ボタンはフォームコントロールで作成したボタンで、ボタンが押下されたときに「editExcel」サブプロシージャが呼ばれるようになっている。
さらに、「編集」ボタンが押下されたときに呼ばれる「editExcel」サブプロシージャと、「editExcel」サブプロシージャから呼ばれる「openExcel」ファンクションの内容は、以下の通りで、指定したファイルを開き、一定の編集を行い、保存して閉じるようになっている。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 | 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」の状態で「編集」ボタンを押下した結果は、以下の通り。
実行後の「C:\tmp\テスト.xlsx」の内容は以下の通りで、セルB5に「編集しました」と表示されている。
また、編集ファイル名を指定しなかった場合の実行結果は、以下の通り。
さらに、編集ファイル名のファイルが存在しない場合の実行結果は、以下の通り。
また、編集ファイル名がで指定したファイルがエクセルファイルでない場合の実行結果は、以下の通り。
さらに、編集ファイル名で指定したファイルが既に開いているファイルの場合の実行結果は、以下の通り。
要点まとめ
- Excel VBAでは、他のエクセルファイルを開き、編集し、保存するような処理を実装することができる。
- ファイル名は「Dir([ファイルパス])」で取得できる。
- ファイルを開く処理は「Workbooks.Open [ファイルパス]」で、ファイルを保存する処理は「Workbooks([ファイル名]).Save」で、ファイルを閉じる処理は「Workbooks([ファイル名]).Close」で、それぞれ実装できる。