☆エコ・RDB 〔8〕データ+IDの削除_SUB
Dim PX As Integer, P1 As Integer, P2 As Integer, CH As Integer, ChX As Integer
Dim ChkDat As Variant, DP As Variant, Rn As Long, Cn As Long
Dim Max0 As Long, Max1 As Integer, Max2 As Integer, Max3 As Integer, Max4 As Integer
Dim C_0 As Integer, C_1 As Integer, C_2 As Integer, C_1M As Integer
Dim Sp0 As Integer, Sp1 As Long, Sp2 As Long, Sp3 As Long, Sp4 As Long, SpR As Long
Dim RCpo1 As Long, RCpo2 As Long, RCpo3 As Long, RCpo4 As Long
Dim BMax_Cp2 As Long, BMax_Cp3 As Long, BMax_Cp4 As Long
Dim BCut_Cp2 As Long, BCut_Cp3 As Long, BCut_Cp4 As Long
Sub Del_Dt_ER2(MST As Worksheet, IDX As Worksheet, DelDt As Variant, DelRn As Variant, Cl As Variant _
, MxDt As Long, RCpo0 As Integer, BMax As Integer, BCut As Integer, TMP1())
'
' Del_Data Macro
' マクロ記録日 : 2008/10/8 ユーザー名 :寺田屋の龍馬
'
' 一件のマスタデータ+IDをRDBシートより削除〔SUB〕
' Eco_RDB【エコ・RDB】 Ver.2.0
C_0 = 0: C_1 = 1: C_2 = 2: C_1M = 10000
'Sub_ID サブIDでの対象のクラスタの検索
Max1 = IDX.Cells(1, 202)
Max0 = IDX.Cells(2, 202)
P1 = C_1
P2 = Max1
PX = Max1 \ C_2 + C_1
CH = C_0: Sp0 = C_1
If Max1 >= C_2 Then
While CH <> PX
DP = TMP1(PX + (Max1 < PX), 1)
ChkDat = MST.Cells(DP Mod C_1M, DP \ C_1M)
CH = PX
If ChkDat > DelDt Then
P2 = PX
Else
If ChkDat = DelDt Then
If DP > DelRn Then
P2 = PX
Else
P1 = PX + C_1
End If
Else
P1 = PX + C_1
End If
End If
PX = (P2 - P1) \ C_2 + P1
Wend
Sp0 = PX - (PX < C_1)
Sp0 = PX + (Max1 < PX)
End If
Call Worksheet_SelectionChange(IDX.Range(IDX.Range("A" + CStr(RCpo0 + Sp0)).Formula), Rn, Sp1)
RCpo1 = Rn - C_1
If Sp0 >= C_2 Then '対象のクラスタを決める
If MST.Cells(DP Mod C_1M, DP \ C_1M) >= DelDt Then
Call Worksheet_SelectionChange(IDX.Range(IDX.Range("A" + CStr(RCpo0 + Sp0 - C_1)).Formula), Rn, Sp3)
RCpo3 = Rn - C_1: DP = IDX.Cells(RCpo3 + IDX.Cells(RCpo3, Sp3), Sp3)
If MST.Cells(DP Mod C_1M, DP \ C_1M) > DelDt Or (MST.Cells(DP Mod C_1M, DP \ C_1M) = _
DelDt And DP >= DelRn) Then
Sp0 = Sp0 - C_1: Sp1 = Sp3: RCpo1 = RCpo3
End If
End If
End If
RCpo2 = RCpo1
'Main_ID クラスタ内での削除IDの検索
Max2 = IDX.Cells(RCpo1, Sp1)
P1 = C_1
P2 = Max2
PX = Max2 \ C_2 + C_1
CH = C_0: Sp2 = C_1
While CH <> PX
ChX = RCpo1 + PX + (Max2 < PX)
DP = IDX.Cells(ChX, Sp1)
ChkDat = MST.Cells(DP Mod C_1M, DP \ C_1M)
CH = PX
If ChkDat > DelDt Then
P2 = PX
Else
If ChkDat = DelDt Then
If DP > DelRn Then
P2 = PX
Else
P1 = PX + C_1
End If
Else
P1 = PX + C_1
End If
End If
PX = (P2 - P1) \ C_2 + P1
Wend
Sp2 = PX + (PX > C_1)
ChX = RCpo1 + Sp2 + (Max2 < Sp2)
DP = IDX.Cells(ChX, Sp1)
ChkDat = MST.Cells(DP Mod C_1M, DP \ C_1M)
BCut_Cp2 = RCpo2 + Sp2
BMax_Cp2 = RCpo2 + Max2
Max3 = C_0: Max4 = C_0
'削除するマスタデータとレコード番号のチェック
If Max2 >= Sp2 And (ChkDat = DelDt And DP = DelRn) Then
'インデックスの削除
IDX.Range(IDX.Cells(BCut_Cp2, Sp1), IDX.Cells(BMax_Cp2, Sp1)).Value = _
IDX.Range(IDX.Cells(BCut_Cp2 + C_1, Sp1), IDX.Cells(BMax_Cp2 + C_1, Sp1)).Value
Rn = DelRn Mod C_1M
Cn = DelRn \ C_1M
MST.Cells(Rn, Cn) = Cl 'マスタデータの削除
Max2 = Max2 - C_1
IDX.Cells(RCpo2, Sp1) = Max2
Max0 = Max0 - C_1: MxDt = Max0
IDX.Cells(2, 201) = Max0
IDX.Cells(2, 202) = Max0
If Sp2 = C_1 Then
TMP1() = IDX.Range(IDX.Cells(RCpo0 + C_1, 1), IDX.Cells(RCpo0 + Max1 + C_1, 1))
End If
End If
If Max2 < BMax * 0.4 Then '前後のクラスタのID数をチェック
ChX = C_0
If Sp0 > C_1 Then
Call Worksheet_SelectionChange(IDX.Range(IDX.Range("A" + CStr(RCpo0 + Sp0 - C_1)).Formula), Rn, Sp3)
RCpo3 = Rn - C_1: Max3 = IDX.Cells(RCpo3, Sp3)
End If
If Sp0 < Max1 Then
Call Worksheet_SelectionChange(IDX.Range(IDX.Range("A" + CStr(RCpo0 + Sp0 + C_1)).Formula), Rn, Sp4)
RCpo4 = Rn - C_1: Max4 = IDX.Cells(RCpo4, Sp4)
End If
If Max3 < Max4 Or Max4 = C_0 Then
If Max2 + Max3 < BMax * 0.8 And Max3 > C_0 Then
BCut_Cp3 = RCpo3 + Max3 '前クラスタとのマージ
BMax_Cp3 = RCpo3 + Max2 + Max3
IDX.Range(IDX.Cells(BCut_Cp3 + C_1, Sp3), IDX.Cells(BMax_Cp3 + C_1, Sp3)).Value = _
IDX.Range(IDX.Cells(RCpo2 + C_1, Sp1), IDX.Cells(BMax_Cp2 + C_1, Sp1)).Value
IDX.Cells(RCpo3, Sp3) = Max2 + Max3: IDX.Cells(RCpo2, Sp1) = C_0
ChX = C_1
End If
Else
If Max2 + Max4 < BMax * 0.8 And Max1 > C_1 Then
BCut_Cp2 = RCpo2 + Max2 '後ろクラスタとのマージ
BMax_Cp2 = RCpo2 + Max2 + Max4
BCut_Cp4 = RCpo4
BMax_Cp4 = RCpo4 + Max4
IDX.Range(IDX.Cells(BCut_Cp2 + C_1, Sp1), IDX.Cells(BMax_Cp2 + C_1, Sp1)).Value = _
IDX.Range(IDX.Cells(BCut_Cp4 + C_1, Sp4), IDX.Cells(BMax_Cp4 + C_1, Sp4)).Value
IDX.Cells(RCpo2, Sp1) = Max2 + Max4: IDX.Cells(RCpo4, Sp4) = C_0
ChX = C_2
End If
End If
If ChX > C_0 Then '不要クラスタの削除
Sp0 = Sp0 + ChX - C_1 'サブIDを1クラスタ分削除
With IDX
.Range(IDX.Cells(RCpo0 + Sp0 + C_1, 1), IDX.Cells(RCpo0 + Max1 + C_1, 1)).Copy
.Range(IDX.Cells(RCpo0 + Sp0, 1), IDX.Cells(RCpo0 + Max1, 1)).PasteSpecial
End With
If ChX = C_1 Then
IDX.Range(IDX.Cells(RCpo2 + C_1, Sp1), IDX.Cells(RCpo2 + BMax + C_1, Sp1)).Value = _
IDX.Range(IDX.Cells(RCpo0 + 4001, 1), IDX.Cells(RCpo0 + BMax + 4001 + C_1, 1)).Value
Else
IDX.Range(IDX.Cells(RCpo4 + C_1, Sp4), IDX.Cells(RCpo4 + BMax + C_1, Sp4)).Value = _
IDX.Range(IDX.Cells(RCpo0 + 4001, 1), IDX.Cells(RCpo0 + BMax + 4001 + C_1, 1)).Value
End If
IDX.Cells(1, 202) = Max1 - C_1
TMP1() = IDX.Range(IDX.Cells(RCpo0 + C_1, 1), IDX.Cells(RCpo0 + Max1 + C_1, 1))
End If
End If
End Sub
Private Sub Worksheet_SelectionChange(ByVal Target As Range, Rn As Long, Cn As Long)
Rn = Target.Row
Cn = Target.Column
End Sub