Files
natalie0312/task4/source/slow/Module1.bas
louiscklaw ec32653f3a update,
2025-02-01 02:04:23 +08:00

805 lines
24 KiB
QBasic

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