[VBA,VB.NET,C#,PHP]プログラムTips集

[VBA,VB.NET,C#,PHP]プログラムのちょっとしたテクニック

D.O-Ultimatum vs ディープステート ― 空間クリエーターの戦い

D.Oはディープステートに追われる身となり、彼の仲間たちも危険にさらされる。彼らはディープステートの手先たちや魔法使いたちと激しい戦いを繰り広げながら、ディープステートの陰謀を阻止するために奮闘する。

ディープステートは巧妙な手口でD.Oを追い詰めてくる。彼らはディープウェブや暗号通貨を利用し、様々な手段でD.Oを攻撃してくる。しかし、D.Oは空間を操る力を使いながら、ディープステートとの戦いに立ち向かっていく。

D.O-Ultimatum vs DS ― 空間クリエーターの戦い

D.O-Ultimatumは、ディープステートという組織の存在を知った。ディープステートは裏で世界を操る陰の組織であり、様々な陰謀を企てていた。彼らは政府や企業を操り、世界を支配しようとしていた。

D.Oはディープステートの脅威を止めるため、自らの力を駆使して戦いを挑むことを決意する。彼は仲間たちを集め、ディープステートの陰謀を暴くため、自らの空間クリエーターの能力を使いながら、戦いを進めていく。

範囲のデータを統括・分割

パターン

pattern1(start is same value)
S1■■■■■■■■■■E1
S2■■■■■■■■■■□□□□□□□□□□□E2
pattern2
S1■■■■■■■■■■■■■■■■■■E1
□□□□□□□S2■■■■■■■■■■■■■■■■■■■■■■■E2
pattern3(END is same value)
S1■■■■■■■■■■■■■■■■■■E1
□□□□□□□S2■■■■■■■■■■■E2
pattern4(all same)
S1■■■■■■■■■■■■■■■■■■E1
S2■■■■■■■■■■■■■■■■■■E2
pattern4(all same)
S1■■■■■■■■■■■■■■■■■■E1
□□□S2■■■■■■■■■■■E2□□□□
サンプル

S1■■■■■■■■■■■■■■■■■■E1
□□□□□□□S2■■■■■■■■■■■■■■■■■■■■■■■E2
S1■■■■■■■■■■■■■■■■■■E1
□□□S2■■■■■■■■■■■E2□□□□
必要なデータ

S1
S2
(S2-1)
Emin = Min(E1,E2)
Emax = Max(E1,E2)
開始・終了を決める

Sa = S1
Ea = S2-1

Sb = S2
Eb = Emin

Sc = Emin + 1
Ec = Emax
source code

Dim S1 As String
Dim E1 As String
Dim S2 As String
Dim E2 As String
Dim Emin As String
Dim Emax As String
S1 = tbl.Rows(idx).Items("S").ToString()
E1 = tbl.Rows(idx).Items("E").ToString()
S2 = tbl.Rows(idx+1).Items("S").ToString()
E2 = tbl.Rows(idx+1).Items("E").ToString()
Emin = Math.Min(E1,E2)
Emax = Math.Max(E1,E2)
1行目

Dim Sa As String
Dim Ea As String
Sa = S1
Ea = S2-1
2行目

Dim Sb As String
Dim Eb As String
Sb = S2
Eb = Emin
3行目

Dim Sb As String
Dim Eb As String
Sb = Emin + 1
Eb = Emax

複数テーブルの範囲データを統合・分割する方法

下記のようなデータパターンを統合する方法
pattern1(start is same value)
S1■■■■■■■■■■E1
S2■■■■■■■■■■□□□□□□□□□□□E2
pattern2
S1■■■■■■■■■■■■■■■■■■E1
□□□□□□□S2■■■■■■■■■■■■■■■■■■■■■■■E2
pattern3(END is same value)
S1■■■■■■■■■■■■■■■■■■E1
□□□□□□□S2■■■■■■■■■■■E2
pattern4(all same)
S1■■■■■■■■■■■■■■■■■■E1
S2■■■■■■■■■■■■■■■■■■E2

・データのソートを実施することでデータのパターンは4パターンに絞られます。

'【クラス】
Public Class ClsDataMerge
 
	''' <summary>
	''' データマージ処理
	''' </summary>
	''' <param name="dtTable"></param>
	Public Function ExecuteDataMerge(ByRef dtTable As DataTable) As Double
    	Dim dblResult As Double = 0
    	Try
        	Dim idx As Double
 
        	Dim idxMax As Double = dtTable.Rows.Count - 2
 
        	'DELETE
        	DeleteData(dtTable)
        	'ChangeAccept
        	dtTable.AcceptChanges()
        	'SORT
        	SortTBL(dtTable)
 
        	For idx = 0 To idxMax
            	Dim S1 As String
            	Dim E1 As String
            	Dim S2 As String
            	Dim E2 As String
            	Dim S3 As String
            	Dim E3 As String
 
            	'現在行を取得
            	S1 = dtTable.Rows(idx).Item("S").ToString()
            	E1 = dtTable.Rows(idx).Item("E").ToString()
 
            	S2 = dtTable.Rows(idx + 1).Item("S").ToString()
            	E2 = dtTable.Rows(idx + 1).Item("E").ToString()
 
            	S3 = ""
            	E3 = ""
 
            	If (S1 <= S2) And (S2 <= E1) Then
 
                	dblResult = dblResult + 1
                	' まったく同じ場合は一個下を削除するのみで良い
                	If S1 = S2 And E1 = E2 Then
                    	dtTable.Rows(idx + 1).Item("DEL") = 1
                    	Continue For
                	End If
 
 
                	S3 = S2
                	E3 = E1
 
                	E1 = (S2 - 1).ToString("000000")
                	S2 = (E1 + 1).ToString("000000")
 
                	dtTable.Rows(idx).Item("E") = E1
                	dtTable.Rows(idx + 1).Item("S") = S2
 
                	'新規Row作成
                	Dim rwNEW As DataRow
                	rwNEW = dtTable.NewRow()
                	rwNEW.Item("S") = S3
                	rwNEW.Item("E") = E3
 
                	' データカラムがある場合(DATA1,DATA2が影響を受けない)
                	Dim sNewData As String = Convert.ToString(dtTable.Rows(idx).Item("DATA"))
                	Dim sAddData() As String = Convert.ToString(dtTable.Rows(idx + 1).Item("DATA")).Replace(",,", ",").Split(",")
                	If sAddData.Length > 0 Then
                    	' 既に含まれているデータは追加しない
                    	For i As Integer = 0 To UBound(sAddData)
                        	If String.IsNullOrEmpty(sAddData(i).Trim) Then Continue For
                        	If sNewData.Contains(sAddData(i)) = False Then
                            	sNewData = sNewData & "," & sAddData(i)
                        	End If
                    	Next
                	End If
                	rwNEW.Item("DATA") = sNewData
 
                	'データの整合性チェック
                    CheckDataValue(dtTable.Rows(idx))
                    CheckDataValue(dtTable.Rows(idx + 1))
                	CheckDataValue(rwNEW)
 
                    'とりあえず追加してしまう
                	dtTable.Rows.Add(rwNEW)
            	End If
        	Next
    	Catch ex As Exception
 
    	End Try
    	Return dblResult
	End Function
 
	''' <summary>
	''' 削除フラグを設定
	''' </summary>
	''' <param name="rwTarget"></param>
	Private Sub CheckDataValue(ByRef rwTarget As DataRow)
    	If rwTarget.Item("S").ToString() > rwTarget.Item("E").ToString() Then
        	rwTarget.Item("DEL") = 1
    	End If
	End Sub
 
	''' <summary>
	''' 実際の削除処理
	''' </summary>
	''' <param name="dtTable"></param>
	Private Sub DeleteData(ByRef dtTable As DataTable)
    	Try
        	For Each rwDEL As DataRow In dtTable.Rows
            	' 実際に削除
            	If rwDEL.Item("DEL").ToString() = "1" Then
                	rwDEL.Delete()
            	End If
        	Next
 
        	dtTable.AcceptChanges()
    	Catch ex As Exception
 
    	End Try
	End Sub
 
	''' <summary>
	''' 最終処理
	''' </summary>
	''' <param name="dtTable"></param>
	Public Sub DataFinish(ByRef dtTable As DataTable)
    	Try
        	For Each rwItem As DataRow In dtTable.Rows
            	CheckDataValue(rwItem)
        	Next
        	'DELETE
        	DeleteData(dtTable)
            	'ChangeAccept
            	dtTable.AcceptChanges()
            	'SORT
            	SortTBL(dtTable)
    	Catch ex As Exception
 
    	End Try
	End Sub
 
	''' <summary>
	''' ソート
	''' </summary>
	''' <param name="dtTable"></param>
	Private Sub SortTBL(ByRef dtTable As DataTable)
    	Try
        	'DataTable.Select()を使いソート(第二引数にソート条件を書く)
        	Dim rows As DataRow() = dtTable.Select(Nothing, "S ASC , E ASC").Clone()
        	'ソート後の DataTable を用意
        	Dim dtWort As DataTable = dtTable.Clone
        	'ソートされてる DataRow 配列をソート後の DataTable に追加
        	For Each row As DataRow In rows
            	dtWort.ImportRow(row)
        	Next
        	dtWort.AcceptChanges()
 
        	dtTable = dtWort
    	Catch ex As Exception
 
    	End Try
	End Sub
 
	''' <summary>
	''' データテーブル作成(データ無しテンプレート)
	''' </summary>
	''' <returns></returns>
	Public Function CreateTemplateDataTable() As DataTable
    	Dim dtTBL As New DataTable
    	Try
        	dtTBL.Columns.Add("S")
        	dtTBL.Columns.Add("E")
        	dtTBL.Columns.Add("DATA")
        	dtTBL.Columns.Add("DEL")
        	dtTBL.AcceptChanges()
    	Catch ex As Exception
 
    	End Try
    	Return dtTBL
	End Function
 
End Class

‘ フォームから呼び出します
Public Class Form1
	Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    	Dim cMG As New ClsDataMerge()
    	Try
        	' テーブル初期化
        	Dim tblDataTable As New DataTable
        	tblDataTable = cMG.CreateTemplateDataTable()
        	' データ格納
        	For Each s As String In Me.RichTextBox1.Lines
            	Dim sItem() As String
            	sItem = s.Split(",")
            	Dim rwNew As DataRow = tblDataTable.NewRow
            	rwNew.Item("S") = sItem(0)
            	rwNew.Item("E") = sItem(1)
            	If sItem.Length > 2 Then
                	For i As Integer = 2 To UBound(sItem)
                    	If String.IsNullOrEmpty(sItem(i)) Then Continue For
                    	rwNew.Item("DATA") = Convert.ToString(rwNew.Item("DATA")) & "," & sItem(i)
                	Next
            	End If
            	rwNew.Item("DEL") = "0"
            	tblDataTable.Rows.Add(rwNew)
        	Next
        	tblDataTable.AcceptChanges()
        	' マージ処理
        	Dim result As Double = 1
        	While (result = 1)
            	result = cMG.ExecuteDataMerge(tblDataTable)
        	End While
        	' 最終整理
        	cMG.DataFinish(tblDataTable)
        	Me.DataGridView1.DataSource = tblDataTable
    	Catch ex As Exception
 
    	End Try
	End Sub
End Class

範囲/枠(FromとTo)データを分割/統合するベースとなるアルゴリズム

Start(S)列とEnd(E)列で昇順にソートしておくと、
データの並び順は以下の4パターンに分類されます。

pattern1(start is same value)
S1■■■■■■■■■■E1
S2■■■■■■■■■■□□□□□□□□□□□E2
pattern2
S1■■■■■■■■■■■■■■■■■■E1
□□□□□□□S2■■■■■■■■■■■■■■■■■■■■■■■E2
pattern3(END is same value)
S1■■■■■■■■■■■■■■■■■■E1
□□□□□□□S2■■■■■■■■■■■E2
pattern4(all same)
S1■■■■■■■■■■■■■■■■■■E1
S2■■■■■■■■■■■■■■■■■■E2

	''' <summary>
	''' 例)呼び出し方
	''' </summary>
	Private Sub ExecSplitAndConsolidateRangeData()
    	' Init Class
    	Dim clsCTRL As New ClsSplitAndConsolidateRangeData()
    	' DataTable
    	Dim datTable As New DataTable
    	' Create Initial DataTable
    	clsCTRL.InitializeDataTable(datTable)
 
    	' データ作成
    	For Each s As String In Me.RichTextBox1.Lines
        	Dim rwNew As DataRow = datTable.NewRow
        	Dim sItems() As String = s.Split(",")
        	rwNew(0) = sItems(0)
        	rwNew(1) = sItems(1)
        	datTable.Rows.Add(rwNew)
    	Next
 
    	' 変換されたデータが0件になるまで続ける
    	Dim result As Double = 1
    	While (result > 0)
        	' 呼出し
        	result = clsCTRL.SplitAndConsolidateRangeData(datTable)
    	End While
 
    	' データをセット
    	Me.DataGridView1.DataSource = datTable
	End Sub

★ここからがデータを整合性を保ちながら分割・統合するクラス

''' <summary>
''' 範囲(From~To,Start~End...etc)からなるデータを統合、分割する方法
''' </summary>
Public Class ClsSplitAndConsolidateRangeData
	' 変数宣言エリア
	Public Const S As String = "S" '開始
	Public Const E As String = "E" '終了
	Public Const FORMAT As String = "000000"
	Public Const DATA As String = "DATA" 'データエリア
	Public Const DEL As String = "DEL" ' 削除対象フラグ
	' クラス内テーブル
	Public TBL_MAIN As New DataTable()
 
	''' <summary>
	''' 削除対象フラグ
	''' </summary>
	Enum DELFLAG
    	DEL
    	NONE
	End Enum
 
	''' <summary>
	''' データテーブルを初期化する
	''' </summary>
	''' <param name="DATA_TABLE"></param>
	Public Sub InitializeDataTable(ByRef DATA_TABLE As DataTable)
    	Try
        	DATA_TABLE = New DataTable()
        	DATA_TABLE.Columns.Add(S, Type.GetType("System.String"))
        	DATA_TABLE.Columns.Add(E, Type.GetType("System.String"))
        	DATA_TABLE.Columns.Add(DATA, Type.GetType("System.String"))
        	DATA_TABLE.Columns.Add(DEL, Type.GetType("System.String"))
    	Catch ex As Exception
    	End Try
	End Sub
 
	''' <summary>
	''' 実処理(分割、統合)
	''' </summary>
	''' <param name="TBL_TARGET"></param>
	Public Function SplitAndConsolidateRangeData(ByRef TBL_TARGET As DataTable) As Double
    	' 何件更新したか?0件になるまで再帰呼出し
    	Dim dblResult As Double = 0
    	Try
        	' インデックス:カレント行
        	Dim idx As Double
        	' インデックス:最大行
        	Dim idxMax As Double = TBL_TARGET.Rows.Count - 2
 
        	'SORT
        	TBL_TARGET = SortDataTable(TBL_TARGET, S & " Asc, " & E & " Asc ")
        	'DELETE
        	DeleteRowData(TBL_TARGET)
        	'ChangeAccept
        	TBL_TARGET.AcceptChanges()
 
        	' 現在行と次の行を比較していく
        	For idx = 0 To idxMax
            	' 元データ格納
            	Dim _S1 As String ' 開始1
            	Dim _E1 As String ' 終了1
            	Dim _S2 As String ' 開始2
            	Dim _E2 As String ' 終了3
            	Dim _S3 As String ' 開始new
      	      Dim _E3 As String ' 終了new
            	' 加工済みデータ格納用
            	Dim E1 As String ' 終了1
            	Dim S2 As String ' 開始2
            	Dim S3 As String ' 開始new
            	Dim E3 As String ' 終了new
 
            	'現在行を取得
            	_S1 = TBL_TARGET.Rows(idx).Item(S).ToString()
            	_E1 = TBL_TARGET.Rows(idx).Item(E).ToString()
 
            	'次の行を取得
            	_S2 = TBL_TARGET.Rows(idx + 1).Item(S).ToString()
            	_E2 = TBL_TARGET.Rows(idx + 1).Item(E).ToString()
 
            	'新しく作成される行
            	_S3 = ""
            	_E3 = ""
 
            	' 重複範囲がある場合は分割/統合対象
            	If (_S1 <= _S2) And (_S2 <= _E1) Then
                	' 影響を受けたデータをカウント
                	dblResult = dblResult + 1
                	' データの成形
                	S3 = _S2
                	E3 = _E1
                	E1 = (CDbl(_S2) - 1).ToString(FORMAT)
                	S2 = (CDbl(_E1) + 1).ToString(FORMAT)
   	             TBL_TARGET.Rows(idx).Item(E) = E1
                	TBL_TARGET.Rows(idx + 1).Item(S) = S2
                	'新規Row作成
                	Dim rwNEW As DataRow
                	rwNEW = TBL_TARGET.NewRow()
                	rwNEW.Item(S) = S3 'または、_S2でもOK
                	rwNEW.Item(E) = E3 'または、_E1でもOK
                	' データカラムがある場合(DATA1,DATA2が影響を受けない)
                	rwNEW.Item(DATA) =
                            TBL_TARGET.Rows(idx).Item(DATA) & TBL_TARGET.Rows(idx + 1).Item(DATA)
                	'データの整合性チェック(削除フラグを設定する)
                    CheckDataValue(TBL_TARGET.Rows(idx))
                    CheckDataValue(TBL_TARGET.Rows(idx + 1))
                	CheckDataValue(rwNEW)
       	         'とりあえず追加してしまう(Rows.Addメソッドだと必ず最後尾に追加)
                	TBL_TARGET.Rows.Add(rwNEW)
            	End If
        	Next
    	Catch ex As Exception
    	Finally
        	TBL_TARGET.AcceptChanges()
    	End Try
    	Return dblResult
	End Function
 
	''' <summary>
	''' テーブルをソートする
	''' DataTable自体にはソートをしてくれる機能がありませんが、DataTable.Select を応用することでソート処理ができます。
	''' </summary>
	''' <param name="tblTarget"></param>
	''' <param name="sortText">"Age DESC , ID ASC"</param>
	''' <returns></returns>
	Public Function SortDataTable(ByVal tblTarget As DataTable, ByVal sortText As String) As DataTable
    	'ソート後の DataTable を用意
    	Dim dtblSrt As New DataTable()
    	Try
        	'ソート前テーブルの情報をクローン
  	      dtblSrt = tblTarget.Clone()
        	'DataTable.Select()を使いソート(第二引数にソート条件を書く)
        	Dim rows As DataRow() = tblTarget.Select(Nothing, sortText).Clone()
        	'ソートされてる DataRow 配列をソート後の DataTable に追加
        	For Each row As DataRow In rows
            	dtblSrt.ImportRow(row)
        	Next
    	Catch ex As Exception
    	End Try
    	Return dtblSrt
	End Function
 
	''' <summary>
	''' 削除フラグを設定する
	''' </summary>
	''' <param name="rwTarget"></param>
	Private Sub CheckDataValue(ByRef rwTarget As DataRow)
    	Try
        	' 開始>終了は不整合データで削除
        	If rwTarget.Item(S).ToString() > rwTarget.Item(E).ToString() Then
            	rwTarget.Item(DEL) = CDbl(DELFLAG.DEL)
        	End If
    	Catch ex As Exception
    	End Try
	End Sub
 
	''' <summary>
	''' 実際にテーブルから削除する
	''' </summary>
	''' <param name="DEL_TABLE"></param>
	Private Sub DeleteRowData(ByRef DEL_TABLE As DataTable)
    	For Each rwDEL As DataRow In DEL_TABLE.Rows
        	' 実際に削除
        	If rwDEL.Item(DEL).ToString() = CStr(CDbl(DELFLAG.DEL)) Then
            	rwDEL.Delete()
        	End If
    	Next
    	DEL_TABLE.AcceptChanges()
	End Sub
 
End Class

プログラミングにおすすめのパソコン::Core i7 8gb

Start(S)列とEnd(E)列で昇順にソートしておくと、
データの並び順は以下の4パターンに分類されます。

pattern1(start is same value)
S1■■■■■■■■■■E1
S2■■■■■■■■■■□□□□□□□□□□□E2
pattern2
S1■■■■■■■■■■■■■■■■■■E1
□□□□□□□S2■■■■■■■■■■■■■■■■■■■■■■■E2
pattern3(END is same value)
S1■■■■■■■■■■■■■■■■■■E1
□□□□□□□S2■■■■■■■■■■■E2
pattern4(all same)
S1■■■■■■■■■■■■■■■■■■E1
S2■■■■■■■■■■■■■■■■■■E2

'新しい行を作成
Create new DataRow.
Set S2 to S(New)
Set E1 to E(New)

'既存のデータを加工
Set S3(S2-1) to E1
Set E3(E1+1) to S2

2つのテーブルデータをマージする方法(From~Toデータ)

''' <summary>
''' 2つのテーブルをマージする方法
''' </summary>
Public Class ClsDataTableMerge
	'-----------------------------------------------------------------
	' 名称を明確に統一(変更しました。)
	' TARGET:分割される側につける(接頭or接尾)
	' NEWRNG:分割する側につける(接頭or接尾)
	' CRNT:カレント行
	' PREV:1個前の行
	' NEXT:1個次の行
	'-----------------------------------------------------------------
 
	' 【定数、変数定義領域】
	' 開始フラグ:1行データごとに処理したらTrueになる(NEWRNG側)
	Public sOK As Boolean
	' 終了フラグ:1行データごとに処理したらTrueになる(NEWRNG側)
	Public eOK As Boolean
	' 分割する側の列:NEWRNG
	Const COL_START_NEWRNG = 1
	Const COL_END_NEWRNG = 2
	' 分割される側の列:TARGET
	Const COL_START_TARGET = 1
	Const COL_END_TARGET = 2
 
	'【仕様】
	' 分割するパターンはいくつあるか?⇛下記の13パターンになる。
	' パターンALL【分割される側の】開始番号、終了番号を同時にみる
	'①範囲が完全一致
	' S----------------------------E
	' S----------------------------E
	'②範囲が完全に含まれる
	' S----------------------------E
	'      S-----------------E
	'③行を跨いで完全に含まれる
	' S----------------------------E
	'      S-----------------E     	
	' S----------------------------E
 
	''' <summary>
	''' 2つのテーブルをマージして連番の整合性を保つ処理
	''' </summary>
	''' <param name="_TBL_TARGER"></param>
	''' <param name="_TBL_NEWRNGE"></param>
	Public Sub MergeDataTables(ByRef _TBL_TARGER As DataTable, ByRef _TBL_NEWRNGE As DataTable)
    	' @
    	' @ _TBL_TARGER:分割される側のDataTable
    	' @ _TBL_NEWRANGE:分割する側のDataTable
    	' @
    	' 分割される側のインデックス
    	Dim idx_TARGET As Double
    	Const MAX_TARGET As Double = Double.MaxValue
 
    	'分割する側のインデックス
    	Dim idx_NEWRNG As Double
    	Const MAX_NEWRNG As Double = Double.MaxValue
 
    	Try
        	' 分割する側(NEWRNG)のデータ側でループ
        	For idx_NEWRNG = 0 To MAX_NEWRNG
            	Application.DoEvents()
            	' フラグ初期化
            	sOK = False
            	eOK = False
 
            	'カレントデータを保存
            	Dim strSTART_NEWRNG_CRNT As String
            	Dim strEND_NEWRNG_CRNT As String
 
            	' 件数を超えていたら終了
            	If idx_NEWRNG > _TBL_NEWRNGE.Rows.Count - 1 Then Exit Sub
 
            	'分割する側のデータを取得(カレント)
            	strSTART_NEWRNG_CRNT = _TBL_NEWRNGE.Rows(idx_NEWRNG).Item(COL_START_NEWRNG)
            	strEND_NEWRNG_CRNT = _TBL_NEWRNGE.Rows(idx_NEWRNG).Item(COL_END_NEWRNG)
 
            	'分割する側が空白になったら終了
            	If strEND_NEWRNG_CRNT = "" Or strSTART_NEWRNG_CRNT = "" Then
                	Exit Sub
            	End If
 
            	' 分割される側(TARGET)でループ
            	For idx_TARGET = 0 To MAX_TARGET
                	Application.DoEvents()
                	'一個前のデータ
                	Dim strSTART_TARGET_PREV As String
                	Dim strEND_TARGET_PREV As String
                	'カレントデータ
                	Dim strSTART_TARGET_CRNT As String
                	Dim strEND_TARGET_CRNT As String
                	'次のデータ
                	Dim strSTART_TARGET_NEXT As String
                	Dim strEND_TARGET_NEXT As String
 
                	'一個前のデータを取得
                	If idx_TARGET > 0 Then
                    	strSTART_TARGET_PREV = _TBL_TARGER.Rows((idx_TARGET - 1)).Item(COL_START_TARGET)
                    	strEND_TARGET_PREV = _TBL_TARGER.Rows((idx_TARGET - 1)).Item(COL_END_TARGET)
                	End If
 
                	'カレントデータ取得
                	strSTART_TARGET_CRNT = _TBL_TARGER.Rows(idx_TARGET).Item(COL_START_TARGET)
                	strEND_TARGET_CRNT = _TBL_TARGER.Rows(idx_TARGET).Item(COL_END_TARGET)
                	'次の行のデータ
                	strSTART_TARGET_NEXT = _TBL_TARGER.Rows((idx_TARGET + 1)).Item(COL_START_TARGET)
                	strEND_TARGET_NEXT = _TBL_TARGER.Rows((idx_TARGET + 1)).Item(COL_END_TARGET)
 
                	'空白に達したらループを抜ける
                	If strSTART_TARGET_CRNT = "" Or strSTART_TARGET_CRNT = "" Then
                    	GoTo CONT_FOR1
                	End If
 
                	''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
                	'この部分に具体的な処理を書いていく
 
                	' ① 範囲が完全一致 = 既に同じデータがあるので何もしない
                	If (strSTART_NEWRNG_CRNT = strSTART_TARGET_CRNT) And (strEND_NEWRNG_CRNT = strEND_TARGET_CRNT) Then
                    	sOK = True
                    	eOK = True
                    	GoTo CONT_FOR1
                	End If
 
                	' ② 範囲が完全に含まれる 挿入×2 S2にS E2にE E1にS-1 S3にE+1
   	             If (strSTART_NEWRNG_CRNT > strSTART_TARGET_CRNT) And (strEND_NEWRNG_CRNT < strEND_TARGET_CRNT) Then
                    	sOK = True
                    	eOK = True
                    	' 挿入
                    	CopyInsertDown(_TBL_TARGER, idx_TARGET)
                    	' 挿入
                        CopyInsertDown(_TBL_TARGER, idx_TARGET)
                    	' S2にS
                        _TBL_TARGER.Rows((idx_TARGET + 1)).Item(COL_START_TARGET) = strSTART_NEWRNG_CRNT
   	                 ' E2にE
                        _TBL_TARGER.Rows((idx_TARGET + 1)).Item(COL_END_TARGET) = strEND_NEWRNG_CRNT
                    	' E1にS-1
                        _TBL_TARGER.Rows((idx_TARGET)).Item(COL_END_TARGET) = Format(CLng(strSTART_NEWRNG_CRNT) - 1, "000000")
                    	' S3にE+1
                        _TBL_TARGER.Rows((idx_TARGET + 2)).Item(COL_START_TARGET) = Format(CLng(strEND_NEWRNG_CRNT) + 1, "000000")
                    	' 処理終わり
                    	GoTo CONT_FOR1
                	End If
 
 
                	' ③ 行を跨いで完全に含まれる
                	If (strSTART_NEWRNG_CRNT > strEND_TARGET_CRNT) And (strEND_NEWRNG_CRNT < strSTART_TARGET_NEXT) Then
                    	sOK = True
                    	eOK = True
                    	' 挿入
                        CopyInsertDown(_TBL_TARGER, idx_TARGET)
                    	' S2にS
                        _TBL_TARGER.Rows((idx_TARGET + 1)).Item(COL_START_TARGET) = strSTART_NEWRNG_CRNT
                    	' E2にE
                        _TBL_TARGER.Rows((idx_TARGET + 1)).Item(COL_END_TARGET) = strEND_NEWRNG_CRNT
                    	' 処理終わり
                    	GoTo CONT_FOR1
                	End If
 
                	'■■■■開始(START)番号チェック■■■■■■■■■
 
                	'①strSTART_NEWRNG_CRNTとstrSTART_TARGET_CRNTが一致したら、
                	' 1行下に挿入
                	' 現行の終了にstrSTART_NEWRNG_CRNTに設定
                	' 次行の開始に(strSTART_NEWRNG_CRNT + 1)を設定
                	If (strSTART_NEWRNG_CRNT = strSTART_TARGET_CRNT) Then
                    	sOK = True
                    	' ただし現行終了(NEWRNG)が現行終了(TARGET)を超えていたら分割不要
                    	If (strEND_TARGET_CRNT < strEND_NEWRNG_CRNT) Then
                        	' 処理終わり
                        	GoTo TO_END1
                    	End If
                    	' 挿入
                        CopyInsertDown(_TBL_TARGER, idx_TARGET)
                    	' 現行の終了にstrSTART_NEWRNG_CRNTに設定
                        _TBL_TARGER.Rows((idx_TARGET)).Item(COL_END_TARGET) = strSTART_NEWRNG_CRNT
                    	' 次行の開始に(strSTART_NEWRNG_CRNT + 1)を設定
                        _TBL_TARGER.Rows((idx_TARGET + 1)).Item(COL_START_TARGET) = Format(CLng(strSTART_NEWRNG_CRNT) + 1, "000000")
                    	' 処理終わり
                    	GoTo TO_END1
                	End If
 
                	'②strSTART_NEWRNG_CRNTとstrEND_TARGET_CRNTが一致
                	' 1行下に挿入
                	' 次行の開始にstrSTART_NEWRNG_CRNTセット
                	' 現業の終了に(strSTART_NEWRNG_CRNT - 1)セット
                	If (strSTART_NEWRNG_CRNT = strEND_TARGET_CRNT) Then
                    	sOK = True
                    	' 挿入
                        CopyInsertDown(_TBL_TARGER, idx_TARGET)
                    	' S2にSセット
                        _TBL_TARGER.Rows((idx_TARGET + 1)).Item(COL_START_TARGET) = strSTART_NEWRNG_CRNT
                    	' 次行の開始にstrSTART_NEWRNG_CRNTセット
                        _TBL_TARGER.Rows((idx_TARGET)).Item(COL_END_TARGET) = Format(CLng(strSTART_NEWRNG_CRNT) - 1, "000000")
                    	' 現業の終了に(strSTART_NEWRNG_CRNT - 1)セット
                    	GoTo TO_END1
                	End If
 
                	'③開始と終了に挟まれる場合 strSTART_TARGET_CRNT < strSTART_NEWRNG_CRNT < strEND_TARGET_CRNT
                	' 1行下に挿入
                	' 次行の開始にstrSTART_NEWRNG_CRNTセット
                	' 現業の終了に(strSTART_NEWRNG_CRNT - 1)
               	 If (strSTART_NEWRNG_CRNT > strSTART_TARGET_CRNT) And (strSTART_NEWRNG_CRNT < strEND_TARGET_CRNT) Then
                    	sOK = True
                    	' 挿入
                        CopyInsertDown(_TBL_TARGER, idx_TARGET)
                    	' 次行の開始にstrSTART_NEWRNG_CRNTセット
                        _TBL_TARGER.Rows((idx_TARGET + 1)).Item(COL_START_TARGET) = strSTART_NEWRNG_CRNT
                    	' 現業の終了に(strSTART_NEWRNG_CRNT - 1)
                        _TBL_TARGER.Rows((idx_TARGET)).Item(COL_END_TARGET) = Format(CLng(strSTART_NEWRNG_CRNT) - 1, "000000")
                    	' 処理終わり
                    	GoTo TO_END1
                	End If
 
                	'④ 現行の終了と次行の開始の間 strEND_TARGET_CRNT < strSTART_NEWRNG_CRNT < strSTART_TARGET_NEXT
                	' 1行下に挿入
                	' 次行の開始にstrSTART_NEWRNG_CRNTセット
                	' 次行の終了に(strSTART_TARGET_NEXT - 1)
                	If (strSTART_NEWRNG_CRNT > strEND_TARGET_CRNT) And (strSTART_NEWRNG_CRNT < strSTART_TARGET_NEXT) Then
                    	sOK = True
                    	' 挿入
                        CopyInsertDown(_TBL_TARGER, idx_TARGET)
                    	' 次行の開始にstrSTART_NEWRNG_CRNTセット
                        _TBL_TARGER.Rows((idx_TARGET + 1)).Item(COL_START_TARGET) = strSTART_NEWRNG_CRNT
                    	' 次行の終了に(strSTART_TARGET_NEXT - 1)
                        _TBL_TARGER.Rows((idx_TARGET + 1)).Item(COL_END_TARGET) = Format(CLng(strSTART_TARGET_NEXT) - 1, "000000")
                    	' 処理終わり
                    	GoTo TO_END1
                	End If
 
TO_END1:  '開始番号終了ラベル
 
                	'■■■■終了(END)番号チェック■■■■■■■■■
                	'①現行開始と一致
             	   ' 1行下に挿入
                	' 現行終了にstrEND_NEWRNG_CRNTセット
                	' 次行開始に(strEND_NEWRNG_CRNT + 1)
                	If (strEND_NEWRNG_CRNT = strSTART_TARGET_CRNT) Then
                    	eOK = True
                    	' ただし現行開始(TARGET)が現行開始(NEWRNG)を超えていたら分割不要
                    	If (strSTART_NEWRNG_CRNT < strSTART_TARGET_CRNT) Then
                        	' 処理終わり
                        	GoTo CONT_FOR1
                    	End If
                    	' 挿入
     	               CopyInsertDown(_TBL_TARGER, idx_TARGET)
                    	' 現行終了にstrEND_NEWRNG_CRNTセット
                        _TBL_TARGER.Rows((idx_TARGET)).Item(COL_END_TARGET) = strEND_NEWRNG_CRNT
                    	' 次行開始に(strEND_NEWRNG_CRNT + 1)
                        _TBL_TARGER.Rows((idx_TARGET + 1)).Item(COL_START_TARGET) = Format(CLng(strEND_NEWRNG_CRNT) + 1, "000000")
                    	' 処理終わり
                    	GoTo CONT_FOR1
                	End If
 
                	'②現行終了と一致
                	' 1行下に挿入
                	' 次行の開始にstrEND_NEWRNG_CRNTセット
                	' 現行の終了に(strEND_NEWRNG_CRNT - 1)
                	If (strEND_NEWRNG_CRNT = strEND_TARGET_CRNT) Then
                    	eOK = True
      	              ' 挿入
                        CopyInsertDown(_TBL_TARGER, idx_TARGET)
                    	' 次行の開始にstrEND_NEWRNG_CRNTセット
                        _TBL_TARGER.Rows((idx_TARGET + 1)).Item(COL_START_TARGET) = strEND_NEWRNG_CRNT
            	        ' 現行の終了に(strEND_NEWRNG_CRNT - 1)
                        _TBL_TARGER.Rows((idx_TARGET)).Item(COL_END_TARGET) = Format(CLng(strEND_NEWRNG_CRNT) - 1, "000000")
                    	' 処理終わり
                    	GoTo CONT_FOR1
               	 End If
 
                	'③現行開始と現行終了の間
                	' 1行下に挿入
                	' 現行終了にstrEND_NEWRNG_CRNTセット
                	' 次行開始に(strEND_NEWRNG_CRNT + 1)
                	If (strEND_NEWRNG_CRNT > strSTART_TARGET_CRNT) And (strEND_NEWRNG_CRNT < strEND_TARGET_CRNT) Then
                    	eOK = True
                    	' 挿入
                        CopyInsertDown(_TBL_TARGER, idx_TARGET)
                    	' 現行終了にstrEND_NEWRNG_CRNTセット
                    	_TBL_TARGER.Rows((idx_TARGET)).Item(COL_END_TARGET) = strEND_NEWRNG_CRNT
                    	' 次行開始に(strEND_NEWRNG_CRNT + 1)
                        _TBL_TARGER.Rows((idx_TARGET + 1)).Item(COL_START_TARGET) = Format(CLng(strEND_NEWRNG_CRNT) + 1, "000000")
                    	' 処理終わり
                    	GoTo CONT_FOR1
                	End If
 
 
                	' ④現行終了と次行開始の間
                	' 1行下に挿入
                	' 現行終了にstrEND_NEWRNG_CRNTセット
                	' 次行開始に(strEND_NEWRNG_CRNT + 1)
                	If (strEND_NEWRNG_CRNT > strSTART_TARGET_CRNT) And (strEND_NEWRNG_CRNT < strSTART_TARGET_NEXT) Then
                    	eOK = True
                    	' 挿入
                    	CopyInsertDown(_TBL_TARGER, idx_TARGET)
                    	' 現行終了にstrEND_NEWRNG_CRNTセット
                        _TBL_TARGER.Rows((idx_TARGET)).Item(COL_END_TARGET) = strEND_NEWRNG_CRNT
                    	' 次行開始に(strEND_NEWRNG_CRNT + 1)
                    	_TBL_TARGER.Rows((idx_TARGET + 1)).Item(COL_START_TARGET) = Format(CLng(strEND_NEWRNG_CRNT) + 1, "000000")
                    	' 処理終わり
                    	GoTo CONT_FOR1
                	End If
 
 
                	'この部分に具体的な処理を書いていく
               	 '''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
CONT_FOR2:
            	Next idx_TARGET
            	''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
            	'存在しない番号の処理は
            	'この部分に具体的な処理を書いていく
            	' 5 上記以外(値が見つからない) ■先頭挿入 S0にSセット E0にSX-1
            	If sOK = False Then
                    InsertEmptyData(_TBL_TARGER, 0)
                    _TBL_TARGER.Rows(0).Item(COL_END_TARGET) = Format(CLng(_TBL_TARGER.Rows(1).Item(COL_START_TARGET)) - 1, "000000")
                    _TBL_TARGER.Rows(0).Item(COL_START_TARGET) = strSTART_NEWRNG_CRNT
            	End If
 
            	' 5 上記以外(値が見つからない ■最下挿入 EXにEセット SXにEX+1
            	'
            	If eOK = False Then
                    InsertEmptyData(_TBL_TARGER)
                    _TBL_TARGER.Rows(_TBL_TARGER.Rows.Count - 1).Item(COL_END_TARGET) = strEND_NEWRNG_CRNT
                    _TBL_TARGER.Rows(_TBL_TARGER.Rows.Count - 1).Item(COL_START_TARGET) = Format(CLng(_TBL_TARGER.Rows((_TBL_TARGER.Rows.Count - 1)).Item(COL_END_TARGET)) + 1, "000000")
            	End If
            	''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
CONT_FOR1:
        	Next idx_NEWRNG
 
    	Catch ex As Exception
    	Finally
        	_TBL_NEWRNGE.AcceptChanges()
        	_TBL_TARGER.AcceptChanges()
    	End Try
	End Sub
 
 
#Region "補助機能"
 
	''' <summary>
	''' 同じ内容の行を1個下の行に追加
	''' </summary>
	''' <param name="dtA"></param>
	''' <param name="idx"></param>
	Public Sub CopyInsertDown(ByRef dtA As DataTable, ByVal idx As Double)
    	Try
        	Dim rwNew As DataRow
        	rwNew = dtA.NewRow
        	rwNew.ItemArray = dtA.Rows(idx).ItemArray
        	dtA.Rows.InsertAt(rwNew, idx + 1)
    	Catch ex As Exception
 
    	End Try
	End Sub
 
	''' <summary>
	''' ~データを追加する
	''' </summary>
	''' <param name="dtA"></param>
	''' <param name="idx"></param>
	Public Sub InsertEmptyData(ByRef dtA As DataTable, Optional ByVal idx As Double = -1)
    	Try
        	Dim rwNew As DataRow
        	rwNew = dtA.NewRow
        	If idx >= -1 Then
            	dtA.Rows.InsertAt(rwNew, idx)
        	Else
            	dtA.ImportRow(rwNew)
        	End If
    	Catch ex As Exception
    	End Try
	End Sub
 
	''' <summary>
	''' ソート対象のテーブル作成
	''' DataTable自体にはソートをしてくれる機能がありませんが、DataTable.Select を応用することでソート処理ができます。
	''' </summary>
	''' <param name="tblTarget"></param>
	''' <param name="sortText">"Age DESC , ID ASC"</param>
	''' <returns></returns>
	Public Function SortDataTable(ByVal tblTarget As DataTable, ByVal sortText As String)
    	'ソート後の DataTable を用意
    	Dim dtblSrt As New DataTable()
    	Try
        	'ソート前テーブルの情報をクローン
        	dtblSrt = tblTarget.Clone()
 
        	'DataTable.Select()を使いソート(第二引数にソート条件を書く)
        	Dim rows As DataRow() = tblTarget.Select(Nothing, sortText).Clone()
        	'ソートされてる DataRow 配列をソート後の DataTable に追加
        	For Each row As DataRow In rows
            	dtblSrt.ImportRow(row)
        	Next
    	Catch ex As Exception
    	End Try
    	Return dtblSrt
	End Function
 
	''' <summary>
	''' ###テストDataTable 作成###
	''' </summary>
	''' <param name="_TBL_NAME"></param>
	''' <param name="dblMaxDataCnt"></param>
	''' <param name="sPan"></param>
	''' <returns></returns>
	Public Function CreateDataTable(ByVal _TBL_NAME As String, Optional ByVal dblMaxDataCnt As Double = 100, Optional ByVal sPan As Integer = 10) As DataTable
    	Dim tbl As New DataTable(_TBL_NAME)
    	tbl.Columns.Add("col1", Type.GetType("System.String"))
    	tbl.Columns.Add("col2", Type.GetType("System.String"))
    	tbl.Columns.Add("col3", Type.GetType("System.String"))
    	tbl.Columns.Add("col4", Type.GetType("System.String"))
    	tbl.Columns.Add("col5", Type.GetType("System.String"))
    	For i As Integer = 0 To dblMaxDataCnt
        	Dim rwNew As DataRow
        	rwNew = tbl.NewRow
        	rwNew("col2") = (i + sPan).ToString("000000")
        	rwNew("col3") = (i + sPan * 100).ToString("000000")
        	tbl.Rows.Add(rwNew)
    	Next
    	tbl.AcceptChanges()
    	Return tbl
	End Function
 
#End Region
 
End Class