thumbnail 一問一答の一歩

別ブックの表の項目と値が一致したら転記を行うマクロ

表が複数ある場合、一つの表の項目に対応する値を他の表から引っ張ってくるなんていうことがときどき起こったりする。

これは量が多くなると、かなりの手間となり、効率化による影響が大きい部分である。

なお、効率化の方法には2 つの方法が考えられる。

  • ・関数を作成する
  • ・マクロを作成する

今回はマクロを作成する方法を紹介する予定であり、マクロを用いることによるメリットは以下の通りである。

  • ・2つの表の並び方が、違っていても、対応しやすい
  • ・ファイルの位置が変わったとしても影響が小さい

プログラムの概要、前提条件、使用する関数

実行のための設定を行うためのエクセルシ-トは以下のようなものを前提としており、ボタンを押すことで実行できるようにしています。

また、書換の対象となる表は以下のようなものを想定しており、項目が横に並んでいるものを想定しています。

プログラムのソ-スコード

VBAのソ-スコードについては以下の通りです。

Sub Copy_value

'----------------------------------------------
'概要:2つのエクセルシートの該当行を比較し、一致している項目の値を書き写す
'機能名:Copy_value
'引数:なし
'戻り値:なし
'備考:
'----------------------------------------------

	Dim readsheet As Worksheet
	Dim writesheet As Worksheet
	Dim optional_sheet As Worksheet
	Dim readbook_name As String
	Dim writebook_name As String
	Dim readbook_kakutyoshi As String
	Dim writebook_kakutyoshi As String
	Dim readsheet_name As String
	Dim writesheet_name As String
	Dim readsheet_index_column As Integer
	Dim writesheet_index_column As Integer
	Dim readsheet_contents_column As Integer
	Dim writesheet_contents_column As Integer
	Dim readsheet_start_row As Integer
	Dim writesheet_start_row As Integer
	Dim readsheet_last_row As Integer
	Dim writesheet_last_row As Integer
	Dim readsheet_row_number As Integer
	Dim writesheet_row_number As Integer
	Dim readsheet_transposition_flag As Integer
	Dim writesheet_transposition_flag As Integer
	
	Set optional_sheet =  Worksheets("シート名")
	'4Dのセルに入力した参照元ブック名を参照する
	readbook_name = optional_sheet.Cells(4,4).Value
	'4Eのセルに入力した参照元ブック名を参照する
	writebook_name = optional_sheet.Cells(4,5).Value
	If optional_sheet.Cells(5,4).Value = "" Then
	'拡張子を自動でxlsxに設定
	readbook_kakutyoshi = ".xlsx"
	Else 
	'5Dのセルに入力した拡張子を参照する
	readbook_kakutyoshi = optional_sheet.Cells(5,4).Value
	End If
	If optional_sheet.Cells(5,4).Value = "" Then
	'拡張子を自動でxlsxに設定
	writebook_kakutyoshi = ".xlsx"
	Else 
	'5Eのセルに入力した拡張子を参照する
	writebook_kakutyoshi = optional_sheet.Cells(5,5).Value
	End If
	'6Dのセルに入力した記載先シート名を参照する
	readsheet_name = optional_sheet.Cells(6,4).Value
	'6Eのセルに入力した記載先シート名を参照する
	writesheet_name = optional_sheet.Cells(6,5).Value
	'7Dのセルに入力したインデックス列番号を参照する
	readsheet_index_column = optional_sheet.Cells(7,4).Value
	'7Eのセルに入力したインデックス列番号を参照する
	writesheet_index_column = optional_sheet.Cells(7,5).Value
	'8Dのセルに入力した転記列番号を参照する
	readsheet_contents_column = optional_sheet.Cells(8,4).Value
	'8Eのセルに入力した転記列番号を参照する
	writesheet_contents_column = optional_sheet.Cells(8,5).Value
	'9Dのセルに入力した転記開始行番号を参照する
	readsheet_start_row = optional_sheet.Cells(9,4).Value
	'9Eのセルに入力した転記開始行番号を参照する
	writesheet_start_row = optional_sheet.Cells(9,5).Value
	'10Dのセルに入力した行列転置の有無を参照する
	readsheet_transposition_flag = optional_sheet.Cells(10,4).Value
	'10Eのセルに入力した行列転置の有無を参照する
	writesheet_transposition_flag = optional_sheet.Cells(10,5).Value
	
	If readbook_name="" Then
		If readsheet_name ="" Then
			Set readsheet=Worksheets(1)
		Else
			Set readsheet=Worksheets(readsheet_name)
		End If
	Else
		If readsheet_name ="" Then
			Set readsheet=Workbooks(readbook_name & readbook_kakutyoshi).Worksheets(1)
		Else
			Set readsheet=Workbooks(readbook_name & readbook_kakutyoshi).Worksheets(readsheet_name)
		End If
	End If
	If writebook_name="" Then
		If writeshee_name ="" Then
			Set writesheet=Worksheets(1)
		Else
			Set writesheet=Worksheets(writesheet_name)
		End If
	Else 
		If writesheet_name ="" Then
			Set writesheet =Workbooks(writebook_name & writebook_kakutyoshi).Worksheets(1)
		Else
			Set writesheet=Workbooks(writebook_name & writebook_kakutyoshi).Worksheets(writesheet_name)
		End If
	End If
	
	'読み込みシートの最終行を取得
	If readsheet_transposition_flag = 1 Then
		readsheet_last_row = readsheet.Cells(readsheet_index_column,Columns.Count).End(xlToLeft).Column
	Else 
		readsheet_last_row = readsheet.Cells(Rows.Count,readsheet_index_column).End(xlup).Row
	End If
	
	'書込みシートの最終列を取得
	If writesheet_transposition_flag = 1 Then
		writesheet_last_row = writesheet.Cells(writesheet_index_column,Columns.Count).End(xlToLeft).Column
	Else 
		writesheet_last_row = writesheet.Cells(Rows.Count,writesheet_index_column).End(xlup).Row
	End If
	
	For readsheet_row_number = readsheet_start_row TO readsheet_last_row
		For writesheet_row_number = writesheet_start_row TO writesheet_last_row

			If readsheet_transposition_flag <> 1 And writesheet_transposition_flag <> 1 Then
			'行列の転置が無い場合
				If writesheet.Cells(writesheet_row_number , writesheet_index_column).Value = readsheet.Cells(readsheet_row_number , readsheet_index_column).Value THEN
					writesheet.Cells(writesheet_row_number , writesheet_contents_column ).Value =readsheet.Cells(readsheet_row_number , readsheet_contents_column).Value
					'該当インデックスの検索を終了する。
					Exit For
				END IF
			ElseIf readsheet_transposition_flag = 1 And writesheet_transposition_flag <> 1 Then
			'読込みシートのみ転置を行う場合
				If writesheet.Cells(writesheet_row_number , writesheet_index_column).Value = readsheet.Cells(readsheet_index_column,readsheet_row_number ).Value THEN
					writesheet.Cells(writesheet_row_number , writesheet_contents_column ).Value =readsheet.Cells(readsheet_contents_column ,readsheet_row_number ).Value
					'該当インデックスの検索を終了する。
					Exit For
				END IF
			ElseIf readsheet_transposition_flag <> 1 And writesheet_transposition_flag = 1 Then
			'書込みシートのみ転置を行う場合
				If writesheet.Cells(writesheet_index_column ,writesheet_row_number ).Value = readsheet.Cells(readsheet_row_number , readsheet_index_column).Value THEN
					writesheet.Cells(writesheet_contents_column , writesheet_row_number ).Value =readsheet.Cells(readsheet_row_number , readsheet_contents_column).Value
					'該当インデックスの検索を終了する。
					Exit For
				END IF
			ElseIf readsheet_transposition_flag = 1 And writesheet_transposition_flag = 1 Then
			'読み込み、書込みの両方とも転置を行う場合
				If writesheet.Cells(writesheet_index_column , writesheet_row_number).Value = readsheet.Cells(readsheet_index_column , readsheet_row_number).Value THEN
					writesheet.Cells(writesheet_contents_column , writesheet_row_number ).Value =readsheet.Cells(readsheet_contents_column , readsheet_row_number).Value
					'該当インデックスの検索を終了する。
					Exit For
				END IF
			End If
			'読み込みシートのみ転置がある場合
		Next writesheet_row_number
	Next readsheet_row_number
End Sub


問題ページに戻る