目次
Excel の指定シートを同一ブックの別シートにエクスポートする
この記事では「Excel の指定シートを同一ブックの別シートにエクスポートする」ために利用可能な ExportInputSheetToOutputSheet というユーザー定義関数について紹介します。 この情報が読者のお役に立てば幸いです。
解決できること
Microsoft Access の中でここで紹介する ExportInputSheetToOutputSheet をマクロの中で呼び出すと %USERPROFILE% からの相対パスで指定された Excel の入力ブックの指定シート内の指定セル範囲を 同一ブックの指定シート内の指定セル範囲へ 簡単にエクスポートできます。
ここに %USERPROFILE% は Windows であらかじめ定義されている環境変数で Windows 10 搭載 PCを使っている利用者のデフォルトのフォルダパスを表しています。この環境変数については必要に応じて以下の記事を参照下さい。
読んでほしい方
こうした Microsoft Access VBA を使ったアプリケーションをこれから作ろうと思っている方、今まで VBA によるアプリケーションを作ってきたが、そのツールを第三者に提供する際に、フォルダの保存パス名等の利用者個人に紐づいた環境差分をVBAのプログラムの中にじかに書くのに抵抗がある方。
ExportInputSheetToOutputSheet 関数 の紹介
説明
%USERPROFILE% からの相対パスで指定された Excel の入力ブックの指定シート内の指定セル範囲を 同一ブック内の指定シート内の指定セル範囲へ 簡単にエクスポートできます。
参照オブジェクト
この関数を利用するためにはこの関数の実行前に データベースツール > Visual Basic > ツール > 参照設定
の中で
- Microsoft Office 16.0 Access Database engine
- Microsoft Excel 16.0 Object Library
にチェックを入れる必要があります。
利用例
Access のマクロ定義例えば “M0090_Call_ExportInputSheetToOutputSheet” の中で
If ExportInputSheetToOutputSheet("Desktop\試験.xlsx","入力","$A$1:$C$","出力","$B$1:$D$")>0
メッセージボックス ("Desktop\試験.xlsx" のエクスポートに失敗しました,はい,なし)
IF 文の最後
のように ExportInputSheetToOutputSheet を “Desktop\Test.xlsx“、”Sheet2“、”$A$1:$D$“、”Sheet1“、”$B$1:$E$” といったパラメータを付けて呼び出します。
ここに “Desktop\Test.xlsx“、”Sheet2“、”$A$1:$D$“はエクスポート元の Excel ブックのフルパス名、エクスポート元シート名、エクスポート元セル範囲、”Sheet1“、”$B$1:$E$“ は(同一 Excel ブック内の)エクスポート先 シート名、エクスポート先セル範囲です。
この “M0090_Call_ExportInputSheetToOutputSheet” のデザインビューを閉じて、
この ”M0090_Call_ExportInputSheetToOutputSheet” マクロをダブルクリックすると、 このマクロの中の ExportInputSheetToOutputSheet が実行され、指定された “Desktop\Test.xlsx” の中で、”Sheet2“の”$A$1:$D$“から”Sheet1“の”$B$1:$E$” へセルの内容がエクスポートされます。
引数
属性 | 意味 | |
---|---|---|
対象ブック名の相対パス名 | 文字型 | ブック内で シート間での セル範囲のエクスポートをしたい Excel ブックのファイル名の%USERPROFILE% からの相対パス名を””で囲んだ文字列で関数のパラメータとして指定します。 |
エクスポート元シート名 | 文字型 | セル範囲のエクスポートをしたいエクスポート元の シートの名前を””で囲んだ文字列で関数のパラメータとして指定します。 |
エクスポート元セル範囲 | 文字型 | エクスポート元の シートにおけるセル範囲を””で囲んだ文字列で関数のパラメータとして指定します。例えば”$A$1:$D$”は、エクスポート元シート名で指定したシートのA列の先頭からD列の最後の行までをエクスポート元セル範囲として指定する意味になります(注1) |
エクスポート先シート名 | 文字型 | セル範囲をエクスポートしたいエクスポート先の シートの名前を””で囲んだ文字列で関数のパラメータとして指定します。 |
エクスポート先セル範囲 | 文字型 | エクスポート先の シートにおける貼り付けセル範囲を””で囲んだ文字列で関数のパラメータとして指定します。例えば”$B$1:$E$”は、エクスポート先シート名で指定したシートのB列の先頭からE列の最後の行までを貼り付け先セル範囲として指定する意味になります。エクスポート元のセル範囲とエクスポート先のセル範囲は幅を一致させる必要があります。 |
戻り値
値 | 意味 |
---|---|
0 | 正常終了 |
1 | 異常終了 |
VBAコード
Function ExportInputSheetToOutputSheet(input_book_path As String, input_sheet_name As String, input_range_string 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 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 = True
excelAppObj.UserControl = True
Set inputExcelWorkBookObj = excelAppObj.Workbooks.Open(Environ("UserProfile") & "\" & input_book_path)
Set inputExcelWorkSheetObj = inputExcelWorkBookObj.Worksheets(input_sheet_name)
Set outputExcelWorkSheetObj = inputExcelWorkBookObj.Worksheets(output_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
outputExcelWorkSheetObj.Range(outputRangeString).Value = inputExcelWorkSheetObj.Range(inputRangeString).Value
inputExcelWorkBookObj.Close savechanges:=True
excelAppObj.Quit
Set outputExcelWorkSheetObj = Nothing
Set inputExcelWorkSheetObj = Nothing
Set inputExcelWorkBookObj = Nothing
Set excelAppObj = Nothing
ExportInputSheetToOutputSheet = C_SUCCESS
Exit Function
exitWithFailure:
Set outputExcelWorkSheetObj = Nothing
Set inputExcelWorkSheetObj = Nothing
Set inputExcelWorkBookObj = Nothing
Set excelAppObj = Nothing
ExportInputSheetToOutputSheet = C_FAILURE
End Function
VBAコードの簡単な説明
行番号 | 説明 |
---|---|
1-2 | 関数名と関数の戻り値の型(Integer:整数型)、入力パラメータ input_book_path 、 input_sheet_name 、 input_range_string 、 output_sheet_name、 output_range_string の名前、型(String:文字列型)を定義しています。また1行目の最後尾にある ‘_’ はこの行が次の行に継続する(継続行がある)ことを示します。 |
4-5 | このプログラムの中で利用する定数C_SUCCESS(0:成功)、C_FAILURE(1:失敗)を定義しています。ここでは47行目、55行目ででこの関数の戻り値が C_SUCCESS(0:成功)、C_FAILURE(1:失敗)であることが明確にわかるようなコーディングの仕方になります。 |
7-12 | excelAppObj 、inputExcelWorkBookObj 、inputExcelWorkSheetObj 、outputExcelWorkSheetObj を オブジェクトとして定義しています。この excelAppObj はMicrosoft Excel のアプリケーションを表すオブジェクト、inputExcelWorkBookObj は対象の Excel Book を表すオブジェクト 、inputExcelWorkSheetObj とoutputExcelWorkSheetObj は それぞれ入力側と出力側の シート名を表すオブジェクトです。 |
14-16 | inputMaxRowCount、 inputRangeString、 outputRangeString を文字列変数として定義しています。inputMaxRowCount は入力側のシートの最後尾の行数を文字列として保存する変数、 inputRangeString と outputRangeString は入力側と出力側のシートでエクスポート範囲、貼り付け範囲を表す文字列を保存する変数です。 |
18 | この関数の実行中にエラーが発生したときの例外処理として、exitWithFailure にジャンプします。 |
20 | Excel にアクセスするため “Excel.Application” オブジェクトを生成し、 excelAppObj に設定しています。 |
22-23 | excelAppObj を実行中に表示し、ユーザー制御可能な状態に設定しています。 |
25-27 | Environ 関数と入力パラメータとして指定された input_book_path、 input_sheet_name、 output_sheet_name を使って、 inputExcelWorkBookObj をオープンし、 入力側の inputExcelWorkSheetObj シートと出力側の outputExcelWorkSheetObj シートを指定しています。 |
29 | 入力側の inputExcelWorkSheetObj シートの Cell(1, 1)、つまりA1セルを下方向に最終行まで移動したその行番号(Row)を文字列に変換して inputMaxRowCount に設定しています。 ここで、B1セルを基準として最終行を求める場合は、 inputMaxRowCount = inputExcelWorkSheetObj.Cells(1, 2).End(xlDown).Row のようにします。 |
31-32 | input_range_string と output_range_string にどういった文字列が設定されることを期待しているかをコメントとして記載しています。このコメントはVBAの動作上は何の影響もありませんが、このVBAコードを人間が参照した際、このVBAコードが何を意図しているのかが分かり易くなるという利点があります。この例では “$B$1:$AB$” や “$A$1:$AA$” (すなわちExcel で範囲を表す文字列の前半部分)を設定するようコメントの中で指定しています。 |
34-35 | この関数の入力パラメータとして設定された input_range_string 、output_range_string と 35行目で求めた inputMaxRowCount を使って、 入力シート用セル範囲 inputRangeString 、出力シート用セル範囲 outputRangeString を完成します。例えば、この入力シートの最終行が 38行だったと仮定すると inputRangeString = “$B$1:$AB$38” outputRangeString = “$A$1:$AA$38” というような結果になります。 |
37 | 実際に出力用シート outputExcelWorkSheetObj の outputRangeString で指定された範囲に 入力用シート inputExcelWorkSheetObj の inputRangeString で指定された範囲からセルの値を貼り付けているこのVBAコードの中心部分です。 |
39 | この inputExcelWorkBookObj の変更を保存後、この Excel Book をクローズします。 |
41 | この excelAppObj を終了します。 |
43-46 | この関数の中で使用したオブジェクトを(メモリ)開放します。 |
47-48 | この関数の戻り値に C_SUCCESS(0:成功) を設定して関数を終わります。 |
51-54 | この関数の中で使用したオブジェクトを(メモリ)開放します。 |
55-57 | この関数の戻り値に C_FAILURE (1:失敗) を設定して関数を終わります。 |
まとめ
この記事では「Excel の指定シートを同一ブックの別シートにエクスポートする」ために利用可能な ExportInputSheetToOutputSheet というユーザー定義関数について紹介しました。 この情報が読者のお役に立てば幸いです。