thumbnail 一問一答の一歩

同一シート内にある複数表を空白行、空白列を変えて転記,又は分割する

プログラムの運用でデ一タを整理しているときに、表の体裁を変えて保存し直したいという状況に陥った。1つや2つなら何とかなるが、数が多くなった結果空白行や空白列の体裁を変更するツ一ルを作成したので情報共有する。

ソースコード

ソースコードは下記の通り

Sub spread_between_tables()

'----------------------------------------------
'概要:同一シート内にある複数表を空白行、空白列を変えて転記,又は分割する
'機能名:spread_between_tables
'引数:なし
'戻り値:なし
'備考:なし
-------------------------------------------

	Dim readsheet As Worksheet
	Dim writesheet As Worksheet
	Dim optional_sheet As Worksheet
	Dim readbook_name As String
	Dim writebook_name As String
	Dim writebook_name_2 As String
	Dim readsheet_name As String
	Dim writesheet_name As String
	Dim writesheet_name_1 As String
	Dim writesheet_name_2 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_row_number As Integer
	Dim writesheet_row_number As Integer
	Dim Sheet_number As Integer
	Dim sheet_kosu As Integer
	Dim koumoku_kosu As Integer
	Dim orikaeshi_kosu As Integer
	Dim start_row As Integer
	Dim start_column As Integer
	Dim end_row As Integer
	Dim end_column As Integer
	Dim read_column_blanc As string
	Dim write_column_blanc As string
	Dim read_row_blanc As string
	Dim write_row_blanc As string
	Dim date_l As string
	Dim yokohaba As Integer
	Dim tatehaba As Integer
	
	Set optional_sheet = Worksheets("マクロ実行シート")
	
	'3行目:ファイルパス
	myPath = optional_sheet.Cells(3, 4).Value
	'4行目:読込みブック名
	readbook_name = optional_sheet.Cells(4, 4).Value
	'5行目:読み込みシート名
	readsheet_name =optional_sheet.Cells(5, 4).Value
	'6行目:転記先ブック名
	writebook_name = optional_sheet.Cells(6, 4).Value
	'転記先ブック名2つ目
	writebook_name_2 = optional_sheet.Cells(6, 5).Value
	'書込みシート数(1か2のみ対応)
	sheet_kosu = optional_sheet.Cells(7, 4).Value
	'8,9行目:書込みシート名
	writesheet_name_1 = optional_sheet.Cells(8, 4).Value
	writesheet_name_2 = optional_sheet.Cells(9, 4).Value
	writesheet_name = writesheet_name_1

	'10行目:項目の個数
	koumoku_kosu = optional_sheet.Cells(10, 4).Value
	'11行目:折り返しの対象にする個数
	orikaeshi_kosu = optional_sheet.Cells(11, 4).Value
	'12行目:1項目目転記開始行
	start_row = optional_sheet.Cells(12, 4).Value
	'13行目:1項目目転記開始列
	start_column = optional_sheet.Cells(13, 4).Value
	'14行目:1項目目転記終了行
	end_row = optional_sheet.Cells(14, 4).Value
	'15行目:1項目目転記終了列
	end_column = optional_sheet.Cells(15, 4).Value
	'16行目:読込項目間の空白列
	read_column_blanc = optional_sheet.Cells(16, 4).Value
	'17行目:書込項目間の空白列
	write_column_blanc = optional_sheet.Cells(17, 4).Value
	'18行目:読込項目間の空白行
	read_row_blanc = optional_sheet.Cells(18, 4).Value
	'19行目:書込項目間の空白行
	write_row_blanc = optional_sheet.Cells(19, 4).Value
	
	'20行目:記載する年月日
	date_l = optional_sheet.Cells(20, 4).Value
	'アラート表示OFF
	Application.DisplayAlerts = False
	'ファイル名のブックを開く
	Workbooks.Open myPath & "\" & readbook_name
	Workbooks.Open myPath & "\" & writebook_name
	Workbooks.Open myPath & "\" & writebook_name_2
	
	Set readsheet = Workbooks(readbook_name).Worksheets(readsheet_name)
	Set writesheet = Workbooks(writebook_name).Worksheets(writesheet_name)
	
	write_yokohaba = end_column - start_column + write_column_blanc
	write_tatehaba = end_row - start_row + write_row_blanc
	read_yokohaba = end_column - start_column + read_column_blanc + 1
	read_tatehaba = end_row - start_row + read_row_blanc + 1
	
	'該当部分をコピーする
	For Sheet_number = 0 To sheet_kosu - 1
	'A1のセルの値を指定された年月日に指定
		writesheet.Cells(1, 1).Value = date_l
		'1号機から3号機までの部分をまとめてコピー
		'セルコピー対象
		'B3~F26:cell(3,2)~cell(3+23,2+4)
		'J3~N26:cell(3,2+8)~cell(3+23,2+4+8)
		'R3~V26:cell(3,2+8*2)~cell(3+23,2+4+8*2)
		'B31~F54:cell(3+28,2)~cell(3+23,2+4)
		'J31~N54:cell(3+28,2+8)~cell(3+23,2+4+8)
		'R31~V54:cell(3+28,2+8*2)~cell(3+23,2+4+8*2)
		For Komoku_number = 0 To koumoku_kosu
			For writesheet_row_number = start_row To end_row
				For writesheet_contents_column = start_column To end_column
					table_tate_count = Komoku_number / orikaeshi_kosu
					table_yoko_count = Komoku_number Mod orikaeshi_kosu
					writesheet.Cells(writesheet_row_number + (table_tate_count * write_tatehaba), writesheet_contents_column + (table_yoko_count * write_yokohaba)).Value = readsheet.Cells(writesheet_row_number + (table_tate_count * read_tatehaba), writesheet_contents_column + (Sheet_number * read_yokohaba) + (table_yoko_count * read_yokohaba * sheet_kosu)).Value
				Next writesheet_contents_column
			Next writesheet_row_number
		Next Komoku_number
		
		
		'------------------------------------------Start:状況に応じて、コピー後にマクロを実施する-------------------------------------------
		
		
		
		'------------------------------------------End:状況に応じて、コピー後にマクロを実施する------------------------------------------------
		
		If Sheet_number = 0 And 1 < Sheet_kosu Then
			'シート名変更
			writesheet_name = writesheet_name_2
			'各ワークシートの変更
			Set writesheet = Workbooks(writebook_name).Worksheets(writesheet_name)
		End If
	Next Sheet_number
    'ブックを保存せずに閉じる
		Workbooks(readbook_name).Close SaveChanges:=False
		Workbooks(writebook_name).Close SaveChanges:=True
		Workbooks(writebook_name_2).Close SaveChanges:=True

End Sub