Attribute VB_Name = "Module1" Option Explicit Global I_TABLE_WIDTH As Integer Global I_TABLE_HEIGHT As Integer Global WS_RAW_DATA As String Global WS_REQUIREMENTS As String Global WS_CASE1 As String Global WS_CASE2 As String Global WS_CASE3 As String Global WS_CASE4 As String Global AA_RAW_DATA(30000) As Variant Global A_RAW_DATA(99) As String Global len_raw_data As Integer Global temp_ws_case1(30000) As Variant Global len_temp_ws_case1 As Integer Global temp_ws_case2(30000) As Variant Global len_temp_ws_case2 As Integer Global temp_ws_case3(30000) As Variant Global len_temp_ws_case3 As Integer Global temp_ws_case4(30000) As Variant Global len_temp_ws_case4 As Integer Global temp_row(99) As String Global COL_O_EXPENSE_NUMBER As Integer Global COL_O_CLAIMANT_NAME As Integer Global COL_O_REPORT_SUBMITTED_DATE As Integer Global COL_O_EXPENSE_REPORT_DATE As Integer Global COL_O_PURPOSE_1 As Integer Global COL_O_PURPOSE_2 As Integer Global COL_O_STATUS As Integer Global COL_O_AMOUNT_HKD As Integer Global COL_O_CURRENCY As Integer Global COL_O_LINE_NUMBER As Integer Global COL_O_EXPENSE_TYPE As Integer Global COL_O_LINE_AMOUNT_HKD As Integer Global COL_O_RECEIPT_AMOUNT_BEFORE_TAX As Integer Global COL_O_LINE_CURRENCY As Integer Global COL_O_EXCHANGE_RATE As Integer Global COL_O_JUSTIFICATION As Integer Global COL_O_EXPENSE_DATE As Integer Global COL_O_ALLOCATION_NUMBER As Integer Global COL_O_ALLOCATION_AMOUNT As Integer Global COL_O_EXPENSE_ALLOCATION As Integer Global COL_O_EMPLOYEE_IF_NOT_THE_CLAIMS As Integer Global COL_O_DEPARTURE_LOCATION As Integer Global COL_O_DESTINATION As Integer Global COL_O_MODE_OF_TRANSPORTATION As Integer Global COL_O_PURPOSE_OF_JOURNEY As Integer Global COL_O_NAME_OF_GUEST_COMPANY As Integer Global COL_O_MOST_SENIOR_PARTICIPANT As Integer Global COL_O_PURPOSE_OF_ENTERTAINMENT As Integer Global COL_O_COST_PER_HEAD As Integer Global COL_O_COST_PER_HEAD_BEFORE_TAX As Integer Global COL_O_NUMBER_OF_PARTICIPANTS As Integer Global COL_O_NAME_AND_POSITION_OF_PARTICIPANTS As Integer Global COL_O_TAR_APPROVED_NUMBER As Integer Global COL_O_REASON_OF_GUEST_NO_DIFF As Integer Global COL_O_REASON_OF_OTHER_RELATED_EXPENSE As Integer Global COL_O_ABC_APPROVAL_REFERENCE_NUMBER As Integer Global COL_O_ADDITIONAL_APPROVER_1 As Integer Global COL_O_ADDITIONAL_APPROVER_2 As Integer Global COL_O_EAP_APPROVER_3 As Integer Global COL_O_ADDITIONAL_APPROVER_4 As Integer Global COL_O_ADDITIONAL_APPROVER_5 As Integer Global COL_O_ADDITIONAL_APPROVER_CEO As Integer Global COL_O_ADDITIONAL_APPROVER_AAE As Integer Global COL_O_HR_DIVISION_1 As Integer Global COL_O_HR_DIVISION_2 As Integer Global COL_O_HR_DIVISION_3 As Integer Global COL_O_HR_DIVISION_4 As Integer Sub initConfig() COL_O_EXPENSE_NUMBER = 0 COL_O_CLAIMANT_NAME = 1 COL_O_REPORT_SUBMITTED_DATE = 2 COL_O_EXPENSE_REPORT_DATE = 3 COL_O_PURPOSE_1 = 4 COL_O_PURPOSE_2 = 5 COL_O_STATUS = 6 COL_O_AMOUNT_HKD = 7 COL_O_CURRENCY = 8 COL_O_LINE_NUMBER = 9 COL_O_EXPENSE_TYPE = 10 COL_O_LINE_AMOUNT_HKD = 11 COL_O_RECEIPT_AMOUNT_BEFORE_TAX = 12 COL_O_LINE_CURRENCY = 13 COL_O_EXCHANGE_RATE = 14 COL_O_JUSTIFICATION = 15 COL_O_EXPENSE_DATE = 16 COL_O_ALLOCATION_NUMBER = 17 COL_O_ALLOCATION_AMOUNT = 18 COL_O_EXPENSE_ALLOCATION = 19 COL_O_EMPLOYEE_IF_NOT_THE_CLAIMS = 20 COL_O_DEPARTURE_LOCATION = 21 COL_O_DESTINATION = 22 COL_O_MODE_OF_TRANSPORTATION = 23 COL_O_PURPOSE_OF_JOURNEY = 24 COL_O_NAME_OF_GUEST_COMPANY = 25 COL_O_MOST_SENIOR_PARTICIPANT = 26 COL_O_PURPOSE_OF_ENTERTAINMENT = 27 COL_O_COST_PER_HEAD = 28 COL_O_COST_PER_HEAD_BEFORE_TAX = 29 COL_O_NUMBER_OF_PARTICIPANTS = 30 COL_O_NAME_AND_POSITION_OF_PARTICIPANTS = 31 COL_O_TAR_APPROVED_NUMBER = 32 COL_O_REASON_OF_GUEST_NO_DIFF = 33 COL_O_REASON_OF_OTHER_RELATED_EXPENSE = 34 COL_O_ABC_APPROVAL_REFERENCE_NUMBER = 35 COL_O_ADDITIONAL_APPROVER_1 = 36 COL_O_ADDITIONAL_APPROVER_2 = 37 COL_O_EAP_APPROVER_3 = 38 COL_O_ADDITIONAL_APPROVER_4 = 39 COL_O_ADDITIONAL_APPROVER_5 = 40 COL_O_ADDITIONAL_APPROVER_CEO = 41 COL_O_ADDITIONAL_APPROVER_AAE = 42 COL_O_HR_DIVISION_1 = 43 COL_O_HR_DIVISION_2 = 44 COL_O_HR_DIVISION_3 = 45 COL_O_HR_DIVISION_4 = 46 WS_CASE1 = "Date & Amount" WS_CASE2 = "Date & Amount & Type" WS_CASE3 = "Date & Amount & Type & Name" WS_CASE4 = "Professional Fees" WS_RAW_DATA = "Raw Data" WS_REQUIREMENTS = "Requirement" I_TABLE_WIDTH = 99 I_TABLE_HEIGHT = 30000 len_temp_ws_case1 = 0 len_temp_ws_case2 = 0 len_temp_ws_case3 = 0 len_temp_ws_case4 = 0 End Sub Function CheckWsExist(ws_string) Dim output As Boolean On Error GoTo eh Dim i As Integer For i = 1 To Worksheets.Count If (Worksheets.Item(i).Name = ws_string) Then CheckWsExist = True Exit Function End If Next i Done: CheckWsExist = False Exit Function eh: CheckWsExist = False End Function Sub CreateWsIfNotExist(ws_string) If (CheckWsExist(ws_string) = False) Then Dim newSheet As Worksheet ' Create a new worksheet and assign it to the variable Set newSheet = ThisWorkbook.Worksheets.Add(After:=Worksheets(Worksheets.Count)) ' Optionally, you can name the new worksheet newSheet.Name = ws_string End If End Sub Function checkTableLength(ws_string) Dim output As Integer Dim r, c As Integer For r = 1 To I_TABLE_HEIGHT Dim temp As String temp = Worksheets(ws_string).Range("A1").Offset(r, 0).Value If temp = "" Then output = r Exit For End If Next r checkTableLength = output - 1 '- 1 for header End Function ' Case 1 ' Situation: ' > If any rows (with different expense number) of both Expense Date (Column Q) and Line Amount (Column L) have the same value ' 1. with different expense number (Column A) ' 2. Expense Date (Column Q) have the same value ' 3. Line Amount (Column L) have the same value ' Action: ' Create a tab (Name: Date & Amount) and copy and paste the related rows to this tab Sub Case1() MsgBox "Helloworld" End Sub Sub initSheetForCase1() Dim r, c As Integer CreateWsIfNotExist (WS_CASE1) Worksheets(WS_CASE1).Range("A1:Z" & CStr(I_TABLE_HEIGHT)).Offset(r, c).Clear For c = 0 To 99 Worksheets(WS_CASE1).Range("A1").Offset(0, c).Value = Worksheets(WS_RAW_DATA).Range("A1").Offset(0, c).Value Next c End Sub Function CheckFullfillCase1(row1, row2) Dim output As Boolean Dim c As Integer Dim R_DIFF_EXPENSE_NUM As Boolean Dim R_SAME_EXPENSE_DATE As Boolean Dim R_SAME_LINE_AMOUNT As Boolean Dim R_SAME_EXPENSE_TYPE, R_SAME_CLAIMANT_NAME As Boolean output = True R_DIFF_EXPENSE_NUM = row1(COL_O_EXPENSE_NUMBER) <> row2(COL_O_EXPENSE_NUMBER) R_SAME_EXPENSE_DATE = row1(COL_O_EXPENSE_DATE) = row2(COL_O_EXPENSE_DATE) R_SAME_LINE_AMOUNT = row1(COL_O_LINE_AMOUNT_HKD) = row2(COL_O_LINE_AMOUNT_HKD) ' R_SAME_EXPENSE_TYPE = row1(COL_O_EXPENSE_TYPE) = row2(COL_O_EXPENSE_TYPE) R_SAME_CLAIMANT_NAME = row1(COL_O_CLAIMANT_NAME) = row2(COL_O_CLAIMANT_NAME) output = R_DIFF_EXPENSE_NUM And R_SAME_EXPENSE_DATE And R_SAME_LINE_AMOUNT And Not (R_SAME_EXPENSE_TYPE Or R_SAME_CLAIMANT_NAME) ' Debug.Print R_DIFF_EXPENSE_NUM Debug.Print "Helloworld" CheckFullfillCase1 = output End Function Function CheckOccurInCase1(row_to_check) Dim output As Boolean output = False Dim r, case1_table_len As Integer Dim R_SAME_EXPENSE_NUM As Boolean Dim R_SAME_EXPENSE_DATE As Boolean Dim R_SAME_LINE_AMOUNT As Boolean For r = 0 To len_temp_ws_case1 - 1 R_SAME_EXPENSE_NUM = row_to_check(COL_O_EXPENSE_NUMBER) = temp_ws_case1(r)(COL_O_EXPENSE_NUMBER) R_SAME_EXPENSE_DATE = row_to_check(COL_O_EXPENSE_DATE) = temp_ws_case1(r)(COL_O_EXPENSE_DATE) R_SAME_LINE_AMOUNT = row_to_check(COL_O_LINE_AMOUNT_HKD) = temp_ws_case1(r)(COL_O_LINE_AMOUNT_HKD) If (R_SAME_EXPENSE_NUM And R_SAME_EXPENSE_DATE And R_SAME_LINE_AMOUNT) Then output = True Exit For End If Next r CheckOccurInCase1 = output End Function Sub ProcessCase1() initSheetForCase1 Dim r, r_c1 As Integer Dim r_fullfill_case1 As Boolean Dim last_row_idx, second_last_row_idx As Integer last_row_idx = len_raw_data - 1 second_last_row_idx = last_row_idx - 1 For r = 0 To (second_last_row_idx) For r_c1 = (r + 1) To (last_row_idx) r_fullfill_case1 = CheckFullfillCase1(AA_RAW_DATA(r), AA_RAW_DATA(r_c1)) If (r_fullfill_case1) Then If (CheckOccurInCase1(AA_RAW_DATA(r))) Then ' if occur in ws_case1, do nothing Else temp_ws_case1(len_temp_ws_case1) = AA_RAW_DATA(r) len_temp_ws_case1 = len_temp_ws_case1 + 1 Worksheets(WS_RAW_DATA).Range("A1").Offset(r + 1, COL_O_EXPENSE_DATE).Interior.Color = GetRandomColor Worksheets(WS_RAW_DATA).Range("A1").Offset(r + 1, COL_O_LINE_AMOUNT_HKD).Interior.Color = GetRandomColor End If If (CheckOccurInCase1(AA_RAW_DATA(r_c1))) Then ' if occur in ws_case1, do nothing Else temp_ws_case1(len_temp_ws_case1) = AA_RAW_DATA(r_c1) len_temp_ws_case1 = len_temp_ws_case1 + 1 Worksheets(WS_RAW_DATA).Range("A1").Offset(r_c1 + 1, COL_O_EXPENSE_DATE).Interior.Color = GetRandomColor Worksheets(WS_RAW_DATA).Range("A1").Offset(r_c1 + 1, COL_O_LINE_AMOUNT_HKD).Interior.Color = GetRandomColor End If End If Next r_c1 Next r For r = 0 To (len_temp_ws_case1 - 1) For r_c1 = 0 To 99 Worksheets(WS_CASE1).Range("A1").Offset(r + 1, r_c1).Value = temp_ws_case1(r)(r_c1) Next r_c1 Next r Worksheets(WS_CASE1).Range("A1:Z" & 99).Columns.AutoFit Worksheets(WS_CASE1).Range("A2:Z" & 99).Interior.Color = xlNone End Sub ' Case 2 ' Situation: ' > If any rows (with different expense number) of Expense Date (Column Q), Line Amount (Column L) and Expense Type (Column K) have the same value ' 1. with different expense number (Column A) ' 2. Expense Date (Column Q) have the same value ' 3. Line Amount (Column L) have the same value ' 4. Expense Type (Column K) have the same value ' Action: ' Create a tab (Name: Date & Amount & Type) and copy and paste the related rows to this tab Sub Case2() MsgBox "Helloworld" End Sub Sub initSheetForCase2() Dim r, c As Integer CreateWsIfNotExist (WS_CASE2) Worksheets(WS_CASE2).Range("A1:Z" & CStr(I_TABLE_HEIGHT)).Offset(r, c).Clear For c = 0 To 99 Worksheets(WS_CASE2).Range("A1").Offset(0, c).Value = Worksheets(WS_RAW_DATA).Range("A1").Offset(0, c).Value Next c End Sub Function CheckFullfillCase2(row1, row2) Dim output As Boolean Dim c As Integer Dim R_DIFF_EXPENSE_NUM As Boolean Dim R_SAME_EXPENSE_DATE As Boolean Dim R_SAME_LINE_AMOUNT As Boolean Dim R_SAME_EXPENSE_TYPE As Boolean Dim R_SAME_CLAIMANT_NAME, R_EXPENSE_TYPE_PROF_FEE As Boolean output = True R_DIFF_EXPENSE_NUM = row1(COL_O_EXPENSE_NUMBER) <> row2(COL_O_EXPENSE_NUMBER) R_SAME_EXPENSE_DATE = row1(COL_O_EXPENSE_DATE) = row2(COL_O_EXPENSE_DATE) R_SAME_LINE_AMOUNT = row1(COL_O_LINE_AMOUNT_HKD) = row2(COL_O_LINE_AMOUNT_HKD) R_SAME_EXPENSE_TYPE = row1(COL_O_EXPENSE_TYPE) = row2(COL_O_EXPENSE_TYPE) R_SAME_CLAIMANT_NAME = row1(COL_O_CLAIMANT_NAME) = row2(COL_O_CLAIMANT_NAME) R_EXPENSE_TYPE_PROF_FEE = row1(COL_O_EXPENSE_TYPE) = "PROF.FEE" output = R_DIFF_EXPENSE_NUM And R_SAME_EXPENSE_DATE And R_SAME_LINE_AMOUNT And R_SAME_EXPENSE_TYPE And Not (R_SAME_CLAIMANT_NAME Or R_EXPENSE_TYPE_PROF_FEE) CheckFullfillCase2 = output End Function Function CheckOccurInCase2(row_to_check) Dim output As Boolean output = False Dim r, case2_table_len As Integer Dim R_SAME_EXPENSE_NUM As Boolean Dim R_SAME_EXPENSE_DATE As Boolean Dim R_SAME_LINE_AMOUNT As Boolean Dim R_SAME_EXPENSE_TYPE As Boolean For r = 1 To len_temp_ws_case2 - 1 R_SAME_EXPENSE_NUM = row_to_check(COL_O_EXPENSE_NUMBER) = temp_ws_case2(r)(COL_O_EXPENSE_NUMBER) R_SAME_EXPENSE_DATE = row_to_check(COL_O_EXPENSE_DATE) = temp_ws_case2(r)(COL_O_EXPENSE_DATE) R_SAME_LINE_AMOUNT = row_to_check(COL_O_LINE_AMOUNT_HKD) = temp_ws_case2(r)(COL_O_LINE_AMOUNT_HKD) R_SAME_EXPENSE_TYPE = row_to_check(COL_O_EXPENSE_TYPE) = temp_ws_case2(r)(COL_O_EXPENSE_TYPE) If (R_SAME_EXPENSE_NUM And R_SAME_EXPENSE_DATE And R_SAME_LINE_AMOUNT And R_SAME_EXPENSE_TYPE) Then output = True Exit For End If Next r CheckOccurInCase2 = output End Function Sub ProcessCase2() initSheetForCase2 Dim r, r_c1 As Integer Dim r_fullfill_case2 As Boolean Dim last_row_idx, second_last_row_idx As Integer last_row_idx = len_raw_data - 1 second_last_row_idx = last_row_idx - 1 For r = 0 To (second_last_row_idx) For r_c1 = (r + 1) To (last_row_idx) r_fullfill_case2 = CheckFullfillCase2(AA_RAW_DATA(r), AA_RAW_DATA(r_c1)) If (r_fullfill_case2) Then If (CheckOccurInCase2(AA_RAW_DATA(r))) Then ' if occur in ws_case2, do nothing Else temp_ws_case2(len_temp_ws_case2) = AA_RAW_DATA(r) len_temp_ws_case2 = len_temp_ws_case2 + 1 Worksheets(WS_RAW_DATA).Range("A1").Offset(r + 1, COL_O_EXPENSE_DATE).Interior.Color = GetRandomColor Worksheets(WS_RAW_DATA).Range("A1").Offset(r + 1, COL_O_LINE_AMOUNT_HKD).Interior.Color = GetRandomColor Worksheets(WS_RAW_DATA).Range("A1").Offset(r + 1, COL_O_EXPENSE_TYPE).Interior.Color = GetRandomColor End If If (CheckOccurInCase2(AA_RAW_DATA(r_c1))) Then ' if occur in ws_case2, do nothing Else temp_ws_case2(len_temp_ws_case2) = AA_RAW_DATA(r_c1) len_temp_ws_case2 = len_temp_ws_case2 + 1 Worksheets(WS_RAW_DATA).Range("A1").Offset(r_c1 + 1, COL_O_EXPENSE_DATE).Interior.Color = GetRandomColor Worksheets(WS_RAW_DATA).Range("A1").Offset(r_c1 + 1, COL_O_LINE_AMOUNT_HKD).Interior.Color = GetRandomColor Worksheets(WS_RAW_DATA).Range("A1").Offset(r_c1 + 1, COL_O_EXPENSE_TYPE).Interior.Color = GetRandomColor End If End If Next r_c1 Next r For r = 0 To (len_temp_ws_case2 - 1) For r_c1 = 0 To 99 Worksheets(WS_CASE2).Range("A1").Offset(r + 1, r_c1).Value = temp_ws_case2(r)(r_c1) Next r_c1 Next r Worksheets(WS_CASE2).Range("A1:Z" & 99).Columns.AutoFit Worksheets(WS_CASE2).Range("A2:Z" & 99).Interior.Color = xlNone End Sub ' Case 3 ' Situation: ' > If any rows (with different expense number) of Expense Date (Column Q), Line Amount (Column L), Expense Type (Column K) and Claimant Name (Column B) have the same value ' 1. with different expense number (Column A) ' 2. Expense Date (Column Q) have the same value ' 3. Line Amount (Column L) have the same value ' 4. Expense Type (Column K) have the same value ' 5. Claimant Name (Column B) have the same value ' Action: ' Create a tab (Name: Date & Amount & Type & Name) and copy and paste the related rows to this tab Sub Case3() MsgBox "Helloworld" End Sub Sub initSheetForCase3() Dim r, c As Integer CreateWsIfNotExist (WS_CASE3) Worksheets(WS_CASE3).Range("A1:Z" & CStr(I_TABLE_HEIGHT)).Offset(r, c).Clear For c = 0 To 99 Worksheets(WS_CASE3).Range("A1").Offset(0, c).Value = Worksheets(WS_RAW_DATA).Range("A1").Offset(0, c).Value Next c End Sub Function CheckFullfillCase3(row1, row2) Dim output As Boolean Dim c As Integer Dim R_DIFF_EXPENSE_NUM As Boolean Dim R_SAME_EXPENSE_DATE As Boolean Dim R_SAME_LINE_AMOUNT As Boolean Dim R_SAME_EXPENSE_TYPE As Boolean Dim R_SAME_CLAIMANT_NAME As Boolean Dim R_EXPENSE_TYPE_PROF_FEE As Boolean output = True R_DIFF_EXPENSE_NUM = row1(COL_O_EXPENSE_NUMBER) <> row2(COL_O_EXPENSE_NUMBER) R_SAME_EXPENSE_DATE = row1(COL_O_EXPENSE_DATE) = row2(COL_O_EXPENSE_DATE) R_SAME_LINE_AMOUNT = row1(COL_O_LINE_AMOUNT_HKD) = row2(COL_O_LINE_AMOUNT_HKD) R_SAME_EXPENSE_TYPE = row1(COL_O_EXPENSE_TYPE) = row2(COL_O_EXPENSE_TYPE) R_SAME_CLAIMANT_NAME = row1(COL_O_CLAIMANT_NAME) = row2(COL_O_CLAIMANT_NAME) ' R_EXPENSE_TYPE_PROF_FEE = row1(COL_O_EXPENSE_TYPE) = "PROF.FEE" output = R_DIFF_EXPENSE_NUM And R_SAME_EXPENSE_DATE And R_SAME_LINE_AMOUNT And R_SAME_EXPENSE_TYPE And R_SAME_CLAIMANT_NAME And Not (R_EXPENSE_TYPE_PROF_FEE) Debug.Print R_DIFF_EXPENSE_NUM CheckFullfillCase3 = output End Function Function CheckOccurInCase3(row_to_check) Dim output As Boolean output = False Dim r As Integer Dim R_SAME_EXPENSE_NUM As Boolean Dim R_SAME_EXPENSE_DATE As Boolean Dim R_SAME_LINE_AMOUNT As Boolean Dim R_SAME_EXPENSE_TYPE As Boolean Dim R_SAME_CLAIMANT_NAME As Boolean For r = 0 To len_temp_ws_case3 - 1 R_SAME_EXPENSE_DATE = row_to_check(COL_O_EXPENSE_DATE) = temp_ws_case3(r)(COL_O_EXPENSE_DATE) R_SAME_EXPENSE_NUM = row_to_check(COL_O_EXPENSE_NUMBER) = temp_ws_case3(r)(COL_O_EXPENSE_NUMBER) R_SAME_LINE_AMOUNT = row_to_check(COL_O_LINE_AMOUNT_HKD) = temp_ws_case3(r)(COL_O_LINE_AMOUNT_HKD) R_SAME_EXPENSE_TYPE = row_to_check(COL_O_EXPENSE_TYPE) = temp_ws_case3(r)(COL_O_EXPENSE_TYPE) R_SAME_CLAIMANT_NAME = row_to_check(COL_O_CLAIMANT_NAME) = temp_ws_case3(r)(COL_O_CLAIMANT_NAME) If (R_SAME_EXPENSE_NUM And R_SAME_EXPENSE_DATE And R_SAME_LINE_AMOUNT And R_SAME_EXPENSE_TYPE And R_SAME_CLAIMANT_NAME) Then output = True Exit For End If Next r CheckOccurInCase3 = output End Function Sub ProcessCase3() initSheetForCase3 Dim r, r_c1 As Integer Dim r_fullfill_case3 As Boolean Dim last_row_idx, second_last_row_idx As Integer last_row_idx = len_raw_data - 1 second_last_row_idx = last_row_idx - 1 For r = 0 To (second_last_row_idx) For r_c1 = (r + 1) To (last_row_idx) r_fullfill_case3 = CheckFullfillCase3(AA_RAW_DATA(r), AA_RAW_DATA(r_c1)) If (r_fullfill_case3) Then If (CheckOccurInCase3(AA_RAW_DATA(r))) Then ' if occur in ws_case3, do nothing Else temp_ws_case3(len_temp_ws_case3) = AA_RAW_DATA(r) len_temp_ws_case3 = len_temp_ws_case3 + 1 Worksheets(WS_RAW_DATA).Range("A1").Offset(r + 1, COL_O_EXPENSE_DATE).Interior.Color = GetRandomColor Worksheets(WS_RAW_DATA).Range("A1").Offset(r + 1, COL_O_LINE_AMOUNT_HKD).Interior.Color = GetRandomColor Worksheets(WS_RAW_DATA).Range("A1").Offset(r + 1, COL_O_EXPENSE_TYPE).Interior.Color = GetRandomColor Worksheets(WS_RAW_DATA).Range("A1").Offset(r + 1, COL_O_CLAIMANT_NAME).Interior.Color = GetRandomColor End If If (CheckOccurInCase3(AA_RAW_DATA(r_c1))) Then ' if occur in ws_case3, do nothing Else temp_ws_case3(len_temp_ws_case3) = AA_RAW_DATA(r_c1) len_temp_ws_case3 = len_temp_ws_case3 + 1 Worksheets(WS_RAW_DATA).Range("A1").Offset(r_c1 + 1, COL_O_EXPENSE_DATE).Interior.Color = GetRandomColor Worksheets(WS_RAW_DATA).Range("A1").Offset(r_c1 + 1, COL_O_LINE_AMOUNT_HKD).Interior.Color = GetRandomColor Worksheets(WS_RAW_DATA).Range("A1").Offset(r_c1 + 1, COL_O_EXPENSE_TYPE).Interior.Color = GetRandomColor Worksheets(WS_RAW_DATA).Range("A1").Offset(r_c1 + 1, COL_O_CLAIMANT_NAME).Interior.Color = GetRandomColor End If End If Next r_c1 Next r For r = 0 To (len_temp_ws_case3 - 1) For r_c1 = 0 To 99 Worksheets(WS_CASE3).Range("A1").Offset(r + 1, r_c1).Value = temp_ws_case3(r)(r_c1) Next r_c1 Next r Worksheets(WS_CASE3).Range("A1:Z" & 99).Columns.AutoFit Worksheets(WS_CASE3).Range("A2:Z" & 99).Interior.Color = xlNone End Sub ' Case 4 ' Situation: ' > If Expense Type (Column K) contains PROF.FEE, and; If any rows (with different expense number) of Claimant Name (Column B) have the same value ' 1. If Expense Type (Column K) contains PROF.FEE ' 2. with different expense number (Column A) ' 3. Claimant Name (Column B) have the same value) ' Action: ' Create a tab (Name: Professional Fees) and copy and paste the related rows to this tab Sub Case4() MsgBox "Helloworld" End Sub Sub initSheetForCase4() Dim r, c As Integer CreateWsIfNotExist (WS_CASE4) Worksheets(WS_CASE4).Range("A1:Z" & CStr(I_TABLE_HEIGHT)).Offset(r, c).Clear For c = 0 To 99 Worksheets(WS_CASE4).Range("A1").Offset(0, c).Value = Worksheets(WS_RAW_DATA).Range("A1").Offset(0, c).Value Next c End Sub Function CheckFullfillCase4(row1, row2) Dim output As Boolean Dim c As Integer Dim R_DIFF_EXPENSE_NUM As Boolean Dim R_EXPENSE_TYPE_PROF_FEE As Boolean Dim R_SAME_CLAIMANT_NAME As Boolean output = True R_DIFF_EXPENSE_NUM = row1(COL_O_EXPENSE_NUMBER) <> row2(COL_O_EXPENSE_NUMBER) R_EXPENSE_TYPE_PROF_FEE = row1(COL_O_EXPENSE_TYPE) = "PROF.FEE" R_SAME_CLAIMANT_NAME = row1(COL_O_CLAIMANT_NAME) = row2(COL_O_CLAIMANT_NAME) output = R_DIFF_EXPENSE_NUM And R_EXPENSE_TYPE_PROF_FEE And R_SAME_CLAIMANT_NAME CheckFullfillCase4 = output End Function Function CheckOccurInCase4(row_to_check) Dim output As Boolean output = False Dim r As Integer Dim R_SAME_EXPENSE_NUM As Boolean Dim R_SAME_CLAIMANT_NAME As Boolean For r = 0 To len_temp_ws_case4 - 1 R_SAME_EXPENSE_NUM = row_to_check(COL_O_EXPENSE_NUMBER) = temp_ws_case4(r)(COL_O_EXPENSE_NUMBER) R_SAME_CLAIMANT_NAME = row_to_check(COL_O_CLAIMANT_NAME) = temp_ws_case4(r)(COL_O_CLAIMANT_NAME) If (R_SAME_EXPENSE_NUM And R_SAME_CLAIMANT_NAME) Then output = True Exit For End If Next r CheckOccurInCase4 = output End Function Sub ProcessCase4() initSheetForCase4 Dim r, r_c1 As Integer Dim r_fullfill_case4 As Boolean Dim last_row_idx, second_last_row_idx As Integer last_row_idx = len_raw_data - 1 second_last_row_idx = last_row_idx - 1 For r = 0 To (second_last_row_idx) For r_c1 = (r + 1) To (last_row_idx) r_fullfill_case4 = CheckFullfillCase4(AA_RAW_DATA(r), AA_RAW_DATA(r_c1)) If (r_fullfill_case4) Then If (CheckOccurInCase4(AA_RAW_DATA(r))) Then ' if occur in ws_case4, do nothing Else temp_ws_case4(len_temp_ws_case4) = AA_RAW_DATA(r) len_temp_ws_case4 = len_temp_ws_case4 + 1 Worksheets(WS_RAW_DATA).Range("A1").Offset(r + 1, COL_O_EXPENSE_TYPE).Interior.Color = GetRandomColor Worksheets(WS_RAW_DATA).Range("A1").Offset(r + 1, COL_O_CLAIMANT_NAME).Interior.Color = GetRandomColor End If If (CheckOccurInCase4(AA_RAW_DATA(r_c1))) Then ' if occur in ws_case4, do nothing Else temp_ws_case4(len_temp_ws_case4) = AA_RAW_DATA(r_c1) len_temp_ws_case4 = len_temp_ws_case4 + 1 Worksheets(WS_RAW_DATA).Range("A1").Offset(r_c1 + 1, COL_O_EXPENSE_TYPE).Interior.Color = GetRandomColor Worksheets(WS_RAW_DATA).Range("A1").Offset(r_c1 + 1, COL_O_CLAIMANT_NAME).Interior.Color = GetRandomColor End If End If Next r_c1 Next r For r = 0 To (len_temp_ws_case4 - 1) For r_c1 = 0 To 99 Worksheets(WS_CASE4).Range("A1").Offset(r + 1, r_c1).Value = temp_ws_case4(r)(r_c1) Next r_c1 Next r Worksheets(WS_CASE4).Range("A1:Z" & 99).Columns.AutoFit Worksheets(WS_CASE4).Range("A2:Z" & 99).Interior.Color = xlNone End Sub Sub ReadRawData() Dim r, i, j, k As Integer len_raw_data = checkTableLength(WS_RAW_DATA) For r = 1 To len_raw_data Dim test(99) As String For i = 0 To 99 test(i) = Worksheets(WS_RAW_DATA).Range("A1").Offset(r, i).Value Next i AA_RAW_DATA(r - 1) = test Next r End Sub Sub TestMain() initConfig Application.ScreenUpdating = False Application.DisplayAlerts = False ResetWs ReadRawData ProcessCase4 ProcessCase3 ProcessCase2 ProcessCase1 MsgBox "done" Application.ScreenUpdating = True Application.DisplayAlerts = True End Sub Sub ResetWs() Dim i, j As Integer Dim last_sheet_idx As Integer last_sheet_idx = Worksheets.Count For i = 1 To last_sheet_idx j = last_sheet_idx + 1 - i Dim IsWsRawData As Boolean Dim IsWsRequirements As Boolean Dim IsWsDebug As Boolean IsWsRawData = Worksheets.Item(j).Name = WS_RAW_DATA IsWsRequirements = Worksheets.Item(j).Name = WS_REQUIREMENTS IsWsDebug = Worksheets.Item(j).Name = "debug" If (IsWsRawData Or IsWsRequirements Or IsWsDebug) Then Else Worksheets.Item(j).Delete End If Next Dim r, table_length As Integer table_length = checkTableLength(WS_RAW_DATA) For r = 1 To table_length + 10 Worksheets(WS_RAW_DATA).Range("A1:Z" & CStr(table_length + 10)).Offset(r, 0).Interior.Color = xlNone Next r End Sub Function GetRandomColor() Dim randR As Integer Dim randG As Integer Dim randB As Integer Randomize randR = Int((256) * Rnd) randG = Int((256) * Rnd) randB = Int((256) * Rnd) GetRandomColor = RGB(246, 229, 141) End Function