Excel の指定シートを別ブックのシートにエクスポートする
この記事では「Excel の指定シートを別ブックのシートにエクスポートする」ために利用可能な ExportInputBookToOutputBook というユーザー定義関数について紹介します。
この情報が読者のお役に立てば幸いです。
解決できること
Microsoft Access の中でここで紹介する
ExportInputBookToOutputBook
をマクロの中で呼び出すと%USERPROFILE%からの相対パスで指定された Excel の入力ブックの指定シート内の指定セル範囲を 出力ブックの指定シート内の指定セル範囲へ 簡単にエクスポートできます。
ここに %USERPROFILE% は Windows であらかじめ定義されている環境変数で Windows 10 搭載 PCを使っている利用者のデフォルトのフォルダパスを表しています。この環境変数については必要に応じて以下の記事を参照下さい。
読んでほしい方
こうした Microsoft Access VBA を使ったアプリケーションをこれから作ろうと思っている方、今まで VBA によるアプリケーションを作ってきたが、そのツールを第三者に提供する際に、フォルダの保存パス名等の利用者個人に紐づいた環境差分をVBAのプログラムの中にじかに書くのに抵抗がある方。
ExportInputBookToOutputBook 関数 の紹介
説明
%USERPROFILE%からの相対パスで指定された Excel の入力ブックの指定シート内の指定セル範囲を 出力ブックの指定シート内の指定セル範囲へ 簡単にエクスポートできます。
参照オブジェクト
この関数を利用するためにはこの関数の実行前に
データベースツール > Visual Basic > ツール > 参照設定
の中で
- Microsoft Office 16.0 Access Database engine
- Microsoft Excel 16.0 Object Library
にチェックを入れる必要があります。
利用例
Access のマクロ定義例えば “M0080_Call_ExportInputBookToOutputBook” の中で
If ExportInputBookToOutputBook("Downloads\issues.xlsx","issues","$A$1:$AA$","Downloads\Redmine_CSV_貼り付け先.xlsx","Redmine","$B$1:$AB$")>0
メッセージボックス ("Downloads\issues.xlsx" から "Downloads\Redmine_CSV_貼り付け先.xlsx" へのセルのエクスポートに失敗しました。,はい,なし)
Else
メッセージボックス (成功しました。,はい,なし)
IF 文の最後
のように ExportInputBookToOutputBookを “Downloads\issues.xlsx“、”issues“、”$A$1:$AA$“、”Downloads\Redmine_CSV_貼り付先.xlsx“、”Redmine“、”$B$1:$AB$” といったパラメータを付けて呼び出します。
ここに”Downloads\issues.xlsx“、”issues“、”$A$1:$AA$“、は%USERPROFILE%からのエクスポート元ブックの相対パス名、シート名、セル範囲、”Downloads\Redmine_CSV_貼り付先.xlsx“、”Redmine“、”$B$1:$AB$“ は%USERPROFILE%からのエクスポート先ブックの相対パス名、シート名、セル範囲です。
この “M0080_Call_ExportInputBookToOutputBook” のデザインビューを閉じて、この ”M0080_Call_ExportInputBookToOutputBook” マクロをダブルクリックすると、
このマクロの中の ExportInputBookToOutputBook が実行され、指定された “Downloads\issues.xlsx“の中で、”issues“の”$A$1:$AA$(issuesのデータの最後尾の行番号)“から”Downloads\Redmine_CSV_貼り付先.xlsx“、”Redmine“、”$B$1:$AB$(issuesのデータの最後尾の行番号)” へセルの内容がエクスポートされます。
引数
引数 |
属性 |
意味 |
%USERPROFILE%からのエクスポート元ブックの相対パス名 |
文字型 |
エクスポート元のブックの%USERPROFILE%からの相対パス名を””で囲んだ文字列で関数のパラメータとして指定します。 |
エクスポート元シート名 |
文字型 |
エクスポート元のブックの対象シートの名前を””で囲んだ文字列で関数のパラメータとして指定します。 |
エクスポート元セル範囲 |
文字型 |
エクスポート元のブックの対象シート内で実際にエクスポートするセル範囲を””で囲んだ文字列で関数のパラメータとして指定します。例えば”$A$1:$D$”は、エクスポート元シートのA列の先頭からD列の最後の行までをエクスポート元セル範囲として指定する意味になります(注1) |
%USERPROFILE%からのエクスポート先ブックの相対パス名 |
文字型 |
エクスポート先のブックの%USERPROFILE%からの相対パス名を””で囲んだ文字列で関数のパラメータとして指定します(注2) |
エクスポート先シート名 |
文字型 |
エクスポート先のブック内でエクスポート先として指定したいシートの名前を””で囲んだ文字列で関数のパラメータとして指定します。 |
エクスポート先セル範囲 |
文字型 |
エクスポート先シート内での貼り付けセル範囲を””で囲んだ文字列で関数のパラメータとして指定します。例えば”$B$1:$E$”は、エクスポート先シートのB列の先頭からE列の最後の行までを貼り付け先セル範囲として指定する意味になります。エクスポート元のセル範囲とエクスポート先のセル範囲は幅を一致させなければいけません。 |
(注1) このセル範囲の最後の行は厳密にはこの
ExportInputBookToOutputBookの中で 指定したシートのA列で一番最初に空白が出てきた行までを最後行として自動検出します。仮にA列の下にまだデータがあるにもかかわらず、A列の途中に空白があり、逆にB列には最後まで空白セルが無いようなケースでは、
ExportInputBookToOutputBookを期待通りに動作させるために最後行を検出する行を指定する部分のコーディングを修正する必要があります。詳細は「コードの簡単な説明」を参照ください。
(注2)このエクスポート先ブックの%
USERPROFILE%からの相対パス名をエクスポート元ブックの%
USERPROFILE%からの相対パス名と同一にするとVBAコードの中で同一ブックへに対する複数回のオープンすることになるためエラーとなります。こういった利用形態でマクロを作成したい方は
の利用を検討ください。
戻り値
VBAコード
Function ExportInputBookToOutputBook(input_book_path As String, input_sheet_name As String, input_range_string As String, _
output_book_path As String, output_sheet_name As String, output_range_string As String) As Integer
Const C_SUCCESS As Integer = 0
Const C_FAILURE As Integer = 1
Dim excelAppObj As Object
Dim inputExcelWorkBookObj As Object
Dim inputExcelWorkSheetObj As Object
Dim outputExcelWorkBookObj As Object
Dim outputExcelWorkSheetObj As Object
Dim inputMaxRowCount As String
Dim inputRangeString As String
Dim outputRangeString As String
On Error GoTo exitWithFailure
Set excelAppObj = CreateObject("Excel.Application")
excelAppObj.Visible = False
excelAppObj.UserControl = True
excelAppObj.DisplayAlerts = False
Set inputExcelWorkBookObj = excelAppObj.Workbooks.Open(Environ("UserProfile") & "\" & input_book_path)
Set inputExcelWorkSheetObj = inputExcelWorkBookObj.Worksheets(input_sheet_name)
inputMaxRowCount = inputExcelWorkSheetObj.Cells(1, 1).End(xlDown).Row
' specify input_range_string as "$B$1:$AB$"
' specify output_range_string as "$A$1:$AA$"
inputRangeString = input_range_string & inputMaxRowCount
outputRangeString = output_range_string & inputMaxRowCount
Set outputExcelWorkBookObj = excelAppObj.Workbooks.Open(Environ("UserProfile") & "\" & output_book_path)
Set outputExcelWorkSheetObj = outputExcelWorkBookObj.Worksheets(output_sheet_name)
outputExcelWorkSheetObj.Cells.Clear
outputExcelWorkSheetObj.Range(outputRangeString).Value = inputExcelWorkSheetObj.Range(inputRangeString).Value
inputExcelWorkBookObj.Close savechanges:=True
outputExcelWorkBookObj.Close savechanges:=True
excelAppObj.Quit
Set outputExcelWorkSheetObj = Nothing
Set outputExcelWorkBookObj = Nothing
Set inputExcelWorkSheetObj = Nothing
Set inputExcelWorkBookObj = Nothing
Set excelAppObj = Nothing
ExportInputBookToOutputBook = C_SUCCESS
Exit Function
exitWithFailure:
excelAppObj.Quit
Set outputExcelWorkSheetObj = Nothing
Set outputExcelWorkBookObj = Nothing
Set inputExcelWorkSheetObj = Nothing
Set inputExcelWorkBookObj = Nothing
Set excelAppObj = Nothing
ExportInputBookToOutputBook = C_FAILURE
End Function
VBAコードの簡単な説明
行番号 |
説明 |
1-2 |
関数名と関数の戻り値の型(Integer:整数型)、入力パラメータ input_book_path 、 input_sheet_name 、 input_range_string 、 output_book_path 、output_sheet_name、 output_range_string の名前、型(String:文字列型)を定義しています。また1行目の最後尾にある ‘_’ はこの行が次の行に継続する(継続行がある)ことを示します。 |
4-5 |
このプログラムの中で利用する定数C_SUCCESS(0:成功)、C_FAILURE(1:失敗)を定義しています。ここでは62行目、72行目ででこの関数の戻り値が C_SUCCESS(0:成功)、C_FAILURE(1:失敗)であることが明確にわかるようなコーディングの仕方になります。 |
7-13 |
excelAppObj 、inputExcelWorkBookObj 、inputExcelWorkSheetObj 、outputExcelWorkBookObj 、outputExcelWorkSheetObj を オブジェクトとして定義しています。この excelAppObj はMicrosoft Excel のアプリケーションを表すオブジェクト、inputExcelWorkBookObj outputExcelWorkBookObj はそれぞれ入力側と出力側の Excel の%USERPROFILE%からの相対パスのブック名を表すオブジェクト 、inputExcelWorkSheetObj とoutputExcelWorkSheetObj は それぞれ入力側と出力側の シートを表すオブジェクトです。 |
15-17 |
inputMaxRowCount、 inputRangeString、 outputRangeString を文字列変数として定義しています。inputMaxRowCount は入力側のシートの最後尾の行数を文字列として保存する変数、 inputRangeString と outputRangeString は入力側と出力側のシートでエクスポート範囲、貼り付け範囲を表す文字列を保存する変数です。 |
19 |
この関数の実行中にエラーが発生したときの例外処理として、exitWithFailure にジャンプします。 |
21 |
Excel にアクセスするため “Excel.Application” オブジェクトを生成し、 excelAppObj に設定しています。 |
23-25 |
excelAppObj を実行中に非表示にし、ユーザー制御可能な状態に設定しています。
また Excel の実行中に現れる警告ダイアログのポップアップを抑制します。 |
27-28 |
Environ 関数と入力パラメータとして指定された input_book_path、 input_sheet_name を使って、 inputExcelWorkBookObj をオープンしし、inputExcelWorkSheetObj を指定しています。。 |
30 |
入力側の inputExcelWorkSheetObj シートの Cell(1,1)、つまりA1セルを下方向に最終行まで移動したその行番号(Row)を文字列に変換して inputMaxRowCount に設定しています。
ここで、B1セルを基準として最終行を求める場合は、
inputMaxRowCount = inputExcelWorkSheetObj.Cells(1, 2).End(xlDown).Row
のようにします。 |
32-33 |
input_range_string と output_range_string にどういった文字列が設定されることを期待しているかをコメントとして記載しています。このコメントはVBAの動作上は何の影響もありませんが、このVBAコードを人間が参照した際、このVBAコードが何を意図しているのかが分かり易くなるという利点があります。この例では “$B$1:$AB$” や “$A$1:$AA$” (すなわちExcel で範囲を表す文字列の前半部分)を設定するようコメントの中で指定しています。 |
35-36 |
この関数の入力パラメータとして設定された input_range_string 、output_range_string と 35行目で求めた inputMaxRowCount を使って、
入力シート用セル範囲 inputRangeString 、出力シート用セル範囲 outputRangeString を完成します。例えば、この入力シートの最終行が 38行だったと仮定すると
inputRangeString = “$B$1:$AB$38”
outputRangeString = “$A$1:$AA$38”
というような結果になります。 |
38-39 |
Environ 関数と入力パラメータとして指定された output_book_path、 output_sheet_name を使って、 outputExcelWorkBookObj をオープンし、outputExcelWorkSheetObj を指定しています。 |
41 |
出力先の outputExcelWorkSheetObj の全てのセルの値をクリアしています。 |
43 |
実際に出力用シート outputExcelWorkSheetObj の outputRangeString で指定された範囲に 入力用シート inputExcelWorkSheetObj の inputRangeString で指定された範囲からセルの値を貼り付けているこのVBAコードの中心部分です。 |
45-46 |
この inputExcelWorkBookObj と outputExcelWorkBookObj の変更を保存後、両方のEブックをクローズします。 |
48 |
この excelAppObj を終了します。 |
50-54 |
この関数の中で使用したオブジェクトを(メモリ)開放します。 |
56-57 |
この関数の戻り値に C_SUCCESS(0:成功) を設定して関数を終わります。 |
61 |
Excel を終了します |
63-67 |
この関数の中で使用したオブジェクトを(メモリ)開放します。 |
69-70 |
この関数の戻り値に C_FAILURE (1:失敗) を設定して関数を終わります。 |
まとめ
この記事では「Excel の指定シートを別ブックのシートにエクスポートする」ために利用可能な ExportInputBookToOutputBook というユーザー定義関数について紹介しました。
この情報が読者のお役に立てば幸いです。