thumbnail 一問一答の一歩

テキストファイルの最初と最後の行を指定して抜き出す

システムの開発中に複数行にまたがるログデ一タを取得したいという状況が出てきた。

この時に指定文字を含む開始行から指定文字を含む終了行を探し、その間の行をまとめて出力するエクセルVBAマクロを作成したので共有する。

ソースコード

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

Sub Between_logdata()
'----------------------------------------------
'概要: ログファイルから開始となる文字から終了となる文字までを抽出する
'機能名: Between_logdata
'引数: なし
'戻り値: なし
'備考:ログファイルから開始となる文字から終了となる文字までを抽出する
'----------------------------------------------
	
	'ワークシート関連の変数
	Dim inputSheet As Worksheet
	Dim outputSheet As WorkSheet
	Dim optional_sheet As Worksheet
	Dim inputbook_name As String
	Dim outputbook_name As String
	Dim inputSheet_name As String
	Dim outputSheet_name As String
	Dim write_lastrow_flg As Integer
	'入力データから転記開始をする文字列を取得
	Dim start_str As String
	Dim start_row As Long
	'入力データから転記終了する文字列を取得
	Dim end_str As String
	Dim end_row As Integer
	'ワークシートの最終行と最終列の取得
	Dim last_row As Long
	Dim last_column As Integer
	
	Set optional_sheet = Worksheets("Sheet1")
	'3Dのセルを参照(3Dにシート名を入力する)
	inputbook_name = optional_sheet.Cells(5,5).Value
	'4Dのセルを参照(4Dにシート名を入力する)
	inputsheet_name = optional_sheet.Cells(6,5).Value
	'6Dのセルを参照(6Dにシート名を入力する)
	outputbook_name = optional_sheet.Cells(8,5).Value
	'7Dのセルを参照(7Dにシート名を入力する)
	outputsheet_name = optional_sheet.Cells(9,5).Value
	
	write_lastrow_flg = optional_sheet.Cells(9,5).Value
	
	If(inputbook_name<>"") Then
		Set inputsheet = Workbooks(inputbook_name).Worksheets(inputsheet_name)
	Else
		Set inputsheet = ThisWorkbook.Worksheets(inputsheet_name)
	End If
	If(outputbook_name<>"") Then
		Set outputsheet = Workbooks(outputbook_name).Worksheets(outputsheet_name)
	Else
		Set outputsheet = ThisWorkbook.Worksheets(outputsheet_name)
	End If
	'項目の検索対象文字列データ(最初の文字を記載すること)
	' 8Dのセルを参照( 8Dに項目1の検索対象文字列を入力する)
	start_str = optional_sheet.Cells(3,5).Value
	'10Dのセルを参照(10Dに項目2の検索対象文字列を入力する)
	end_str = optional_sheet.Cells(4,5).Value
	'転記対象の列データ
	' 5Dのセルを参照( 5Dに読込対象文字列を入力する)
	inputcolumn = optional_sheet.Cells(7,5).Value
	' 9Dのセルを参照( 9Dに項目1の検索対象文字列を入力する)
	outputcolumn = optional_sheet.Cells(10,5).Value
	
	outputrow = 1
	
	'最終行を取得(とりあえず1行目から30行目までを検索)
			last_row = 0
			For column_number = 1 TO 30
				If last_row < inputSheet.Cells(Rows.Count,column_number).End(xlup).Row Then
					last_row = inputSheet.Cells(Rows.Count,column_number).End(xlup).Row
				End If
			Next column_number
			'MsgBox "last_row:" & last_row & vbLf & "last_column:" & last_column 
	
	'最終行までループ
	For row_number = 1 TO last_row
		'はじめとなる文字列を検索
		If InStr(inputSheet.Cells(row_number, inputcolumn).Value, start_str) <> 0 Then
			
			'見つかったら、はじめの文字のある行を開始地点として終わりとなる文字列を検索
			start_row = row_number
			For row_number_2 = start_row TO last_row
				
				If Dim write_lastrow_flg = 1 Then
					'セルを転記する
					outputsheet.Cells(outputrow, outputcolumn).Value = inputSheet.Cells(row_number_2, inputcolumn).Value
				End If
				If InStr(inputSheet.Cells(row_number_2, inputcolumn).Value, end_str) <> 0 And row_number_2 <> start_row Then
					row_number = row_number_2 - 1
					outputrow = outputrow + 3
					GoTo BREAKPOINTS
				Else
					outputrow = outputrow + 1
				End If
				If Dim write_lastrow_flg <> 1 Then
					'セルを転記する
					outputsheet.Cells(outputrow, outputcolumn).Value = inputSheet.Cells(row_number_2, inputcolumn).Value
				End If
			Next row_number_2
			BREAKPOINTS:
		End If
	Next row_number
End Sub