User Tools

Site Tools


microsoft_excel:macros:macro_full_example_program

Microsoft Excel - Macros - Macro Full Example Program

' Options
 
' Option Explicit forces you to declare all your variables.
Option Explicit
 
' Makes all "text comparisons" case insensitive
Option Compare Text
 
 
'******************************************************************************
 
' Window API Declarations
' These Declares MUST appear at the top of the code module, above and before any VBA procedures.
 
'Const HWND_BOTTOM = 1
Const SWP_NOSIZE = &H1
Const SWP_NOMOVE = &H2
Const SWP_NOACTIVATE = &H10
Const SWP_SHOWWINDOW = &H40
 
Public Const HWND_TOPMOST = -1
Public Const HWND_NOTOPMOST = -2
Public Const HWND_TOP = 0
Public Const HWND_BOTTOM = 1
 
 
' http://www.tek-tips.com/faqs.cfm?fid=4699
'
' Message boxes are always modal, which means that the underlying application (e.g. Excel) waits for a response from
' the User and does not allow any other interaction until one is given.
' By default they are application modal (they remain in front of all other windows belonging to the owning application
' but have no impact on other applications), but they may also be system modal (they remain in front of ALL other
' windows although they have no non-visual impact on applications other than the owning one).
'
' Use the Message Box facility directly, via the Windows API, instead of via the VBA interface.
' Using it is pretty much the same as using MsgBox, except that you have the opportunity to set some parameter values
' which are defaulted in the VBA interface, in particular the message box, although technically still modal, can be
' attached to any window, or none.  If you do not attach it to your window, it will not restrict your User's interaction
' with the application.
Private Declare Function MessageBox _
        Lib "user32" Alias "MessageBoxA" _
           (ByVal hwnd As Long, _
            ByVal lpText As String, _
            ByVal lpCaption As String, _
            ByVal wType As Long) _
        As Long
 
 
' Used to have XL be on top of all other windows.
#If Win64 Then
Public Declare PtrSafe Function SetWindowPos _
  Lib "user32" ( _
  ByVal hwnd As LongPtr, _
  ByVal hwndInsertAfter As LongPtr, _
  ByVal x As Long, _
  ByVal y As Long, _
  ByVal cx As Long, _
  ByVal cy As Long, _
  ByVal wFlags As Long) _
  As Long
#Else
Public Declare Function SetWindowPos _
  Lib "user32" ( _
  ByVal hwnd As Long, _
  ByVal hwndInsertAfter As Long, _
  ByVal x As Long, _
  ByVal y As Long, _
  ByVal cx As Long, _
  ByVal cy As Long, _
  ByVal wFlags As Long) _
  As Long
#End If
 
 
'******************************************************************************
 
' Some public variables.
 
Public wb_name As String                       ' Workbook Name
 
Public ctrl_disable_auto_calcs_before_subroutine As Boolean
Public ctrl_reenable_auto_calcs_after_subroutine As Boolean
Public ctrl_ask_before_running_subroutine As Boolean
Public ctrl_show_dashboard_after_subroutine As Boolean
Public ctrl_close_erroneous_files As Boolean
Public ctrl_display_sheet_adding_error As Boolean
Public ctrl_use_system_modal_messages As Boolean
Public ctrl_clear_formatting_as_well As Boolean
Public ctrl_processing_type As Long
 
 
 
Sub ShowXLOnTop(ByVal OnTop As Boolean)
 
    Dim xStype As Long
 
#If Win64 Then
    Dim xHwnd As LongPtr
#Else
    Dim xHwnd As Long
#End If
 
    If OnTop Then
        xStype = HWND_TOPMOST
    Else
        xStype = HWND_NOTOPMOST
    End If
 
    Call SetWindowPos(Application.hwnd, xStype, 0, 0, 0, 0, SWP_NOSIZE Or SWP_NOMOVE)
 
End Sub
 
 
' Sets that XL is the top window of all applications.
Sub SetXLOnTop()
    ShowXLOnTop True
End Sub
 
 
' Sets that XL is not necessarily the top windows of all applications.
' If this were not run at some stage then no other application, such as mail, would be able to be seen.
Sub SetXLNormal()
    ShowXLOnTop False
End Sub
 
 
' Scrolls the worksheet to the specific range.
' For instance ScrollTo "SHEETNAME1", "A1"
Sub ScrollTo(ws As String, rng As String)
 
    Application.GoTo Worksheets(ws).Range(rng), True
    Worksheets(ws).Range(rng).Select
 
End Sub
 
 
' Removes AutoFilter if one exists.
Sub TurnFilterOffAllSheets()
 
    Dim ws As Worksheet
 
    For Each ws In ActiveWorkbook.Worksheets
        With ws
            .AutoFilterMode = False
        End With
    Next ws
 
End Sub
 
 
 
' Delete all unused blank rows and columns in the sheet.
' Note: This code may not work correctly if the worksheet contains merged cells.
Sub DeleteUnusedOnSheet(ws As String)
 
    Dim myLastRow As Long
    Dim myLastCol As Long
    Dim wks As Worksheet
 
    With Worksheets(ws)
        myLastRow = 0
        myLastCol = 0
        On Error Resume Next
        myLastRow = _
            .Cells.Find("*", after:=.Cells(1), _
            LookIn:=xlFormulas, lookat:=xlWhole, _
            searchdirection:=xlPrevious, _
            searchorder:=xlByRows).Row
        myLastCol = _
            .Cells.Find("*", after:=.Cells(1), _
            LookIn:=xlFormulas, lookat:=xlWhole, _
            searchdirection:=xlPrevious, _
            searchorder:=xlByColumns).Column
        On Error GoTo 0
 
        If myLastRow * myLastCol = 0 Then
            .Columns.Delete
        Else
            .Range(.Cells(myLastRow + 1, 1), _
            .Cells(.Rows.Count, 1)).EntireRow.Delete
            .Range(.Cells(1, myLastCol + 1), _
            .Cells(1, .Columns.Count)).EntireColumn.Delete
        End If
    End With
 
End Sub
 
 
' Displays a message to the user, optionally adding in how long the process ran and the queryname.
' Depending on the Developer Control settings it will display a System modal message.
Function Message(msg As String, Optional elapsedtime As Single, Optional queryname As String)
 
    Dim msg_to_show As String
 
    msg_to_show = msg
 
 
    If Not IsMissing(elapsedtime) And elapsedtime > 0 Then
        If msg_to_show <> "" Then
            msg_to_show = msg_to_show & vbCrLf & vbCrLf
        End If
 
        If Not IsMissing(queryname) Then
            msg_to_show = msg_to_show & "The query """ & queryname & """ took " & elapsedtime _
                    & " seconds to run."
        Else
            msg_to_show = msg_to_show & "The query took " & elapsedtime & " seconds to run."
        End If
    End If
 
    If ctrl_use_system_modal_messages = True Then
        If Not IsMissing(queryname) Then
            MessageBox &H0, msg_to_show, wb_name & "-" & queryname, vbSystemModal
        Else
            MessageBox &H0, msg_to_show, wb_name, vbSystemModal
        End If
    Else
        MsgBox msg_to_show
    End If
 
End Function
 
 
 
 
' Initializes global variables.
' These variables are set within the "Developer Control" sheet, and allow overrides of specific functionality within other subroutines.
Sub Z00000_Init()
 
    ' Set a shortcut to the workbook.
    wb_name = ThisWorkbook.name
 
 
    ' Set public variables from the Developer Control Sheet.
    ctrl_disable_auto_calcs_before_subroutine = Workbooks(wb_name).Sheets("Developer Control").Range("H11")
    ctrl_reenable_auto_calcs_after_subroutine = Workbooks(wb_name).Sheets("Developer Control").Range("H13")
    ctrl_ask_before_running_subroutine = Workbooks(wb_name).Sheets("Developer Control").Range("H15")
 
    ctrl_show_dashboard_after_subroutine = Workbooks(wb_name).Sheets("Developer Control").Range("H19")
    ctrl_close_erroneous_files = Workbooks(wb_name).Sheets("Developer Control").Range("H21")
    ctrl_display_sheet_adding_error = Workbooks(wb_name).Sheets("Developer Control").Range("H23")
    ctrl_use_system_modal_messages = Workbooks(wb_name).Sheets("Developer Control").Range("H25")
    ctrl_clear_formatting_as_well = Workbooks(wb_name).Sheets("Developer Control").Range("H27")
    ctrl_processing_type = Workbooks(wb_name).Sheets("Developer Control").Range("H30")
 
End Sub
 
 
 
' Runs whichever subroutine name is passed to it.
' This is the 'master' controlling routine, which also times how long other routines take and displays messages.
Sub Z99999_Run_Subroutine(strQueryName As String, Optional strDescription As String = "")
 
    Dim sngStart As Single
    Dim sngEnd As Single
    Dim sngElapsed As Single
 
    ' Control to prevent user from overwriting the template.
    If ThisWorkbook.name Like "* Template.xlsm" Then
        MsgBox "This workbook is the template, you must not make changes to it." & vbCrLf & vbCrLf & "You need to save as a new workbook name before running any macros."
        Exit Sub
    End If
 
 
    ' Get start time.
    sngStart = Timer
 
 
    ' Initializes global variables.
    Call Z00000_Init
 
 
    ' To speed up processing.
    If ctrl_disable_auto_calcs_before_subroutine Then
        With Application
            .Calculation = xlCalculationManual
            .EnableEvents = False
            .ScreenUpdating = False
        End With
    End If
 
 
    ' Turn filters off on all sheets.
    Call TurnFilterOffAllSheets
 
 
    ' Update StatusBar message.
    If strDescription = "" Then
        Application.StatusBar = "Running " & strQueryName
    Else
        Application.StatusBar = "Running " & strDescription
    End If
 
 
    ' Run query.
    'DoCmd.OpenQuery strQueryName, acNormal
    'Call strQueryName
    Application.Run strQueryName
 
 
    ' Re-enable automatic calculations.
    If ctrl_reenable_auto_calcs_after_subroutine Then
        With Application
            .Calculation = xlCalculationAutomatic
            .EnableEvents = True
            .ScreenUpdating = True
        End With
    End If
 
 
    ' Activate the dashboard.
    If ctrl_show_dashboard_after_subroutine Then
        Workbooks(wb_name).Sheets("Dashboard").Activate
    End If
 
 
    ' Display how long the subroutine ran for.
    sngEnd = Timer                                 ' Get end time.
    sngElapsed = Format(sngEnd - sngStart, "Fixed") ' Elapsed time.
 
 
    ' Make excel top most to bring it to the top of other applications.
    SetXLOnTop
 
 
    ' Display message to user.
    If strDescription = "" Then
        Message "", sngElapsed, strQueryName
        Application.StatusBar = "Finished " & strQueryName
    Else
        Message "", sngElapsed, strDescription
        Application.StatusBar = "Finished " & strDescription
    End If
 
 
    ' Make excel not top most to allow other applications to go on top of it.
    SetXLNormal
 
End Sub
 
 
 
' Runs the M10000_Clear_All subroutine.
' Clears all sheets, but leaves the forumulas which are in the 2nd row on most sheets.
Sub Run_M10000_Clear_All()
 
    Call Z99999_Run_Subroutine("M10000_Clear_All", "Clear all")
 
End Sub
 
 
' Runs the M10030_Reset_Formulae subroutine.
' Writes all formulae into the 2nd row on all sheets.
' Usually the green column headings indicate which have formulae.
Sub Run_M10030_Reset_Formulae()
 
    Call Z99999_Run_Subroutine("M10030_Reset_Formulae", "Reset Formulae")
 
End Sub
 
 
' Runs the M10040_Refresh_Queries subroutine.
' Refreshes all queries on all sheets.
Sub Run_M10040_Refresh_Queries()
 
    Call Z99999_Run_Subroutine("M10040_Refresh_Queries", "Refresh Queries")
 
End Sub
 
 
' Runs the M10100_Import_FinalABC subroutine.
' Imports the FinalABC file.
Sub Run_M10100_Import_FinalABC()
 
    Call Z99999_Run_Subroutine("M10100_Import_FinalABC", "Import FinalABC")
 
End Sub
 
 
' Runs the M10110_Copy_Pre_FinalABC_Formulae_Down subroutine.
' Copy initial formulae down on the FinalABC sheet.
' Just enough data to allow the sheet to be later sorted and for the Mapping Pivots to be created.
Sub Run_M10110_Copy_Pre_FinalABC_Formulae_Down()
 
    Call Z99999_Run_Subroutine("M10110_Copy_Pre_FinalABC_Formulae_Down", "Copy pre-FinalABC formulae down")
 
End Sub
 
 
 
' Runs the M10120_Sort_FinalABC_column_A subroutine.
' Sort FinalABC on column A in ascending order.
Sub Run_M10120_Sort_FinalABC_column_A()
 
    Call Z99999_Run_Subroutine("M10120_Sort_FinalABC_column_A", "Sort FinalABC")
 
End Sub
 
 
 
' Runs the M10200_Refresh_Mapping_Pivots subroutine.
' Refresh the Mapping Pivots.
' These only depend on the FinalABC sheet.
Sub Run_M10200_Refresh_Mapping_Pivots()
 
    Call Z99999_Run_Subroutine("M10200_Refresh_Mapping_Pivots", "Refresh Mapping Pivots")
 
End Sub
 
 
 
' Runs the M10300_Import_SHEETNAME1_from_Auto subroutine.
' Import data into the SHEETNAME1 sheet from the "SHEETNAME1 - Auto" sheet instead of from a file.
' The "SHEETNAME1 - Auto" sheet is populated from a query against G3.
Sub Run_M10300_Import_SHEETNAME1_from_Auto()
 
    Call Z99999_Run_Subroutine("M10300_Import_SHEETNAME1_from_Auto", "Import SHEETNAME1 from Auto")
 
End Sub
 
 
' Runs the M10300_Import_SHEETNAME1 subroutine.
' Filename must be in the format SHEETNAME1CCYYMMDD.csv.
' If not MMDD available then use 9999 in their place.
Sub Run_M10300_Import_SHEETNAME1()
 
    Call Z99999_Run_Subroutine("M10300_Import_SHEETNAME1", "Import SHEETNAME1 from a file")
 
End Sub
 
 
 
' Runs the M10400_Update_FinalABC_Formulae subroutine.
' Updates the formulae on the FinalABC sheet to only reference the specific number of rows actually loaded into the
' FinalABC sheet instead of something like A:A which would reference over 1 million rows and therefore may slow down
' calculations etc.
Sub Run_M10400_Update_FinalABC_Formulae()
 
    Call Z99999_Run_Subroutine("M10400_Update_FinalABC_Formulae", "Update FinalABC formulae")
 
End Sub
 
 
 
' Runs the M10410_Copy_Post_FinalABC_Formulae_Down subroutine.
' Copy the updated formula on the FinalABC sheet down for all populated rows.
Sub Run_M10410_Copy_Post_FinalABC_Formulae_Down()
 
    Select Case ctrl_processing_type
 
        Case 1
            Call Z99999_Run_Subroutine("M10415_Copy_Post_FinalABC_Formulae_Down_Array", "Copy post-FinalABC formulae down")
 
        Case 2
            Call Z99999_Run_Subroutine("M10410_Copy_Post_FinalABC_Formulae_Down", "Copy post-FinalABC formulae down")
 
        Case Else
            Call Z99999_Run_Subroutine("M10415_Copy_Post_FinalABC_Formulae_Down_Array", "Copy post-FinalABC formulae down")
 
    End Select
 
End Sub
 
 
 
' Runs the M10500_Copy_Pre_SHEETNAME1_Formulae_Down subroutine.
' Copy pre SHEETNAME1 formula down.
' Just enough data to allow SHEETNAME1 sheet to be sorted.
Sub Run_M10500_Copy_Pre_SHEETNAME1_Formulae_Down()
 
    Select Case ctrl_processing_type
 
        Case 1
            Call Z99999_Run_Subroutine("M10505_Copy_Pre_SHEETNAME1_Formulae_Down_array", "Copy pre-SHEETNAME1 formulae down")
 
        Case 2
            Call Z99999_Run_Subroutine("M10500_Copy_Pre_SHEETNAME1_Formulae_Down", "Copy pre-SHEETNAME1 formulae down")
 
        Case Else
            Call Z99999_Run_Subroutine("M10505_Copy_Pre_SHEETNAME1_Formulae_Down_array", "Copy pre-SHEETNAME1 formulae down")
 
    End Select
 
End Sub
 
 
 
' Runs the M10510_Sort_SHEETNAME1_column_A subroutine.
' Sorts the SHEETNAME1 sheet by Column A and M in ascending order.
Sub Run_M10510_Sort_SHEETNAME1_column_A()
 
    Call Z99999_Run_Subroutine("M10510_Sort_SHEETNAME1_column_A", "Sort SHEETNAME1")
 
End Sub
 
 
 
' Runs the M10520_Update_SHEETNAME1_Formulae subroutine.
' Updates the formulae on the SHEETNAME1 sheet to only reference the specific number of rows actually loaded into the SHEETNAME1 sheet
' instead of something like A:A which would reference over 1 million rows and therefore may slow down calculations etc.
Sub Run_M10520_Update_SHEETNAME1_Formulae()
 
    Select Case ctrl_processing_type
 
        Case 1
            Call Z99999_Run_Subroutine("M10520_Update_SHEETNAME1_Formulae", "Update SHEETNAME1 formulae")
 
        Case 2
            Call Z99999_Run_Subroutine("M10520_Update_SHEETNAME1_Formulae", "Update SHEETNAME1 formulae")
 
        Case Else
            Call Z99999_Run_Subroutine("M10520_Update_SHEETNAME1_Formulae", "Update SHEETNAME1 formulae")
 
    End Select
 
End Sub
 
 
 
' Runs the M10535_Copy_Post_SHEETNAME1_Formulae_Down_Array subroutine.
' Speedy - copies using arrays.
' Copies remaining formulae down on the SHEETNAME1 sheet.
Sub Run_M10535_Copy_Post_SHEETNAME1_Formulae_Down_Array()
 
    Call Z99999_Run_Subroutine("M10535_Copy_Post_SHEETNAME1_Formulae_Down_Array", "Copy post-SHEETNAME1 formulae down")
 
End Sub
 
 
 
' Runs the M10540_Copy_Post_SHEETNAME1_Formulae_Down subroutine.
' Copies remaining formulae down on the SHEETNAME1 sheet.
Sub Run_M10540_Copy_Post_SHEETNAME1_Formulae_Down()
 
    Select Case ctrl_processing_type
 
        Case 1
            Call Z99999_Run_Subroutine("M10535_Copy_Post_SHEETNAME1_Formulae_Down_Array", "Copy post-SHEETNAME1 formulae down")
 
        Case 2
            Call Z99999_Run_Subroutine("M10540_Copy_Post_SHEETNAME1_Formulae_Down", "Copy post-SHEETNAME1 formulae down")
 
        Case Else
            Call Z99999_Run_Subroutine("M10535_Copy_Post_SHEETNAME1_Formulae_Down_Array", "Copy post-SHEETNAME1 formulae down")
 
    End Select
 
End Sub
 
 
 
' Runs the M10600_Copy_More_FinalABC_Formulae_Down subroutine.
' Now that both Final and SHEETNAME1 sheets populated, need to action some more formula calculations.
Sub Run_M10600_Copy_More_FinalABC_Formulae_Down()
 
    Call Z99999_Run_Subroutine("M10600_Copy_More_FinalABC_Formulae_Down", "Copy more FinalABC formulae down")
 
End Sub
 
 
 
' Runs the M10610_Reformat_FinalABC_Corrected_Dates subroutine.
' Adds 1 to the Corrected Date, column E, in the FinalABC sheet for dates that were the last date of the month.
' It then recalculates the sheet to determine if column AJ now reconciles, i.e. shows "MATCHED GROSS AMOUNT ISIN BY MONTH".
' This requires the following columns to have formulae throughout:  E, L, K, AI, AJ
Sub Run_M10610_Reformat_FinalABC_Corrected_Dates()
 
    Call Z99999_Run_Subroutine("M10610_Reformat_FinalABC_Corrected_Dates", "Reformat FinalABC corrected dates")
 
End Sub
 
 
 
' Runs the M10620_Recalc_SHEETNAME1_Formulae subroutine.
' Copies remaining formulae down on the SHEETNAME1 sheet.
Sub Run_M10620_Recalc_SHEETNAME1_Formulae()
 
    Select Case ctrl_processing_type
 
        Case 1
            Call Z99999_Run_Subroutine("M10615_Recalc_SHEETNAME1_Formulae_Array", "Recalc SHEETNAME1 formulae")
 
        Case 2
            Call Z99999_Run_Subroutine("M10625_Recalc_SHEETNAME1_Formulae", "Recalc SHEETNAME1 formulae")
 
        Case Else
            Call Z99999_Run_Subroutine("M10615_Recalc_SHEETNAME1_Formulae_Array", "Recalc SHEETNAME1 formulae")
 
    End Select
 
End Sub
 
 
' Runs the M10700_Format_FinalABC_lines subroutine.
' Format the FinalABC sheet to put lines between ISINs.
Sub Run_M10700_Format_FinalABC_lines()
 
    Call Z99999_Run_Subroutine("M10700_Format_FinalABC_lines", "Format FinalABC lines")
 
End Sub
 
 
 
' Runs the M10710_Format_SHEETNAME1_Lines subroutine.
' Format the SHEETNAME1 sheet by placing lines between ISINs.
Sub Run_M10710_Format_SHEETNAME1_Lines()
 
    Call Z99999_Run_Subroutine("M10710_Format_SHEETNAME1_Lines", "Format SHEETNAME1 lines")
 
End Sub
 
 
 
' Runs the M10800_Refresh_Rec_Dashboard_Pivots subroutine.
' Refresh the PIVOT tables on the REC DASHBOARD sheet.
Sub Run_M10800_Refresh_Rec_Dashboard_Pivots()
 
    Call Z99999_Run_Subroutine("M10800_Refresh_Rec_Dashboard_Pivots", "Refresh REC-Dashboard pivots")
 
End Sub
 
 
 
' Runs the M10810_Refresh_Adj_Dashboard_Pivots subroutine.
' Refresh the PIVOT tables on the ADJ DASHBOARD sheet.
Sub Run_M10810_Refresh_Adj_Dashboard_Pivots()
 
    Call Z99999_Run_Subroutine("M10810_Refresh_Adj_Dashboard_Pivots", "Refresh ADJ-Dashboard pivots")
 
End Sub
 
 
 
' Runs the M10910_Revert_Reformatted_FinalABC_Corrected_Dates subroutine.
' Reverts the Corrected Date, column E, in the FinalABC sheet back to its original calculated date.
' It only does this for cells where column AJ does not still reconciles, i.e. does not show "MATCHED GROSS AMOUNT ISIN BY MONTH".
' This requires the following columns to have formulae throughout:  E, L, K, AI, AJ
Sub Run_M10910_Revert_Reformatted_FinalABC_Corrected_Dates()
 
    Call Z99999_Run_Subroutine("M10910_Revert_Reformatted_FinalABC_Corrected_Dates", "Revert reformatted FinalABC corrected dates")
 
End Sub
 
 
' Runs the M11000_Clear_SHEETNAME1_lines subroutine.
' Clears formatting on the SHEETNAME1 sheet.
' Removes the lines between ISINs.
Sub Run_M11000_Clear_SHEETNAME1_lines()
 
    Call Z99999_Run_Subroutine("M11000_Clear_SHEETNAME1_lines", "Clear SHEETNAME1 lines")
 
End Sub
 
 
' Runs the M1110_Clear_FinalABC_lines subroutine.
' Clears formatting on the FinalABC sheet.  Removes the lines between ISINs.
Sub Run_M11110_Clear_FinalABC_lines()
 
    Call Z99999_Run_Subroutine("M11110_Clear_FinalABC_lines", "Clear FinalABC lines")
 
End Sub
 
 
' Runs the M11200_Recalc_changed_adjusted_rows subroutine.
' For any row that has adjusted values different than the original value it recalculates the values against that row.
' It does this by putting formulae back in only for the specific row and then performing the recalc.
' Later the formula are replaced by values again.
Sub Run_M11200_Recalc_changed_adjusted_rows()
 
    Select Case ctrl_processing_type
 
        Case 1
 
            Call Z99999_Run_Subroutine("M11205_Recalc_changed_adjusted_rows_Array_NEW", "Recalc changed adjusted rows")
            'Call Z99999_Run_Subroutine("M11200_Recalc_changed_adjusted_rows_Array", "Recalc changed adjusted rows")
 
        Case 2
            Call Z99999_Run_Subroutine("M11210_Recalc_changed_adjusted_rows", "Recalc changed adjusted rows")
 
        Case Else
            Call Z99999_Run_Subroutine("M11200_Recalc_changed_adjusted_rows_Array", "Recalc changed adjusted rows")
 
    End Select
 
 
End Sub
 
 
' Runs the M11207_Recalc_changed_adjusted_rows subroutine.
' This prompt the user for a row in the SHEETNAME1 sheet.
' It then recalculates the values against that row.
' It does this by putting formulae back in only for the specific row and then performing the recalc.
' Later the formula are replaced by values again.
Sub Run_M11207_Recalc_changed_adjusted_rows()
 
    Call Z99999_Run_Subroutine("M11207_Recalc_changed_adjusted_rows_Array_NEW", "Recalc changed adjusted rows - SHEETNAME1")
 
End Sub
 
 
' Runs the M11208_Recalc_changed_adjusted_rows subroutine.
' This prompt the user for a row in the FinalABC sheet.
' It then recalculates the values against that row.
' It does this by putting formulae back in only for the specific row and then performing the recalc.
' Later the formula are replaced by values again.
Sub Run_M11208_Recalc_changed_adjusted_rows()
 
    Call Z99999_Run_Subroutine("M11208_Recalc_changed_adjusted_rows_Array_NEW", "Recalc changed adjusted rows - FinalABC")
 
End Sub
 
 
 
 
 
' Runs the M12000_Copy_FinalABC_Formulae_Down subroutine.
' Copies all formulae down on the FinalABC sheet.
' Does not change the formula to values.  For that use the seperate subroutine.
' Does not calculate.  This needs to be requested seperately when needed.  Probably only once the SHEETNAME1 sheet populated too.
' This may run for a very long time.  Go have a coffee.
Sub Run_M12000_Copy_FinalABC_Formulae_Down()
 
    Call Z99999_Run_Subroutine("M12000_Copy_FinalABC_Formulae_Down", "Copy FinalABC formulae down")
 
End Sub
 
 
 
' Runs the M12010_Convert_FinalABC_Formulae_to_Values subroutine.
' Converts all formulae on the FinalABC sheet to Values.
' Does not change row 2 of the FinalABC sheet.  This retains the formulae in this row.
' This may run for a very long time.  Go have a coffee.
Sub Run_M12010_Convert_FinalABC_Formulae_to_Values()
 
    Call Z99999_Run_Subroutine("M12010_Convert_FinalABC_Formulae_to_Values", "Convert FinalABC formulae to values")
 
End Sub
 
 
 
' Runs the M12020_Copy_SHEETNAME1_Formulae_Down subroutine.
' Copies down all formulae on the SHEETNAME1 sheet.
' Does not change the formula to values.  For that use the seperate subroutine.
' Does not calculate.  This needs to be requested seperately when needed.  Probably only once the FinalABC sheet populated too.
' This may run for a very long time.  Go have a coffee.
Sub Run_M12020_Copy_SHEETNAME1_Formulae_Down()
 
    Call Z99999_Run_Subroutine("M12020_Copy_SHEETNAME1_Formulae_Down", "Copy SHEETNAME1 formulae down")
 
End Sub
 
 
 
' Runs the M12030_Convert_SHEETNAME1_Formulae_to_Values subroutine.
' Converts all formula cells on the SHEETNAME1 sheet into values.
' Does not change row 2 of the SHEETNAME1 sheet.  This retains the formulae in this row.
' This may run for a very long time.  Go have a coffee.
Sub Run_M12030_Convert_SHEETNAME1_Formulae_to_Values()
 
    Call Z99999_Run_Subroutine("M12030_Convert_SHEETNAME1_Formulae_to_Values", "Convert SHEETNAME1 formulae to values")
 
End Sub
 
 
 
' Runs the M13000_Import_Wxxxx subroutine.
' Imports the Wxxxx file into the Wxxxx tab.
' This also sorts the result and places in formulas.
Sub Run_M13000_Import_Wxxxx()
 
    Call Z99999_Run_Subroutine("M13000_Import_Wxxxx", "Import Wxxxx")
 
End Sub
 
 
 
' Clears all sheets, but leaves the formulae which are in the 2nd row on most sheets.
Sub M10000_Clear_All()
 
    ' Initialize global vars.
    Call Z00000_Init
 
 
    ' Ask user.
    If ctrl_ask_before_running_subroutine = True Then
        If MsgBox("Clear all sheets?", vbYesNo) = vbNo Then Exit Sub
    End If
 
 
    ' Clear the SHEETNAME1 sheet.
    Call M10010_Clear_SHEETNAME1
 
 
    ' Clear the FinalABC sheet.
    Call M10020_Clear_FinalABC
 
End Sub
 
 
 
' Clears the SHEETNAME1 sheet, but leaves the formulae which are in the 2nd row.
Sub M10010_Clear_SHEETNAME1()
 
    Dim lastrow_SHEETNAME1 As Long                    ' Last row in the SHEETNAME1 sheet
    Dim rng As Range
    Dim i As Long
 
 
    ' Initialize global vars.
    Call Z00000_Init
 
 
    ' Ask user.
    'If ctrl_ask_before_running_subroutine = True Then
    '    If MsgBox("Clear the SHEETNAME1 sheet?", vbYesNo) = vbNo Then Exit Sub
    'End If
 
 
    ' Update StatusBar.
    Application.StatusBar = "Clearing SHEETNAME1 sheet..."
 
 
    With Workbooks(wb_name)
 
        With .Sheets("SHEETNAME1")
 
            ' Activate the sheet.
            .Activate
 
 
            ' Get how many rows of data have been loaded into the sheet.
            lastrow_SHEETNAME1 = .Cells(Rows.Count, 4).End(xlUp).Row
            ' Prevent line 2 being deleted - as this contains the formulae which need coping down later.
            If lastrow_SHEETNAME1 < 3 Then
                lastrow_SHEETNAME1 = 3
            End If
 
 
            ' Set entire range to blank.
            Set rng = .Range("A3:BO" & lastrow_SHEETNAME1)
            rng.Value = ""
 
 
            ' Clear entire sheet, except for row 2 which contains formulae.
            ' Uses ClearContents instead of Delete as much quicker.
            ' ClearContents only clears the cell value and not the formatting if any.
            For i = lastrow_SHEETNAME1 To 3 Step -1
                .Rows(i).ClearContents
            Next i
 
 
            ' Clear fields loaded from SHEETNAME1 file.
            .Range("C2:E" & lastrow_SHEETNAME1).ClearContents
            .Range("G2:G" & lastrow_SHEETNAME1).ClearContents
            .Range("I2:I" & lastrow_SHEETNAME1).ClearContents
            .Range("N2:S" & lastrow_SHEETNAME1).ClearContents
            .Range("U2:U" & lastrow_SHEETNAME1).ClearContents
 
 
            ' Clear formatting.
            If ctrl_clear_formatting_as_well = True Then
                .Range("A3:BO" & lastrow_SHEETNAME1).ClearFormats
 
                .Range("C2:E" & lastrow_SHEETNAME1).ClearFormats
                .Range("G2:G" & lastrow_SHEETNAME1).ClearFormats
                .Range("I2:I" & lastrow_SHEETNAME1).ClearFormats
                .Range("N2:S" & lastrow_SHEETNAME1).ClearFormats
                .Range("U2:U" & lastrow_SHEETNAME1).ClearFormats
            End If
 
 
            ' Clear any double lines.  These are used to flag where the ISIN changes.
            .Range("A1:BO" & lastrow_SHEETNAME1).Borders.LineStyle = xlNone
 
 
            ' Reset font to standard.
            .Range("A2:BO" & lastrow_SHEETNAME1).Font.name = Application.StandardFont
 
 
            ' Delete all unused rows and columns in the sheet.
            DeleteUnusedOnSheet ("SHEETNAME1")
 
        End With
    End With
 
 
    ' Do calculation.
    With Application
        .Calculate
    End With
 
 
    ' Clear all objects.
    Set rng = Nothing
 
End Sub
 
 
 
' Clears the FinalABC sheet, but leaves the formulae which are in the 2nd row.
Sub M10020_Clear_FinalABC()
 
    Dim lastrow_FinalABC As Long                ' Last row in the FinalABC sheet
    Dim rng As Range
 
 
    ' Initialize global vars.
    Call Z00000_Init
 
 
    ' Ask user.
    'If ctrl_ask_before_running_subroutine = True Then
    '    If MsgBox("Clear the FinalABC sheet?", vbYesNo) = vbNo Then Exit Sub
    'End If
 
 
    ' Update StatusBar.
    Application.StatusBar = "Clearing FinalABC sheet..."
 
 
    With Workbooks(wb_name)
 
        With .Sheets("FinalABC")
 
            ' Activate the sheet.
            .Activate
 
 
            ' Get how many rows of data have been loaded into the sheet.
            lastrow_FinalABC = .Cells(Rows.Count, 4).End(xlUp).Row
            ' Prevent line 2 being deleted - as this contains the formulae which need coping down later.
            If lastrow_FinalABC < 3 Then
                lastrow_FinalABC = 3
            End If
 
 
            ' Clear entire sheet, except for row 2 which contains formulae.
            .Range("A3:AT" & lastrow_FinalABC).ClearContents
 
 
            ' Clear fields loaded from BBH file.
            .Range("D2:D" & lastrow_FinalABC).ClearContents
            .Range("F2:I" & lastrow_FinalABC).ClearContents
            .Range("O2:O" & lastrow_FinalABC).ClearContents
            .Range("S2:AH" & lastrow_FinalABC).ClearContents
 
 
            ' Clear formatting.
            If ctrl_clear_formatting_as_well = True Then
                .Range("A3:AT" & lastrow_FinalABC).ClearFormats
 
                .Range("D2:D" & lastrow_FinalABC).ClearFormats
                .Range("F2:I" & lastrow_FinalABC).ClearFormats
                .Range("O2:O" & lastrow_FinalABC).ClearFormats
                .Range("S2:AH" & lastrow_FinalABC).ClearFormats
            End If
 
 
            ' Clear any double lines.  These are used to flag where the ISIN changes.
            .Range("A1:AT" & lastrow_FinalABC).Borders.LineStyle = xlNone
 
 
            ' Reset font to standard.
            .Range("A3:AT" & lastrow_FinalABC).Font.name = Application.StandardFont
 
 
            ' This deletes empty rows at the bottom of the sheet.  Important to save after this is run to commit this change.
            ' This substantially reduces the size of the sheet, especially in larger Excel sheets going down to over 1 Million rows.
            '.Range("A" & lastrow_FinalABC & ":AT" & Rows.Count).EntireRow.Delete
 
 
            ' Delete all unused black rows and columns in the sheet.
            DeleteUnusedOnSheet ("FinalABC")
 
 
            ' Control to confirm there is currently no data in the blue columns in the FinalABC sheet.
            If WorksheetFunction.CountA( _
                .Range("D2:D" & lastrow_FinalABC), _
                .Range("F2:I" & lastrow_FinalABC), _
                .Range("O2:O" & lastrow_FinalABC), _
                .Range("S2:AH" & lastrow_FinalABC)) > 0 Then
                    Message "There is data still present in the blue columns in the FinalABC sheet, these should be blank. Ensure they are empty before running this process."
                    Exit Sub
            End If
 
        End With
    End With
 
 
    ' Do calculation.
    With Application
        .Calculate
    End With
 
 
    ' Clear all objects.
    Set rng = Nothing
 
End Sub
 
 
 
' Writes all formulae into the 2nd row on all sheets.
' Usually the green column headings indicate which have formulae.
Sub M10030_Reset_Formulae()
 
    ' Initialize global vars.
    Call Z00000_Init
 
 
    ' Ask user.
    If ctrl_ask_before_running_subroutine = True Then
        If MsgBox("Reset all Formulae?", vbYesNo) = vbNo Then Exit Sub
    End If
 
 
    ' Update StatusBar.
    Application.StatusBar = "Resetting Formulae..."
 
 
    With Workbooks(wb_name)
 
        ' Resets formulae on TRANSACTIONS.
        'With .Sheets("TRANSACTIONS")
        '    .Activate
        '    .Range("A2").Formula = "=B2&F2&K2"
        'End With
 
        ' Resets formulae on SHEETNAME1.
        With .Sheets("SHEETNAME1")
            .Activate
 
            ' Update StatusBar.
            Application.StatusBar = "Resetting Formulae...on SHEETNAME1"
 
            .Range("A2").Formula = "=B2&"" - ""&TEXT(C2,""MMM"")&"" ""&YEAR(C2)"
            .Range("B2").Formula = "=IFERROR(VLOOKUP(N2,SECT!A:B,2,FALSE),"""")"
            .Range("F2").Formula = "=IF(X2=""EXCLUDE"",0,G2)"
            .Range("H2").Formula = "=G2-J2"
            .Range("J2").Formula = "=IF(K2="""",I2,IF(L2="""",I2,IF(OR(L2=0,K2=0),0,I2/(L2/K2))))"
            .Range("L2").Formula = "=IF(G2=0,0,I2/G2)"
            .Range("M2").Formula = "=VLOOKUP(U2,References!A:B,2,FALSE)"
            .Range("T2").Formula = "=VLOOKUP(R2,CUST!A:B,2,FALSE)"
            .Range("V2").Formula = "=IF(ISNA(VLOOKUP(B2,FinalABC!$D:$D,1,FALSE)),""NON EXIST"",""EXIST"")"
            .Range("W2").Formula = "=B2=B1"
            .Range("X2").Formula = "=IF(ISNA(VLOOKUP(A2,FinalABC!A:A,1,FALSE)),""NON EXIST"",""EXIST"")"
            .Range("AB2").Formula = "=IF(OR(X2=""NON EXIST"",Y2=""EXCLUDE""),""NON REPORTABLE"",A2&"" - ""&ROUND(F2,0))"
            .Range("AC2").Formula = "=IF(OR($X2=""NON EXIST"",$Y2=""EXCLUDE""),""NON REPORTABLE"",IFERROR(VLOOKUP($A2,'Mapping Pivots'!$A:$B,2,FALSE), IFERROR(VLOOKUP($AB2,'Mapping Pivots'!$F:$G,2,FALSE), ""MANUAL INPUT"")))"
            .Range("AE2").Formula = "=IF(OR($X2=""NON EXIST"",$Y2=""EXCLUDE""),""NON REPORTABLE"",IFERROR(VLOOKUP($A2,'Mapping Pivots'!$A:$C,3,FALSE),IFERROR(VLOOKUP($AB2,'Mapping Pivots'!$F:$H,3,FALSE), ""MANUAL INPUT"")))"
            .Range("AG2").Formula = "=IF(OR($X2=""NON EXIST"",$Y2=""EXCLUDE""),""NON REPORTABLE"",IF(COUNTIF($A$1:A2,A2)>1,""AGGREGATE"",ROUND(SUMIF($A:$A,A2,$J:$J)-SUMIF(FinalABC!$A:$A,A2,FinalABC!$N:$N),2)))"
            .Range("AH2").Formula = "=IF(AG2=""NON REPORTABLE"",AG2,IF(AND(ROUND(SUMIFS($J:$J,$A:$A,A2,$Y:$Y,""INCLUDE"")-SUMIF(FinalABC!$A:$A,A2,FinalABC!$N:$N),2)>-1,ROUND(SUMIFS($J:$J,$A:$A,A2,$Y:$Y,""INCLUDE"")-SUMIF(FinalABC!$A:$A,A2,FinalABC!$N:$N),2)<1),K2,""MANUAL INPUT""))"
            .Range("AJ2").Formula = "=IF(OR($X2=""NON EXIST"",$Y2=""EXCLUDE""),""NON REPORTABLE"",ROUND(E2*SUM(AI2/100),2))"
            .Range("AK2").Formula = "=IF(OR($X2=""NON EXIST"",$Y2=""EXCLUDE""),""NON REPORTABLE"",SUMIF($A:$A,A2,$AJ:$AJ)-SUMIF(FinalABC!$A:$A,A2,FinalABC!$N:$N))"
            .Range("AL2").Formula = "=IF(OR($X2=""NON EXIST"",$Y2=""EXCLUDE""), ""NON REPORTABLE"", IFERROR(VLOOKUP($A2,'Mapping Pivots'!$A:$D,4,FALSE), IFERROR(VLOOKUP($AB2,'Mapping Pivots'!$F:$I,4,FALSE), ""MANUAL INPUT"")))"
            .Range("AN2").Formula = "=IF(OR($X2=""NON EXIST"",$Y2=""EXCLUDE""),""NON REPORTABLE"",IFERROR(VLOOKUP(A2&"" - ""&AM2,'Mapping Pivots'!$K:$M,2,FALSE),0))"
            .Range("AO2").Formula = "=IF(OR($X2=""NON EXIST"",$Y2=""EXCLUDE""),""NON REPORTABLE"",IF(AN2=0,0,F2/AN2))"
            .Range("AP2").Formula = "=IF(OR($X2=""NON EXIST"",$Y2=""EXCLUDE""),""NON REPORTABLE"",IF(COUNTIF($A$1:A2,A2)>1,""AGGREGATE"",SUMIF($A:$A,A2,$AO:$AO)-SUMIF(FinalABC!$A:$A,A2,FinalABC!$K:$K)))"
            .Range("AQ2").Formula = "=IF(OR($X2=""NON EXIST"",$Y2=""EXCLUDE""),""NON REPORTABLE"",T2&"" - ""&  IFERROR(IF(VLOOKUP(R2,Wxxxx!B:Z,24,FALSE)=""YES"", ""VALID"", ""INVALID""),""INVALID"")&"" - "" & IFERROR(VLOOKUP(R2,Wxxxx!B:Z,25,FALSE),""N"") &"" - ""&K2)"
            .Range("AR2").Formula = "=IF(OR($X2=""NON EXIST"",$Y2=""EXCLUDE""),""NON REPORTABLE"",IFERROR(VLOOKUP(AQ2,References!$H$1:$K$45,2,FALSE),0))"
            .Range("AS2").Formula = "=IF(OR($X2=""NON EXIST"",$Y2=""EXCLUDE""),""NON REPORTABLE"",IFERROR(VLOOKUP(AQ2,References!$H$1:$K$45,3,FALSE),0))"
            .Range("AT2").Formula = "=IF(OR($X2=""NON EXIST"",$Y2=""EXCLUDE""),""NON REPORTABLE"",IFERROR(VLOOKUP(AQ2,References!$H$1:$K$45,4,FALSE),0))"
            .Range("AV2").Formula = "=IF(OR($X2=""NON EXIST"",$Y2=""EXCLUDE""),""NON REPORTABLE"",IFERROR(VLOOKUP(AD2&"" - ""&AF2,References!S:W,3,FALSE),0))"
            .Range("AW2").Formula = "=IF(OR($X2=""NON EXIST"",$Y2=""EXCLUDE""),""NON REPORTABLE"",IF(OR(AR2=""NO ADJUSTMENT REQUIRED"",K2=AU2),""NO ADJUSTMENT REQUIRED"",""ADJUST FROM ""&K2&""% TO ""&AU2&""% - BBH REPORTED ""&AH2&""%""))"
            .Range("AX2").Formula = "=IF(OR($X2=""NON EXIST"",$Y2=""EXCLUDE""),""NON REPORTABLE"",IF(R2=530572,""BPB&T IOM"",IF(T2=""IBGC"",""BPCI"",""BPB&T Jersey"")))"
            .Range("AY2").Formula = "=IF(WV2=""NO ADJUSTMENT REQUIRED"",""NO ADJUSTMENT REQUIRED"",IF(AW2=""NON REPORTABLE"",""NON REPORTABLE"",ROUND((F2*AU2%)-J2,2)))"
            .Range("BB2").Formula = "=IF(ISNA(VLOOKUP(U2,References!$AG:$AG,1,FALSE)),""NO ADJUSTMENT REQUIRED"",IF(AW2=""NO ADJUSTMENT REQUIRED"",""NO ADJUSTMENT REQUIRED"",IF(AW2=""NON REPORTABLE"",""NON REPORTABLE"",IFERROR(VLOOKUP(T2&"" - ""&AT2,References!$O$2:$Q$5,3,FALSE),0))))"
            .Range("BD2").Formula = "=IF(AW2=""NO ADJUSTMENT REQUIRED"",""NO ADJUSTMENT REQUIRED"",IF(AW2=""NON REPORTABLE"",""NON REPORTABLE"",IFERROR(VLOOKUP(T2& "" - "" &AU2,References!$O$2:$Q$5,2,FALSE),0)))"
            .Range("BE2").Formula = "=IF(AW2=""NO ADJUSTMENT REQUIRED"",""NO ADJUSTMENT REQUIRED"",IF(AW2=""NON REPORTABLE"",""NON REPORTABLE"",IF(BD2<>M2,""Yes"",""No"")))"
            .Range("BG2").Formula = "=IF(ISNA(VLOOKUP(R2&N2,HOLDINGS!A:A,1,FALSE)),""NO HOLDINGS"",""STILL HAS HOLDINGS"")"
            .Range("BH2").Formula = "=IFERROR(VLOOKUP(R2&N2,HOLDINGS!A:F,6,FALSE), ""NO HOLDINGS"")"
            .Range("BI2").Formula = "=IF(BH2=""NO HOLDINGS"",""NO HOLDINGS"",IFERROR(VLOOKUP(BH2,References!A:B,2,FALSE),0))"
            .Range("BJ2").Formula = "=IF(OR(BB2=""NO ADJUSTMENT REQUIRED"",Y2=""EXCLUDE""),""NO ADJUSTMENT REQUIRED"",IFERROR(VLOOKUP(LEFT(P2,6)&TEXT(H2,""#.00"")&R2,TRANSACTIONS!A:L,12,FALSE),0))"
            .Range("BK2").Formula = "=IF(OR(BB2=""NO ADJUSTMENT REQUIRED"",Y2=""EXCLUDE""),""NO ADJUSTMENT REQUIRED"",IFERROR(VLOOKUP(LEFT(P2,6)&TEXT(H2,""#.00"")&R2,TRANSACTIONS!A:M,13,FALSE),0))"
            .Range("BL2").Formula = "=IF(OR(BB2=""NO ADJUSTMENT REQUIRED"",Y2=""EXCLUDE""),""NO ADJUSTMENT REQUIRED"",IFERROR(VLOOKUP(LEFT(P2,6)&TEXT(H2,""#.00"")&R2,TRANSACTIONS!A:N,14,FALSE),0))"
            .Range("BM2").Formula = "=IF(ISNA(VLOOKUP(R2,QSHEET!A:A,1,FALSE)),""NOT ON QSHEET"", ""ON QSHEET"")"
        End With
 
 
        ' Resets formulae on FinalABC.
        With .Sheets("FinalABC")
            .Activate
 
            ' Update StatusBar.
            Application.StatusBar = "Resetting Formulae...on FinalABC"
 
            .Range("A2").Formula = "=D2&"" - ""&TEXT(E2,""MMM"")&"" ""&YEAR(E2)"
            .Range("B2").Formula = "=A2&"" - ""&ROUND(L2,0)"
            .Range("C2").Formula = "=A2&"" - ""&G2"
            .Range("E2").Formula = "=TEXT(MID(F2,FIND("" "",F2)+1,FIND("","",F2)-FIND("" "",F2)-1)&"" ""&LEFT(F2,FIND("" "",F2)-1)&"" ""&RIGHT(F2,4),""dd/mm/yyyy"")"
            .Range("K2").Formula = "=I2+J2"
            .Range("L2").Formula = "=K2*AE2"
            .Range("M2").Formula = "=L2-N2"
            .Range("N2").Formula = "=P2*AE2"
            .Range("P2").Formula = "=IF(R2="""",K2*S2/100,K2*R2/100)"
            .Range("Q2").Formula = "=IF(R2="""",S2*100,R2*100)"
            .Range("AI2").Formula = "=IF(ISNA(VLOOKUP(D2,'SHEETNAME1'!G:G,1,FALSE)),""NOT FOUND"",""FOUND"")"
            .Range("AJ2").Formula = "=D2=D1"
            .Range("AK2").Formula = "=IF(COUNTIF($A$1:A2,A2)>1,""AGGREGATE"",SUMIF($A:$A,A2,$L:$L)-SUMIF('SHEETNAME1'!$A:$A,A2,'SHEETNAME1'!$F:$F))"
            .Range("AL2").Formula = "=IF(A2=A1,AL1,IF(AND(AK2>-0.1,AK2<0.1),""MATCHED GROSS AMOUNT ISIN BY MONTH"",""GROSS AMOUNT NOT MATCHED ISIN BY MONTH""))"
            .Range("AM2").Formula = "=IF(COUNTIF($A$1:A2,A2)>1,""AGGREGATE"",SUMIF($A:$A,A2,$K:$K)-SUMIF('SHEETNAME1'!A:A,A2,'SHEETNAME1'!$AN:$AN))"
            .Range("AR2").Formula = "=IF(COUNTIF($A$1:$A2,$A2)>1,""AGGREGATE"",SUMIF($A:$A,$A2,$O:$O)-SUMIF(SHEETNAME1!$A:$A,$A2,SHEETNAME1!$J:$J))"
            .Range("AS2").Formula = "=IF(A2=A1,AS1,IF(AND(AR2>-0.1,AR2<0.1),""MATCHED TAX AMOUNT ISIN BY MONTH"",""TAX AMOUNT NOT MATCHED ISIN BY MONTH""))"
            .Range("AT2").Formula = "=IF(COUNTIF($A$1:$A2,$A2)>1,""AGGREGATE"",SUMIF($A:$A,$A2,$O:$O)-SUMIF(SHEETNAME1!$A:$A,$A2,SHEETNAME1!$I:$I))"
        End With
 
 
        ' Resets formulae on References.
        ' These are hard-coded for various rows as small in number.
        With .Sheets("References")
            .Activate
 
            ' Update StatusBar.
            Application.StatusBar = "Resetting Formulae...on References"
 
            .Range("O2").Formula = "=M2&"" - ""&N2"
            .Range("O3").Formula = "=M3&"" - ""&N3"
            .Range("O4").Formula = "=M4&"" - ""&N4"
            .Range("O5").Formula = "=M5&"" - ""&N5"
            .Range("S2").Formula = "=V2&"" - ""&W2"
            .Range("S3").Formula = "=V3&"" - ""&W3"
            .Range("S4").Formula = "=V4&"" - ""&W4"
            .Range("S5").Formula = "=V5&"" - ""&W5"
            .Range("S6").Formula = "=V6&"" - ""&W6"
            .Range("S7").Formula = "=V7&"" - ""&W7"
            .Range("S8").Formula = "=V8&"" - ""&W8"
            .Range("S9").Formula = "=V9&"" - ""&W9"
            .Range("S10").Formula = "=V10&"" - ""&W10"
        End With
 
 
        ' Resets formulae on QSHEET.
        With .Sheets("QSHEET")
            .Activate
 
            ' Update StatusBar.
            Application.StatusBar = "Resetting Formulae...on QSHEET"
 
            .Range("E2").Formula = "=VLOOKUP(A2,C:C,1,FALSE)"
        End With
 
 
        ' Resets formulae on "Wxxxx".
        With .Sheets("Wxxxx")
            .Activate
 
            ' Update StatusBar.
            Application.StatusBar = "Resetting Formulae...on Wxxxx"
 
            .Range("Y2").Formula = "=IF(AND(YEAR(T2)>=YEAR(NOW()), YEAR(T2)-YEAR(S2)<=3),IF(TRIM(C2)<>"""",IF(E2=TRUE,IF(G2=TRUE,IF(TRIM(K2)<>""All Other Countries"",IF(O2=TRUE,IF(P2=TRUE,IF(Q2=TRUE,IF(X2=FALSE,""YES"",""NO1""),""NO2""),""NO3""),""NO4""),""NO5""),""NO6""),""NO7""),""NO8""),""NO9"")"
            .Range("Z2").Formula = "=IF(Y2=""YES"",IFERROR(VLOOKUP(K2,References!AI:AJ,2,FALSE),30),30)"
        End With
    End With
 
End Sub
 
 
 
' Refreshes all queries on all sheets.
Sub M10040_Refresh_Queries()
 
    Dim cn As WorkbookConnection
 
 
    ' Initialize global vars.
    Call Z00000_Init
 
 
    ' Ask user.
    If ctrl_ask_before_running_subroutine = True Then
        If MsgBox("Refresh all queries?", vbYesNo) = vbNo Then Exit Sub
    End If
 
 
    ' First, ensure that the queries do not run in the background.
    ' The queries need to really complete before we continue with the next subroutines.
    For Each cn In ThisWorkbook.Connections
        If cn.Type = xlConnectionTypeODBC Then
            cn.ODBCConnection.BackgroundQuery = False
        End If
 
        If cn.Type = xlConnectionTypeOLEDB Then
            cn.OLEDBConnection.BackgroundQuery = False
        End If
 
 
        ' Update status message.
        Application.StatusBar = "Refreshing " & cn.name & "..."
 
 
        ' Refresh the query.
        cn.Refresh
    Next cn
 
 
    ' Call Sort_Queries
    Call M10050_Sort_Queries
 
 
    ' Clear all variables.
    Set cn = Nothing
 
End Sub
 
 
' Sorts all queries on all sheets.
' Unfortunately, the SQL sort does not match how Excel sorts the data, and therefore these are resorted per Excel.
Sub M10050_Sort_Queries()
 
    Dim lastrow_SHEETNAME1Auto As Long
    Dim lastrow_CUST As Long
    Dim lastrow_HOLDINGS As Long
    Dim lastrow_QSHEET As Long
    Dim lastrow_SECT As Long
    Dim lastrow_TRANSACTIONS As Long
    Dim lastrow_Wxxxx As Long
 
 
    ' Initialize global vars.
    Call Z00000_Init
 
 
    ' Ask user.
'    If ctrl_ask_before_running_subroutine = True Then
'        If MsgBox("Sort all queries?", vbYesNo) = vbNo Then Exit Sub
'    End If
 
 
    ' Update StatusBar.
    Application.StatusBar = "Sorting Queries..."
 
 
    With Workbooks(wb_name)
 
        With .Sheets("SECT")
 
            ' Activates the sheet.
            .Activate
 
 
            ' Update StatusBar.
            Application.StatusBar = "Sorting Queries...on SECT"
 
 
            ' Determine the number of rows.
            lastrow_SECT = .Cells(Rows.Count, 1).End(xlUp).Row
 
 
            ' Do the sort.
            With .Sort
 
                '.AutoFilter
                With .SortFields
                    .Clear
                    .Add Key:=Range("A1:A" & lastrow_SECT), SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:=xlSortNormal
                End With
 
                .SetRange Range("A1:B" & lastrow_SECT)
                .Header = xlYes
                .MatchCase = False
                .Orientation = xlTopToBottom
                .SortMethod = xlPinYin
                .Apply
 
            End With
 
 
            ' Select A1.
            ScrollTo ActiveSheet.name, "A1"
 
        End With
 
 
        With .Sheets("TRANSACTIONS")
 
            ' Activates the sheet.
            .Activate
 
 
            ' Update StatusBar.
            Application.StatusBar = "Sorting Queries...on TRANSACTIONS"
 
 
            ' Determine the number of rows.
            lastrow_TRANSACTIONS = .Cells(Rows.Count, 1).End(xlUp).Row
 
 
            ' Do the sort.
            With .Sort
 
                '.AutoFilter
                With .SortFields
                    .Clear
                    .Add Key:=Range("A1:A" & lastrow_TRANSACTIONS), SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:=xlSortNormal
                End With
 
                .SetRange Range("A1:N" & lastrow_TRANSACTIONS)
                .Header = xlYes
                .MatchCase = False
                .Orientation = xlTopToBottom
                .SortMethod = xlPinYin
                .Apply
 
            End With
 
 
            ' Select A1.
            ScrollTo ActiveSheet.name, "A1"
 
        End With
 
 
        With .Sheets("HOLDINGS")
 
            ' Activates the sheet.
            .Activate
 
 
            ' Update StatusBar.
            Application.StatusBar = "Sorting Queries...on HOLDINGS"
 
 
            ' Determine the number of rows.
            lastrow_HOLDINGS = .Cells(Rows.Count, 1).End(xlUp).Row
 
 
            ' Do the sort.
            With .Sort
 
                '.AutoFilter
                With .SortFields
                    .Clear
                    .Add Key:=Range("A1:A" & lastrow_HOLDINGS), SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:=xlSortNormal
                End With
 
                .SetRange Range("A1:Y" & lastrow_HOLDINGS)
                .Header = xlYes
                .MatchCase = False
                .Orientation = xlTopToBottom
                .SortMethod = xlPinYin
                .Apply
 
            End With
 
 
            ' Select A1.
            ScrollTo ActiveSheet.name, "A1"
 
        End With
 
 
        With .Sheets("CUST")
 
            ' Activates the sheet.
            .Activate
 
 
            ' Update StatusBar.
            Application.StatusBar = "Sorting Queries...on CUST"
 
 
            ' Determine the number of rows.
            lastrow_CUST = .Cells(Rows.Count, 1).End(xlUp).Row
 
 
            ' Do the sort.
            With .Sort
 
                '.AutoFilter
                With .SortFields
                    .Clear
                    .Add Key:=Range("A1:A" & lastrow_CUST), SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:=xlSortNormal
                End With
 
                .SetRange Range("A1:B" & lastrow_CUST)
                .Header = xlYes
                .MatchCase = False
                .Orientation = xlTopToBottom
                .SortMethod = xlPinYin
                .Apply
 
            End With
 
 
            ' Select A1.
            ScrollTo ActiveSheet.name, "A1"
 
        End With
 
 
        With .Sheets("SHEETNAME1 - Auto")
 
            ' Activates the sheet.
            .Activate
 
 
            ' Update StatusBar.
            Application.StatusBar = "Sorting Queries...on SHEETNAME1 - Auto"
 
 
            ' Determine the number of rows.
            lastrow_SHEETNAME1Auto = .Cells(Rows.Count, 1).End(xlUp).Row
 
 
            ' Do the sort.
            With .Sort
 
                '.AutoFilter
                With .SortFields
                    .Clear
                    .Add Key:=Range("A1:A" & lastrow_SHEETNAME1Auto), SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:=xlSortNormal
                End With
 
                .SetRange Range("A1:T" & lastrow_SHEETNAME1Auto)
                .Header = xlYes
                .MatchCase = False
                .Orientation = xlTopToBottom
                .SortMethod = xlPinYin
                .Apply
 
            End With
 
 
            ' Select A1.
            ScrollTo ActiveSheet.name, "A1"
 
        End With
 
 
 
        With .Sheets("QSHEET")
 
            ' Activates the sheet.
            .Activate
 
 
            ' Update StatusBar.
            Application.StatusBar = "Sorting Queries...on QSHEET"
 
 
            ' Determine the number of rows.
            lastrow_QSHEET = .Cells(Rows.Count, 1).End(xlUp).Row
 
 
            ' Do the sort.
            With .Sort
 
                '.AutoFilter
                With .SortFields
                    .Clear
                    ' PETER-FIX 20191211  .Add Key:=Range("A1:A" & lastrow_CUST), SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:=xlSortNormal
                    .Add Key:=Range("A1:A" & lastrow_QSHEET), SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:=xlSortNormal
                End With
 
                ' PETER-FIX 20191211 .SetRange Range("A1:A" & lastrow_CUST)
                .SetRange Range("A1:A" & lastrow_QSHEET)
                .Header = xlYes
                .MatchCase = False
                .Orientation = xlTopToBottom
                .SortMethod = xlPinYin
                .Apply
 
            End With
 
 
            ' Select A1.
            ScrollTo ActiveSheet.name, "A1"
 
        End With
 
 
        With .Sheets("Wxxxx")
 
            ' Activates the sheet.
            .Activate
 
 
            ' Update StatusBar.
            Application.StatusBar = "Sorting Queries...on Wxxxx"
 
 
            ' Determine the number of rows.
            lastrow_Wxxxx = .Cells(Rows.Count, 2).End(xlUp).Row
 
 
            ' Do the sort.
            With .Sort
 
                '.AutoFilter
                With .SortFields
                    .Clear
                    .Add Key:=Range("B1:B" & lastrow_Wxxxx), SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:=xlSortNormal
                End With
 
              ' PETER-FIX 20191211. .SetRange Range("A1:Z" & lastrow_CUST)
                .SetRange Range("A1:Z" & lastrow_Wxxxx)
                .Header = xlYes
                .MatchCase = False
                .Orientation = xlTopToBottom
                .SortMethod = xlPinYin
                .Apply
 
            End With
 
 
            ' Select A1.
            ScrollTo ActiveSheet.name, "A1"
 
        End With
 
    End With
End Sub
 
 
 
 
' Imports the FinalABC file.
 
 
' Imports the FinalABC file.
Sub M10100_Import_FinalABC()
 
    Dim fileToOpen As Variant
    Dim count_FinalABC As Double
    Dim count_InputFile As Double
    Dim lastrow_FinalABC As Long
    Dim lastrow_InputFile As Long
    Dim my_from_column As Variant
    Dim my_to_column As Variant
    Dim fileToOpen_name As String
    Dim FileParts() As String
 
 
    ' Initialize global vars.
    Call Z00000_Init
 
 
    ' Ask user.
    If ctrl_ask_before_running_subroutine = True Then
        If MsgBox("Import FinalABC?", vbYesNo) = vbNo Then Exit Sub
    End If
 
 
    ' Clear the FinalABC sheet.
    Call M10020_Clear_FinalABC
 
 
    ' Ask user for a FinalABC file to load.
    fileToOpen = Application.GetOpenFilename("Excel files (*.xls; *.xlsx; *.csv),*.xls; *.xlsx; *.csv", , "Select FinalABC file")
    If fileToOpen = False Then
        MsgBox "No BBH file selected.  No data copied across to the FinalABC sheet."
        Exit Sub
    End If
 
    FileParts() = Split(fileToOpen, Application.PathSeparator)
    fileToOpen_name = FileParts(UBound(FileParts))
 
 
    ' Update StatusBar.
    Application.StatusBar = "Importing FinalABC file..." & fileToOpen_name
 
 
    ' Start of copying columns across.
    With Workbooks.Open(fileToOpen)
 
        With .Sheets(1)
 
            ' Control to check that the FinalABC file is in the usual format.
            If .Range("A2") Like "???????" Then
            Else
 
                If ctrl_close_erroneous_files = True Then
                    ' Close the file.
                    Application.DisplayAlerts = False
                    Workbooks(fileToOpen_name).Close
                    Application.DisplayAlerts = True
                End If
 
                MsgBox "The FinalABC file is not in the usual format, it may have been change since the code was written, please follow the procedure to manually copy the columns across."
                Exit Sub
            End If
 
            ' Control to check that the FinalABC file is in the usual format.
            If .Range("I2") Like "????" Then
            Else
                If ctrl_close_erroneous_files = True Then
                    ' Close the file.
                    Application.DisplayAlerts = False
                    Workbooks(fileToOpen_name).Close
                    Application.DisplayAlerts = True
                End If
 
                MsgBox "The FinalABC file is not in the usual format, it may have been change since the code was written, please follow the procedure to manually copy the columns across"
                Exit Sub
            End If
 
 
            ' Control to check that the FinalABC file is in the usual format.
            If WorksheetFunction.CountA(.Range("A1:X1")) = 24 Then
            Else
                If ctrl_close_erroneous_files = True Then
                    ' Close the file.
                    Application.DisplayAlerts = False
                    Workbooks(fileToOpen_name).Close
                    Application.DisplayAlerts = True
                End If
 
                MsgBox "The FinalABC file is not in the usual format, it may have been change since the code was written, please follow the procedure to manually copy the columns across"
                Exit Sub
            End If
 
 
            ' Determine how many rows in the input file.
            lastrow_InputFile = .Cells(Rows.Count, 1).End(xlUp).Row
 
 
            ' Copy all columns from BBH file into master sheet where column names match.
            For Each my_from_column In .Range("A1:AD1") ' Range is all columns in BBH file.
                For Each my_to_column In Workbooks(wb_name).Sheets("FinalABC").Range("A1:AH1") ' AH is last column containing data from BBH file.
                    If my_from_column = my_to_column Then .Range(Cells(2, my_from_column.Column), Cells(lastrow_InputFile + 1, my_from_column.Column).End(xlUp)).Copy Workbooks(wb_name).Sheets("FinalABC").Cells(2, my_to_column.Column)
                Next my_to_column
            Next my_from_column
 
 
            ' Counts the number of cells from the input file that should have been copied across.
            count_InputFile = WorksheetFunction.CountA(.Range("A2:V" & lastrow_InputFile))
 
        End With
 
 
        ' Close the file.
        Application.DisplayAlerts = False
        .Close
        Application.DisplayAlerts = True
 
    End With
 
 
    ' Counts the number of cells in the FinalABC sheet that have been copied across.
    With Workbooks(wb_name)
 
        ' Activate the workbook.
        .Activate
 
        With .Sheets("FinalABC")
 
            ' Activate the sheet.
            .Activate
 
 
            ' Get how many rows of data have been loaded into the sheet.
            lastrow_FinalABC = .Cells(Rows.Count, 4).End(xlUp).Row
            ' Prevent line 2 being deleted - as this contains the formulae which need coping down later.
            If lastrow_FinalABC < 3 Then
                lastrow_FinalABC = 3
            End If
 
 
            ' Count how much data has been loaded into the FinalABC sheet.
            count_FinalABC = WorksheetFunction.CountA( _
                .Range("D2:D" & lastrow_FinalABC), _
                .Range("F2:I" & lastrow_FinalABC), _
                .Range("O2:O" & lastrow_FinalABC), _
                .Range("S2:AH" & lastrow_FinalABC))
 
 
            ' Select A1.
            ScrollTo ActiveSheet.name, "A1"
 
        End With
 
    End With
 
 
    ' Control to ensure that the number of cells copied across matches those in the originating file.
    If count_FinalABC <> count_InputFile Then
        Message "The number of cells copied from the FinalABC file does not equal the number of cells copied to the 1042 rec. Please manually copy them across."
        Exit Sub
    End If
 
 
    ' Clear all objects.
    Set my_from_column = Nothing
    Set my_to_column = Nothing
 
End Sub
 
 
 
 
 
' Copy initial formulae down on the FinalABC sheet.
' Just enough data to allow the sheet to be later sorted and for the Mapping Pivots to be created.
Sub M10110_Copy_Pre_FinalABC_Formulae_Down()
 
    Dim mycell As Variant
    Dim lastrow_FinalABC As Long
    Dim Pmt_Curr As Variant
    Dim FX_Rate As Variant
 
 
    ' Initialize global vars.
    Call Z00000_Init
 
 
    ' Ask user.
    If ctrl_ask_before_running_subroutine = True Then
        If MsgBox("Copy pre FinalABC formulae down?", vbYesNo) = vbNo Then Exit Sub
    End If
 
 
    ' Update StatusBar.
    Application.StatusBar = "Copy pre-FinalABC formulae down..."
 
 
    With Workbooks(wb_name)
 
        With .Sheets("FinalABC")
 
            ' Activate the FinalABC sheet.
            .Activate
 
 
            ' Get how many rows of data have been loaded into the sheet.
            lastrow_FinalABC = .Cells(Rows.Count, 4).End(xlUp).Row
            ' Prevent line 2 being deleted - as this contains the formulae which need coping down later.
            If lastrow_FinalABC < 3 Then
                lastrow_FinalABC = 3
            End If
 
 
            ' Ensure that FX_Rate has a default value.
            'For Each mycell In Workbooks(my1042Rec).Sheets("FinalABC").Range("AE2", Range("AE65536").End(xlUp))
            For Each mycell In .Range("AE2:AE" & lastrow_FinalABC)
                If Not mycell Like "*[0-9]*" Then mycell.Formula = 1
            Next mycell
 
 
            ' Copy using autofill.
            .Range("A2:A2").AutoFill Destination:=.Range("A2:A" & lastrow_FinalABC)
            .Range("B2:C2").AutoFill Destination:=.Range("B2:C" & lastrow_FinalABC)
            .Range("E2").AutoFill Destination:=.Range("E2:E" & lastrow_FinalABC)
            .Range("K2:L2").AutoFill Destination:=.Range("K2:L" & lastrow_FinalABC)
 
 
            ' Copy using a resize.  Some say much quicker than alternative solutions, but not proven.
            ' Destination is lastrow -1 as need to exclude header row.
            'Dim rngSource As Range
            'Dim rngTarget As Range
            '    Set rngSource = .Range("A2:A2")
            '    Set rngTarget = Range("A2:A2")
            '    rngTarget.Resize(lastrow_FinalABC - 1, rngSource.Columns.Count).Formula = rngSource.Formula
 
 
            ' Ensure that Payment Currency is set to something.  Default to USD for unknowns.
            For Each Pmt_Curr In .Range("G2:G" & lastrow_FinalABC)
                If RTrim(LTrim(Pmt_Curr)) = "" Then Pmt_Curr.Value = "USD"
            Next Pmt_Curr
 
 
            ' Ensure that the FX Rate is set to a valid number.  Default to 1 for unknowns.
            For Each FX_Rate In .Range("AE2:AE" & lastrow_FinalABC)
                If IsNumeric(FX_Rate) = False Then FX_Rate.Value = 1
            Next FX_Rate
 
 
            ' Calculations.
            .Range("E2:E" & lastrow_FinalABC).Calculate
            .Range("A2:A" & lastrow_FinalABC).Calculate
            .Range("K2:L" & lastrow_FinalABC).Calculate
            .Range("B2:C" & lastrow_FinalABC).Calculate
 
 
            ' Now copy and paste formula ranges as values to speed up the file processing.
            .Range("A3:A" & lastrow_FinalABC) = .Range("A3:A" & lastrow_FinalABC).Value
            .Range("B3:C" & lastrow_FinalABC) = .Range("B3:C" & lastrow_FinalABC).Value
            .Range("E3:E" & lastrow_FinalABC) = .Range("E3:E" & lastrow_FinalABC).Value
            .Range("K3:L" & lastrow_FinalABC) = .Range("K3:L" & lastrow_FinalABC).Value
 
 
            ' Select A1.
            ScrollTo ActiveSheet.name, "A1"
 
        End With
    End With
 
 
    ' Clear all objects.
    Set mycell = Nothing
    Set Pmt_Curr = Nothing
    Set FX_Rate = Nothing
 
End Sub
 
 
 
 
' Sort FinalABC on column A in ascending order.
Sub M10120_Sort_FinalABC_column_A()
 
    Dim lastrow_FinalABC As Long
 
 
    ' Initialize global vars.
    Call Z00000_Init
 
 
    ' Ask user.
    If ctrl_ask_before_running_subroutine = True Then
        If MsgBox("Sort FinalABC column A?", vbYesNo) = vbNo Then Exit Sub
    End If
 
 
    ' Update StatusBar.
    Application.StatusBar = "Sorting FinalABC...Column A"
 
 
    With Workbooks(wb_name)
 
        With .Sheets("FinalABC")
 
            ' Activate the sheet.
            .Activate
 
 
            ' Get how many rows of data have been loaded into the sheet.
            lastrow_FinalABC = .Cells(Rows.Count, 4).End(xlUp).Row
            ' Prevent line 2 being deleted - as this contains the formulae which need coping down later.
            If lastrow_FinalABC < 3 Then
                lastrow_FinalABC = 3
            End If
 
 
            On Error GoTo Whoa
 
 
            ' Do the sort.
            With .Sort
                .SortFields.Clear
                '    .SortFields.Add Key:=Range("A1:A" & lastrow_FinalABC), SortOn:=xlSortOnValues, Order:=xlAscending, CustomOrder:= _
                '        "Open,Closed", DataOption:=xlSortNormal
                .SortFields.Add Key:=Range("A1:A1" & lastrow_FinalABC), SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:=xlSortNormal
                .SetRange Range("A1:AT" & lastrow_FinalABC)
                .Header = xlYes
                .MatchCase = False
                .Orientation = xlTopToBottom
                .SortMethod = xlPinYin
                .Apply
            End With
 
        End With
 
    End With
 
    Exit Sub
 
Whoa:
    MsgBox "Error " & Err.Number & " " & Err.Description, vbOKOnly
 
 
End Sub
 
 
 
 
' Refresh the Mapping Pivots.
' These only depend on data on the FinalABC sheet.
Sub M10200_Refresh_Mapping_Pivots()
 
    Dim pt As PivotTable
    Dim pc As PivotCache
    Dim lastrow_FinalABC As Long
    Dim FinalABC_range As Range
 
 
    ' Initialize global vars.
    Call Z00000_Init
 
 
    ' Ask user.
    If ctrl_ask_before_running_subroutine = True Then
        If MsgBox("Refresh Mapping Pivot Tables?", vbYesNo) = vbNo Then Exit Sub
    End If
 
 
    ' Update StatusBar.
    Application.StatusBar = "Refreshing Mapping Pivots..."
 
 
    With Workbooks(wb_name)
 
        ' Get how many rows of data have been loaded into the sheet.
        lastrow_FinalABC = .Sheets("FinalABC").Cells(Rows.Count, 4).End(xlUp).Row
        Set FinalABC_range = Range("FinalABC!A1:AT" & lastrow_FinalABC)
 
 
        With .Sheets("Mapping Pivots")
 
            ' Activate the sheet.
            .Activate
 
 
            ' Refresh all the pivot tables on the Mapping Pivots sheet.
            For Each pt In ActiveWorkbook.ActiveSheet.PivotTables
 
                ' Update StatusBar.
                Application.StatusBar = "Refreshing MappingPivot..." & pt.name
 
                Set pc = ActiveWorkbook.PivotCaches.Create(xlDatabase, FinalABC_range)
                pt.ChangePivotCache pc
                pt.RefreshTable
                pt.Update
            Next
 
 
            ' Select A1.
            ScrollTo ActiveSheet.name, "A1"
 
        End With
 
    End With
 
 
    ' Clear all objects.
    Set pt = Nothing
    Set pc = Nothing
    Set FinalABC_range = Nothing
 
End Sub
 
 
 
' Import data into the SHEETNAME1 sheet from the "SHEETNAME1 - Auto" sheet instead of from a file.
' The "SHEETNAME1 - Auto" sheet is populated from a query against G3.
Sub M10300_Import_SHEETNAME1_from_Auto()
 
    Dim SHEETNAME1 As String
    Dim count_SHEETNAME1_Auto As Double
    Dim count_SHEETNAME1 As Double
    Dim lastrow_SHEETNAME1 As Long
    Dim lastrow_SHEETNAME1_Auto As Long
    Dim i As Long
    Dim txt As String
 
 
    ' Initialize global vars.
    Call Z00000_Init
 
 
    ' Ask user.
    If ctrl_ask_before_running_subroutine = True Then
        If MsgBox("Import SHEETNAME1 Auto?", vbYesNo) = vbNo Then Exit Sub
    End If
 
 
    ' Update StatusBar.
    Application.StatusBar = "Import SHEETNAME1 from Auto..."
 
 
    With Workbooks(wb_name)
 
        ' Clear the existing SHEETNAME1 sheet.
        With .Sheets("SHEETNAME1")
 
            ' Activate the SHEETNAME1 sheet.
            .Activate
 
 
            ' Get how many rows of data have been loaded into the sheet.
            lastrow_SHEETNAME1 = .Cells(Rows.Count, 4).End(xlUp).Row
            ' Prevent line 2 being deleted - as this contains the formulae which need coping down later.
            If lastrow_SHEETNAME1 < 3 Then
                lastrow_SHEETNAME1 = 3
            End If
 
 
            ' Clear entire sheet, except for row 2 which contains formulae.
            With .Range("A3:BO" & lastrow_SHEETNAME1)
                .ClearContents
            End With
 
 
            ' Clear fields loaded from SHEETNAME1 file.
            .Range("C2:E" & lastrow_SHEETNAME1).ClearContents
            .Range("G2:G" & lastrow_SHEETNAME1).ClearContents
            .Range("I2:I" & lastrow_SHEETNAME1).ClearContents
            .Range("N2:S" & lastrow_SHEETNAME1).ClearContents
            .Range("U2:U" & lastrow_SHEETNAME1).ClearContents
 
 
            ' Clear any double lines.  These are used to flag where the ISIN changes.
            .Range("A1:BO" & lastrow_SHEETNAME1).Borders.LineStyle = xlNone
 
 
            ' Control to confirm there is currently no data in the blue columns in the SHEETNAME1 sheet.
            If WorksheetFunction.CountA( _
                .Range("C2:E" & lastrow_SHEETNAME1), _
                .Range("G2:G" & lastrow_SHEETNAME1), _
                .Range("I2:I" & lastrow_SHEETNAME1), _
                .Range("N2:S" & lastrow_SHEETNAME1), _
                .Range("U2:U" & lastrow_SHEETNAME1)) > 0 Then
                MsgBox "There is data still present in the blue columns in the SHEETNAME1 sheet, these should be blank. Ensure they are empty before running this process"
                Application.Calculation = xlCalculationAutomatic
                Application.EnableEvents = True
                Application.ScreenUpdating = True
                Exit Sub
            End If
 
        End With
 
 
        With .Sheets("SHEETNAME1 - Auto")
 
            ' Activate the sheet.
            .Activate
 
 
            '.Range("A1").Select
            ScrollTo ActiveSheet.name, "A1"
 
 
            ' Update StatusBar.
            Application.StatusBar = "Refreshing the ""SHEETNAME1 - Auto"" query..."
 
 
            ' Refresh the queries.
            Selection.ListObject.QueryTable.Refresh BackgroundQuery:=False
 
 
            ' Control to check that the SHEETNAME1 file is in the usual format.
            If .Range("A2") Like "???" And .Range("T2") Like "???" And .Range("N2") Like "########" Then
            Else
                MsgBox "The 'SHEETNAME1 - Auto' sheet is not in the usual format, it may have been changed since the code was written, please follow the procedure to manually copy the columns across"
                Exit Sub
            End If
 
 
            ' Update StatusBar.
            Application.StatusBar = "Copying data from ""SHEETNAME1 - Auto"" to SHEETNAME1..."
 
 
            ' Copy data from "SHEETNAME1 - Auto" to SHEETNAME1 my way.
            lastrow_SHEETNAME1_Auto = .Cells(Rows.Count, 4).End(xlUp).Row
 
            .Range("A2:A" & lastrow_SHEETNAME1_Auto).Copy Sheets("SHEETNAME1").Range("S2")
            .Range("C2:C" & lastrow_SHEETNAME1_Auto).Copy Sheets("SHEETNAME1").Range("R2")
            .Range("D2:D" & lastrow_SHEETNAME1_Auto).Copy Sheets("SHEETNAME1").Range("S2")
            .Range("F2:F" & lastrow_SHEETNAME1_Auto).Copy Sheets("SHEETNAME1").Range("E2")
            .Range("G2:G" & lastrow_SHEETNAME1_Auto).Copy Sheets("SHEETNAME1").Range("N2")
            .Range("J2:J" & lastrow_SHEETNAME1_Auto).Copy Sheets("SHEETNAME1").Range("C2")
            .Range("K2:K" & lastrow_SHEETNAME1_Auto).Copy Sheets("SHEETNAME1").Range("P2")
            .Range("L2:L" & lastrow_SHEETNAME1_Auto).Copy Sheets("SHEETNAME1").Range("Q2")
            .Range("P2:P" & lastrow_SHEETNAME1_Auto).Copy Sheets("SHEETNAME1").Range("I2")
            .Range("Q2:Q" & lastrow_SHEETNAME1_Auto).Copy Sheets("SHEETNAME1").Range("G2")
            .Range("T2:T" & lastrow_SHEETNAME1_Auto).Copy Sheets("SHEETNAME1").Range("D2")
 
 
            ' Counts the number of cells in the SHEETNAME1 file that should have been copied across.
            count_SHEETNAME1_Auto = WorksheetFunction.CountA( _
                .Range("A2:A" & lastrow_SHEETNAME1_Auto), _
                .Range("C2:C" & lastrow_SHEETNAME1_Auto), _
                .Range("D2:D" & lastrow_SHEETNAME1_Auto), _
                .Range("F2:F" & lastrow_SHEETNAME1_Auto), _
                .Range("G2:G" & lastrow_SHEETNAME1_Auto), _
                .Range("H2:H" & lastrow_SHEETNAME1_Auto), _
                .Range("J2:J" & lastrow_SHEETNAME1_Auto), _
                .Range("K2:K" & lastrow_SHEETNAME1_Auto), _
                .Range("L2:L" & lastrow_SHEETNAME1_Auto), _
                .Range("P2:P" & lastrow_SHEETNAME1_Auto), _
                .Range("Q2:Q" & lastrow_SHEETNAME1_Auto), _
                .Range("T2:T" & lastrow_SHEETNAME1_Auto))
        End With
 
 
        ' Tidy up some columns in the SHEETNAME1 sheet.
        With .Sheets("SHEETNAME1")
 
            ' Activate the sheet.
            .Activate
 
 
            ' Get how many rows of data have been loaded into the sheet.
            lastrow_SHEETNAME1 = .Cells(Rows.Count, 4).End(xlUp).Row
            ' Prevent line 2 being deleted - as this contains the formulae which need coping down later.
            If lastrow_SHEETNAME1 < 3 Then
                lastrow_SHEETNAME1 = 3
            End If
 
 
            ' Update StatusBar.
            Application.StatusBar = "Fixing SEDOLs..."
 
 
            'Set the SEDOL range format to text.
            .Range("N2:N" & lastrow_SHEETNAME1).NumberFormat = "@"
 
 
            ' Adds 0's to the front of the sedol number.
            Dim x
            For i = 2 To lastrow_SHEETNAME1
                txt = .Range("N" & i).Value
                If Len(txt) < 7 Then
                    For x = 1 To (7 - Len(txt))
                        txt = "0" & txt
                    Next x
                End If
 
                If IsNumeric(txt) Then
                    txt = "'" & txt
                End If
 
                .Range("N" & i) = txt
            Next i
 
 
            ' In the SHEETNAME1 file, the sedol name is spread out over two columsn, so we can't do a straight copy and paste
            ' therefore we must put a formula in the SHEETNAME1 sheet to concatenate the two columns.
            .Range("O2").Formula = "='SHEETNAME1 - Auto'!H2&'SHEETNAME1 - Auto'!I2"
            .Range("O2:O2").AutoFill Destination:=Range("O2:O" & lastrow_SHEETNAME1)
 
 
            ' Update StatusBar.
            Application.StatusBar = "Fixing Pay Dates..."
 
 
            ' Convert the pay date using a formula.
            ' In order to convert the pay date it is neccessary to use a formula that copies the data from the SHEETNAME1 file instead of copy/pasting it.
            .Range("C2").Formula = "=if('SHEETNAME1 - Auto'!J2>9999999,DATE(RIGHT('SHEETNAME1 - Auto'!J2,4),MID('SHEETNAME1 - Auto'!J2,3,2),LEFT('SHEETNAME1 - Auto'!J2,2)),DATE(RIGHT('SHEETNAME1 - Auto'!J2,4),MID('SHEETNAME1 - Auto'!J2,2,2),LEFT('SHEETNAME1 - Auto'!J2,1)))"
 
 
            ' Change format of date.
            .Range("C2:C2").AutoFill Destination:=.Range("C2:C" & lastrow_SHEETNAME1)
            .Range("C2:C" & lastrow_SHEETNAME1).NumberFormat = "yyyymmdd"
            .Range("C2:C" & lastrow_SHEETNAME1).Calculate
 
 
            ' Change formulae to values.
            .Range("C3:C" & lastrow_SHEETNAME1) = .Range("C3:C" & lastrow_SHEETNAME1).Value
 
 
            ' Counts the number of cells in the SHEETNAME1 that have been copied across.
            count_SHEETNAME1 = WorksheetFunction.CountA( _
                .Range("C2:E" & lastrow_SHEETNAME1), _
                .Range("G2:G" & lastrow_SHEETNAME1), _
                .Range("I2:I" & lastrow_SHEETNAME1), _
                .Range("N2:S" & lastrow_SHEETNAME1), _
                .Range("U2:U" & lastrow_SHEETNAME1))
 
 
            ' Control to ensure that the number of cells copied across matches those in the originating file.
            If count_SHEETNAME1 <> count_SHEETNAME1_Auto Then
                MsgBox "The number of cells copied from the SHEETNAME1 file does not equal the number of cells copied to the 1042 rec. Please manually copy them across."
 
                '.Range("C2:E" & lastrow_SHEETNAME1).ClearContents
                '.Range("G2:G" & lastrow_SHEETNAME1).ClearContents
                '.Range("I2:I" & lastrow_SHEETNAME1).ClearContents
                '.Range("K2:K" & lastrow_SHEETNAME1).ClearContents
                '.Range("M2:R" & lastrow_SHEETNAME1).ClearContents
                '.Range("T2:T" & lastrow_SHEETNAME1).ClearContents
 
                Exit Sub
            End If
 
 
            ' Select A1.
            ScrollTo ActiveSheet.name, "A1"
 
        End With
 
 
        With .Sheets("FinalABC")
 
            ' Activate the FinalABC sheet.
            .Activate
 
 
            ' Resets formulae on FinalABC to point to "SHEETNAME1" instead of "SHEETNAME1".
            .Range("AI2").Formula = "=IF(ISNA(VLOOKUP(D2,'SHEETNAME1'!G:G,1,FALSE)),""NOT FOUND"",""FOUND"")"
            .Range("AK2").Formula = "=IF(COUNTIF($A$1:A2,A2)>1,""AGGREGATE"",SUMIF($A:$A,A2,$L:$L)-SUMIF('SHEETNAME1'!$A:$A,A2,'SHEETNAME1'!$F:$F))"
            .Range("AM2").Formula = "=IF(COUNTIF($A$1:A2,A2)>1,""AGGREGATE"",SUMIF($A:$A,A2,$K:$K)-SUMIF('SHEETNAME1'!A:A,A2,'SHEETNAME1'!$AN:$AN))"
 
            .Range("AR2").Formula = "=IF(COUNTIF($A$1:A2,A2)>1,""AGGREGATE"",SUMIF($A:$A,A2,$P:$P)-SUMIF('SHEETNAME1'!$A:$A,A2,'SHEETNAME1'!$J:$J))"
            .Range("AT2").Formula = "=IF(COUNTIF($A$1:A2,A2)>1,""AGGREGATE"",SUMIF($A:$A,A2,$O:$O)-SUMIF('SHEETNAME1'!A:A,A2,'SHEETNAME1'!$I:$I))"
        End With
 
    End With
 
End Sub
 
 
 
' Import data into the SHEETNAME1 sheet from a file.
' Filename must be in the format SHEETNAME1CCYYMMDD.csv.
' If not MMDD available then use 9999 in their place.
Sub M10300_Import_SHEETNAME1()
 
    Dim fileToOpen As Variant
    Dim count_SHEETNAME1 As Double
    Dim count_InputFile As Double
    Dim fileToOpen_name As String
    Dim FileParts() As String
    Dim lastrow_SHEETNAME1 As Long
    Dim lastrow_FinalABC As Long
    Dim lastrow_InputFile As Long
    Dim Include_Exclude As Variant
    Dim i As Long
    Dim txt As String
 
 
    ' Initialize global vars.
    Call Z00000_Init
 
 
    ' Ask user.
    If ctrl_ask_before_running_subroutine = True Then
        If MsgBox("Import SHEETNAME1?", vbYesNo) = vbNo Then Exit Sub
    End If
 
 
    ' Clear the SHEETNAME1 sheet.
    Call M10010_Clear_SHEETNAME1
 
 
    ' Update StatusBar.
    Application.StatusBar = "Importing SHEETNAME1 file..."
 
 
    ' Prompt for a file.
    fileToOpen = Application.GetOpenFilename("Excel files (*.xls; *.xlsx; *.csv),*.xls; *.xlsx; *.csv", , "Select SHEETNAME1 file")
    If fileToOpen = False Then
        MsgBox "No BBH file selected.  No data copied across to the FinalABC sheet."
        Exit Sub
    End If
 
    FileParts() = Split(fileToOpen, Application.PathSeparator)
    fileToOpen_name = FileParts(UBound(FileParts))
 
 
    ' Update StatusBar.
    Application.StatusBar = "Importing SHEETNAME1 file..." & fileToOpen_name
 
 
    ' Start of copying columns across.
    With Workbooks.Open(fileToOpen)
 
        With .Sheets(1)
 
            ' Control to check that the SHEETNAME1 file is in the usual format.
            If .Range("A1") Like "???" And .Range("T1") Like "???" And .Range("N1") Like "########" Then
            Else
                MsgBox "The SHEETNAME1 file is not in the usual format, it may have been change since the code was written, please follow the procedure to manually copy the columns across."
                If ctrl_close_erroneous_files = True Then
                    Application.DisplayAlerts = False
                    Workbooks(fileToOpen_name).Close
                    Application.DisplayAlerts = True
                End If
                Exit Sub
            End If
 
 
            ' Determine how many rows in the input file.
            lastrow_InputFile = .Cells(Rows.Count, 1).End(xlUp).Row
 
        End With
 
 
        ' Copy data to the SHEETNAME1 sheet.
        With .Sheets(1)
 
            ' Copy data from the Input file to the SHEETNAME1 sheet.
            .Range("A1:A" & lastrow_InputFile).Copy Workbooks(wb_name).Sheets("SHEETNAME1").Range("U2")
            .Range("C1:C" & lastrow_InputFile).Copy Workbooks(wb_name).Sheets("SHEETNAME1").Range("R2")
            .Range("D1:D" & lastrow_InputFile).Copy Workbooks(wb_name).Sheets("SHEETNAME1").Range("S2")
            .Range("F1:F" & lastrow_InputFile).Copy Workbooks(wb_name).Sheets("SHEETNAME1").Range("E2")
            .Range("G1:G" & lastrow_InputFile).Copy Workbooks(wb_name).Sheets("SHEETNAME1").Range("N2")
 
 
            ' In the SHEETNAME1 file, the sedol name is spread out over two columsn, so we can't do a straight copy and paste
            ' therefore we must put a formula in the SHEETNAME1 sheet to concatenate the two columns.
            Workbooks(wb_name).Sheets("SHEETNAME1").Range("O2").Formula = "=" & fileToOpen_name & "!H1&" & """; ""&" & fileToOpen_name & "!I1"
 
 
            ' In order to convert the pay date it is neccessary to use a formula that copies the data from the SHEETNAME1 file instead of copy/pasting it.
            Workbooks(wb_name).Sheets("SHEETNAME1").Range("C2").Formula = "=if(" & fileToOpen_name & "!J1>9999999,DATE(RIGHT(" & fileToOpen_name & "!J1,4),MID(" & fileToOpen_name & "!J1,3,2),LEFT(" & fileToOpen_name & "!J1,2)),DATE(RIGHT(" & fileToOpen_name & "!J1,4),MID(" & fileToOpen_name & "!J1,2,2),LEFT(" & fileToOpen_name & "!J1,1)))"
 
 
            ' Copy data from the Input file to the SHEETNAME1 sheet.
            .Range("K1:K" & lastrow_InputFile).Copy Workbooks(wb_name).Sheets("SHEETNAME1").Range("P2")
            .Range("L1:L" & lastrow_InputFile).Copy Workbooks(wb_name).Sheets("SHEETNAME1").Range("Q2")
            .Range("P1:P" & lastrow_InputFile).Copy Workbooks(wb_name).Sheets("SHEETNAME1").Range("I2")
            .Range("Q1:Q" & lastrow_InputFile).Copy Workbooks(wb_name).Sheets("SHEETNAME1").Range("G2")
            .Range("T1:T" & lastrow_InputFile).Copy Workbooks(wb_name).Sheets("SHEETNAME1").Range("D2")
 
 
            ' Counts the number of cells in the SHEETNAME1 file that should have been copied across.
            count_InputFile = WorksheetFunction.CountA( _
                .Range("A1:A" & lastrow_InputFile), _
                .Range("C1:C" & lastrow_InputFile), _
                .Range("D1:D" & lastrow_InputFile), _
                .Range("F1:F" & lastrow_InputFile), _
                .Range("G1:G" & lastrow_InputFile), _
                .Range("H1:H" & lastrow_InputFile), _
                .Range("J1:J" & lastrow_InputFile), _
                .Range("K1:K" & lastrow_InputFile), _
                .Range("L1:L" & lastrow_InputFile), _
                .Range("P1:P" & lastrow_InputFile), _
                .Range("Q1:Q" & lastrow_InputFile), _
                .Range("T1:T" & lastrow_InputFile))
 
        End With
 
    End With
 
 
    With Workbooks(wb_name)
 
        With .Sheets("SHEETNAME1")
 
            ' Activate the SHEETNAME1 sheet.
            .Activate
 
 
            ' Get how many rows of data have been loaded into the sheet.
            lastrow_SHEETNAME1 = .Cells(Rows.Count, 4).End(xlUp).Row
            ' Prevent line 2 being deleted - as this contains the formulae which need coping down later.
            If lastrow_SHEETNAME1 < 3 Then
                lastrow_SHEETNAME1 = 3
            End If
 
 
            ' Update StatusBar.
            Application.StatusBar = "Fixing SEDOLs..."
 
 
            'Set the SEDOL range format to text.
            .Range("N2:N" & lastrow_SHEETNAME1).NumberFormat = "@"
 
 
            ' Adds 0's to the front of the sedol number.
            Dim x
            For i = 2 To lastrow_SHEETNAME1
                txt = .Range("N" & i).Value
                If Len(txt) < 7 Then
                    For x = 1 To (7 - Len(txt))
                        txt = "0" & txt
                    Next x
                End If
 
                If IsNumeric(txt) Then
                    txt = "'" & txt
                End If
 
                .Range("N" & i) = txt
            Next i
 
 
            ' Copy and paste SEDOL as values to allow vlookups to work correctly.
            ' Certain SEDOLs are only numbers and numbers don't work in vlookups to strings.
            .Range("N2:N" & lastrow_SHEETNAME1) = .Range("N2:N" & lastrow_SHEETNAME1).Value
 
 
            ' In the SHEETNAME1 file, the sedol name is spread out over two columsn, so we can't do a straight copy and paste
            ' therefore we must put a formula in the SHEETNAME1 sheet to concatenate the two columns.
            .Range("O2:O2").AutoFill Destination:=.Range("O2:O" & lastrow_SHEETNAME1)
            .Range("O2:O" & lastrow_SHEETNAME1).Calculate
            .Range("O2:O" & lastrow_SHEETNAME1) = .Range("O2:O" & lastrow_SHEETNAME1).Value
 
 
            ' Update StatusBar.
            Application.StatusBar = "Fixing Pay Dates..."
 
 
            ' In order to convert the pay date it is neccessary to use a formula that copies the data from the SHEETNAME1 file instead of copy/pasting it.
            .Range("C2:C2").AutoFill Destination:=.Range("C2:C" & lastrow_SHEETNAME1)
            .Range("C2:C" & lastrow_SHEETNAME1).NumberFormat = "yyyymmdd"
            .Range("C2:C" & lastrow_SHEETNAME1).Calculate
            .Range("C2:C" & lastrow_SHEETNAME1) = .Range("C2:C" & lastrow_SHEETNAME1).Value
 
 
            ' Copy "Include / Exclude" column value down.  Default to setting this to INCLUDE.
            For Each Include_Exclude In .Range("Y2:Y" & lastrow_SHEETNAME1)
                If RTrim(LTrim(Include_Exclude)) = "" Then Include_Exclude.Value = "INCLUDE"
            Next Include_Exclude
 
 
            ' Counts the number of cells in the SHEETNAME1 sheet that have been copied across.
            count_SHEETNAME1 = WorksheetFunction.CountA( _
                .Range("C2:C" & lastrow_SHEETNAME1), _
                .Range("D2:D" & lastrow_SHEETNAME1), _
                .Range("E2:E" & lastrow_SHEETNAME1), _
                .Range("G2:G" & lastrow_SHEETNAME1), _
                .Range("I2:I" & lastrow_SHEETNAME1), _
                .Range("N2:N" & lastrow_SHEETNAME1), _
                .Range("O2:O" & lastrow_SHEETNAME1), _
                .Range("P2:P" & lastrow_SHEETNAME1), _
                .Range("Q2:Q" & lastrow_SHEETNAME1), _
                .Range("S2:S" & lastrow_SHEETNAME1), _
                .Range("R2:R" & lastrow_SHEETNAME1), _
                .Range("U2:U" & lastrow_SHEETNAME1))
 
 
            ' Select A1.
            ScrollTo ActiveSheet.name, "A1"
 
        End With
 
 
        With .Sheets("FinalABC")
 
            ' Activate the FinalABC sheet.
            .Activate
 
 
            ' Get how many rows of data have been loaded into the sheet.
            lastrow_FinalABC = .Cells(Rows.Count, 5).End(xlUp).Row
 
 
            ' Resets formulae on FinalABC to point to "SHEETNAME1" instead of "SHEETNAME1 - Auto".
            .Range("AI2").Formula = "=IF(ISNA(VLOOKUP(D2,'SHEETNAME1'!$G$1:$G$" & lastrow_SHEETNAME1 & ",1,FALSE)),""NOT FOUND"",""FOUND"")"
            .Range("AK2").Formula = "=IF(COUNTIF($A$1:$A2,A2)>1,""AGGREGATE"",SUMIF($A$1:$A$" & lastrow_FinalABC & ",A2,$L$1:$L$" & lastrow_FinalABC & ")-SUMIF('SHEETNAME1'!$A$1:$A$" & lastrow_SHEETNAME1 & ",A2,'SHEETNAME1'!$F$1:$F$" & lastrow_SHEETNAME1 & "))"
            .Range("AM2").Formula = "=IF(COUNTIF($A$1:$A2,A2)>1,""AGGREGATE"",SUMIF($A$1:$A$" & lastrow_FinalABC & ",A2,$K$1:$K$" & lastrow_FinalABC & ")-SUMIF('SHEETNAME1'!$A$1:$A$" & lastrow_SHEETNAME1 & ",A2,'SHEETNAME1'!$AO$1:$AO$" & lastrow_SHEETNAME1 & "))"
 
            '.Range("AP2").Formula = "=IF(COUNTIF($A$1:A2,A2)>1,""AGGREGATE"",SUMIF($A:$A,A2,$O:$O)-SUMIF('SHEETNAME1'!$A:$A,A2,'SHEETNAME1'!$J:$J))"
            .Range("AR2").Formula = "=IF(COUNTIF($A$1:$A2,A2)>1,""AGGREGATE"",SUMIF($A$1:$A$" & lastrow_FinalABC & ",A2,$P$1:$P$" & lastrow_FinalABC & ")-SUMIF('SHEETNAME1'!$A$1:$A$" & lastrow_SHEETNAME1 & ",A2,'SHEETNAME1'!$J$1:$J$" & lastrow_SHEETNAME1 & "))"
            '.Range("AR2").Formula = "=IF(COUNTIF($A$1:A2,A2)>1,""AGGREGATE"",SUMIF($A:$A,A2,$O:$O)-SUMIF('SHEETNAME1'!A:A,A2,'SHEETNAME1'!$I:$I))"
            .Range("AT2").Formula = "=IF(COUNTIF($A$1:$A2,A2)>1,""AGGREGATE"",SUMIF($A$1:$A$" & lastrow_FinalABC & ",A2,$O$1:$O$" & lastrow_FinalABC & ")-SUMIF('SHEETNAME1'!$A$1:$A$" & lastrow_SHEETNAME1 & ",A2,'SHEETNAME1'!$I$1:$I$" & lastrow_SHEETNAME1 & "))"
 
        End With
 
    End With
 
 
    ' Control to ensure that the number of cells copied across matches those in the originating file.
    If count_SHEETNAME1 <> count_InputFile Then
        MsgBox "The number of cells copied from the Input File does not equal the number of cells copied to the SHEETNAME1 sheet. Please manually copy them across."
        'Workbooks(my1042Rec).Sheets("SHEETNAME1").Range("C2", Range("E65536").End(xlUp)).ClearContents
        'Workbooks(my1042Rec).Sheets("SHEETNAME1").Range("G2", Range("G65536").End(xlUp)).ClearContents
        'Workbooks(my1042Rec).Sheets("SHEETNAME1").Range("I2", Range("I65536").End(xlUp)).ClearContents
        'Workbooks(my1042Rec).Sheets("SHEETNAME1").Range("K2", Range("K65536").End(xlUp)).ClearContents
        'Workbooks(my1042Rec).Sheets("SHEETNAME1").Range("M2", Range("R65536").End(xlUp)).ClearContents
        'Workbooks(my1042Rec).Sheets("SHEETNAME1").Range("T2", Range("T65536").End(xlUp)).ClearContents
 
 
        ' Close the SHEETNAME1 file.
        If ctrl_close_erroneous_files = True Then
            Application.DisplayAlerts = False
            Workbooks(fileToOpen_name).Close
            Application.DisplayAlerts = True
        End If
        Exit Sub
    End If
 
 
    ' Close the SHEETNAME1 file.
    Application.DisplayAlerts = False
    Workbooks(fileToOpen_name).Close
    Application.DisplayAlerts = True
 
 
    ' Clear all objects.
    Set Include_Exclude = Nothing
 
End Sub
 
 
 
' Updates the formulae on the FinalABC sheet to only reference the specific number of rows actually loaded into the
' FinalABC sheet instead of something like A:A which would reference over 1 million rows and therefore may slow down
' calculations etc.
Sub M10400_Update_FinalABC_Formulae()
 
    Dim lastrow_SHEETNAME1 As Long
    Dim lastrow_FinalABC As Long
 
 
    ' Initialize global vars.
    Call Z00000_Init
 
 
    ' Ask user.
    If ctrl_ask_before_running_subroutine = True Then
        If MsgBox("Update FinalABC formulae?", vbYesNo) = vbNo Then Exit Sub
    End If
 
 
    ' Update StatusBar.
    Application.StatusBar = "Updating FinalABC Formulae..."
 
 
    With Workbooks(wb_name)
 
        With .Sheets("FinalABC")
 
            ' Activate the sheet.
            .Activate
 
 
            ' Get how many rows of data have been loaded into the sheet.
            lastrow_SHEETNAME1 = Sheets("SHEETNAME1").Cells(Rows.Count, 4).End(xlUp).Row
            ' Prevent line 2 being deleted - as this contains the formulae which need coping down later.
            If lastrow_SHEETNAME1 < 3 Then
                lastrow_SHEETNAME1 = 3
            End If
 
 
            ' Get how many rows of data have been loaded into the sheet.
            lastrow_FinalABC = .Cells(Rows.Count, 4).End(xlUp).Row
            ' Prevent line 2 being deleted - as this contains the formulae which need coping down later.
            If lastrow_FinalABC < 3 Then
                lastrow_FinalABC = 3
            End If
 
 
            ' Resets formulae on FinalABC.
            .Range("A2").Formula = "=D2&"" - ""&TEXT(E2,""MMM"")&"" ""&YEAR(E2)"
            .Range("B2").Formula = "=A2&"" - ""&ROUND(L2,0)"
            .Range("C2").Formula = "=A2&"" - ""&G2"
            .Range("E2").Formula = "=TEXT(MID(F2,FIND("" "",F2)+1,FIND("","",F2)-FIND("" "",F2)-1)&"" ""&LEFT(F2,FIND("" "",F2)-1)&"" ""&RIGHT(F2,4),""dd/mm/yyyy"")"
            .Range("K2").Formula = "=I2+J2"
            .Range("L2").Formula = "=K2*AE2"
            .Range("M2").Formula = "=L2-N2"
            .Range("N2").Formula = "=P2*AE2"
            .Range("P2").Formula = "=IF(R2="""",K2*S2/100,K2*R2/100)"
            .Range("Q2").Formula = "=IF(R2="""",S2*100,R2*100)"
            .Range("AI2").Formula = "=IF(ISNA(VLOOKUP(D2,'SHEETNAME1'!G$1:G$" & lastrow_SHEETNAME1 & ",1,FALSE)),""NOT FOUND"",""FOUND"")"
            .Range("AJ2").Formula = "=D2=D1"
            .Range("AK2").Formula = "=IF(COUNTIF($A$1:A2,A2)>1,""AGGREGATE"",SUMIF($A$1:$A$" & lastrow_FinalABC & ",A2,$L$1:$L$" & lastrow_FinalABC & ")-SUMIF('SHEETNAME1'!$A$1:$A$" & lastrow_SHEETNAME1 & ",A2,'SHEETNAME1'!$F$1:$F$" & lastrow_SHEETNAME1 & "))"
            .Range("AL2").Formula = "=IF(A2=A1,AL1,IF(AND(AK2>-0.1,AK2<0.1),""MATCHED GROSS AMOUNT ISIN BY MONTH"",""GROSS AMOUNT NOT MATCHED ISIN BY MONTH""))"
            .Range("AM2").Formula = "=IF(COUNTIF($A$1:A2,A2)>1,""AGGREGATE"",SUMIF($A$1:$A$" & lastrow_FinalABC & ",A2,$K$1:$K$" & lastrow_FinalABC & ")-SUMIF('SHEETNAME1'!$A$1:$A$" & lastrow_SHEETNAME1 & ",A2,'SHEETNAME1'!$AO$1:$AO$" & lastrow_SHEETNAME1 & "))"
            .Range("AR2").Formula = "=IF(COUNTIF($A$1:A2,A2)>1,""AGGREGATE"",SUMIF($A$1:$A$" & lastrow_FinalABC & ",A2,$P$1:$P$" & lastrow_FinalABC & ")-SUMIF('SHEETNAME1'!$A$1:$A$" & lastrow_SHEETNAME1 & ",A2,'SHEETNAME1'!$J$1:$J$" & lastrow_SHEETNAME1 & "))"
            .Range("AS2").Formula = "=IF(A2=A1,AS1,IF(AND(AR2>-0.1,AR2<0.1),""MATCHED TAX AMOUNT ISIN BY MONTH"",""TAX AMOUNT NOT MATCHED ISIN BY MONTH""))"
            .Range("AT2").Formula = "=IF(COUNTIF($A$1:A2,A2)>1,""AGGREGATE"",SUMIF($A$1:$A$" & lastrow_FinalABC & ",A2,$O$1:$O$" & lastrow_FinalABC & ")-SUMIF('SHEETNAME1'!$A$1:$A$" & lastrow_SHEETNAME1 & ",A2,'SHEETNAME1'!$I$1:$I$" & lastrow_SHEETNAME1 & "))"
 
        End With
    End With
End Sub
 
 
 
' Copy the updated formula on the FinalABC sheet down for all populated rows.
Sub M10410_Copy_Post_FinalABC_Formulae_Down()
 
    Dim mycell As Variant
    Dim lastrow_FinalABC As Long
 
 
    ' Initialize global vars.
    Call Z00000_Init
 
 
    ' Ask user.
    If ctrl_ask_before_running_subroutine = True Then
        If MsgBox("Copy post FinalABC formulae down?", vbYesNo) = vbNo Then Exit Sub
    End If
 
 
    ' Update StatusBar.
    Application.StatusBar = "Copy post-FinalABC Formulae down..."
 
 
    With Workbooks(wb_name)
 
        With .Sheets("FinalABC")
 
            ' Activate the sheet.
            .Activate
 
 
            ' Get how many rows of data have been loaded into the sheet.
            lastrow_FinalABC = .Cells(Rows.Count, 4).End(xlUp).Row
            ' Prevent line 2 being deleted - as this contains the formulae which need coping down later.
            If lastrow_FinalABC < 3 Then
                lastrow_FinalABC = 3
            End If
 
 
            ' For Each mycell In Workbooks(my1042Rec).Sheets("FinalABC").Range("AE2", Range("AE65536").End(xlUp).Offset(0, -1))
            For Each mycell In .Range("AE2:AE" & lastrow_FinalABC)
                If Not mycell Like "*[0-9]*" Then mycell.Formula = 1
            Next mycell
 
 
            ' Copies formulae down.
            .Range("M2:N2").AutoFill Destination:=.Range("M2:N" & lastrow_FinalABC)
            .Range("P2").AutoFill Destination:=.Range("P2:P" & lastrow_FinalABC)
            .Range("Q2").AutoFill Destination:=.Range("Q2:Q" & lastrow_FinalABC)
            .Range("AI2:AM2").AutoFill Destination:=.Range("AI2:AM" & lastrow_FinalABC)
            .Range("AR2:AT2").AutoFill Destination:=.Range("AR2:AT" & lastrow_FinalABC)
 
 
            ' Calculations.
            .Range("M2:N" & lastrow_FinalABC).Calculate
            .Range("P2:P" & lastrow_FinalABC).Calculate
            .Range("Q2:Q" & lastrow_FinalABC).Calculate
            'TODO below calc is not needed now.  Only needed once SHEETNAME1 file is loaded, as AG to AK use SHEETNAME1 data.
            .Range("AI2:AM" & lastrow_FinalABC).Calculate
            .Range("AR2:AT" & lastrow_FinalABC).Calculate
 
 
            ' Now copy and paste formula ranges as values to speed up the file processing.
            .Range("M3:N" & lastrow_FinalABC) = .Range("M3:N" & lastrow_FinalABC).Value
            .Range("P3:P" & lastrow_FinalABC) = .Range("P3:P" & lastrow_FinalABC).Value
            .Range("Q3:Q" & lastrow_FinalABC) = .Range("Q3:Q" & lastrow_FinalABC).Value
            .Range("AI3:AM" & lastrow_FinalABC) = .Range("AI3:AM" & lastrow_FinalABC).Value
            .Range("AR3:AT" & lastrow_FinalABC) = .Range("AR3:AT" & lastrow_FinalABC).Value
 
        End With
    End With
 
 
    ' Clear all objects.
    Set mycell = Nothing
 
End Sub
 
 
' Copy the updated formula on the FinalABC sheet down for all populated rows.
' Speeds this up using Arrays
Sub M10415_Copy_Post_FinalABC_Formulae_Down_Array()
 
    Dim mycell As Variant
    Dim lastrow_SHEETNAME1 As Long
    Dim lastrow_FinalABC As Long
 
    Dim working As Variant
    Dim column_a_FinalABC As Variant
    Dim column_d_FinalABC As Variant
    Dim column_k_FinalABC As Variant
    Dim column_l_FinalABC As Variant
    Dim column_n_FinalABC As Variant
    Dim column_o_FinalABC As Variant
    Dim column_p_FinalABC As Variant
    Dim column_r_FinalABC As Variant
    Dim column_s_FinalABC As Variant
    Dim column_ae_FinalABC As Variant
    Dim column_ak_FinalABC As Variant
    Dim column_al_FinalABC As Variant
 
    Dim column_a_SHEETNAME1 As Variant
    Dim column_f_SHEETNAME1 As Variant
    Dim column_g_SHEETNAME1 As Variant
    Dim column_i_SHEETNAME1 As Variant
    Dim column_j_SHEETNAME1 As Variant
    Dim column_ao_SHEETNAME1 As Variant
 
    Dim n As Long
 
 
    ' Initialize global vars.
    Call Z00000_Init
 
 
    ' Ask user.
    If ctrl_ask_before_running_subroutine = True Then
        If MsgBox("Copy post FinalABC formulae down?", vbYesNo) = vbNo Then Exit Sub
    End If
 
 
    ' Update StatusBar.
    Application.StatusBar = "Copy post-FinalABC Formulae down..."
 
 
    With Workbooks(wb_name)
 
        ' Get how many rows of data have been loaded into the sheet.
        lastrow_SHEETNAME1 = Sheets("SHEETNAME1").Cells(Rows.Count, 4).End(xlUp).Row
        ' Prevent line 2 being deleted - as this contains the formulae which need coping down later.
        If lastrow_SHEETNAME1 < 3 Then
            lastrow_SHEETNAME1 = 3
        End If
 
 
        With .Sheets("FinalABC")
 
            ' Activate the sheet.
            .Activate
 
            ' Get how many rows of data have been loaded into the sheet.
            lastrow_FinalABC = .Cells(Rows.Count, 4).End(xlUp).Row
            ' Prevent line 2 being deleted - as this contains the formulae which need coping down later.
            If lastrow_FinalABC < 3 Then
                lastrow_FinalABC = 3
            End If
 
            ReDim working(1 To lastrow_FinalABC, 1) ' Working array
            working = Range("D3:D" & lastrow_FinalABC) ' load with dummy values.
 
            ReDim column_a_FinalABC(1 To lastrow_FinalABC, 1)
            ReDim column_k_FinalABC(1 To lastrow_FinalABC, 1)
            ReDim column_l_FinalABC(1 To lastrow_FinalABC, 1)
            ReDim column_n_FinalABC(1 To lastrow_FinalABC, 1)
            ReDim column_o_FinalABC(1 To lastrow_FinalABC, 1)
            ReDim column_p_FinalABC(1 To lastrow_FinalABC, 1)
            ReDim column_r_FinalABC(1 To lastrow_FinalABC, 1)
            ReDim column_s_FinalABC(1 To lastrow_FinalABC, 1)
            ReDim column_ae_FinalABC(1 To lastrow_FinalABC, 1)
            ReDim column_ak_FinalABC(1 To lastrow_FinalABC, 1)
            ReDim column_al_FinalABC(1 To lastrow_FinalABC, 1)
 
            ReDim column_a_SHEETNAME1(1 To lastrow_SHEETNAME1, 1)
            ReDim column_f_SHEETNAME1(1 To lastrow_SHEETNAME1, 1)
            ReDim column_g_SHEETNAME1(1 To lastrow_SHEETNAME1, 1)
            ReDim column_i_SHEETNAME1(1 To lastrow_SHEETNAME1, 1)
            ReDim column_j_SHEETNAME1(1 To lastrow_SHEETNAME1, 1)
            ReDim column_ao_SHEETNAME1(1 To lastrow_SHEETNAME1, 1)
 
 
            ' Column AE
            ' FX_Rate
            working = Range("AE3:AE" & lastrow_FinalABC)
            column_ae_FinalABC = Range("AE3:AE" & lastrow_FinalABC)
            For n = LBound(working) To UBound(working)
              If Not column_ae_FinalABC(n, 1) Like "*[0-9]*" Then
                working(n, 1) = 1
              End If
            Next n
 
            .Range("AE3:AE" & lastrow_FinalABC).Value = working
 
 
 
 
            ' Column P - needed before column N
            ' =IF(R2="",K2*S2/100,K2*R2/100)
            column_r_FinalABC = Range("R3:R" & lastrow_FinalABC)
            column_k_FinalABC = Range("O3:O" & lastrow_FinalABC)
            column_s_FinalABC = Range("S3:S" & lastrow_FinalABC)
            For n = LBound(working) To UBound(working)
                If column_r_FinalABC(n, 1) = "" Then
                    working(n, 1) = column_k_FinalABC(n, 1) * column_s_FinalABC(n, 1) / 100
                Else
                    working(n, 1) = column_k_FinalABC(n, 1) * column_r_FinalABC(n, 1) / 100
                End If
            Next n
 
            .Range("P3:P" & lastrow_FinalABC).Value = working
 
 
            ' Column N - needed before column M
            ' =P2*AE2
            column_p_FinalABC = Range("P3:P" & lastrow_FinalABC)
            column_ae_FinalABC = Range("AE3:AE" & lastrow_FinalABC)
            For n = LBound(working) To UBound(working)
                working(n, 1) = column_p_FinalABC(n, 1) * column_ae_FinalABC(n, 1)
            Next n
 
            .Range("N3:N" & lastrow_FinalABC).Value = working
 
 
            ' Column M
            '=L2-N2
            column_l_FinalABC = Range("L3:L" & lastrow_FinalABC)
            column_n_FinalABC = Range("N3:N" & lastrow_FinalABC)
            For n = LBound(working) To UBound(working)
                working(n, 1) = column_l_FinalABC(n, 1) - column_n_FinalABC(n, 1)
            Next n
 
            .Range("M3:M" & lastrow_FinalABC).Value = working
 
 
 
            ' Column Q
            ' =IF(R2="",S2*100,R2*100)
            column_r_FinalABC = Range("R3:R" & lastrow_FinalABC)
            column_s_FinalABC = Range("S3:S" & lastrow_FinalABC)
            For n = LBound(working) To UBound(working)
                If column_r_FinalABC(n, 1) = "" Then
                    working(n, 1) = column_s_FinalABC(n, 1) * 100
                Else
                    working(n, 1) = column_r_FinalABC(n, 1) * 100
                End If
            Next n
 
            .Range("Q3:Q" & lastrow_FinalABC).Value = working
 
 
 
            ' Column AI
            ' =IF(ISNA(VLOOKUP(D2,SHEETNAME1!G$1:G$52435,1,FALSE)),"NOT FOUND","FOUND")
            column_d_FinalABC = Range("D3:D" & lastrow_FinalABC)
            column_g_SHEETNAME1 = Range("G3:G" & lastrow_SHEETNAME1)
            For n = LBound(working) To UBound(working)
                working(n, 1) = ArrayFindEx(column_g_SHEETNAME1, column_d_FinalABC(n, 1), "FOUND", "NOT FOUND")
            Next n
 
            .Range("AI3:AI" & lastrow_FinalABC).Value = working
 
 
 
            ' Column AJ
            'D2=D1
            .Range("AJ2:AJ2").AutoFill Destination:=.Range("AJ2:AJ" & lastrow_FinalABC)
 
 
            ' Column AK
            ' =IF(COUNTIF($A$1:A2,A2)>1,"AGGREGATE",SUMIF($A$1:$A$2227,A2,$L$1:$L$2227)-SUMIF(SHEETNAME1!$A$1:$A$52435,A2,SHEETNAME1!$F$1:$F$52435))
            column_a_FinalABC = Range("A3:A" & lastrow_FinalABC)
            column_l_FinalABC = Range("L3:L" & lastrow_FinalABC)
            column_a_SHEETNAME1 = Sheets("SHEETNAME1").Range("A3:A" & lastrow_SHEETNAME1)
            column_f_SHEETNAME1 = Sheets("SHEETNAME1").Range("F3:F" & lastrow_SHEETNAME1)
            For n = LBound(working) To UBound(working)
 
                If ArrayCountIf(column_a_FinalABC, column_a_FinalABC(n, 1)) > 1 Then
                    working(n, 1) = "AGGREGATE"
                Else
                    working(n, 1) = ArraySumIf(column_a_FinalABC, column_a_FinalABC(n, 1), column_l_FinalABC) - ArraySumIf(column_a_SHEETNAME1, column_a_FinalABC(n, 1), column_f_SHEETNAME1)
                End If
            Next n
 
            .Range("AK3:AK" & lastrow_FinalABC).Value = working
 
 
            ' Column AL
            ' =IF(A2=A1,AL1,IF(AND(AK2>-0.1,AK2<0.1),"MATCHED GROSS AMOUNT ISIN BY MONTH","GROSS AMOUNT NOT MATCHED ISIN BY MONTH"))
'            column_a_FinalABC = Range("A3:A" & lastrow_FinalABC)
'            column_aj_FinalABC = Range("AJ3:AJ" & lastrow_FinalABC)
'            column_ai_FinalABC = Range("AI3:AJ" & lastrow_FinalABC)
'            For n = LBound(working) To UBound(working)
'                If column_a_FinalABC(n, 1) = column_a_FinalABC(n - 1, 1) Then
'                    working(n, 1) = column_aj_FinalABC(n - 1, 1)
'                Else
'                    If column_ai_FinalABC(n, 1) > -0.1 And column_ai_FinalABC(n, 1) < 0.1 Then
'                        working(n, 1) = "MATCHED GROSS AMOUNT ISIN BY MONTH"
'                    Else
'                        working(n, 1) = "GROSS AMOUNT NOT MATCHED ISIN BY MONTH"
'                    End If
'                End If
'            Next n
'
'            .Range("AM3:AM" & lastrow_FinalABC).Value = working
 
 
            .Range("AL2").AutoFill Destination:=.Range("AL2:AL" & lastrow_FinalABC)
            .Range("AL2:AL" & lastrow_FinalABC).Calculate
            .Range("AL3:AL" & lastrow_FinalABC) = .Range("AL3:AL" & lastrow_FinalABC).Value
 
 
 
            ' Column AM
            ' =IF(COUNTIF($A$1:A2,A2)>1,"AGGREGATE",SUMIF($A$1:$A$2227,A2,$K$1:$K$2227)-SUMIF(SHEETNAME1!$A$1:A$52435,A2,SHEETNAME1!$AO$1:$AO$52435))
            column_a_FinalABC = Range("A3:A" & lastrow_FinalABC)
            column_k_FinalABC = Range("K3:K" & lastrow_FinalABC)
            column_a_SHEETNAME1 = Sheets("SHEETNAME1").Range("A3:A" & lastrow_SHEETNAME1)
            column_ao_SHEETNAME1 = Sheets("SHEETNAME1").Range("AO3:AO" & lastrow_SHEETNAME1)
            For n = LBound(working) To UBound(working)
 
                If ArrayCountIf(column_a_FinalABC, column_a_FinalABC(n, 1)) > 1 Then
                    working(n, 1) = "AGGREGATE"
                Else
                    working(n, 1) = ArraySumIf(column_a_FinalABC, column_a_FinalABC(n, 1), column_k_FinalABC) - ArraySumIf(column_a_SHEETNAME1, column_a_FinalABC(n, 1), column_ao_SHEETNAME1)
                End If
            Next n
 
            .Range("AM3:AM" & lastrow_FinalABC).Value = working
 
 
 
            ' Column AR
            ' =IF(COUNTIF($A$1:A2,A2)>1,"AGGREGATE",SUMIF($A$1:$A$2227,A2,$P$1:$P$2227)-SUMIF(SHEETNAME1!$A$1:$A$52435,A2,SHEETNAME1!$J$1:$J$52435))
            column_a_FinalABC = Range("A3:A" & lastrow_FinalABC)
            column_p_FinalABC = Range("P3:P" & lastrow_FinalABC)
            column_a_SHEETNAME1 = Sheets("SHEETNAME1").Range("A3:A" & lastrow_SHEETNAME1)
            column_j_SHEETNAME1 = Sheets("SHEETNAME1").Range("J3:J" & lastrow_SHEETNAME1)
            For n = LBound(working) To UBound(working)
 
                If ArrayCountIf(column_a_FinalABC, column_a_FinalABC(n, 1)) > 1 Then
                    working(n, 1) = "AGGREGATE"
                Else
                    working(n, 1) = ArraySumIf(column_a_FinalABC, column_a_FinalABC(n, 1), column_p_FinalABC) - ArraySumIf(column_a_SHEETNAME1, column_a_FinalABC(n, 1), column_j_SHEETNAME1)
                End If
            Next n
 
            .Range("AR3:AR" & lastrow_FinalABC).Value = working
 
 
            ' Column AS
            ' =IF(A2=A1,AS1,IF(AND(AR2>-0.1,AR2<0.1),"MATCHED TAX AMOUNT ISIN BY MONTH","TAX AMOUNT NOT MATCHED ISIN BY MONTH"))
'            column_a_FinalABC = Range("A3:A" & lastrow_FinalABC)
'            column_aq_FinalABC = Range("AQ3:AQ" & lastrow_FinalABC)
'            column_ap_FinalABC = Range("AP3:AP" & lastrow_FinalABC)
'            For n = LBound(working) To UBound(working)
'                If column_a_FinalABC(n, 1) = column_a_FinalABC(n - 1, 1) Then
'                    working(n, 1) = column_aq_FinalABC(n - 1, 1)
'                Else
'                    If column_ap_FinalABC(n, 1) > -0.1 And column_ap_FinalABC(n, 1) < 0.1 Then
'                        working(n, 1) = "MATCHED TAX AMOUNT ISIN BY MONTH"
'                    Else
'                        working(n, 1) = "TAX AMOUNT NOT MATCHED ISIN BY MONTH"
'                    End If
'                End If
'            Next n
'
'            .Range("AS3:AS" & lastrow_FinalABC).Value = working
 
 
            .Range("AS2").AutoFill Destination:=.Range("AS2:AS" & lastrow_FinalABC)
            .Range("AS2:AS" & lastrow_FinalABC).Calculate
            .Range("AS3:AS" & lastrow_FinalABC) = .Range("AS3:AS" & lastrow_FinalABC).Value
 
 
 
            ' Column AT
            ' =IF(COUNTIF($A$1:A2,A2)>1,"AGGREGATE",SUMIF($A$1:$A$2227,A2,$O$1:$O$2227)-SUMIF(SHEETNAME1!$A$1:$A$52435,A2,SHEETNAME1!$I$1:$I$52435))
            column_a_FinalABC = Range("A3:A" & lastrow_FinalABC)
            column_o_FinalABC = Range("O3:O" & lastrow_FinalABC)
            column_a_SHEETNAME1 = Sheets("SHEETNAME1").Range("A3:A" & lastrow_SHEETNAME1)
            column_i_SHEETNAME1 = Sheets("SHEETNAME1").Range("I3:I" & lastrow_SHEETNAME1)
            For n = LBound(working) To UBound(working)
 
                If ArrayCountIf(column_a_FinalABC, column_a_FinalABC(n, 1)) > 1 Then
                    working(n, 1) = "AGGREGATE"
                Else
                    working(n, 1) = ArraySumIf(column_a_FinalABC, column_a_FinalABC(n, 1), column_o_FinalABC) - ArraySumIf(column_a_SHEETNAME1, column_a_FinalABC(n, 1), column_i_SHEETNAME1)
                End If
            Next n
 
            .Range("AT3:AT" & lastrow_FinalABC).Value = working
 
        End With
    End With
 
 
    ' Clear all objects.
    Set mycell = Nothing
 
    Set working = Nothing
 
    Set column_a_FinalABC = Nothing
    Set column_d_FinalABC = Nothing
    Set column_k_FinalABC = Nothing
    Set column_l_FinalABC = Nothing
    Set column_n_FinalABC = Nothing
    Set column_o_FinalABC = Nothing
    Set column_p_FinalABC = Nothing
    Set column_r_FinalABC = Nothing
    Set column_s_FinalABC = Nothing
    Set column_ae_FinalABC = Nothing
    Set column_ak_FinalABC = Nothing
    Set column_al_FinalABC = Nothing
 
    Set column_a_SHEETNAME1 = Nothing
    Set column_f_SHEETNAME1 = Nothing
    Set column_i_SHEETNAME1 = Nothing
    Set column_j_SHEETNAME1 = Nothing
    Set column_ao_SHEETNAME1 = Nothing
 
End Sub
 
 
 
 
 
' Copy pre SHEETNAME1 formula down.
' Just enough data to allow SHEETNAME1 sheet to be sorted.
Sub M10500_Copy_Pre_SHEETNAME1_Formulae_Down()
 
    Dim lastrow_SHEETNAME1 As Long
 
 
    ' Initialize global vars.
    Call Z00000_Init
 
 
    ' Ask user.
    If ctrl_ask_before_running_subroutine = True Then
        If MsgBox("Copy pre SHEETNAME1 formulae down?", vbYesNo) = vbNo Then Exit Sub
    End If
 
 
    ' Update StatusBar.
    Application.StatusBar = "Copy pre-SHEETNAME1 Formulae down..."
 
 
    With Workbooks(wb_name)
 
        With .Sheets("SHEETNAME1")
 
            ' Activate the sheet.
            .Activate
 
 
            ' Get how many rows of data have been loaded into the sheet.
            lastrow_SHEETNAME1 = .Cells(Rows.Count, 4).End(xlUp).Row
            ' Prevent line 2 being deleted - as this contains the formulae which need coping down later.
            If lastrow_SHEETNAME1 < 3 Then
                lastrow_SHEETNAME1 = 3
            End If
 
 
            ' Copies formulae down.
            .Range("A2:B2").AutoFill Destination:=.Range("A2:B" & lastrow_SHEETNAME1)
 
 
            ' Calculations.
            .Range("A2:B" & lastrow_SHEETNAME1).Calculate
 
 
            ' Now copy and paste formula ranges as values to speed up the file processing.
            .Range("A3:A" & lastrow_SHEETNAME1) = .Range("A3:A" & lastrow_SHEETNAME1).Value
            .Range("B3:B" & lastrow_SHEETNAME1) = .Range("B3:B" & lastrow_SHEETNAME1).Value
 
 
            ' Select A1.
            ScrollTo ActiveSheet.name, "A1"
        End With
    End With
End Sub
 
 
 
' Copy pre SHEETNAME1 formula down using Arrays for speed.
' Just enough data to allow SHEETNAME1 sheet to be sorted.
Sub M10505_Copy_Pre_SHEETNAME1_Formulae_Down_array()
 
    Dim lastrow_SHEETNAME1 As Long
    Dim lastrow_SECT As Long
 
    Dim working As Variant
    Dim column_a As Variant
    Dim column_b As Variant
    Dim column_c As Variant
    Dim column_n As Variant
    Dim column_a_SECT As Variant
    Dim column_b_SECT As Variant
 
    Dim n As Long
 
 
    ' Initialize global vars.
    Call Z00000_Init
 
 
    ' Ask user.
    If ctrl_ask_before_running_subroutine = True Then
        If MsgBox("Copy pre SHEETNAME1 formulae down?", vbYesNo) = vbNo Then Exit Sub
    End If
 
 
    ' Update StatusBar.
    Application.StatusBar = "Copy pre-SHEETNAME1 Formulae down..."
 
 
    With Workbooks(wb_name)
 
        With .Sheets("SHEETNAME1")
 
            ' Activate the sheet.
            .Activate
 
 
            ' Get how many rows of data have been loaded into the sheet.
            lastrow_SHEETNAME1 = .Cells(Rows.Count, 4).End(xlUp).Row
            ' Prevent line 2 being deleted - as this contains the formulae which need coping down later.
            If lastrow_SHEETNAME1 < 3 Then
                lastrow_SHEETNAME1 = 3
            End If
 
            lastrow_SECT = Sheets("SECT").Cells(Rows.Count, 1).End(xlUp).Row
 
 
            ReDim working(1 To lastrow_SHEETNAME1, 1) ' Working array
            working = Range("N3:N" & lastrow_SHEETNAME1) ' load with dummy values.
 
            ReDim column_a(1 To lastrow_SHEETNAME1, 1)
            ReDim column_b(1 To lastrow_SHEETNAME1, 1)
            ReDim column_c(1 To lastrow_SHEETNAME1, 1)
            ReDim column_n(1 To lastrow_SHEETNAME1, 1)
            ReDim column_a_SECT(1 To lastrow_SECT, 1)
            ReDim column_b_SECT(1 To lastrow_SECT, 1)
 
 
            ' Column B
            '=IFERROR(VLOOKUP(N2,SECT!A$1:B$50021,2,FALSE),"")
            column_n = Range("N3:N" & lastrow_SHEETNAME1)
            column_a_SECT = Sheets("SECT").Range("A3:A" & lastrow_SECT)
            column_b_SECT = Sheets("SECT").Range("B3:B" & lastrow_SECT)
            For n = LBound(working) To UBound(working)
                working(n, 1) = ArrayFind(column_a_SECT, column_n(n, 1), column_b_SECT, "")
            Next n
 
            .Range("B3:B" & lastrow_SHEETNAME1).Value = working
 
 
            ' Column A
            '=B2&" - "&TEXT(C2,"MMM")&" "&YEAR(C2)
            column_b = Range("B3:B" & lastrow_SHEETNAME1)
            column_c = Range("C3:C" & lastrow_SHEETNAME1)
            For n = LBound(working) To UBound(working)
                working(n, 1) = column_b(n, 1) & " - " & WorksheetFunction.Text(column_c(n, 1), "MMM") & " " & Year(column_c(n, 1))
            Next n
 
            .Range("A3:A" & lastrow_SHEETNAME1).Value = working
 
 
            ' Select A1.
            ScrollTo ActiveSheet.name, "A1"
        End With
    End With
 
 
    ' Clear all objects.
    Set working = Nothing
 
    Set column_a = Nothing
    Set column_b = Nothing
    Set column_c = Nothing
    Set column_n = Nothing
    Set column_a_SECT = Nothing
    Set column_b_SECT = Nothing
 
End Sub
 
 
 
' Sorts the SHEETNAME1 sheet by Columns A and M in ascending order.
Sub M10510_Sort_SHEETNAME1_column_A()
 
    Dim lastrow_SHEETNAME1 As Long
 
 
    ' Initialize global vars.
    Call Z00000_Init
 
 
    ' Ask user.
    If ctrl_ask_before_running_subroutine = True Then
        If MsgBox("Sort SHEETNAME1 column A?", vbYesNo) = vbNo Then Exit Sub
    End If
 
 
    ' Update StatusBar.
    Application.StatusBar = "Sort SHEETNAME1...Column A and M"
 
 
    With Workbooks(wb_name)
 
        With .Sheets("SHEETNAME1")
 
            ' Active the sheet.
            .Activate
 
 
            ' Get how many rows of data have been loaded into the sheet.
            lastrow_SHEETNAME1 = .Cells(Rows.Count, 4).End(xlUp).Row
            ' Prevent line 2 being deleted - as this contains the formulae which need coping down later.
            If lastrow_SHEETNAME1 < 3 Then
                lastrow_SHEETNAME1 = 3
            End If
 
 
            ' Checks if all ISINs are populated.
            If WorksheetFunction.CountA(.Columns("B")) <> WorksheetFunction.CountA(.Columns("M")) Then
                'If MsgBox("There are still missing ISIN's in the SHEETNAME1 sheet, column B. Either run the macro entitled 'find_ISINs' or manually add them.  Do you want to continue sorting?", vbYesNo) = vbNo Then
                If MsgBox("There are still missing ISIN's in the SHEETNAME1 sheet, column B, which can be manually added in.  Do you want to continue sorting?", vbYesNo) = vbNo Then
                    Exit Sub
                End If
            End If
 
 
            ' Do the sort.
            With .Sort
 
                '.AutoFilter
                With .SortFields
                    .Clear
                    .Add Key:=Range("A1:A" & lastrow_SHEETNAME1), SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:=xlSortNormal
                    .Add Key:=Range("N1:N" & lastrow_SHEETNAME1), SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:=xlSortNormal
                End With
 
                .SetRange Range("A1:BO" & lastrow_SHEETNAME1)
                .Header = xlYes
                .MatchCase = False
                .Orientation = xlTopToBottom
                .SortMethod = xlPinYin
                .Apply
 
            End With
 
 
            ' Select A1.
            ScrollTo ActiveSheet.name, "A1"
 
        End With
  End With
End Sub
 
 
 
 
' Updates the formulae on the SHEETNAME1 sheet to only reference the specific number of rows actually loaded into the SHEETNAME1 sheet
' instead of something like A:A which would reference over 1 million rows and therefore may slow down calculations etc.
Sub M10520_Update_SHEETNAME1_Formulae()
 
    Dim lastrow_SHEETNAME1 As Long
    Dim lastrow_SECT As Long
    Dim lastrow_References As Long
    Dim lastrow_References_adjusted_rate As Long
    Dim lastrow_References_g3_location As Long
    Dim lastrow_References_excemption_code As Long
    Dim lastrow_References_allowed_locations As Long
    Dim lastrow_FinalABC As Long
    Dim lastrow_MappingPivots As Long
    Dim lastrow_MappingPivots2 As Long
    Dim lastrow_MappingPivots3 As Long
    Dim lastrow_Wxxxx As Long
    Dim lastrow_HOLDINGS As Long
    Dim lastrow_TRANSACTIONS As Long
    Dim lastrow_CUST As Long
    Dim lastrow_QSHEET As Long
 
 
    ' Initialize global vars.
    Call Z00000_Init
 
 
    ' Ask user.
    If ctrl_ask_before_running_subroutine = True Then
        If MsgBox("Update SHEETNAME1 formulae?", vbYesNo) = vbNo Then Exit Sub
    End If
 
 
    ' Update StatusBar.
    Application.StatusBar = "Update SHEETNAME1 Formulae..."
 
 
    With Workbooks(wb_name)
 
        ' Get how many rows of data have been loaded into the sheet.
        lastrow_SHEETNAME1 = .Sheets("SHEETNAME1").Cells(Rows.Count, 4).End(xlUp).Row
        lastrow_SECT = .Sheets("SECT").Cells(Rows.Count, 1).End(xlUp).Row
        lastrow_References = .Sheets("References").Cells(Rows.Count, 1).End(xlUp).Row
        lastrow_References_adjusted_rate = .Sheets("References").Cells(Rows.Count, 8).End(xlUp).Row
        lastrow_References_g3_location = .Sheets("References").Cells(Rows.Count, 15).End(xlUp).Row
        lastrow_References_excemption_code = .Sheets("References").Cells(Rows.Count, 19).End(xlUp).Row
        lastrow_References_allowed_locations = .Sheets("References").Cells(Rows.Count, 33).End(xlUp).Row
        lastrow_FinalABC = .Sheets("FinalABC").Cells(Rows.Count, 1).End(xlUp).Row
        lastrow_HOLDINGS = .Sheets("HOLDINGS").Cells(Rows.Count, 1).End(xlUp).Row
        lastrow_MappingPivots = .Sheets("Mapping Pivots").Cells(Rows.Count, 1).End(xlUp).Row
        lastrow_MappingPivots2 = .Sheets("Mapping Pivots").Cells(Rows.Count, 6).End(xlUp).Row
        lastrow_MappingPivots3 = .Sheets("Mapping Pivots").Cells(Rows.Count, 11).End(xlUp).Row
        lastrow_Wxxxx = .Sheets("Wxxxx").Cells(Rows.Count, 2).End(xlUp).Row
        lastrow_TRANSACTIONS = .Sheets("TRANSACTIONS").Cells(Rows.Count, 2).End(xlUp).Row
        lastrow_CUST = .Sheets("CUST").Cells(Rows.Count, 1).End(xlUp).Row
        lastrow_QSHEET = .Sheets("QSHEET").Cells(Rows.Count, 1).End(xlUp).Row
 
 
        ' Updates formulae on SHEETNAME1.
        With .Sheets("SHEETNAME1")
 
            ' Activate the sheet.
            .Activate
 
            .Range("A2").Formula = "=B2&"" - ""&TEXT(C2,""MMM"")&"" ""&YEAR(C2)"
            .Range("B2").Formula = "=IFERROR(VLOOKUP(N2,SECT!A$1:B$" & lastrow_SECT & ",2,FALSE),"""")"
            .Range("F2").Formula = "=IF(Y2=""EXCLUDE"",0,G2)"
            .Range("H2").Formula = "=G2-J2"
            .Range("J2").Formula = "=IF(K2="""",I2,IF(L2="""",I2,IF(OR(L2=0,K2=0),0,I2/(L2/K2))))"
            .Range("L2").Formula = "=IF(G2=0,0,I2/G2)"
            .Range("M2").Formula = "=VLOOKUP(U2,References!A$1:B$" & lastrow_References & ",2,FALSE)"
            .Range("T2").Formula = "=VLOOKUP(R2,CUST!$A$1:$B$" & lastrow_CUST & ",2,FALSE)"
            .Range("V2").Formula = "=IF(ISNA(VLOOKUP(B2,FinalABC!$D$1:$D$" & lastrow_FinalABC & ",1,FALSE)),""NON EXIST"",""EXIST"")"
            .Range("W2").Formula = "=B2=B1"
            .Range("X2").Formula = "=IF(ISNA(VLOOKUP(A2,FinalABC!A$1:A$" & lastrow_FinalABC & ",1,FALSE)),""NON EXIST"",""EXIST"")"
            .Range("AB2").Formula = "=IF(OR(X2=""NON EXIST"",Y2=""EXCLUDE""),""NON REPORTABLE"",A2&"" - ""&ROUND(F2,0))"
            .Range("AC2").Formula = "=IF(OR($X2=""NON EXIST"",$Y2=""EXCLUDE""),""NON REPORTABLE"",IFERROR(VLOOKUP($A2,'Mapping Pivots'!$A$4:$B$" & lastrow_MappingPivots & ",2,FALSE), IFERROR(VLOOKUP($AB2,'Mapping Pivots'!$F$4:$G$" & lastrow_MappingPivots2 & ",2,FALSE), ""MANUAL INPUT"")))"
            .Range("AE2").Formula = "=IF(OR($X2=""NON EXIST"",$Y2=""EXCLUDE""),""NON REPORTABLE"",IFERROR(VLOOKUP($A2,'Mapping Pivots'!$A$4:$C$" & lastrow_MappingPivots & ",3,FALSE),IFERROR(VLOOKUP($AB2,'Mapping Pivots'!$F$4:$H$" & lastrow_MappingPivots2 & ",3,FALSE), ""MANUAL INPUT"")))"
            .Range("AG2").Formula = "=IF(OR($X2=""NON EXIST"",$Y2=""EXCLUDE""),""NON REPORTABLE"",IF(COUNTIF($A$2:A2,A2)>1,""AGGREGATE"",ROUND(SUMIF($A$1:$A$" & lastrow_SHEETNAME1 & ",A2,$J$1:$J$" & lastrow_SHEETNAME1 & ")-SUMIF(FinalABC!$A$1:$A$" & lastrow_FinalABC & ",A2,FinalABC!$N$1:$N$" & lastrow_FinalABC & "),2)))"
            .Range("AH2").Formula = "=IF(AG2=""NON REPORTABLE"",AG2,IF(AND(ROUND(SUMIFS($J$1:$J$" & lastrow_SHEETNAME1 & ",$A$1:$A$" & lastrow_SHEETNAME1 & ",A2,$Y$1:$Y$" & lastrow_SHEETNAME1 & ",""INCLUDE"")-SUMIF(FinalABC!$A$1:$A$" & lastrow_FinalABC & ",A2,FinalABC!$N$1:$N$" & lastrow_FinalABC & "),2)>-1,ROUND(SUMIFS($J$1:$J$" & lastrow_SHEETNAME1 & ",$A$1:$A$" & lastrow_SHEETNAME1 & ",A2,$Y$1:$Y$" & lastrow_SHEETNAME1 & ",""INCLUDE"")-SUMIF(FinalABC!$A$1:$A$" & lastrow_FinalABC & ",A2,FinalABC!$N$1:$N$" & lastrow_FinalABC & "),2)<1),K2,""MANUAL INPUT""))"
            .Range("AJ2").Formula = "=IF(OR($X2=""NON EXIST"",$Y2=""EXCLUDE""),""NON REPORTABLE"",ROUND(E2*SUM(AI2/100),2))"
            .Range("AK2").Formula = "=IF(OR($X2=""NON EXIST"",$Y2=""EXCLUDE""),""NON REPORTABLE"",SUMIF($A$1:$A$" & lastrow_SHEETNAME1 & ",A2,$AJ$1:$AJ$" & lastrow_SHEETNAME1 & ")-SUMIF(FinalABC!$A$1:$A$" & lastrow_FinalABC & ",A2,FinalABC!$N$1:$N$" & lastrow_FinalABC & "))"
            .Range("AL2").Formula = "=IF(OR($X2=""NON EXIST"",$Y2=""EXCLUDE""), ""NON REPORTABLE"", IFERROR(VLOOKUP($A2,'Mapping Pivots'!$A$4:$D$" & lastrow_MappingPivots & ",4,FALSE), IFERROR(VLOOKUP($AB2,'Mapping Pivots'!$F$4:$I$" & lastrow_MappingPivots2 & ",4,FALSE), ""MANUAL INPUT"")))"
            .Range("AN2").Formula = "=IF(OR($X2=""NON EXIST"",$Y2=""EXCLUDE""),""NON REPORTABLE"",IFERROR(VLOOKUP(A2&"" - ""&AM2,'Mapping Pivots'!$K$4:$M$" & lastrow_MappingPivots & ",2,FALSE),0))"
            .Range("AO2").Formula = "=IF(OR($X2=""NON EXIST"",$Y2=""EXCLUDE""),""NON REPORTABLE"",IF(AN2=0,0,F2/AN2))"
            .Range("AP2").Formula = "=IF(OR($X2=""NON EXIST"",$Y2=""EXCLUDE""),""NON REPORTABLE"",IF(COUNTIF($A$1:A2,A2)>1,""AGGREGATE"",SUMIF($A$1:$A$" & lastrow_SHEETNAME1 & ",A2,$AO$1:$AO$" & lastrow_SHEETNAME1 & ")-SUMIF(FinalABC!$A$1:$A$" & lastrow_FinalABC & ",A2,FinalABC!$K$1:$K$" & lastrow_FinalABC & ")))"
            .Range("AQ2").Formula = "=IF(OR($X2=""NON EXIST"",$Y2=""EXCLUDE""),""NON REPORTABLE"",T2&"" - ""&  IFERROR(IF(VLOOKUP(R2,Wxxxx!$B$1:$Z" & lastrow_Wxxxx & ",24,FALSE)=""YES"", ""VALID"", ""INVALID""),""INVALID"")&"" - "" & IFERROR(VLOOKUP(R2,Wxxxx!$B$1:$Z$" & lastrow_Wxxxx & ",25,FALSE),""N"") &"" - ""&K2)"
            .Range("AR2").Formula = "=IF(OR($X2=""NON EXIST"",$Y2=""EXCLUDE""),""NON REPORTABLE"",IFERROR(VLOOKUP(AQ2,References!$H$1:$K$" & lastrow_References_adjusted_rate & ",2,FALSE),0))"
            .Range("AS2").Formula = "=IF(OR($X2=""NON EXIST"",$Y2=""EXCLUDE""),""NON REPORTABLE"",IFERROR(VLOOKUP(AQ2,References!$H$1:$K$" & lastrow_References_adjusted_rate & ",3,FALSE),0))"
            .Range("AT2").Formula = "=IF(OR($X2=""NON EXIST"",$Y2=""EXCLUDE""),""NON REPORTABLE"",IFERROR(VLOOKUP(AQ2,References!$H$1:$K$" & lastrow_References_adjusted_rate & ",4,FALSE),0))"
            .Range("AV2").Formula = "=IF(OR($X2=""NON EXIST"",$Y2=""EXCLUDE""),""NON REPORTABLE"",IFERROR(VLOOKUP(AD2&"" - ""&AF2,References!S$1:W$" & lastrow_References_excemption_code & ",3,FALSE),0))"
            .Range("AW2").Formula = "=IF(OR($X2=""NON EXIST"",$Y2=""EXCLUDE""),""NON REPORTABLE"",IF(OR(AR2=""NO ADJUSTMENT REQUIRED"",K2=AU2),""NO ADJUSTMENT REQUIRED"",""ADJUST FROM ""&K2&""% TO ""&AU2&""% - BBH REPORTED ""&AI2&""%""))"
            .Range("AX2").Formula = "=IF(OR($X2=""NON EXIST"",$Y2=""EXCLUDE""),""NON REPORTABLE"",IF(R2=530572,""BPB&T IOM"",IF(T2=""IBGC"",""BPCI"",""BPB&T Jersey"")))"
            .Range("AY2").Formula = "=IF(AW2=""NO ADJUSTMENT REQUIRED"",""NO ADJUSTMENT REQUIRED"",IF(AW2=""NON REPORTABLE"",""NON REPORTABLE"",ROUND((F2*AU2%)-J2,2)))"
            .Range("BB2").Formula = "=IF(ISNA(VLOOKUP(U2,References!$AG$1:$AG$" & lastrow_References_allowed_locations & ",1,FALSE)),""NO ADJUSTMENT REQUIRED"",IF(AW2=""NO ADJUSTMENT REQUIRED"",""NO ADJUSTMENT REQUIRED"",IF(AW2=""NON REPORTABLE"",""NON REPORTABLE"",IFERROR(VLOOKUP(T2&"" - ""&AU2,References!$O$2:$Q$" & lastrow_References_g3_location & ",3,FALSE),0))))"
            .Range("BD2").Formula = "=IF(AW2=""NO ADJUSTMENT REQUIRED"",""NO ADJUSTMENT REQUIRED"",IF(AW2=""NON REPORTABLE"",""NON REPORTABLE"",IFERROR(VLOOKUP(T2& "" - "" &AU2,References!$O$2:$Q$" & lastrow_References_g3_location & ",2,FALSE),0)))"
            .Range("BE2").Formula = "=IF(AW2=""NO ADJUSTMENT REQUIRED"",""NO ADJUSTMENT REQUIRED"",IF(AW2=""NON REPORTABLE"",""NON REPORTABLE"",IF(BD2<>M2,""Yes"",""No"")))"
            .Range("BG2").Formula = "=IF(ISNA(VLOOKUP(R2&N2,HOLDINGS!A$1:A$" & lastrow_HOLDINGS & ",1,FALSE)),""NO HOLDINGS"",""STILL HAS HOLDINGS"")"
            .Range("BH2").Formula = "=IFERROR(VLOOKUP(R2&N2,HOLDINGS!A$1:F$" & lastrow_HOLDINGS & ",6,FALSE), ""NO HOLDINGS"")"
            .Range("BI2").Formula = "=IF(BH2=""NO HOLDINGS"",""NO HOLDINGS"",IFERROR(VLOOKUP(BH2,References!A$1:B$" & lastrow_References & ",2,FALSE),0))"
            .Range("BJ2").Formula = "=IF(OR(BB2=""NO ADJUSTMENT REQUIRED"",Y2=""EXCLUDE""),""NO ADJUSTMENT REQUIRED"",IFERROR(VLOOKUP(LEFT(P2,6)&TEXT(H2,""#.00"")&R2,TRANSACTIONS!A$1:L$" & lastrow_TRANSACTIONS & ",12,FALSE),0))"
            .Range("BK2").Formula = "=IF(OR(BB2=""NO ADJUSTMENT REQUIRED"",Y2=""EXCLUDE""),""NO ADJUSTMENT REQUIRED"",IFERROR(VLOOKUP(LEFT(P2,6)&TEXT(H2,""#.00"")&R2,TRANSACTIONS!A$1:M$" & lastrow_TRANSACTIONS & ",13,FALSE),0))"
            .Range("BL2").Formula = "=IF(OR(BB2=""NO ADJUSTMENT REQUIRED"",Y2=""EXCLUDE""),""NO ADJUSTMENT REQUIRED"",IFERROR(VLOOKUP(LEFT(P2,6)&TEXT(H2,""#.00"")&R2,TRANSACTIONS!A$1:N$" & lastrow_TRANSACTIONS & ",14,FALSE),0))"
            .Range("BM2").Formula = "=IF(ISNA(VLOOKUP(R2,QSHEET!A$1:A$" & lastrow_QSHEET & ",1,FALSE)),""NOT ON QSHEET"", ""ON QSHEET"")"
 
        End With
 
    End With
 
End Sub
 
 
 
' Returns the number of vCrit found within the array oArrWithCrit.
Function ArrayCountIfSequential(oArrWithCrit As Variant, vCrit As Variant)
    Dim lRow As Long
 
    For lRow = LBound(oArrWithCrit, 1) To UBound(oArrWithCrit, 1)
        If oArrWithCrit(lRow, 1) = vCrit Then
            ArrayCountIfSequential = ArrayCountIf + 1
        End If
    Next
End Function
 
 
' Binary Search of array.
' Returns the number of vCrit found within the array oArrWithCrit.
Function ArrayCountIf(oArrWithCrit As Variant, vCrit As Variant)
    Dim low As Long
    low = LBound(oArrWithCrit)
    Dim high As Long
    high = UBound(oArrWithCrit)
    Dim i As Long
    Dim J As Long
    Dim result As Boolean
 
    ArrayCountIf = 0
 
    Do While low <= high
        i = (low + high) / 2
        If vCrit = oArrWithCrit(i, 1) Then
            ArrayCountIf = ArrayCountIf + 1
            ' Now that found run sequentially while same value
            J = i - 1
            i = i + 1
 
            Do While (i <= high)
                If vCrit = oArrWithCrit(i, 1) Then
                    ArrayCountIf = ArrayCountIf + 1
                    i = i + 1
                Else
                  Exit Do
                End If
            Loop
 
            Do While (J >= low)
                If vCrit = oArrWithCrit(J, 1) Then
                    ArrayCountIf = ArrayCountIf + 1
                    J = J - 1
                Else
                  Exit Do
                End If
            Loop
 
            Exit Do
        ElseIf vCrit < oArrWithCrit(i, 1) Then
            high = (i - 1)
        Else
            low = (i + 1)
        End If
    Loop
 
End Function
 
 
' Returns the sum of all oArrWithValues for all vCrit found within the array oArrWithCrit.
Function ArraySumIfSequential(oArrWithCrit As Variant, vCrit As Variant, oArrWithValues As Variant)
    Dim vArr1 As Variant
    Dim vArr2 As Variant
    Dim lRow As Long
    If (UBound(oArrWithCrit) - LBound(oArrWithCrit)) = (UBound(oArrWithValues) - LBound(oArrWithValues)) Then
        For lRow = LBound(oArrWithCrit, 1) To UBound(oArrWithCrit, 1)
            If oArrWithCrit(lRow, 1) = vCrit Then
                ArraySumIfSequential = ArraySumIfSequential + oArrWithValues(lRow, 1)
            End If
        Next
    Else
        ArraySumIfSequential = "Criteriarange and sum range must be of same length"
    End If
 
 
    ' Clear all objects.
    Set vArr1 = Nothing
    Set vArr2 = Nothing
 
End Function
 
 
' Returns the sum of all oArrWithValues for all vCrit found within the array oArrWithCrit.
Function ArraySumIf(oArrWithCrit As Variant, vCrit As Variant, oArrWithValues As Variant)
    Dim low As Long
    low = LBound(oArrWithCrit)
    Dim high As Long
    high = UBound(oArrWithCrit)
    Dim i As Long
    Dim J As Long
    Dim result As Boolean
 
    ArraySumIf = 0
 
    Do While low <= high
        i = (low + high) / 2
        If vCrit = oArrWithCrit(i, 1) Then
            If IsNumeric(oArrWithValues(i, 1)) Then
                ArraySumIf = ArraySumIf + oArrWithValues(i, 1)
            End If
 
            ' Now that found run sequentially while same value
            i = i + 1
            J = J - 1
 
            Do While (i <= high)
                If vCrit = oArrWithCrit(i, 1) Then
                    If IsNumeric(oArrWithValues(i, 1)) Then
                        ArraySumIf = ArraySumIf + oArrWithValues(i, 1)
                    End If
                    i = i + 1
                Else
                  Exit Do
                End If
            Loop
 
            Do While (J >= low)
                If vCrit = oArrWithCrit(J, 1) Then
                    If IsNumeric(oArrWithValues(i, 1)) Then
                        ArraySumIf = ArraySumIf + oArrWithValues(i, 1)
                    End If
                    J = J - 1
                Else
                  Exit Do
                End If
            Loop
 
            Exit Do
        ElseIf vCrit < oArrWithCrit(i, 1) Then
            high = (i - 1)
        Else
            low = (i + 1)
        End If
    Loop
 
End Function
 
 
 
' Returns the sum of all oArrWithValues for all vCrit found within the array oArrWithCrit.
Function ArraySumIfx(oArrWithCrit As Variant, vCrit As Variant, oArrWithValues As Variant)
    Dim low As Long
    low = LBound(oArrWithCrit)
    Dim high As Long
    high = UBound(oArrWithCrit)
    Dim i As Long
    Dim J As Long
    Dim result As Boolean
 
    ArraySumIf = 0
 
    Do While low <= high
        i = (low + high) / 2
        If vCrit = oArrWithCrit(i, 1) Then
            ArraySumIf = ArraySumIf + oArrWithValues(i, 1)
            ' Now that found run sequentially while same value
            i = i + 1
            J = J - 1
 
            Do While (i <= high)
                If vCrit = oArrWithCrit(i, 1) Then
                    ArraySumIf = ArraySumIf + oArrWithValues(i, 1)
                    i = i + 1
                Else
                  Exit Do
                End If
            Loop
 
            Do While (J >= low)
                If vCrit = oArrWithCrit(J, 1) Then
                    ArraySumIf = ArraySumIf + oArrWithValues(i, 1)
                    J = J - 1
                Else
                  Exit Do
                End If
            Loop
 
            Exit Do
        ElseIf vCrit < oArrWithCrit(i, 1) Then
            high = (i - 1)
        Else
            low = (i + 1)
        End If
    Loop
 
End Function
 
 
 
' Tries to find vCrit within oArrWithCrit.
' If found then return corresponding oArrWithValues otherwise vDefault.
Function ArrayFindSequential(oArrWithCrit As Variant, vCrit As Variant, oArrWithValues As Variant, vDefault As Variant)
 
    Dim vArr1 As Variant
    Dim vArr2 As Variant
    Dim lRow As Long
    ArrayFindSequential = vDefault
    If (UBound(oArrWithCrit) - LBound(oArrWithCrit)) = (UBound(oArrWithValues) - LBound(oArrWithValues)) Then
        For lRow = LBound(oArrWithCrit, 1) To UBound(oArrWithCrit, 1)
            If oArrWithCrit(lRow, 1) = vCrit Then
                ArrayFindSequential = oArrWithValues(lRow, 1)
                Exit Function
            End If
        Next
    Else
        ArrayFindSequential = "Criteriarange and sum range must be of same length"
    End If
 
 
    ' Clear all objects.
    Set vArr1 = Nothing
    Set vArr2 = Nothing
 
End Function
 
 
' Binary Search of array.
' Tries to find vCrit within oArrWithCrit.
' If found then return corresponding oArrWithValues otherwise vDefault.
' Note that due to way that binary search works this may not report on the very 1st instance of that vCrit if this
' was done sequentially.  It will simply report on the 1st instance found and there may be various oArrWithValues
' data against the same vCrit.
Function ArrayFind(oArrWithCrit As Variant, vCrit As Variant, oArrWithValues As Variant, vDefault As Variant)
    Dim low As Long
    low = LBound(oArrWithCrit)
    Dim high As Long
    high = UBound(oArrWithCrit)
    Dim i As Long
    Dim result As Boolean
    ArrayFind = vDefault
 
    Do While low <= high
        i = (low + high) / 2
        If vCrit = oArrWithCrit(i, 1) Then
            ArrayFind = oArrWithValues(i, 1)
            Exit Do
        ElseIf vCrit < oArrWithCrit(i, 1) Then
            high = (i - 1)
        Else
            low = (i + 1)
        End If
    Loop
 
End Function
 
 
 
 
' Tries to find vCrit within oArrWithCrit.
' If found then returns vFoundValue otherwise vNotFoundValue.
'=ArrayFind(A1:A1000,"Foo",B1:B1000)
Function ArrayFindSequentialEx(oArrWithCrit As Variant, vCrit As Variant, vFoundValue As Variant, vNotFoundValue As Variant)
    Dim vArr1 As Variant
    Dim vArr2 As Variant
    Dim lRow As Long
    ArrayFindSequentialEx = vNotFoundValue
    For lRow = LBound(oArrWithCrit, 1) To UBound(oArrWithCrit, 1)
        If oArrWithCrit(lRow, 1) = vCrit Then
            ArrayFindSequentialEx = vFoundValue
            Exit Function
        End If
    Next
 
 
    ' Clear all objects.
    Set vArr1 = Nothing
    Set vArr2 = Nothing
 
End Function
 
 
' Tries to find vCrit within oArrWithCrit.
' If found then returns vFoundValue otherwise vNotFoundValue.
' Note that due to way that binary search works this may not report on the very 1st instance of that vCrit if this
' was done sequentially.  It will simply report on the 1st instance found and there may be various oArrWithValues
' data against the same vCrit.
Function ArrayFindEx(oArrWithCrit As Variant, vCrit As Variant, vFoundValue As Variant, vNotFoundValue As Variant)
    Dim low As Long
    low = LBound(oArrWithCrit)
    Dim high As Long
    high = UBound(oArrWithCrit)
    Dim i As Long
    Dim result As Boolean
    ArrayFindEx = vNotFoundValue
    Do While low <= high
        i = (low + high) / 2
        If vCrit = oArrWithCrit(i, 1) Then
            ArrayFindEx = vFoundValue
            Exit Do
        ElseIf vCrit < oArrWithCrit(i, 1) Then
            high = (i - 1)
        Else
            low = (i + 1)
        End If
    Loop
 
End Function
 
 
 
'=ArrayCountIf(A1:A1000,"Foo",B1:B1000)
Function RangeCountIf(oRngWithCrit As Range, vCrit As Variant)
    Dim vArr1 As Variant
    Dim lRow As Long
 
    vArr1 = oRngWithCrit.Value
    For lRow = LBound(vArr1, 1) To UBound(vArr1, 1)
        If vArr1(lRow, 1) = vCrit Then
            RangeCountIf = RangeCountIf + 1
        End If
    Next
 
 
    ' Clear all objects.
    Set vArr1 = Nothing
 
End Function
 
 
'=ArraySumIf(A1:A1000,"Foo",B1:B1000)
Function RangeSumIf(oRngWithCrit As Range, vCrit As Variant, oRngWithValues As Range)
    Dim vArr1 As Variant
    Dim vArr2 As Variant
    Dim lRow As Long
    If oRngWithCrit.Rows.Count = oRngWithValues.Rows.Count Then
        vArr1 = oRngWithCrit.Value
        vArr2 = oRngWithValues.Value
        For lRow = LBound(vArr1, 1) To UBound(vArr1, 1)
            If vArr1(lRow, 1) = vCrit Then
                RangeSumIf = ArraySumIf + vArr2(lRow, 1)
            End If
        Next
    Else
        RangeSumIf = "Criteriarange and sum range must be of same length"
    End If
 
 
    ' Clear all objects.
    Set vArr1 = Nothing
    Set vArr2 = Nothing
 
End Function
 
 
 
 
' Speedy - copies using arrays.
' Copies remaining formulae down on the SHEETNAME1 sheet.
Sub M10535_Copy_Post_SHEETNAME1_Formulae_Down_Array()
 
    Dim lastrow_CUST As Long
    Dim lastrow_SHEETNAME1 As Long
    Dim lastrow_FinalABC As Long
    Dim lastrow_HOLDINGS As Long
    Dim lastrow_MappingPivots As Long
    Dim lastrow_MappingPivots2 As Long
    Dim lastrow_MappingPivots3 As Long
    Dim lastrow_References As Long
    Dim lastrow_References_adjusted_rate As Long
    Dim lastrow_References_g3_location As Long
    Dim lastrow_References_income_type As Long
    Dim lastrow_References_allowed_locations As Long
    Dim lastrow_QSHEET As Long
    Dim lastrow_TRANSACTIONS As Long
    Dim lastrow_Wxxxx As Long
 
    Dim column_a As Variant
    Dim column_b As Variant
    Dim column_e As Variant
    Dim column_f As Variant
    Dim column_g As Variant
    Dim column_h As Variant
    Dim column_i As Variant
    Dim column_k As Variant
    Dim column_l As Variant
    Dim column_m As Variant
    Dim column_n As Variant
    Dim column_p As Variant
    Dim column_r As Variant
    Dim column_t As Variant
    Dim column_u As Variant
    Dim column_x As Variant
    Dim column_y As Variant
    Dim column_ab As Variant
    Dim column_ad As Variant
    Dim column_af As Variant
    Dim column_ai As Variant
    Dim column_aj As Variant
    Dim column_am As Variant
    Dim column_an As Variant
    Dim column_ao As Variant
    Dim column_aq As Variant
    Dim column_ar As Variant
    Dim column_au As Variant
    Dim column_aw As Variant
    Dim column_bb As Variant
    Dim column_bd As Variant
    Dim column_bh As Variant
 
    Dim column_a_CUST As Variant
    Dim column_b_CUST As Variant
    Dim column_a_FinalABC As Variant
    Dim column_d_FinalABC As Variant
    Dim column_k_FinalABC As Variant
    Dim column_n_FinalABC As Variant
    Dim column_a_HOLDINGS As Variant
    Dim column_f_HOLDINGS As Variant
    Dim column_a_MappingPivots As Variant
    Dim column_b_MappingPivots As Variant
    Dim column_c_MappingPivots As Variant
    Dim column_d_MappingPivots As Variant
    Dim column_f_MappingPivots As Variant
    Dim column_g_MappingPivots As Variant
    Dim column_h_MappingPivots As Variant
    Dim column_i_MappingPivots As Variant
    Dim column_k_MappingPivots As Variant
    Dim column_m_MappingPivots As Variant
    Dim column_a_QSHEET As Variant
    Dim column_a_References As Variant
    Dim column_b_References As Variant
    Dim column_h_References As Variant
    Dim column_i_References As Variant
    Dim column_j_References As Variant
    Dim column_k_References As Variant
    Dim column_o_References As Variant
    Dim column_p_References As Variant
    Dim column_q_References As Variant
    Dim column_s_References As Variant
    Dim column_u_References As Variant
    Dim column_ag_References As Variant
    Dim column_a_TRANSACTIONS As Variant
    Dim column_l_TRANSACTIONS As Variant
    Dim column_m_TRANSACTIONS As Variant
    Dim column_n_TRANSACTIONS As Variant
    Dim column_b_Wxxxx As Variant
    Dim column_y_Wxxxx As Variant
    Dim column_z_Wxxxx As Variant
 
    Dim prev_a As Variant
    Dim prev_b As Variant
    Dim prev_c As Variant
    Dim prev_d As Variant
    Dim prev_f As Variant
    Dim prev_g As Variant
    Dim prev_h As Variant
    Dim prev_i As Variant
 
    Dim tmp As Variant
 
    Dim working As Variant
    Dim n As Long
 
 
    ' Initialize global vars.
    Call Z00000_Init
 
 
    ' Ask user.
    If ctrl_ask_before_running_subroutine = True Then
        If MsgBox("Copy Post SHEETNAME1 formulae down?", vbYesNo) = vbNo Then Exit Sub
    End If
 
 
    ' Update StatusBar.
    Application.StatusBar = "Copy post-SHEETNAME1 Formulae down..."
 
 
    With Workbooks(wb_name)
 
        With .Sheets("SHEETNAME1")
 
            ' Activate the SHEETNAME1 sheet.
            .Activate
 
            ' Get how many rows of data have been loaded into the sheet.
            lastrow_SHEETNAME1 = .Cells(Rows.Count, 4).End(xlUp).Row
            ' Prevent line 2 being deleted - as this contains the formulae which need coping down later.
            If lastrow_SHEETNAME1 < 3 Then
                lastrow_SHEETNAME1 = 3
            End If
 
            lastrow_CUST = Sheets("CUST").Cells(Rows.Count, 1).End(xlUp).Row
            lastrow_FinalABC = Sheets("FinalABC").Cells(Rows.Count, 4).End(xlUp).Row
            lastrow_HOLDINGS = Sheets("HOLDINGS").Cells(Rows.Count, 1).End(xlUp).Row
            lastrow_MappingPivots = Sheets("Mapping Pivots").Cells(Rows.Count, 1).End(xlUp).Row
            lastrow_MappingPivots2 = Sheets("Mapping Pivots").Cells(Rows.Count, 6).End(xlUp).Row
            lastrow_MappingPivots3 = Sheets("Mapping Pivots").Cells(Rows.Count, 11).End(xlUp).Row
            lastrow_References = Sheets("References").Cells(Rows.Count, 1).End(xlUp).Row
            lastrow_References_adjusted_rate = Sheets("References").Cells(Rows.Count, 8).End(xlUp).Row
            lastrow_References_g3_location = Sheets("References").Cells(Rows.Count, 15).End(xlUp).Row
            lastrow_References_income_type = Sheets("References").Cells(Rows.Count, 19).End(xlUp).Row
            lastrow_References_allowed_locations = Sheets("References").Cells(Rows.Count, 33).End(xlUp).Row
            lastrow_QSHEET = Sheets("QSHEET").Cells(Rows.Count, 1).End(xlUp).Row
            lastrow_TRANSACTIONS = Sheets("TRANSACTIONS").Cells(Rows.Count, 1).End(xlUp).Row
            lastrow_Wxxxx = Sheets("Wxxxx").Cells(Rows.Count, 2).End(xlUp).Row
 
 
            ReDim working(1 To lastrow_SHEETNAME1, 1) ' Working array
            working = Range("D3:D" & lastrow_SHEETNAME1) ' load with dummy values.
 
            ReDim column_a(1 To lastrow_SHEETNAME1, 1)
            ReDim column_b(1 To lastrow_SHEETNAME1, 1)
            ReDim column_e(1 To lastrow_SHEETNAME1, 1)
            ReDim column_f(1 To lastrow_SHEETNAME1, 1)
            ReDim column_g(1 To lastrow_SHEETNAME1, 1)
            ReDim column_h(1 To lastrow_SHEETNAME1, 1)
            ReDim column_i(1 To lastrow_SHEETNAME1, 1)
            ReDim column_k(1 To lastrow_SHEETNAME1, 1)
            ReDim column_l(1 To lastrow_SHEETNAME1, 1)
            ReDim column_m(1 To lastrow_SHEETNAME1, 1)
            ReDim column_n(1 To lastrow_SHEETNAME1, 1)
            ReDim column_p(1 To lastrow_SHEETNAME1, 1)
            ReDim column_r(1 To lastrow_SHEETNAME1, 1)
            ReDim column_t(1 To lastrow_SHEETNAME1, 1)
            ReDim column_u(1 To lastrow_SHEETNAME1, 1)
            ReDim column_x(1 To lastrow_SHEETNAME1, 1)
            ReDim column_y(1 To lastrow_SHEETNAME1, 1)
            ReDim column_ab(1 To lastrow_SHEETNAME1, 1)
            ReDim column_ad(1 To lastrow_SHEETNAME1, 1)
            ReDim column_af(1 To lastrow_SHEETNAME1, 1)
            ReDim column_ai(1 To lastrow_SHEETNAME1, 1)
            ReDim column_aj(1 To lastrow_SHEETNAME1, 1)
            ReDim column_am(1 To lastrow_SHEETNAME1, 1)
            ReDim column_an(1 To lastrow_SHEETNAME1, 1)
            ReDim column_ao(1 To lastrow_SHEETNAME1, 1)
            ReDim column_aq(1 To lastrow_SHEETNAME1, 1)
            ReDim column_ar(1 To lastrow_SHEETNAME1, 1)
            ReDim column_au(1 To lastrow_SHEETNAME1, 1)
            ReDim column_aw(1 To lastrow_SHEETNAME1, 1)
            ReDim column_bd(1 To lastrow_SHEETNAME1, 1)
            ReDim column_bh(1 To lastrow_SHEETNAME1, 1)
 
            ReDim column_a_CUST(1 To lastrow_CUST, 1)
            ReDim column_b_CUST(1 To lastrow_CUST, 1)
            ReDim column_a_FinalABC(1 To lastrow_FinalABC, 1)
            ReDim column_d_FinalABC(1 To lastrow_FinalABC, 1)
            ReDim column_k_FinalABC(1 To lastrow_FinalABC, 1)
            ReDim column_n_FinalABC(1 To lastrow_FinalABC, 1)
            ReDim column_a_HOLDINGS(1 To lastrow_HOLDINGS, 1)
            ReDim column_f_HOLDINGS(1 To lastrow_HOLDINGS, 1)
            ReDim column_a_MappingPivots(1 To lastrow_MappingPivots, 1)
            ReDim column_b_MappingPivots(1 To lastrow_MappingPivots, 1)
            ReDim column_c_MappingPivots(1 To lastrow_MappingPivots, 1)
            ReDim column_d_MappingPivots(1 To lastrow_MappingPivots, 1)
            ReDim column_f_MappingPivots(1 To lastrow_MappingPivots, 1)
            ReDim column_g_MappingPivots(1 To lastrow_MappingPivots, 1)
            ReDim column_h_MappingPivots(1 To lastrow_MappingPivots, 1)
            ReDim column_i_MappingPivots(1 To lastrow_MappingPivots, 1)
            ReDim column_m_MappingPivots(1 To lastrow_MappingPivots, 1)
            ReDim column_k_MappingPivots(1 To lastrow_MappingPivots, 1)
            ReDim column_a_References(1 To lastrow_References, 1)
            ReDim column_b_References(1 To lastrow_References, 1)
            ReDim column_h_References(1 To lastrow_References, 1)
            ReDim column_i_References(1 To lastrow_References, 1)
            ReDim column_j_References(1 To lastrow_References, 1)
            ReDim column_k_References(1 To lastrow_References, 1)
            ReDim column_o_References(1 To lastrow_References, 1)
            ReDim column_p_References(1 To lastrow_References, 1)
            ReDim column_q_References(1 To lastrow_References, 1)
            ReDim column_s_References(1 To lastrow_References, 1)
            ReDim column_u_References(1 To lastrow_References, 1)
            ReDim column_ag_References(1 To lastrow_References, 1)
            ReDim column_a_QSHEET(1 To lastrow_QSHEET, 1)
            ReDim column_a_TRANSACTIONS(1 To lastrow_TRANSACTIONS, 1)
            ReDim column_l_TRANSACTIONS(1 To lastrow_TRANSACTIONS, 1)
            ReDim column_m_TRANSACTIONS(1 To lastrow_TRANSACTIONS, 1)
            ReDim column_n_TRANSACTIONS(1 To lastrow_TRANSACTIONS, 1)
            ReDim column_b_Wxxxx(1 To lastrow_Wxxxx, 1)
            ReDim column_y_Wxxxx(1 To lastrow_Wxxxx, 1)
            ReDim column_z_Wxxxx(1 To lastrow_Wxxxx, 1)
 
 
 
            ' Column F
            ' =IF(X2="EXCLUDE",0,G2)
            column_g = Range("G3:G" & lastrow_SHEETNAME1)
            column_y = Range("Y3:Y" & lastrow_SHEETNAME1)
            For n = LBound(working) To UBound(working)
                If (column_y(n, 1) = "EXCLUDE") Then
                    working(n, 1) = 0
                Else
                    working(n, 1) = column_g(n, 1)
                End If
            Next n
 
            .Range("F3:F" & lastrow_SHEETNAME1).Value = working
 
 
            ' Column H
            ' =G2-I2
            column_g = Range("G3:G" & lastrow_SHEETNAME1)
            column_i = Range("I3:I" & lastrow_SHEETNAME1)
            For n = LBound(working) To UBound(working)
                working(n, 1) = column_g(n, 1) - column_i(n, 1)
            Next n
 
            .Range("H3:H" & lastrow_SHEETNAME1).Value = working
 
 
            ' Column J
            ' =IF(K2="",I2,IF(L2="",I2,IF(OR(L2=0,K2=0),0,I2/(L2/K2))))
            column_k = Range("K3:K" & lastrow_SHEETNAME1)
            column_i = Range("I3:I" & lastrow_SHEETNAME1)
            column_l = Range("L3:L" & lastrow_SHEETNAME1)
            For n = LBound(working) To UBound(working)
                If column_k(n, 1) = "" Or column_k(n, 1) = 0 Then
                    working(n, 1) = column_i(n, 1)
                Else
                    If column_l(n, 1) = "" Or column_l(n, 1) = 0 Then
                        working(n, 1) = column_i(n, 1)
                    Else
                        working(n, 1) = column_i(n, 1) / (column_l(n, 1) / column_k(n, 1))
                    End If
                End If
            Next n
 
            .Range("J3:J" & lastrow_SHEETNAME1).Value = working
 
 
 
            ' Column L
            ' =IF(G2=0,0,I2/G2)
            column_g = Range("G3:G" & lastrow_SHEETNAME1)
            column_i = Range("I3:I" & lastrow_SHEETNAME1)
            For n = LBound(working) To UBound(working)
                If column_g(n, 1) = 0 Then ' Cant SHEETNAME1de by zero.
                    working(n, 1) = 0
                Else
                    working(n, 1) = column_i(n, 1) / column_g(n, 1)
                End If
            Next n
 
            .Range("L3:L" & lastrow_SHEETNAME1).Value = working
 
 
            ' Column M
            ' =VLOOKUP(U2,References!A$1:B$198,2,FALSE)
            column_a_References = Sheets("References").Range("A3:A" & lastrow_References)
            column_u = Range("U3:U" & lastrow_SHEETNAME1)
            column_b_References = Sheets("References").Range("B3:B" & lastrow_References)
            For n = LBound(working) To UBound(working)
                working(n, 1) = ArrayFind(column_a_References, column_u(n, 1), column_b_References, 0)
            Next n
 
            .Range("M3:M" & lastrow_SHEETNAME1).Value = working
 
 
            ' Column T
            ' =VLOOKUP(R2,CUST!$A$1:$B$26608,2,FALSE)
            column_r = Range("R3:R" & lastrow_SHEETNAME1)
            column_a_CUST = Sheets("CUST").Range("A3:A" & lastrow_CUST)
            column_b_CUST = Sheets("CUST").Range("B3:B" & lastrow_CUST)
            For n = LBound(working) To UBound(working)
                working(n, 1) = ArrayFind(column_a_CUST, column_r(n, 1), column_b_CUST, "")
            Next n
 
            .Range("T3:T" & lastrow_SHEETNAME1).Value = working
 
 
            ' Column V
            ' =IF(ISNA(VLOOKUP(B2,FinalABC!$D$1:$D$2227,1,FALSE)),"NON EXIST","EXIST")
            column_b = Range("B3:B" & lastrow_SHEETNAME1)
            column_d_FinalABC = Sheets("FinalABC").Range("D3:D" & lastrow_FinalABC)
            For n = LBound(working) To UBound(working)
                working(n, 1) = ArrayFindEx(column_d_FinalABC, column_b(n, 1), "EXIST", "NON EXIST")
            Next n
 
            .Range("V3:V" & lastrow_SHEETNAME1).Value = working
 
 
            ' Column W
            ' =B2=B1
            .Range("W2:W2").AutoFill Destination:=.Range("W2:W" & lastrow_SHEETNAME1)
            .Range("W2:W" & lastrow_SHEETNAME1).Calculate
            .Range("W3:W" & lastrow_SHEETNAME1) = .Range("W3:W" & lastrow_SHEETNAME1).Value
 
'            For n = LBound(working) To UBound(working)
'                If (n > 1) Then
'                    working(n, 1) = column_b(n, 1) = column_b(n - 1, 1)
'                End If
'            Next n
 
'            .range("W3:W" & lastrow_SHEETNAME1).Value = working
 
 
            ' Column X
            ' =IF(ISNA(VLOOKUP(A2,FinalABC!A$1:A$2227,1,FALSE)),"NON EXIST","EXIST")
            column_a = Range("A3:A" & lastrow_SHEETNAME1)
            column_a_FinalABC = Sheets("FinalABC").Range("A3:A" & lastrow_FinalABC)
            For n = LBound(working) To UBound(working)
                working(n, 1) = ArrayFindEx(column_a_FinalABC, column_a(n, 1), "EXIST", "NON EXIST")
            Next n
 
            .Range("X3:X" & lastrow_SHEETNAME1).Value = working
 
 
            ' Column AB
            ' =IF(OR(X2="NON EXIST",Y2="EXCLUDE"),"NON REPORTABLE",A2&" - "&ROUND(F2,0))
            column_x = Range("X3:X" & lastrow_SHEETNAME1)
            column_y = Range("Y3:Y" & lastrow_SHEETNAME1)
            column_a = Range("A3:A" & lastrow_SHEETNAME1)
            column_f = Range("F3:F" & lastrow_SHEETNAME1)
            For n = LBound(working) To UBound(working)
 
                If (column_x(n, 1) = "NON EXIST" Or column_y(n, 1) = "EXCLUDE") Then
                    working(n, 1) = "NON REPORTABLE"
                Else
                    working(n, 1) = column_a(n, 1) & " - " & Round(column_f(n, 1), 0)
                End If
            Next n
 
            .Range("AB3:AB" & lastrow_SHEETNAME1).Value = working
 
 
            ' Column AC
            ' =IF(OR($X2="NON EXIST",$Y2="EXCLUDE"),"NON REPORTABLE",IFERROR(VLOOKUP($A2,'Mapping Pivots'!$A$4:$B$1458,2,FALSE), IFERROR(VLOOKUP($AB2,'Mapping Pivots'!$F$4:$G$2230,2,FALSE), "MANUAL INPUT")))
            column_x = Range("X3:X" & lastrow_SHEETNAME1)
            column_y = Range("Y3:Y" & lastrow_SHEETNAME1)
            column_a = Range("A3:A" & lastrow_SHEETNAME1)
            column_ab = Range("AB3:AB" & lastrow_SHEETNAME1)
            column_a_MappingPivots = Sheets("Mapping Pivots").Range("A4:A" & lastrow_MappingPivots)
            column_b_MappingPivots = Sheets("Mapping Pivots").Range("B4:B" & lastrow_MappingPivots)
            column_f_MappingPivots = Sheets("Mapping Pivots").Range("F4:F" & lastrow_MappingPivots2)
            column_g_MappingPivots = Sheets("Mapping Pivots").Range("G4:G" & lastrow_MappingPivots2)
 
            ' Tidy up for Mapping Pivots columns.  Often they are Empty when reporting a 2nd line for same key value.
            ' This effects binary searches, so initially in the columns if a blank is encountered then actual value
            ' is written in its place.
            prev_a = column_a_MappingPivots(LBound(column_a_MappingPivots), 1)
            prev_b = column_b_MappingPivots(LBound(column_b_MappingPivots), 1)
            For n = LBound(column_a_MappingPivots) To UBound(column_a_MappingPivots)
                If column_a_MappingPivots(n, 1) = "" Then
                    column_a_MappingPivots(n, 1) = prev_a
                End If
                If column_b_MappingPivots(n, 1) = "" Then
                    column_b_MappingPivots(n, 1) = prev_b
                End If
                prev_a = column_a_MappingPivots(n, 1)
                prev_b = column_b_MappingPivots(n, 1)
            Next n
 
            prev_f = column_f_MappingPivots(LBound(column_f_MappingPivots), 1)
            prev_g = column_g_MappingPivots(LBound(column_g_MappingPivots), 1)
            For n = LBound(column_f_MappingPivots) To UBound(column_f_MappingPivots)
                If column_f_MappingPivots(n, 1) = "" Then
                    column_f_MappingPivots(n, 1) = prev_f
                End If
                If column_g_MappingPivots(n, 1) = "" Then
                    column_g_MappingPivots(n, 1) = prev_g
                End If
                prev_f = column_f_MappingPivots(n, 1)
                prev_g = column_g_MappingPivots(n, 1)
            Next n
 
            For n = LBound(working) To UBound(working)
 
                If (column_x(n, 1) = "NON EXIST" Or column_y(n, 1) = "EXCLUDE") Then
                    working(n, 1) = "NON REPORTABLE"
                Else
                    If ArrayCountIf(column_a_MappingPivots, column_a(n, 1)) > 0 Then
                        working(n, 1) = ArrayFind(column_a_MappingPivots, column_a(n, 1), column_b_MappingPivots, 0)
                    Else
                        If ArrayCountIf(column_f_MappingPivots, column_ab(n, 1)) > 0 Then
                            working(n, 1) = ArrayFind(column_f_MappingPivots, column_ab(n, 1), column_g_MappingPivots, 0)
                        Else
                            working(n, 1) = "MANUAL INPUT"
                        End If
                    End If
                End If
            Next n
 
            .Range("AC3:AC" & lastrow_SHEETNAME1).Value = working
 
 
'            .Range("AC2:AC2").AutoFill Destination:=.Range("AC2:AC" & lastrow_SHEETNAME1)
'            .Range("AC2:AC" & lastrow_SHEETNAME1).Calculate
'            .Range("AC3:AC" & lastrow_SHEETNAME1) = .Range("AC3:AC" & lastrow_SHEETNAME1).Value
 
 
 
            ' Column AE
            ' =IF(OR($X2="NON EXIST",$Y2="EXCLUDE"),"NON REPORTABLE",IFERROR(VLOOKUP($A2,'Mapping Pivots'!$A$4:$C$1458,3,FALSE),IFERROR(VLOOKUP($AB2,'Mapping Pivots'!$F$4:$H$2230,3,FALSE), "MANUAL INPUT")))
 
            column_x = Range("X3:X" & lastrow_SHEETNAME1)
            column_y = Range("Y3:Y" & lastrow_SHEETNAME1)
            column_a = Range("A3:A" & lastrow_SHEETNAME1)
            column_ab = Range("AB3:AB" & lastrow_SHEETNAME1)
            column_a_MappingPivots = Sheets("Mapping Pivots").Range("A4:A" & lastrow_MappingPivots)
            column_c_MappingPivots = Sheets("Mapping Pivots").Range("C4:C" & lastrow_MappingPivots)
            column_f_MappingPivots = Sheets("Mapping Pivots").Range("F4:F" & lastrow_MappingPivots2)
            column_h_MappingPivots = Sheets("Mapping Pivots").Range("H4:H" & lastrow_MappingPivots2)
 
            ' Tidy up for Mapping Pivots columns.  Often they are Empty when reporting a 2nd line for same key value.
            ' This effects binary searches, so initially in the columns if a blank is encountered then actual value
            ' is written in its place.
            prev_a = column_a_MappingPivots(LBound(column_a_MappingPivots), 1)
            prev_c = column_c_MappingPivots(LBound(column_c_MappingPivots), 1)
            For n = LBound(column_a_MappingPivots) To UBound(column_a_MappingPivots)
                If column_a_MappingPivots(n, 1) = "" Then
                    column_a_MappingPivots(n, 1) = prev_a
                End If
                If column_c_MappingPivots(n, 1) = "" Then
                    column_c_MappingPivots(n, 1) = prev_c
                End If
                prev_a = column_a_MappingPivots(n, 1)
                prev_c = column_c_MappingPivots(n, 1)
            Next n
 
            prev_f = column_f_MappingPivots(LBound(column_f_MappingPivots), 1)
            prev_h = column_h_MappingPivots(LBound(column_h_MappingPivots), 1)
            For n = LBound(column_f_MappingPivots) To UBound(column_f_MappingPivots)
                If column_f_MappingPivots(n, 1) = "" Then
                    column_f_MappingPivots(n, 1) = prev_f
                End If
                If column_h_MappingPivots(n, 1) = "" Then
                    column_h_MappingPivots(n, 1) = prev_h
                End If
                prev_f = column_f_MappingPivots(n, 1)
                prev_h = column_h_MappingPivots(n, 1)
            Next n
 
            For n = LBound(working) To UBound(working)
 
                If (column_x(n, 1) = "NON EXIST" Or column_y(n, 1) = "EXCLUDE") Then
                    working(n, 1) = "NON REPORTABLE"
                Else
                    If ArrayCountIf(column_a_MappingPivots, column_a(n, 1)) > 0 Then
                        working(n, 1) = ArrayFind(column_a_MappingPivots, column_a(n, 1), column_c_MappingPivots, 0)
                    Else
                        If ArrayCountIf(column_f_MappingPivots, column_ab(n, 1)) > 0 Then
                            working(n, 1) = ArrayFind(column_f_MappingPivots, column_ab(n, 1), column_h_MappingPivots, 0)
                        Else
                            working(n, 1) = "MANUAL INPUT"
                        End If
                    End If
                End If
            Next n
 
            .Range("AE3:AE" & lastrow_SHEETNAME1).Value = working
 
 
 
            ' Column AG
            ' =IF(OR($X2="NON EXIST",$Y2="EXCLUDE"),"NON REPORTABLE",IF(COUNTIF($A$1:A2,A2)>1,"AGGREGATE",ROUND(SUMIF($A$1:$A$52435,A2,$I$1:$I$52435)-SUMIF(FinalABC!$A$1:$A$2227,A2,FinalABC!$N$1:$N$2227),2)))
            column_x = Range("X3:X" & lastrow_SHEETNAME1)
            column_y = Range("Y3:Y" & lastrow_SHEETNAME1)
            column_a = Range("A3:A" & lastrow_SHEETNAME1)
            column_i = Range("I3:I" & lastrow_SHEETNAME1)
            column_a_FinalABC = Sheets("FinalABC").Range("A3:A" & lastrow_FinalABC)
            column_n_FinalABC = Sheets("FinalABC").Range("N3:N" & lastrow_FinalABC)
            For n = LBound(working) To UBound(working)
 
                If (column_x(n, 1) = "NON EXIST" Or column_y(n, 1) = "EXCLUDE") Then
                    working(n, 1) = "NON REPORTABLE"
                Else
                    If ArrayCountIf(column_a, column_a(n, 1)) > 1 Then
                        working(n, 1) = "AGGREGATE"
                    Else
                        working(n, 1) = Round(ArraySumIf(column_a, column_a(n, 1), column_i) - ArraySumIf(column_a_FinalABC, column_a(n, 1), column_n_FinalABC), 2)
                    End If
                End If
            Next n
 
            .Range("AG3:AG" & lastrow_SHEETNAME1).Value = working
 
 
 
            ' Column AH
            ' =IF(AG2="NON REPORTABLE",AG2,IF(AND(ROUND(SUMIFS($I$1:$I$52435,$A$1:$A$52435,A2,$Y$1:$Y$52435,"INCLUDE")-SUMIF(FinalABC!$A$1:$A$2227,A2,FinalABC!$N$1:$N$2227),2)>-1,ROUND(SUMIFS($I$1:$I$52435,$A$1:$A$52435,A2,$Y$1:$Y$52435,"INCLUDE")-SUMIF(FinalABC!$A$1:$A$2227,A2,FinalABC!$N$1:$N$2227),2)<1),K2,"MANUAL INPUT"))
            column_x = Range("X3:X" & lastrow_SHEETNAME1)
            column_y = Range("Y3:Y" & lastrow_SHEETNAME1)
            column_a = Range("A3:A" & lastrow_SHEETNAME1)
            column_i = Range("I3:I" & lastrow_SHEETNAME1)
            column_a_FinalABC = Sheets("FinalABC").Range("A3:A" & lastrow_FinalABC)
            column_n_FinalABC = Sheets("FinalABC").Range("N3:N" & lastrow_FinalABC)
            For n = LBound(working) To UBound(working)
 
                If (column_x(n, 1) = "NON EXIST" Or column_y(n, 1) = "EXCLUDE") Then
                'If working(n, 1) = "NON REPORTABLE" Then
                    working(n, 1) = "NON REPORTABLE"
                Else
                    If (column_y(n, 1) = "INCLUDE") Then
                        working(n, 1) = Round(ArraySumIf(column_a, column_a(n, 1), column_i) - ArraySumIf(column_a_FinalABC, column_a(n, 1), column_n_FinalABC), 2)
 
                        If ((working(n, 1) > -1) Or (working(n, 1) < 1)) Then
                            working(n, 1) = column_k(n, 1)
                        Else
                            working(n, 1) = "MANUAL INPUT"
                        End If
                    Else
                        working(n, 1) = "MANUAL INPUT"
                    End If
                End If
            Next n
 
            .Range("AH3:AH" & lastrow_SHEETNAME1).Value = working
 
 
            ' Copy adjustment data.
'zzzz            .Range("AI2:AI" & lastrow_SHEETNAME1) = .Range("AH2:AH" & lastrow_SHEETNAME1).Value
 
 
            ' Column AJ
            ' =IF(OR($X2="NON EXIST",$Y2="EXCLUDE"),"NON REPORTABLE",ROUND(E2*SUM(AI2/100),2))
            column_x = Range("X3:X" & lastrow_SHEETNAME1)
            column_y = Range("Y3:Y" & lastrow_SHEETNAME1)
            column_e = Range("E3:E" & lastrow_SHEETNAME1)
            column_ai = Range("AI3:AI" & lastrow_SHEETNAME1)
            For n = LBound(working) To UBound(working)
 
                If (column_x(n, 1) = "NON EXIST" Or column_y(n, 1) = "EXCLUDE") Then
                    working(n, 1) = "NON REPORTABLE"
                Else
                    If IsNumeric(column_ai(n, 1)) Then ' To cater for "Manual Input" in column AH.
                        working(n, 1) = Round(column_e(n, 1) * column_ai(n, 1) / 100, 2)
                    Else
                        working(n, 1) = 0
                    End If
                End If
            Next n
 
            .Range("AJ3:AJ" & lastrow_SHEETNAME1).Value = working
 
 
            ' Column AK
            ' =IF(OR($X2="NON EXIST",$Y2="EXCLUDE"),"NON REPORTABLE",SUMIF($A$1:$A$52435,A2,$AJ$1:$AJ$52435)-SUMIF(FinalABC!$A$1:$A$2227,A2,FinalABC!$N$1:$N$2227))
            column_x = Range("X3:X" & lastrow_SHEETNAME1)
            column_y = Range("Y3:Y" & lastrow_SHEETNAME1)
            column_a = Range("A3:A" & lastrow_SHEETNAME1)
            column_aj = Range("AJ3:AJ" & lastrow_SHEETNAME1)
            column_a_FinalABC = Sheets("FinalABC").Range("A3:A" & lastrow_FinalABC)
            column_n_FinalABC = Sheets("FinalABC").Range("N3:N" & lastrow_FinalABC)
            For n = LBound(working) To UBound(working)
 
                If (column_x(n, 1) = "NON EXIST" Or column_y(n, 1) = "EXCLUDE") Then
                    working(n, 1) = "NON REPORTABLE"
                Else
                    'working(n, 1) = Round(ArraySumIf(column_a, column_a(n, 1), column_aj) - ArraySumIf(column_a_FinalABC, column_a(n, 1), column_n_FinalABC), 2)
                    working(n, 1) = ArraySumIf(column_a, column_a(n, 1), column_aj) - ArraySumIf(column_a_FinalABC, column_a(n, 1), column_n_FinalABC)
                End If
            Next n
 
            .Range("AK3:AK" & lastrow_SHEETNAME1).Value = working
 
 
 
            ' Column AL
            ' =IF(OR($X2="NON EXIST",$Y2="EXCLUDE"), "NON REPORTABLE", IFERROR(VLOOKUP($A2,'Mapping Pivots'!$A$4:$D$1458,4,FALSE), IFERROR(VLOOKUP($AB2,'Mapping Pivots'!$F$4:$I$2230,4,FALSE), "MANUAL INPUT")))
            column_x = Range("X3:X" & lastrow_SHEETNAME1)
            column_y = Range("Y3:Y" & lastrow_SHEETNAME1)
            column_a = Range("A3:A" & lastrow_SHEETNAME1)
            column_ab = Range("AB3:AB" & lastrow_SHEETNAME1)
            column_a_MappingPivots = Sheets("Mapping Pivots").Range("A4:A" & lastrow_MappingPivots)
            column_d_MappingPivots = Sheets("Mapping Pivots").Range("D4:D" & lastrow_MappingPivots)
            column_f_MappingPivots = Sheets("Mapping Pivots").Range("F4:F" & lastrow_MappingPivots2)
            column_i_MappingPivots = Sheets("Mapping Pivots").Range("I4:I" & lastrow_MappingPivots2)
 
            ' Tidy up for Mapping Pivots columns.  Often they are Empty when reporting a 2nd line for same key value.
            ' This effects binary searches, so initially in the columns if a blank is encountered then actual value
            ' is written in its place.
            prev_a = column_a_MappingPivots(LBound(column_a_MappingPivots), 1)
            prev_d = column_d_MappingPivots(LBound(column_d_MappingPivots), 1)
            For n = LBound(column_a_MappingPivots) To UBound(column_a_MappingPivots)
                If column_a_MappingPivots(n, 1) = "" Then
                    column_a_MappingPivots(n, 1) = prev_a
                End If
                If column_d_MappingPivots(n, 1) = "" Then
                    column_d_MappingPivots(n, 1) = prev_d
                End If
                prev_a = column_a_MappingPivots(n, 1)
                prev_d = column_d_MappingPivots(n, 1)
            Next n
 
            prev_f = column_f_MappingPivots(LBound(column_f_MappingPivots), 1)
            prev_i = column_i_MappingPivots(LBound(column_i_MappingPivots), 1)
            For n = LBound(column_f_MappingPivots) To UBound(column_f_MappingPivots)
                If column_f_MappingPivots(n, 1) = "" Then
                    column_f_MappingPivots(n, 1) = prev_f
                End If
                If column_i_MappingPivots(n, 1) = "" Then
                    column_i_MappingPivots(n, 1) = prev_i
                End If
                prev_f = column_f_MappingPivots(n, 1)
                prev_i = column_i_MappingPivots(n, 1)
            Next n
 
            For n = LBound(working) To UBound(working)
 
                If (column_x(n, 1) = "NON EXIST" Or column_y(n, 1) = "EXCLUDE") Then
                    working(n, 1) = "NON REPORTABLE"
                Else
                    If ArrayCountIf(column_a_MappingPivots, column_a(n, 1)) > 0 Then
                        working(n, 1) = ArrayFind(column_a_MappingPivots, column_a(n, 1), column_d_MappingPivots, 0)
                    Else
                        If ArrayCountIf(column_f_MappingPivots, column_ab(n, 1)) > 0 Then
                            working(n, 1) = ArrayFind(column_f_MappingPivots, column_ab(n, 1), column_i_MappingPivots, 0)
                        Else
                            working(n, 1) = "MANUAL INPUT"
                        End If
                    End If
                End If
            Next n
 
            .Range("AL3:AL" & lastrow_SHEETNAME1).Value = working
 
 
 
'            .Range("AL2:AL2").AutoFill Destination:=.Range("AL2:AL" & lastrow_SHEETNAME1)
'            .Range("AL2:AL" & lastrow_SHEETNAME1).Calculate
'            .Range("AL3:AL" & lastrow_SHEETNAME1) = .Range("AL3:AL" & lastrow_SHEETNAME1).Value
 
 
            ' Copy adjustment data.
'zzzz            .Range("AM2:AM" & lastrow_SHEETNAME1) = .Range("AL2:AL" & lastrow_SHEETNAME1).Value
 
 
            ' Column AN
            ' =IF(OR($X2="NON EXIST",$Y2="EXCLUDE"),"NON REPORTABLE",IFERROR(VLOOKUP(A2&" - "&AM2,'Mapping Pivots'!$K$4:$M$1458,2,FALSE), 0))
            column_x = Range("X3:X" & lastrow_SHEETNAME1)
            column_y = Range("Y3:Y" & lastrow_SHEETNAME1)
            column_a = Range("A3:A" & lastrow_SHEETNAME1)
            column_am = Range("AM3:AM" & lastrow_SHEETNAME1)
            column_k_MappingPivots = Sheets("Mapping Pivots").Range("K4:K" & lastrow_MappingPivots3)
            column_m_MappingPivots = Sheets("Mapping Pivots").Range("M4:M" & lastrow_MappingPivots3)
 
            For n = LBound(working) To UBound(working)
 
                If (column_x(n, 1) = "NON EXIST" Or column_y(n, 1) = "EXCLUDE") Then
                    working(n, 1) = "NON REPORTABLE"
                Else
                    working(n, 1) = ArrayFind(column_k_MappingPivots, column_a(n, 1) & " - " & column_am(n, 1), column_m_MappingPivots, 0)
                End If
 
            Next n
 
            .Range("AN3:AN" & lastrow_SHEETNAME1).Value = working
 
 
'            .Range("AN2:AN2").AutoFill Destination:=.Range("AN2:AN" & lastrow_SHEETNAME1)
'            .Range("AN2:AN" & lastrow_SHEETNAME1).Calculate
'            .Range("AN3:AN" & lastrow_SHEETNAME1) = .Range("AN3:AN" & lastrow_SHEETNAME1).Value
 
 
 
            ' Column AO
            ' =IF(OR($X2="NON EXIST",$Y2="EXCLUDE"),"NON REPORTABLE",F2/AN2)
            column_x = Range("X3:X" & lastrow_SHEETNAME1)
            column_y = Range("Y3:Y" & lastrow_SHEETNAME1)
            column_f = Range("F3:F" & lastrow_SHEETNAME1)
            column_an = Range("AN3:AN" & lastrow_SHEETNAME1)
            For n = LBound(working) To UBound(working)
 
                If (column_x(n, 1) = "NON EXIST" Or column_y(n, 1) = "EXCLUDE") Then
                    working(n, 1) = "NON REPORTABLE"
                Else
                    If (column_an(n, 1) = 0) Then   ' Can't SHEETNAME1de by zero.
                        working(n, 1) = 0
                    Else
                        working(n, 1) = column_f(n, 1) / column_an(n, 1)
                    End If
                End If
            Next n
 
            .Range("AO3:AO" & lastrow_SHEETNAME1).Value = working
 
 
            ' Column AP
            ' =IF(OR($X2="NON EXIST",$Y2="EXCLUDE"),"NON REPORTABLE",IF(COUNTIF($A$1:A2,A2)>1,"AGGREGATE",SUMIF($A:$A,A2,$AO:$AO)-SUMIF(FinalABC!$A:$A,A2,FinalABC!$K:$K)))
            column_x = Range("X3:X" & lastrow_SHEETNAME1)
            column_y = Range("Y3:Y" & lastrow_SHEETNAME1)
            column_a = Range("A3:A" & lastrow_SHEETNAME1)
            column_ao = Range("AO3:AO" & lastrow_SHEETNAME1)
            column_a_FinalABC = Sheets("FinalABC").Range("A3:A" & lastrow_FinalABC)
            column_k_FinalABC = Sheets("FinalABC").Range("K3:K" & lastrow_FinalABC)
            For n = LBound(working) To UBound(working)
 
                If (column_x(n, 1) = "NON EXIST" Or column_y(n, 1) = "EXCLUDE") Then
                    working(n, 1) = "NON REPORTABLE"
                Else
                    If ArrayCountIf(column_a, column_a(n, 1)) > 1 Then
                        working(n, 1) = "AGGREGATE"
                    Else
                        working(n, 1) = Round(ArraySumIf(column_a, column_a(n, 1), column_ao) - ArraySumIf(column_a_FinalABC, column_a(n, 1), column_k_FinalABC), 2)
                    End If
                End If
            Next n
 
            .Range("AP3:AP" & lastrow_SHEETNAME1).Value = working
 
 
            ' Column AQ
            ' =IF(OR($X2="NON EXIST",$Y2="EXCLUDE"),"NON REPORTABLE",T2&" - "&  IFERROR(IF(VLOOKUP(R2,Wxxxx!B:Z,24,FALSE)="YES", "VALID", "INVALID"),"INVALID")&" - " & IFERROR(VLOOKUP(R2,Wxxxx!B:Z,25,FALSE),"N") &" - "&K2)
            column_x = Range("X3:X" & lastrow_SHEETNAME1)
            column_y = Range("Y3:Y" & lastrow_SHEETNAME1)
            column_t = Range("T3:T" & lastrow_SHEETNAME1)
            column_u = Range("U3:U" & lastrow_SHEETNAME1)
            column_b_Wxxxx = Sheets("Wxxxx").Range("B3:B" & lastrow_Wxxxx)
            column_y_Wxxxx = Sheets("Wxxxx").Range("Y3:Y" & lastrow_Wxxxx)
            column_r = Range("R3:R" & lastrow_SHEETNAME1)
            column_z_Wxxxx = Sheets("Wxxxx").Range("Z3:Z" & lastrow_Wxxxx)
            column_k = Range("K3:K" & lastrow_SHEETNAME1)
            For n = LBound(working) To UBound(working)
 
                If (column_x(n, 1) = "NON EXIST" Or column_y(n, 1) = "EXCLUDE") Then
                    working(n, 1) = "NON REPORTABLE"
                Else
                    working(n, 1) = column_t(n, 1) & " - "
 
                    tmp = ArrayFind(column_b_Wxxxx, column_r(n, 1), column_y_Wxxxx, 0)
                    If tmp = "YES" Then
                        working(n, 1) = working(n, 1) & "VALID" & " - "
                    Else
                        working(n, 1) = working(n, 1) & "INVALID" & " - "
                    End If
 
                    tmp = ArrayFind(column_b_Wxxxx, column_r(n, 1), column_z_Wxxxx, "N")
                    working(n, 1) = working(n, 1) & tmp & " - " & column_k(n, 1)
                End If
            Next n
 
            .Range("AQ3:AQ" & lastrow_SHEETNAME1).Value = working
 
'            .Range("AQ2:AQ2").AutoFill Destination:=.Range("AQ2:AQ" & lastrow_SHEETNAME1)
'            .Range("AQ2:AQ" & lastrow_SHEETNAME1).Calculate
'            .Range("AQ3:AQ" & lastrow_SHEETNAME1) = .Range("AQ3:AQ" & lastrow_SHEETNAME1).Value
 
 
            ' Column AR
            ' =IF(OR($X2="NON EXIST",$Y2="EXCLUDE"),"NON REPORTABLE",IFERROR(VLOOKUP(AQ2,References!$H$1:$K$45,2,FALSE),0))
            column_x = Range("X3:X" & lastrow_SHEETNAME1)
            column_y = Range("Y3:Y" & lastrow_SHEETNAME1)
            column_aq = Range("AQ3:AQ" & lastrow_SHEETNAME1)
            column_h_References = Sheets("References").Range("H3:H" & lastrow_References_adjusted_rate)
            column_i_References = Sheets("References").Range("I3:I" & lastrow_References_adjusted_rate)
            For n = LBound(working) To UBound(working)
 
                If (column_x(n, 1) = "NON EXIST" Or column_y(n, 1) = "EXCLUDE") Then
                    working(n, 1) = "NON REPORTABLE"
                Else
                    working(n, 1) = ArrayFind(column_h_References, column_aq(n, 1), column_i_References, 0)
                End If
            Next n
 
            .Range("AR3:AR" & lastrow_SHEETNAME1).Value = working
 
 
'            .Range("AR2:AR2").AutoFill Destination:=.Range("AR2:AR" & lastrow_SHEETNAME1)
'            .Range("AR2:AR" & lastrow_SHEETNAME1).Calculate
'            .Range("AR3:AR" & lastrow_SHEETNAME1) = .Range("AR3:AR" & lastrow_SHEETNAME1).Value
 
 
            ' Column AS
            ' =IF(OR($X2="NON EXIST",$Y2="EXCLUDE"),"NON REPORTABLE",IFERROR(VLOOKUP(AQ2,References!$H$1:$K$45,3,FALSE),0))
            column_x = Range("X3:X" & lastrow_SHEETNAME1)
            column_y = Range("Y3:Y" & lastrow_SHEETNAME1)
            column_aq = Range("AQ3:AQ" & lastrow_SHEETNAME1)
            column_h_References = Sheets("References").Range("H3:H" & lastrow_References_adjusted_rate)
            column_j_References = Sheets("References").Range("J3:J" & lastrow_References_adjusted_rate)
            For n = LBound(working) To UBound(working)
 
                If (column_x(n, 1) = "NON EXIST" Or column_y(n, 1) = "EXCLUDE") Then
                    working(n, 1) = "NON REPORTABLE"
                Else
                    working(n, 1) = ArrayFind(column_h_References, column_aq(n, 1), column_j_References, 0)
                End If
            Next n
 
            .Range("AS3:AS" & lastrow_SHEETNAME1).Value = working
 
'            .Range("AS2:AS2").AutoFill Destination:=.Range("AS2:AS" & lastrow_SHEETNAME1)
'            .Range("AS2:AS" & lastrow_SHEETNAME1).Calculate
'            .Range("AS3:AS" & lastrow_SHEETNAME1) = .Range("AS3:AS" & lastrow_SHEETNAME1).Value
 
 
            ' Column AT
            ' =IF(OR($X2="NON EXIST",$Y2="EXCLUDE"),"NON REPORTABLE",IFERROR(VLOOKUP(AQ2,References!$H$1:$K$45,4,FALSE),0))
            column_x = Range("X3:X" & lastrow_SHEETNAME1)
            column_y = Range("Y3:Y" & lastrow_SHEETNAME1)
            column_aq = Range("AQ3:AQ" & lastrow_SHEETNAME1)
            column_h_References = Sheets("References").Range("H3:H" & lastrow_References_adjusted_rate)
            column_k_References = Sheets("References").Range("K3:K" & lastrow_References_adjusted_rate)
            For n = LBound(working) To UBound(working)
 
                If (column_x(n, 1) = "NON EXIST" Or column_y(n, 1) = "EXCLUDE") Then
                    working(n, 1) = "NON REPORTABLE"
                Else
                    working(n, 1) = ArrayFind(column_h_References, column_aq(n, 1), column_k_References, 0)
                End If
            Next n
 
            .Range("AT3:AT" & lastrow_SHEETNAME1).Value = working
 
'            .Range("AT2:AT2").AutoFill Destination:=.Range("AT2:AT" & lastrow_SHEETNAME1)
'            .Range("AT2:AT" & lastrow_SHEETNAME1).Calculate
'            .Range("AT3:AT" & lastrow_SHEETNAME1) = .Range("AT3:AT" & lastrow_SHEETNAME1).Value
 
 
            ' Copy adjustment data.
'zzzz            .Range("AU2:AU" & lastrow_SHEETNAME1) = .Range("AT2:AT" & lastrow_SHEETNAME1).Value
 
 
            ' Column AV
            ' =IF(OR($X2="NON EXIST",$Y2="EXCLUDE"),"NON REPORTABLE",IFERROR(VLOOKUP(AD2&" - "&AF2,References!S:W,3,FALSE),0))
            column_x = Range("X3:X" & lastrow_SHEETNAME1)
            column_y = Range("Y3:Y" & lastrow_SHEETNAME1)
            column_ad = Range("AD3:AD" & lastrow_SHEETNAME1)
            column_af = Range("AF3:AF" & lastrow_SHEETNAME1)
            column_s_References = Sheets("References").Range("S3:S" & lastrow_References_income_type)
            column_u_References = Sheets("References").Range("U3:U" & lastrow_References_income_type)
            For n = LBound(working) To UBound(working)
 
                If (column_x(n, 1) = "NON EXIST" Or column_y(n, 1) = "EXCLUDE") Then
                    working(n, 1) = "NON REPORTABLE"
                Else
                    working(n, 1) = ArrayFind(column_s_References, column_ad(n, 1) & " - " & column_af(n, 1), column_u_References, 0)
                End If
            Next n
 
            .Range("AV3:AV" & lastrow_SHEETNAME1).Value = working
 
'            .Range("AV2:AV2").AutoFill Destination:=.Range("AV2:AV" & lastrow_SHEETNAME1)
'            .Range("AV2:AV" & lastrow_SHEETNAME1).Calculate
'            .Range("AV3:AV" & lastrow_SHEETNAME1) = .Range("AV3:AV" & lastrow_SHEETNAME1).Value
 
 
            ' Column AW
            ' =IF(OR($X2="NON EXIST",$Y2="EXCLUDE"),"NON REPORTABLE",IF(OR(AR2="NO ADJUSTMENT REQUIRED",K2=AU2),"NO ADJUSTMENT REQUIRED","ADJUST FROM "&K2&"% TO "&AU2&"% - BBH REPORTED "&AI2&"%"))
            column_x = Range("X3:X" & lastrow_SHEETNAME1)
            column_y = Range("Y3:Y" & lastrow_SHEETNAME1)
            column_ar = Range("AR3:AR" & lastrow_SHEETNAME1)
            column_k = Range("K3:K" & lastrow_SHEETNAME1)
            column_au = Range("AU3:AU" & lastrow_SHEETNAME1)
            column_ai = Range("AI3:AI" & lastrow_SHEETNAME1)
            For n = LBound(working) To UBound(working)
 
                If (column_x(n, 1) = "NON EXIST" Or column_y(n, 1) = "EXCLUDE") Then
                    working(n, 1) = "NON REPORTABLE"
                Else
                    If (column_ar(n, 1) = "NO ADJUSTMENT REQUIRED" Or column_k(n, 1) = column_au(n, 1)) Then
                        working(n, 1) = "NO ADJUSTMENT REQUIRED"
                    Else
                        working(n, 1) = "ADJUST FROM " & column_k(n, 1) & "% TO " & column_au(n, 1) & "% - BBH REPORTED " & column_ai(n, 1) & "%"
                    End If
                End If
            Next n
 
            .Range("AW3:AW" & lastrow_SHEETNAME1).Value = working
 
 
            ' Column AX
            ' =IF(OR($X2="NON EXIST",$Y2="EXCLUDE"),"NON REPORTABLE",IF(R2=530572,"BPB&T IOM",IF(T2="IBGC","BPCI","BPB&T Jersey")))
            column_x = Range("X3:X" & lastrow_SHEETNAME1)
            column_y = Range("Y3:Y" & lastrow_SHEETNAME1)
            column_r = Range("R3:R" & lastrow_SHEETNAME1)
            column_t = Range("T3:T" & lastrow_SHEETNAME1)
            For n = LBound(working) To UBound(working)
 
                If (column_x(n, 1) = "NON EXIST" Or column_y(n, 1) = "EXCLUDE") Then
                    working(n, 1) = "NON REPORTABLE"
                Else
                    If (column_r(n, 1) = 530572) Then
                        working(n, 1) = "BPB&T IOM"
                    Else
                        If (column_t(n, 1) = "IBGC") Then
                            working(n, 1) = "BPCI"
                        Else
                            working(n, 1) = "BPB&T Jersey"
                        End If
                    End If
                End If
            Next n
 
            .Range("AX3:AX" & lastrow_SHEETNAME1).Value = working
 
 
            ' Column AY
            ' =IF(AW2="NO ADJUSTMENT REQUIRED","NO ADJUSTMENT REQUIRED",IF(AW2="NON REPORTABLE","NON REPORTABLE",ROUND((F2*AU2%)-I2,2)))
            column_aw = Range("AW3:AW" & lastrow_SHEETNAME1)
            column_f = Range("F3:F" & lastrow_SHEETNAME1)
            column_au = Range("AU3:AU" & lastrow_SHEETNAME1)
            column_i = Range("I3:I" & lastrow_SHEETNAME1)
            For n = LBound(working) To UBound(working)
 
                If (column_aw(n, 1) = "NO ADJUSTMENT REQUIRED") Then
                    working(n, 1) = "NO ADJUSTMENT REQUIRED"
                Else
                    If (column_aw(n, 1) = "NON REPORTABLE") Then
                        working(n, 1) = "NON REPORTABLE"
                    Else
                        working(n, 1) = Round((column_f(n, 1) * column_au(n, 1) / 100) - column_i(n, 1), 2)
                    End If
                End If
            Next n
 
            .Range("AY3:AY" & lastrow_SHEETNAME1).Value = working
 
 
            ' Column BB
            ' =IF(ISNA(VLOOKUP(U2,References!$AG:$AG,1,FALSE)),"NO ADJUSTMENT REQUIRED",IF(AW2="NO ADJUSTMENT REQUIRED","NO ADJUSTMENT REQUIRED",IF(AW2="NON REPORTABLE","NON REPORTABLE",IFERROR(VLOOKUP(T2&" - "&AU2,References!$O$2:$Q$5,3,FALSE),0))))
            column_u = Range("U3:U" & lastrow_SHEETNAME1)
            column_ag_References = Sheets("References").Range("AG3:AG" & lastrow_References_allowed_locations)
            column_aw = Range("AW3:AW" & lastrow_SHEETNAME1)
            column_t = Range("T3:T" & lastrow_SHEETNAME1)
            column_au = Range("AU3:AU" & lastrow_SHEETNAME1)
            column_o_References = Sheets("References").Range("O3:O" & lastrow_References_g3_location)
            column_q_References = Sheets("References").Range("Q3:Q" & lastrow_References_g3_location)
            For n = LBound(working) To UBound(working)
 
                If ArrayCountIf(column_ag_References, column_u(n, 1)) > 0 Then
                    If column_aw(n, 1) = "NO ADJUSTMENT REQUIRED" Then
                        working(n, 1) = "NO ADJUSTMENT REQUIRED"
                    Else
                        If column_aw(n, 1) = "NON REPORTABLE" Then
                            working(n, 1) = "NON REPORTABLE"
                        Else
                            working(n, 1) = ArrayFind(column_o_References, column_t(n, 1) & " - " & column_au(n, 1), column_q_References, 0)
                        End If
 
                    End If
                    'working(n, 1) = Round(ArraySumIf(column_a, column_a(n, 1), column_an) - ArraySumIf(column_a_FinalABC, column_a(n, 1), column_k_FinalABC), 2)
                Else
                    working(n, 1) = "NO ADJUSTMENT REQUIRED"
                End If
            Next n
 
            .Range("BB3:BB" & lastrow_SHEETNAME1).Value = working
 
 
'            .Range("BB2:BB2").AutoFill Destination:=.Range("BB2:BB" & lastrow_SHEETNAME1)
'            .Range("BB2:BB" & lastrow_SHEETNAME1).Calculate
'            .Range("BB3:BB" & lastrow_SHEETNAME1) = .Range("BB3:BB" & lastrow_SHEETNAME1).Value
 
 
            ' Column BD
            ' =IF(AW2="NO ADJUSTMENT REQUIRED","NO ADJUSTMENT REQUIRED",IF(AW2="NON REPORTABLE","NON REPORTABLE",IFERROR(VLOOKUP(T2& " - " &AU2,References!$O$2:$Q$5,2,FALSE),0)))
            column_aw = Range("AW3:AW" & lastrow_SHEETNAME1)
            column_au = Range("AU3:AU" & lastrow_SHEETNAME1)
            column_o_References = Sheets("References").Range("O3:O" & lastrow_References_g3_location)
            column_p_References = Sheets("References").Range("P3:P" & lastrow_References_g3_location)
            For n = LBound(working) To UBound(working)
 
                If (column_aw(n, 1) = "NO ADJUSTMENT REQUIRED") Then
                    working(n, 1) = "NO ADJUSTMENT REQUIRED"
                Else
                    If (column_aw(n, 1) = "NON REPORTABLE") Then
                        working(n, 1) = "NON REPORTABLE"
                    Else
                        working(n, 1) = ArrayFind(column_o_References, column_t(n, 1) & " - " & column_au(n, 1), column_p_References, 0)
                    End If
                End If
            Next n
 
            .Range("BD3:BD" & lastrow_SHEETNAME1).Value = working
 
'            .Range("BD2:BD2").AutoFill Destination:=.Range("BD2:BD" & lastrow_SHEETNAME1)
'            .Range("BD2:BD" & lastrow_SHEETNAME1).Calculate
'            .Range("BD3:BD" & lastrow_SHEETNAME1) = .Range("BD3:BD" & lastrow_SHEETNAME1).Value
 
 
            ' Column BE
            '=IF(AW2="NO ADJUSTMENT REQUIRED","NO ADJUSTMENT REQUIRED",IF(AW2="NON REPORTABLE","NON REPORTABLE",IF(BD2<>M2,"Yes","No")))
            column_aw = Range("AW3:AW" & lastrow_SHEETNAME1)
            column_bd = Range("BD3:BD" & lastrow_SHEETNAME1)
            column_m = Range("M3:M" & lastrow_SHEETNAME1)
            For n = LBound(working) To UBound(working)
 
                If (column_aw(n, 1) = "NO ADJUSTMENT REQUIRED") Then
                    working(n, 1) = "NO ADJUSTMENT REQUIRED"
                Else
                    If (column_aw(n, 1) = "NON REPORTABLE") Then
                        working(n, 1) = "NON REPORTABLE"
                    Else
                        If (column_bd(n, 1) <> column_m(n, 1)) Then
                            working(n, 1) = "Yes"
                        Else
                            working(n, 1) = "No"
                        End If
                    End If
                End If
            Next n
 
            .Range("BE3:BE" & lastrow_SHEETNAME1).Value = working
 
 
            ' Column BG
            ' =IF(ISNA(VLOOKUP(R2&N2,HOLDINGS!A:A,1,FALSE)),"NO HOLDINGS","STILL HAS HOLDINGS")
            column_r = Range("R3:R" & lastrow_SHEETNAME1)
            column_n = Range("N3:N" & lastrow_SHEETNAME1)
            column_a_HOLDINGS = Sheets("HOLDINGS").Range("A3:A" & lastrow_HOLDINGS)
            For n = LBound(working) To UBound(working)
                'working(n, 1) = ArrayFind(column_a_HOLDINGS, column_r(n, 1) & column_n(n, 1), column_a_HOLDINGS, 0)
                working(n, 1) = ArrayFindEx(column_a_HOLDINGS, column_r(n, 1) & column_n(n, 1), "STILL HAS HOLDINGS", "NO HOLDINGS")
            Next n
 
            .Range("BG3:BG" & lastrow_SHEETNAME1).Value = working
 
'            .Range("BG2:BG2").AutoFill Destination:=.Range("BF2:BF" & lastrow_SHEETNAME1)
'            .Range("BG2:BG" & lastrow_SHEETNAME1).Calculate
'            .Range("BG3:BG" & lastrow_SHEETNAME1) = .Range("BF3:BF" & lastrow_SHEETNAME1).Value
 
 
            ' Column BH
            '=IF(ISNA(VLOOKUP(R2&N2,HOLDINGS!A:G,7,FALSE)),"NO HOLDINGS",VLOOKUP(R2&N2,HOLDINGS!A:G,7,FALSE))
            column_r = Range("R3:R" & lastrow_SHEETNAME1)
            column_n = Range("N3:N" & lastrow_SHEETNAME1)
            column_a_HOLDINGS = Sheets("HOLDINGS").Range("A3:A" & lastrow_HOLDINGS)
            column_f_HOLDINGS = Sheets("HOLDINGS").Range("F3:F" & lastrow_HOLDINGS)
            For n = LBound(working) To UBound(working)
                working(n, 1) = ArrayFind(column_a_HOLDINGS, column_r(n, 1) & column_n(n, 1), column_f_HOLDINGS, "NO HOLDINGS")
            Next n
 
            .Range("BH3:BH" & lastrow_SHEETNAME1).Value = working
 
'            .Range("BH2:BH2").AutoFill Destination:=.Range("BH2:BH" & lastrow_SHEETNAME1)
'            .Range("BH2:BH" & lastrow_SHEETNAME1).Calculate
'            .Range("BH3:BH" & lastrow_SHEETNAME1) = .Range("BH3:BH" & lastrow_SHEETNAME1).Value
 
 
            ' Column BI
            ' =IF(BH2="NO HOLDINGS","NO HOLDINGS",VLOOKUP(BH2,References!A:B,2,FALSE))
            column_bh = Range("BH3:BH" & lastrow_SHEETNAME1)
            column_a_References = Sheets("References").Range("A3:A" & lastrow_References)
            column_b_References = Sheets("References").Range("B3:B" & lastrow_References)
            For n = LBound(working) To UBound(working)
                If column_bh(n, 1) = "NO HOLDINGS" Then
                    working(n, 1) = "NO HOLDINGS"
                Else
                    working(n, 1) = ArrayFind(column_a_References, column_bh(n, 1), column_b_References, 0)
                End If
            Next n
 
            .Range("BI3:BI" & lastrow_SHEETNAME1).Value = working
 
'            .Range("BI2:BI2").AutoFill Destination:=.Range("BI2:BI" & lastrow_SHEETNAME1)
'            .Range("BI2:BI" & lastrow_SHEETNAME1).Calculate
'            .Range("BI3:BI" & lastrow_SHEETNAME1) = .Range("BI3:BI" & lastrow_SHEETNAME1).Value
 
 
            ' Column BJ
            ' =IF(OR(BB2="NO ADJUSTMENT REQUIRED",Y2="EXCLUDE"),"NO ADJUSTMENT REQUIRED",IFERROR(VLOOKUP(LEFT(P2,6)&TEXT(H2,"#.00")&R2,TRANSACTIONS!A:L,12,FALSE),0))
            column_bb = Range("BB3:BB" & lastrow_SHEETNAME1)
            column_y = Range("Y3:Y" & lastrow_SHEETNAME1)
            column_p = Range("P3:P" & lastrow_SHEETNAME1)
            column_h = Range("H3:H" & lastrow_SHEETNAME1)
            column_r = Range("R3:R" & lastrow_SHEETNAME1)
            column_a_TRANSACTIONS = Sheets("TRANSACTIONS").Range("A3:A" & lastrow_TRANSACTIONS)
            column_l_TRANSACTIONS = Sheets("TRANSACTIONS").Range("L3:L" & lastrow_TRANSACTIONS)
            For n = LBound(working) To UBound(working)
                If column_bb(n, 1) = "NO ADJUSTMENT REQUIRED" Or column_y(n, 1) = "EXCLUDE" Then
                    working(n, 1) = "NO ADJUSTMENT REQUIRED"
                Else
                    working(n, 1) = ArrayFind(column_a_TRANSACTIONS, Left(column_p(n, 1), 6) & WorksheetFunction.Text(column_h(n, 1), "#.00") & column_r(n, 1), column_l_TRANSACTIONS, 0)
                End If
            Next n
 
            .Range("BJ3:BJ" & lastrow_SHEETNAME1).Value = working
 
'            .Range("BJ2:BJ2").AutoFill Destination:=.Range("BJ2:BJ" & lastrow_SHEETNAME1)
'            .Range("BJ2:BJ" & lastrow_SHEETNAME1).Calculate
'            .Range("BJ3:BJ" & lastrow_SHEETNAME1) = .Range("BJ3:BJ" & lastrow_SHEETNAME1).Value
 
 
            ' Column BK
            ' =IF(OR(BB2="NO ADJUSTMENT REQUIRED",Y2="EXCLUDE"),"NO ADJUSTMENT REQUIRED",VLOOKUP(LEFT(P2,6)&Text(H2,"#.00")&R2,TRANSACTIONS!A:M,13,FALSE))
            column_bb = Range("BB3:BB" & lastrow_SHEETNAME1)
            column_y = Range("Y3:Y" & lastrow_SHEETNAME1)
            column_p = Range("P3:P" & lastrow_SHEETNAME1)
            column_h = Range("H3:H" & lastrow_SHEETNAME1)
            column_r = Range("R3:R" & lastrow_SHEETNAME1)
            column_a_TRANSACTIONS = Sheets("TRANSACTIONS").Range("A3:A" & lastrow_TRANSACTIONS)
            column_m_TRANSACTIONS = Sheets("TRANSACTIONS").Range("M3:M" & lastrow_TRANSACTIONS)
            For n = LBound(working) To UBound(working)
                If column_bb(n, 1) = "NO ADJUSTMENT REQUIRED" Or column_y(n, 1) = "EXCLUDE" Then
                    working(n, 1) = "NO ADJUSTMENT REQUIRED"
                Else
                    working(n, 1) = ArrayFind(column_a_TRANSACTIONS, Left(column_p(n, 1), 6) & WorksheetFunction.Text(column_h(n, 1), "#.00") & column_r(n, 1), column_m_TRANSACTIONS, 0)
                End If
            Next n
 
            .Range("BK3:BK" & lastrow_SHEETNAME1).Value = working
 
'            .Range("BK2:BK2").AutoFill Destination:=.Range("BK2:BK" & lastrow_SHEETNAME1)
'            .Range("BK2:BK" & lastrow_SHEETNAME1).Calculate
'            .Range("BK3:BK" & lastrow_SHEETNAME1) = .Range("BK3:BK" & lastrow_SHEETNAME1).Value
 
 
            ' Column BL
            ' =IF(OR(BB2="NO ADJUSTMENT REQUIRED",Y2="EXCLUDE"),"NO ADJUSTMENT REQUIRED",VLOOKUP(LEFT(P2,6)&Text(H2,"#.00")&R2,TRANSACTIONS!A:N,14,FALSE))
            column_bb = Range("BB3:BB" & lastrow_SHEETNAME1)
            column_y = Range("Y3:Y" & lastrow_SHEETNAME1)
            column_p = Range("P3:P" & lastrow_SHEETNAME1)
            column_h = Range("H3:H" & lastrow_SHEETNAME1)
            column_r = Range("R3:R" & lastrow_SHEETNAME1)
            column_a_TRANSACTIONS = Sheets("TRANSACTIONS").Range("A3:A" & lastrow_TRANSACTIONS)
            column_n_TRANSACTIONS = Sheets("TRANSACTIONS").Range("N3:N" & lastrow_TRANSACTIONS)
            For n = LBound(working) To UBound(working)
                If column_bb(n, 1) = "NO ADJUSTMENT REQUIRED" Or column_y(n, 1) = "EXCLUDE" Then
                    working(n, 1) = "NO ADJUSTMENT REQUIRED"
                Else
                    working(n, 1) = ArrayFind(column_a_TRANSACTIONS, Left(column_p(n, 1), 6) & WorksheetFunction.Text(column_h(n, 1), "#.00") & column_r(n, 1), column_n_TRANSACTIONS, 0)
                End If
            Next n
 
            .Range("BL3:BL" & lastrow_SHEETNAME1).Value = working
 
'            .Range("BL2:BL2").AutoFill Destination:=.Range("BL2:BL" & lastrow_SHEETNAME1)
'            .Range("BL2:BL" & lastrow_SHEETNAME1).Calculate
'            .Range("BL3:BL" & lastrow_SHEETNAME1) = .Range("BL3:BL" & lastrow_SHEETNAME1).Value
 
 
            ' Column BM
            ' =IF(ISNA(VLOOKUP(R2,QSHEET!A:A,1,FALSE)),"NOT ON QSHEET", "ON QSHEET")
            column_r = Range("R3:R" & lastrow_SHEETNAME1)
            column_a_QSHEET = Sheets("QSHEET").Range("A3:A" & lastrow_QSHEET)
            For n = LBound(working) To UBound(working)
                working(n, 1) = ArrayFindEx(column_a_QSHEET, column_r(n, 1), "ON QSHEET", "NOT ON QSHEET")
            Next n
 
            .Range("BM3:BM" & lastrow_SHEETNAME1).Value = working
 
'            .Range("BM2:BM2").AutoFill Destination:=.Range("BM2:BM" & lastrow_SHEETNAME1)
'            .Range("BM2:BM" & lastrow_SHEETNAME1).Calculate
'            .Range("BM3:BM" & lastrow_SHEETNAME1) = .Range("BM3:BM" & lastrow_SHEETNAME1).Value
 
        End With
    End With
 
 
    ' Clear all objects.
    Set working = Nothing
 
    Set column_a = Nothing
    Set column_b = Nothing
    Set column_e = Nothing
    Set column_f = Nothing
    Set column_g = Nothing
    Set column_h = Nothing
    Set column_i = Nothing
    Set column_k = Nothing
    Set column_l = Nothing
    Set column_m = Nothing
    Set column_n = Nothing
    Set column_p = Nothing
    Set column_r = Nothing
    Set column_t = Nothing
    Set column_u = Nothing
    Set column_x = Nothing
    Set column_y = Nothing
    Set column_ab = Nothing
    Set column_ad = Nothing
    Set column_af = Nothing
    Set column_ai = Nothing
    Set column_aj = Nothing
    Set column_am = Nothing
    Set column_an = Nothing
    Set column_ao = Nothing
    Set column_aq = Nothing
    Set column_ar = Nothing
    Set column_au = Nothing
    Set column_aw = Nothing
    Set column_bb = Nothing
    Set column_bd = Nothing
    Set column_bh = Nothing
 
    Set column_a_CUST = Nothing
    Set column_b_CUST = Nothing
    Set column_a_FinalABC = Nothing
    Set column_d_FinalABC = Nothing
    Set column_k_FinalABC = Nothing
    Set column_n_FinalABC = Nothing
    Set column_a_HOLDINGS = Nothing
    Set column_f_HOLDINGS = Nothing
    Set column_a_MappingPivots = Nothing
    Set column_b_MappingPivots = Nothing
    Set column_c_MappingPivots = Nothing
    Set column_d_MappingPivots = Nothing
    Set column_f_MappingPivots = Nothing
    Set column_g_MappingPivots = Nothing
    Set column_h_MappingPivots = Nothing
    Set column_i_MappingPivots = Nothing
    Set column_k_MappingPivots = Nothing
    Set column_m_MappingPivots = Nothing
    Set column_a_QSHEET = Nothing
    Set column_a_References = Nothing
    Set column_b_References = Nothing
    Set column_h_References = Nothing
    Set column_i_References = Nothing
    Set column_j_References = Nothing
    Set column_k_References = Nothing
    Set column_o_References = Nothing
    Set column_p_References = Nothing
    Set column_q_References = Nothing
    Set column_s_References = Nothing
    Set column_u_References = Nothing
    Set column_ag_References = Nothing
 
    Set column_a_TRANSACTIONS = Nothing
    Set column_l_TRANSACTIONS = Nothing
    Set column_m_TRANSACTIONS = Nothing
    Set column_n_TRANSACTIONS = Nothing
    Set column_b_Wxxxx = Nothing
    Set column_y_Wxxxx = Nothing
    Set column_z_Wxxxx = Nothing
 
    Set prev_a = Nothing
    Set prev_b = Nothing
    Set prev_c = Nothing
    Set prev_f = Nothing
    Set prev_g = Nothing
    Set prev_h = Nothing
    Set prev_i = Nothing
 
    Set tmp = Nothing
 
End Sub
 
 
 
 
' Copies remaining formulae down on the SHEETNAME1 sheet.
Sub M10540_Copy_Post_SHEETNAME1_Formulae_Down()
 
    Dim lastrow_SHEETNAME1 As Long
 
 
    ' Initialize global vars.
    Call Z00000_Init
 
 
    ' Ask user.
    If ctrl_ask_before_running_subroutine = True Then
        If MsgBox("Copy Post SHEETNAME1 formulae down?", vbYesNo) = vbNo Then Exit Sub
    End If
 
 
    ' Update StatusBar.
    Application.StatusBar = "Copy post-SHEETNAME1 Formulae down..."
 
 
    With Workbooks(wb_name)
 
        With .Sheets("SHEETNAME1")
 
            ' Activate the SHEETNAME1 sheet.
            .Activate
 
            ' Get how many rows of data have been loaded into the sheet.
            lastrow_SHEETNAME1 = .Cells(Rows.Count, 4).End(xlUp).Row
            ' Prevent line 2 being deleted - as this contains the formulae which need coping down later.
            If lastrow_SHEETNAME1 < 3 Then
                lastrow_SHEETNAME1 = 3
            End If
 
 
            ' Copies formulae down.
            .Range("F2:F2").AutoFill Destination:=.Range("F2:F" & lastrow_SHEETNAME1)
            .Range("F2:F" & lastrow_SHEETNAME1).Calculate
            .Range("F3:F" & lastrow_SHEETNAME1) = .Range("F3:F" & lastrow_SHEETNAME1).Value
 
            .Range("H2:H2").AutoFill Destination:=.Range("H2:H" & lastrow_SHEETNAME1)
            .Range("H2:H" & lastrow_SHEETNAME1).Calculate
            .Range("H3:H" & lastrow_SHEETNAME1) = .Range("H3:H" & lastrow_SHEETNAME1).Value
 
            .Range("J2:J2").AutoFill Destination:=.Range("J2:J" & lastrow_SHEETNAME1)
            .Range("J2:J" & lastrow_SHEETNAME1).Calculate
            .Range("J3:J" & lastrow_SHEETNAME1) = .Range("J3:J" & lastrow_SHEETNAME1).Value
 
            .Range("L2:L2").AutoFill Destination:=.Range("L2:L" & lastrow_SHEETNAME1)
            .Range("L2:L" & lastrow_SHEETNAME1).Calculate
            .Range("L3:L" & lastrow_SHEETNAME1) = .Range("L3:L" & lastrow_SHEETNAME1).Value
 
            .Range("M2:M2").AutoFill Destination:=.Range("M2:M" & lastrow_SHEETNAME1)
            .Range("M2:M" & lastrow_SHEETNAME1).Calculate
            .Range("M3:M" & lastrow_SHEETNAME1) = .Range("M3:M" & lastrow_SHEETNAME1).Value
 
            .Range("T2:T2").AutoFill Destination:=.Range("T2:T" & lastrow_SHEETNAME1)
            .Range("T2:T" & lastrow_SHEETNAME1).Calculate
            .Range("T3:T" & lastrow_SHEETNAME1) = .Range("T3:T" & lastrow_SHEETNAME1).Value
 
            .Range("V2:V2").AutoFill Destination:=.Range("V2:V" & lastrow_SHEETNAME1)
            .Range("V2:V" & lastrow_SHEETNAME1).Calculate
            .Range("V3:V" & lastrow_SHEETNAME1) = .Range("V3:V" & lastrow_SHEETNAME1).Value
 
            .Range("W2:W2").AutoFill Destination:=.Range("W2:W" & lastrow_SHEETNAME1)
            .Range("W2:W" & lastrow_SHEETNAME1).Calculate
            .Range("W3:W" & lastrow_SHEETNAME1) = .Range("W3:W" & lastrow_SHEETNAME1).Value
 
            .Range("X2:X2").AutoFill Destination:=.Range("X2:X" & lastrow_SHEETNAME1)
            .Range("X2:X" & lastrow_SHEETNAME1).Calculate
            .Range("X3:X" & lastrow_SHEETNAME1) = .Range("X3:X" & lastrow_SHEETNAME1).Value
 
            .Range("AB2:AB2").AutoFill Destination:=.Range("AB2:AB" & lastrow_SHEETNAME1)
            .Range("AB2:AB" & lastrow_SHEETNAME1).Calculate
            .Range("AB3:AB" & lastrow_SHEETNAME1) = .Range("AB3:AB" & lastrow_SHEETNAME1).Value
 
            .Range("AC2:AC2").AutoFill Destination:=.Range("AC2:AC" & lastrow_SHEETNAME1)
            .Range("AC2:AC" & lastrow_SHEETNAME1).Calculate
            .Range("AC3:AC" & lastrow_SHEETNAME1) = .Range("AC3:AC" & lastrow_SHEETNAME1).Value
 
            .Range("AE2:AE2").AutoFill Destination:=.Range("AE2:AE" & lastrow_SHEETNAME1)
            .Range("AE2:AE" & lastrow_SHEETNAME1).Calculate
            .Range("AE3:AE" & lastrow_SHEETNAME1) = .Range("AE3:AE" & lastrow_SHEETNAME1).Value
 
            .Range("AG2:AG2").AutoFill Destination:=.Range("AG2:AG" & lastrow_SHEETNAME1)
            .Range("AG2:AG" & lastrow_SHEETNAME1).Calculate
            .Range("AG3:AG" & lastrow_SHEETNAME1) = .Range("AG3:AG" & lastrow_SHEETNAME1).Value
 
            .Range("AH2:AH2").AutoFill Destination:=.Range("AH2:AH" & lastrow_SHEETNAME1)
            .Range("AH2:AH" & lastrow_SHEETNAME1).Calculate
            .Range("AH3:AH" & lastrow_SHEETNAME1) = .Range("AH3:AH" & lastrow_SHEETNAME1).Value
 
            .Range("AJ2:AJ2").AutoFill Destination:=.Range("AJ2:AJ" & lastrow_SHEETNAME1)
            .Range("AJ2:AJ" & lastrow_SHEETNAME1).Calculate
            .Range("AJ3:AJ" & lastrow_SHEETNAME1) = .Range("AJ3:AJ" & lastrow_SHEETNAME1).Value
 
            .Range("AK2:AK2").AutoFill Destination:=.Range("AK2:AK" & lastrow_SHEETNAME1)
            .Range("AK2:AK" & lastrow_SHEETNAME1).Calculate
            .Range("AK3:AK" & lastrow_SHEETNAME1) = .Range("AK3:AK" & lastrow_SHEETNAME1).Value
 
            .Range("AL2:AL2").AutoFill Destination:=.Range("AL2:AL" & lastrow_SHEETNAME1)
            .Range("AL2:AL" & lastrow_SHEETNAME1).Calculate
            .Range("AL3:AL" & lastrow_SHEETNAME1) = .Range("AL3:AL" & lastrow_SHEETNAME1).Value
 
            .Range("AN2:AN2").AutoFill Destination:=.Range("AN2:AN" & lastrow_SHEETNAME1)
            .Range("AN2:AN" & lastrow_SHEETNAME1).Calculate
            .Range("AN3:AN" & lastrow_SHEETNAME1) = .Range("AN3:AN" & lastrow_SHEETNAME1).Value
 
            .Range("AO2:AO2").AutoFill Destination:=.Range("AO2:AO" & lastrow_SHEETNAME1)
            .Range("AO2:AO" & lastrow_SHEETNAME1).Calculate
            .Range("AO3:AO" & lastrow_SHEETNAME1) = .Range("AO3:AO" & lastrow_SHEETNAME1).Value
 
            .Range("AP2:AP2").AutoFill Destination:=.Range("AP2:AP" & lastrow_SHEETNAME1)
            .Range("AP2:AP" & lastrow_SHEETNAME1).Calculate
            .Range("AP3:AP" & lastrow_SHEETNAME1) = .Range("AP3:AP" & lastrow_SHEETNAME1).Value
 
            .Range("AQ2:AQ2").AutoFill Destination:=.Range("AQ2:AQ" & lastrow_SHEETNAME1)
            .Range("AQ2:AQ" & lastrow_SHEETNAME1).Calculate
            .Range("AQ3:AQ" & lastrow_SHEETNAME1) = .Range("AQ3:AQ" & lastrow_SHEETNAME1).Value
 
            .Range("AR2:AR2").AutoFill Destination:=.Range("AR2:AR" & lastrow_SHEETNAME1)
            .Range("AR2:AR" & lastrow_SHEETNAME1).Calculate
            .Range("AR3:AR" & lastrow_SHEETNAME1) = .Range("AR3:AR" & lastrow_SHEETNAME1).Value
 
            .Range("AS2:AS2").AutoFill Destination:=.Range("AS2:AS" & lastrow_SHEETNAME1)
            .Range("AS2:AS" & lastrow_SHEETNAME1).Calculate
            .Range("AS3:AS" & lastrow_SHEETNAME1) = .Range("AS3:AS" & lastrow_SHEETNAME1).Value
 
            .Range("AT2:AT2").AutoFill Destination:=.Range("AT2:AT" & lastrow_SHEETNAME1)
            .Range("AT2:AT" & lastrow_SHEETNAME1).Calculate
            .Range("AT3:AT" & lastrow_SHEETNAME1) = .Range("AT3:AT" & lastrow_SHEETNAME1).Value
 
            .Range("AV2:AV2").AutoFill Destination:=.Range("AV2:AV" & lastrow_SHEETNAME1)
            .Range("AV2:AV" & lastrow_SHEETNAME1).Calculate
            .Range("AV3:AV" & lastrow_SHEETNAME1) = .Range("AV3:AV" & lastrow_SHEETNAME1).Value
 
            .Range("AW2:AW2").AutoFill Destination:=.Range("AW2:AW" & lastrow_SHEETNAME1)
            .Range("AW2:AW" & lastrow_SHEETNAME1).Calculate
            .Range("AW3:AW" & lastrow_SHEETNAME1) = .Range("AW3:AW" & lastrow_SHEETNAME1).Value
 
            .Range("AX2:AX2").AutoFill Destination:=.Range("AX2:AX" & lastrow_SHEETNAME1)
            .Range("AX2:AX" & lastrow_SHEETNAME1).Calculate
            .Range("AX3:AX" & lastrow_SHEETNAME1) = .Range("AX3:AX" & lastrow_SHEETNAME1).Value
 
            .Range("AY2:AY2").AutoFill Destination:=.Range("AY2:AY" & lastrow_SHEETNAME1)
            .Range("AY2:AY" & lastrow_SHEETNAME1).Calculate
            .Range("AY3:AY" & lastrow_SHEETNAME1) = .Range("AY3:AY" & lastrow_SHEETNAME1).Value
 
            .Range("BB2:BB2").AutoFill Destination:=.Range("BB2:BB" & lastrow_SHEETNAME1)
            .Range("BB2:BB" & lastrow_SHEETNAME1).Calculate
            .Range("BB3:BB" & lastrow_SHEETNAME1) = .Range("BB3:BB" & lastrow_SHEETNAME1).Value
 
            .Range("BD2:BD2").AutoFill Destination:=.Range("BD2:BD" & lastrow_SHEETNAME1)
            .Range("BD2:BD" & lastrow_SHEETNAME1).Calculate
            .Range("BD3:BD" & lastrow_SHEETNAME1) = .Range("BD3:BD" & lastrow_SHEETNAME1).Value
 
            .Range("BE2:BE2").AutoFill Destination:=.Range("BE2:BE" & lastrow_SHEETNAME1)
            .Range("BE2:BE" & lastrow_SHEETNAME1).Calculate
            .Range("BE3:BE" & lastrow_SHEETNAME1) = .Range("BE3:BE" & lastrow_SHEETNAME1).Value
 
            .Range("BG2:BG2").AutoFill Destination:=.Range("BG2:BG" & lastrow_SHEETNAME1)
            .Range("BG2:BG" & lastrow_SHEETNAME1).Calculate
            .Range("BG3:BG" & lastrow_SHEETNAME1) = .Range("BG3:BG" & lastrow_SHEETNAME1).Value
 
            .Range("BH2:BH2").AutoFill Destination:=.Range("BH2:BH" & lastrow_SHEETNAME1)
            .Range("BH2:BH" & lastrow_SHEETNAME1).Calculate
            .Range("BH3:BH" & lastrow_SHEETNAME1) = .Range("BH3:BH" & lastrow_SHEETNAME1).Value
 
            .Range("BI2:BI2").AutoFill Destination:=.Range("BI2:BI" & lastrow_SHEETNAME1)
            .Range("BI2:BI" & lastrow_SHEETNAME1).Calculate
            .Range("BI3:BI" & lastrow_SHEETNAME1) = .Range("BI3:BI" & lastrow_SHEETNAME1).Value
 
            .Range("BJ2:BJ2").AutoFill Destination:=.Range("BJ2:BJ" & lastrow_SHEETNAME1)
            .Range("BJ2:BJ" & lastrow_SHEETNAME1).Calculate
            .Range("BJ3:BJ" & lastrow_SHEETNAME1) = .Range("BJ3:BJ" & lastrow_SHEETNAME1).Value
 
            .Range("BK2:BK2").AutoFill Destination:=.Range("BK2:BK" & lastrow_SHEETNAME1)
            .Range("BK2:BK" & lastrow_SHEETNAME1).Calculate
            .Range("BK3:BK" & lastrow_SHEETNAME1) = .Range("BK3:BK" & lastrow_SHEETNAME1).Value
 
            .Range("BL2:BL2").AutoFill Destination:=.Range("BL2:BL" & lastrow_SHEETNAME1)
            .Range("BL2:BL" & lastrow_SHEETNAME1).Calculate
            .Range("BL3:BL" & lastrow_SHEETNAME1) = .Range("BL3:BL" & lastrow_SHEETNAME1).Value
 
            .Range("BM2:BM2").AutoFill Destination:=.Range("BM2:BM" & lastrow_SHEETNAME1)
            .Range("BM2:BM" & lastrow_SHEETNAME1).Calculate
            .Range("BM3:BM" & lastrow_SHEETNAME1) = .Range("BM3:BM" & lastrow_SHEETNAME1).Value
 
        End With
    End With
End Sub
 
 
 
' Now that both Final and SHEETNAME1 sheets populated, need to action some more formulae calculations.
Sub M10600_Copy_More_FinalABC_Formulae_Down()
 
    'Dim mycell As Variant
    Dim lastrow_FinalABC As Long
 
 
    ' Initialize global vars.
    Call Z00000_Init
 
 
    ' Ask user.
    If ctrl_ask_before_running_subroutine = True Then
        If MsgBox("Copy more FinalABC formulae down?", vbYesNo) = vbNo Then Exit Sub
    End If
 
 
    ' Update StatusBar.
    Application.StatusBar = "Copy more BBH Formulae down..."
 
 
    With Workbooks(wb_name)
 
        With .Sheets("FinalABC")
 
            ' Activate the sheet.
            .Activate
 
 
            ' Get how many rows of data have been loaded into the sheet.
            lastrow_FinalABC = .Cells(Rows.Count, 4).End(xlUp).Row
            ' Prevent line 2 being deleted - as this contains the formulae which need coping down later.
            If lastrow_FinalABC < 3 Then
                lastrow_FinalABC = 3
            End If
 
 
            ' Copies formulae down.
            .Range("L2:N2").AutoFill Destination:=.Range("L2:N" & lastrow_FinalABC)
            .Range("P2:Q2").AutoFill Destination:=.Range("P2:Q" & lastrow_FinalABC)
            .Range("AI2:AM2").AutoFill Destination:=.Range("AI2:AM" & lastrow_FinalABC)
            .Range("AR2:AT2").AutoFill Destination:=.Range("AR2:AT" & lastrow_FinalABC)
            .Range("B2:B2").AutoFill Destination:=.Range("B2:B" & lastrow_FinalABC)
 
 
            ' Calculations.
            .Range("P2:Q" & lastrow_FinalABC).Calculate
            .Range("L2:N" & lastrow_FinalABC).Calculate
            .Range("AI2:AM" & lastrow_FinalABC).Calculate
            .Range("AR2:AT" & lastrow_FinalABC).Calculate
            .Range("B2:B" & lastrow_FinalABC).Calculate
 
 
            ' Now copy and paste formula ranges as values to speed up the file processing.
            .Range("K3:N" & lastrow_FinalABC) = .Range("K3:N" & lastrow_FinalABC).Value
            .Range("P3:Q" & lastrow_FinalABC) = .Range("P3:Q" & lastrow_FinalABC).Value
            .Range("AI3:AM" & lastrow_FinalABC) = .Range("AI3:AM" & lastrow_FinalABC).Value
            .Range("AR3:AT" & lastrow_FinalABC) = .Range("AR3:AT" & lastrow_FinalABC).Value
            .Range("B3:B" & lastrow_FinalABC) = .Range("B3:B" & lastrow_FinalABC).Value
 
        End With
    End With
End Sub
 
 
 
' Adds 1 to the Corrected Date, column E, in the FinalABC sheet for dates that were the last date of the month.
' It then recalculates the sheet to determine if column AL now reconciles, i.e. shows "MATCHED GROSS AMOUNT ISIN BY MONTH".
' This requires the following columns to have formulae throughout:  E, L, K, AK, AL
Sub M10610_Reformat_FinalABC_Corrected_Dates()
 
    Dim lastrow_FinalABC As Long
    Dim cell_date As Date
    Dim LastDayOfMonth As Date
    Dim pt As PivotTable
    Dim i As Long
 
 
    ' Initialize global vars.
    Call Z00000_Init
 
 
    ' Ask user.
    If ctrl_ask_before_running_subroutine = True Then
        If MsgBox("Reformat FinalABC Corrected Dates?", vbYesNo) = vbNo Then Exit Sub
    End If
 
 
    With Workbooks(wb_name)
 
        With .Sheets("FinalABC")
 
            ' Activate the sheet.
            .Activate
 
 
            ' Get how many rows of data have been loaded into the sheet.
            lastrow_FinalABC = .Cells(Rows.Count, 4).End(xlUp).Row
            ' Prevent line 2 being deleted - as this contains the formulae which need coping down later.
            If lastrow_FinalABC < 3 Then
                lastrow_FinalABC = 3
            End If
 
 
            ' Loop through every row and where column AJ does not match, it then changes the date in column E to the
            ' 1st of the next month and again checks if column AJ matches.  If not then it reverts otherwise it keeps
            ' the newly calculated values.
            For i = 2 To lastrow_FinalABC
                If RTrim(LTrim(.Range("AL" & i).Value)) = "GROSS AMOUNT NOT MATCHED ISIN BY MONTH" Then
 
                    cell_date = .Range("E" & i).Value
                    LastDayOfMonth = DateSerial(Year(cell_date), Month(cell_date + 1), 0)
 
                    If cell_date = LastDayOfMonth Then
 
                        ' Change for formula in column E to add 1 to the date.  This should make dates that are the last day of the month now reflect
                        ' the 1st of the following month.
                        .Range("E" & i).Formula = "=TEXT(TEXT(MID(F" & i & ",FIND("" "",F" & i & ")+1,FIND("","",F" & i & ")-FIND("" "",F" & i & ")-1)&"" ""&LEFT(F" & i & ",FIND("" "",F" & i & ")-1)&"" ""&RIGHT(F" & i & ",4),""dd/mm/yyyy"")+1,""dd/mm/yyyy"")"
 
                        .Range("A" & i & ":C" & i).Formula = .Range("A2:C2").FormulaR1C1
                        .Range("A" & i & ":C" & i).Calculate
 
                        .Range("K" & i & ":N" & i).Formula = .Range("K2:N2").FormulaR1C1
                        .Range("K" & i & ":N" & i).Calculate
 
                        .Range("AI" & i & ":AM" & i).Formula = .Range("AI2:AM2").FormulaR1C1
                        .Range("AI" & i & ":AM" & i).Calculate
 
                        .Range("AR" & i & ":AT" & i).Formula = .Range("AR2:AT2").FormulaR1C1
                        .Range("AR" & i & ":AT" & i).Calculate
 
 
                        ' If column AJ is unchanged then the change of the date did not work.  So reset back.
                        If RTrim(LTrim(Range("AJ" & i).Value)) = "GROSS AMOUNT NOT MATCHED ISIN BY MONTH" Then
                            .Range("E" & i).Formula = "=TEXT(MID(F" & i & ",FIND("" "",F" & i & ")+1,FIND("","",F" & i & ")-FIND("" "",F" & i & ")-1)&"" ""&LEFT(F" & i & ",FIND("" "",F" & i & ")-1)&"" ""&RIGHT(F" & i & ",4),""dd/mm/yyyy"")"
 
                            .Range("A" & i & ":C" & i).Formula = .Range("A2:C2").FormulaR1C1
                            .Range("A" & i & ":C" & i).Calculate
 
                            .Range("K" & i & ":N" & i).Formula = .Range("K2:N2").FormulaR1C1
                            .Range("K" & i & ":N" & i).Calculate
 
                            .Range("AI" & i & ":AM" & i).Formula = .Range("AI2:AM2").FormulaR1C1
                            .Range("AI" & i & ":AM" & i).Calculate
 
                            .Range("AR" & i & ":AT" & i).Formula = .Range("AR2:AT2").FormulaR1C1
                            .Range("AR" & i & ":AT" & i).Calculate
 
                        Else ' Column AJ has changed therefore change of date in column E has worked.  So save as values.
 
                            If (i <> 2) Then ' Do not process for column 2 as we need to retain the formulae.
                                .Range("A" & i & ":C" & i) = .Range("A" & i & ":C" & i).Value
                                .Range("K" & i & ":N" & i) = .Range("K" & i & ":N" & i).Value
                                .Range("AI" & i & ":AM" & i) = .Range("AI" & i & ":AM" & i).Value
                                .Range("AR" & i & ":AT" & i) = .Range("AR" & i & ":AT" & i).Value
                            End If
 
                        End If
 
                    End If
 
                End If
            Next i
 
        End With
 
 
        ' Refresh Mapping Pivots
        With .Sheets("Mapping Pivots")
 
            ' Activate the sheet.
            .Activate
 
 
            ' Refresh all the pivot tables on the Mapping Pivots sheet.
            'For Each Sheet In ThisWorkbook.Worksheets
                'For Each Pivot In Sheet.PivotTables
                For Each pt In .PivotTables
                    pt.RefreshTable
                    pt.Update
                Next
            'Next
 
        End With
    End With
 
 
    ' Clear all objects.
    Set pt = Nothing
 
 
End Sub
 
 
 
' Speedy - copies using arrays.
' Copies remaining formulae down on the SHEETNAME1 sheet.
Sub M10615_Recalc_SHEETNAME1_Formulae_Array()
 
    Dim lastrow_CUST As Long
    Dim lastrow_SHEETNAME1 As Long
    Dim lastrow_FinalABC As Long
    Dim lastrow_HOLDINGS As Long
    Dim lastrow_MappingPivots As Long
    Dim lastrow_MappingPivots2 As Long
    Dim lastrow_MappingPivots3 As Long
    Dim lastrow_References As Long
    Dim lastrow_References_adjusted_rate As Long
    Dim lastrow_References_g3_location As Long
    Dim lastrow_References_income_type As Long
    Dim lastrow_References_allowed_locations As Long
    Dim lastrow_QSHEET As Long
    Dim lastrow_TRANSACTIONS As Long
    Dim lastrow_Wxxxx As Long
 
    Dim column_a As Variant
    Dim column_b As Variant
    Dim column_e As Variant
    Dim column_f As Variant
    Dim column_g As Variant
    Dim column_h As Variant
    Dim column_i As Variant
    Dim column_k As Variant
    Dim column_m As Variant
    Dim column_n As Variant
    Dim column_p As Variant
    Dim column_r As Variant
    Dim column_t As Variant
    Dim column_u As Variant
    Dim column_x As Variant
    Dim column_y As Variant
    Dim column_ab As Variant
    Dim column_ad As Variant
    Dim column_af As Variant
    Dim column_ai As Variant
    Dim column_aj As Variant
    Dim column_am As Variant
    Dim column_an As Variant
    Dim column_ao As Variant
    Dim column_aq As Variant
    Dim column_ar As Variant
    Dim column_au As Variant
    Dim column_aw As Variant
    Dim column_bb As Variant
    Dim column_bd As Variant
    Dim column_bh As Variant
 
    Dim column_a_CUST As Variant
    Dim column_b_CUST As Variant
    Dim column_a_FinalABC As Variant
    Dim column_d_FinalABC As Variant
    Dim column_k_FinalABC As Variant
    Dim column_n_FinalABC As Variant
    Dim column_a_HOLDINGS As Variant
    Dim column_f_HOLDINGS As Variant
    Dim column_a_MappingPivots As Variant
    Dim column_b_MappingPivots As Variant
    Dim column_c_MappingPivots As Variant
    Dim column_d_MappingPivots As Variant
    Dim column_f_MappingPivots As Variant
    Dim column_g_MappingPivots As Variant
    Dim column_h_MappingPivots As Variant
    Dim column_i_MappingPivots As Variant
    Dim column_m_MappingPivots As Variant
    Dim column_k_MappingPivots As Variant
    Dim column_a_QSHEET As Variant
    Dim column_a_References As Variant
    Dim column_b_References As Variant
    Dim column_h_References As Variant
    Dim column_i_References As Variant
    Dim column_j_References As Variant
    Dim column_k_References As Variant
    Dim column_o_References As Variant
    Dim column_p_References As Variant
    Dim column_q_References As Variant
    Dim column_s_References As Variant
    Dim column_u_References As Variant
    Dim column_ag_References As Variant
    Dim column_a_TRANSACTIONS As Variant
    Dim column_l_TRANSACTIONS As Variant
    Dim column_m_TRANSACTIONS As Variant
    Dim column_n_TRANSACTIONS As Variant
    Dim column_b_Wxxxx As Variant
    Dim column_y_Wxxxx As Variant
    Dim column_z_Wxxxx As Variant
 
    Dim prev_a As Variant
    Dim prev_b As Variant
    Dim prev_c As Variant
    Dim prev_d As Variant
    Dim prev_f As Variant
    Dim prev_g As Variant
    Dim prev_h As Variant
    Dim prev_i As Variant
 
    Dim tmp As Variant
 
    Dim working As Variant
    Dim n As Long
 
 
    ' Initialize global vars.
    Call Z00000_Init
 
 
    ' Ask user.
    If ctrl_ask_before_running_subroutine = True Then
        If MsgBox("Recalc_SHEETNAME1_Formulae_Array?", vbYesNo) = vbNo Then Exit Sub
    End If
 
 
    With Workbooks(wb_name)
 
        With .Sheets("SHEETNAME1")
 
            ' Activate the SHEETNAME1 sheet.
            .Activate
 
            ' Get how many rows of data have been loaded into the sheet.
            lastrow_SHEETNAME1 = .Cells(Rows.Count, 4).End(xlUp).Row
            ' Prevent line 2 being deleted - as this contains the formulae which need coping down later.
            If lastrow_SHEETNAME1 < 3 Then
                lastrow_SHEETNAME1 = 3
            End If
 
            lastrow_CUST = Sheets("CUST").Cells(Rows.Count, 1).End(xlUp).Row
            lastrow_FinalABC = Sheets("FinalABC").Cells(Rows.Count, 4).End(xlUp).Row
            lastrow_HOLDINGS = Sheets("HOLDINGS").Cells(Rows.Count, 1).End(xlUp).Row
            lastrow_MappingPivots = Sheets("Mapping Pivots").Cells(Rows.Count, 1).End(xlUp).Row
            lastrow_MappingPivots2 = Sheets("Mapping Pivots").Cells(Rows.Count, 6).End(xlUp).Row
            lastrow_MappingPivots3 = Sheets("Mapping Pivots").Cells(Rows.Count, 11).End(xlUp).Row
            lastrow_References = Sheets("References").Cells(Rows.Count, 1).End(xlUp).Row
            lastrow_References_adjusted_rate = Sheets("References").Cells(Rows.Count, 8).End(xlUp).Row
            lastrow_References_g3_location = Sheets("References").Cells(Rows.Count, 15).End(xlUp).Row
            lastrow_References_income_type = Sheets("References").Cells(Rows.Count, 19).End(xlUp).Row
            lastrow_References_allowed_locations = Sheets("References").Cells(Rows.Count, 33).End(xlUp).Row
            lastrow_QSHEET = Sheets("QSHEET").Cells(Rows.Count, 1).End(xlUp).Row
            lastrow_TRANSACTIONS = Sheets("TRANSACTIONS").Cells(Rows.Count, 1).End(xlUp).Row
            lastrow_Wxxxx = Sheets("Wxxxx").Cells(Rows.Count, 2).End(xlUp).Row
 
 
            ReDim working(1 To lastrow_SHEETNAME1, 1) ' Working array
 
            ReDim column_a(1 To lastrow_SHEETNAME1, 1)
            ReDim column_b(1 To lastrow_SHEETNAME1, 1)
            ReDim column_e(1 To lastrow_SHEETNAME1, 1)
            ReDim column_f(1 To lastrow_SHEETNAME1, 1)
            ReDim column_g(1 To lastrow_SHEETNAME1, 1)
            ReDim column_h(1 To lastrow_SHEETNAME1, 1)
            ReDim column_i(1 To lastrow_SHEETNAME1, 1)
            ReDim column_k(1 To lastrow_SHEETNAME1, 1)
            ReDim column_m(1 To lastrow_SHEETNAME1, 1)
            ReDim column_n(1 To lastrow_SHEETNAME1, 1)
            ReDim column_p(1 To lastrow_SHEETNAME1, 1)
            ReDim column_r(1 To lastrow_SHEETNAME1, 1)
            ReDim column_t(1 To lastrow_SHEETNAME1, 1)
            ReDim column_u(1 To lastrow_SHEETNAME1, 1)
            ReDim column_x(1 To lastrow_SHEETNAME1, 1)
            ReDim column_y(1 To lastrow_SHEETNAME1, 1)
            ReDim column_ab(1 To lastrow_SHEETNAME1, 1)
            ReDim column_ad(1 To lastrow_SHEETNAME1, 1)
            ReDim column_af(1 To lastrow_SHEETNAME1, 1)
            ReDim column_ai(1 To lastrow_SHEETNAME1, 1)
            ReDim column_aj(1 To lastrow_SHEETNAME1, 1)
            ReDim column_am(1 To lastrow_SHEETNAME1, 1)
            ReDim column_an(1 To lastrow_SHEETNAME1, 1)
            ReDim column_ao(1 To lastrow_SHEETNAME1, 1)
            ReDim column_aq(1 To lastrow_SHEETNAME1, 1)
            ReDim column_ar(1 To lastrow_SHEETNAME1, 1)
            ReDim column_au(1 To lastrow_SHEETNAME1, 1)
            ReDim column_aw(1 To lastrow_SHEETNAME1, 1)
            ReDim column_bd(1 To lastrow_SHEETNAME1, 1)
            ReDim column_bh(1 To lastrow_SHEETNAME1, 1)
 
            ReDim column_a_CUST(1 To lastrow_CUST, 1)
            ReDim column_b_CUST(1 To lastrow_CUST, 1)
            ReDim column_a_FinalABC(1 To lastrow_FinalABC, 1)
            ReDim column_d_FinalABC(1 To lastrow_FinalABC, 1)
            ReDim column_k_FinalABC(1 To lastrow_FinalABC, 1)
            ReDim column_n_FinalABC(1 To lastrow_FinalABC, 1)
            ReDim column_a_HOLDINGS(1 To lastrow_HOLDINGS, 1)
            ReDim column_g_HOLDINGS(1 To lastrow_HOLDINGS, 1)
            ReDim column_a_MappingPivots(1 To lastrow_MappingPivots, 1)
            ReDim column_b_MappingPivots(1 To lastrow_MappingPivots, 1)
            ReDim column_c_MappingPivots(1 To lastrow_MappingPivots, 1)
            ReDim column_d_MappingPivots(1 To lastrow_MappingPivots, 1)
            ReDim column_f_MappingPivots(1 To lastrow_MappingPivots, 1)
            ReDim column_g_MappingPivots(1 To lastrow_MappingPivots, 1)
            ReDim column_h_MappingPivots(1 To lastrow_MappingPivots, 1)
            ReDim column_i_MappingPivots(1 To lastrow_MappingPivots, 1)
            ReDim column_m_MappingPivots(1 To lastrow_MappingPivots, 1)
            ReDim column_k_MappingPivots(1 To lastrow_MappingPivots, 1)
            ReDim column_a_References(1 To lastrow_References, 1)
            ReDim column_b_References(1 To lastrow_References, 1)
            ReDim column_h_References(1 To lastrow_References, 1)
            ReDim column_i_References(1 To lastrow_References, 1)
            ReDim column_j_References(1 To lastrow_References, 1)
            ReDim column_k_References(1 To lastrow_References, 1)
            ReDim column_o_References(1 To lastrow_References, 1)
            ReDim column_p_References(1 To lastrow_References, 1)
            ReDim column_q_References(1 To lastrow_References, 1)
            ReDim column_s_References(1 To lastrow_References, 1)
            ReDim column_u_References(1 To lastrow_References, 1)
            ReDim column_ag_References(1 To lastrow_References, 1)
            ReDim column_a_QSHEET(1 To lastrow_QSHEET, 1)
            ReDim column_a_TRANSACTIONS(1 To lastrow_TRANSACTIONS, 1)
            ReDim column_l_TRANSACTIONS(1 To lastrow_TRANSACTIONS, 1)
            ReDim column_m_TRANSACTIONS(1 To lastrow_TRANSACTIONS, 1)
            ReDim column_n_TRANSACTIONS(1 To lastrow_TRANSACTIONS, 1)
            ReDim column_b_Wxxxx(1 To lastrow_Wxxxx, 1)
            ReDim column_y_Wxxxx(1 To lastrow_Wxxxx, 1)
            ReDim column_z_Wxxxx(1 To lastrow_Wxxxx, 1)
 
            working = Range("D3:D" & lastrow_SHEETNAME1) ' load with dummy values.
 
 
            ' Column X
            ' =IF(ISNA(VLOOKUP(A2,FinalABC!A$1:A$2227,1,FALSE)),"NON EXIST","EXIST")
            column_a = Range("A3:A" & lastrow_SHEETNAME1)
            column_a_FinalABC = Sheets("FinalABC").Range("A3:A" & lastrow_FinalABC)
            For n = LBound(working) To UBound(working)
                working(n, 1) = ArrayFindEx(column_a_FinalABC, column_a(n, 1), "EXIST", "NON EXIST")
            Next n
 
            .Range("X3:X" & lastrow_SHEETNAME1).Value = working
 
 
            ' Column AB
            ' =IF(OR(X2="NON EXIST",Y2="EXCLUDE"),"NON REPORTABLE",A2&" - "&ROUND(F2,0))
            column_x = Range("X3:X" & lastrow_SHEETNAME1)
            column_y = Range("Y3:Y" & lastrow_SHEETNAME1)
            column_a = Range("A3:A" & lastrow_SHEETNAME1)
            column_f = Range("F3:F" & lastrow_SHEETNAME1)
            For n = LBound(working) To UBound(working)
 
                If (column_x(n, 1) = "NON EXIST" Or column_y(n, 1) = "EXCLUDE") Then
                    working(n, 1) = "NON REPORTABLE"
                Else
                    working(n, 1) = column_a(n, 1) & " - " & Round(column_f(n, 1), 0)
                End If
            Next n
 
            .Range("AB3:AB" & lastrow_SHEETNAME1).Value = working
 
 
            ' Column AC
            ' =IF(OR($X2="NON EXIST",$Y2="EXCLUDE"),"NON REPORTABLE",IFERROR(VLOOKUP($A2,'Mapping Pivots'!$A$4:$B$1458,2,FALSE), IFERROR(VLOOKUP($AB2,'Mapping Pivots'!$F$4:$G$2230,2,FALSE), "MANUAL INPUT")))
            column_x = Range("X3:X" & lastrow_SHEETNAME1)
            column_y = Range("Y3:Y" & lastrow_SHEETNAME1)
            column_a = Range("A3:A" & lastrow_SHEETNAME1)
            column_ab = Range("AB3:AB" & lastrow_SHEETNAME1)
            column_a_MappingPivots = Sheets("Mapping Pivots").Range("A4:A" & lastrow_MappingPivots)
            column_b_MappingPivots = Sheets("Mapping Pivots").Range("B4:B" & lastrow_MappingPivots)
            column_f_MappingPivots = Sheets("Mapping Pivots").Range("F4:F" & lastrow_MappingPivots2)
            column_g_MappingPivots = Sheets("Mapping Pivots").Range("G4:G" & lastrow_MappingPivots2)
 
            ' Tidy up for Mapping Pivots columns.  Often they are Empty when reporting a 2nd line for same key value.
            ' This effects binary searches, so initially in the columns if a blank is encountered then actual value
            ' is written in its place.
            prev_a = column_a_MappingPivots(LBound(column_a_MappingPivots), 1)
            prev_b = column_b_MappingPivots(LBound(column_b_MappingPivots), 1)
            For n = LBound(column_a_MappingPivots) To UBound(column_a_MappingPivots)
                If column_a_MappingPivots(n, 1) = "" Then
                    column_a_MappingPivots(n, 1) = prev_a
                End If
                If column_b_MappingPivots(n, 1) = "" Then
                    column_b_MappingPivots(n, 1) = prev_b
                End If
                prev_a = column_a_MappingPivots(n, 1)
                prev_b = column_b_MappingPivots(n, 1)
            Next n
 
            prev_f = column_f_MappingPivots(LBound(column_f_MappingPivots), 1)
            prev_g = column_g_MappingPivots(LBound(column_g_MappingPivots), 1)
            For n = LBound(column_f_MappingPivots) To UBound(column_f_MappingPivots)
                If column_f_MappingPivots(n, 1) = "" Then
                    column_f_MappingPivots(n, 1) = prev_f
                End If
                If column_g_MappingPivots(n, 1) = "" Then
                    column_g_MappingPivots(n, 1) = prev_g
                End If
                prev_f = column_f_MappingPivots(n, 1)
                prev_g = column_g_MappingPivots(n, 1)
            Next n
 
            For n = LBound(working) To UBound(working)
 
                If (column_x(n, 1) = "NON EXIST" Or column_y(n, 1) = "EXCLUDE") Then
                    working(n, 1) = "NON REPORTABLE"
                Else
                    If ArrayCountIf(column_a_MappingPivots, column_a(n, 1)) > 0 Then
                        working(n, 1) = ArrayFind(column_a_MappingPivots, column_a(n, 1), column_b_MappingPivots, 0)
                    Else
                        If ArrayCountIf(column_f_MappingPivots, column_ab(n, 1)) > 0 Then
                            working(n, 1) = ArrayFind(column_f_MappingPivots, column_ab(n, 1), column_g_MappingPivots, 0)
                        Else
                            working(n, 1) = "MANUAL INPUT"
                        End If
                    End If
                End If
            Next n
 
            .Range("AC3:AC" & lastrow_SHEETNAME1).Value = working
 
 
'            .Range("AC2:AC2").AutoFill Destination:=.Range("AC2:AC" & lastrow_SHEETNAME1)
'            .Range("AC2:AC" & lastrow_SHEETNAME1).Calculate
'            .Range("AC3:AC" & lastrow_SHEETNAME1) = .Range("AC3:AC" & lastrow_SHEETNAME1).Value
 
 
 
            ' Column AE
            ' =IF(OR($X2="NON EXIST",$Y2="EXCLUDE"),"NON REPORTABLE",IFERROR(VLOOKUP($A2,'Mapping Pivots'!$A$4:$C$1458,3,FALSE),IFERROR(VLOOKUP($AB2,'Mapping Pivots'!$F$4:$H$2230,3,FALSE), "MANUAL INPUT")))
 
            column_x = Range("X3:X" & lastrow_SHEETNAME1)
            column_y = Range("Y3:Y" & lastrow_SHEETNAME1)
            column_a = Range("A3:A" & lastrow_SHEETNAME1)
            column_ab = Range("AB3:AB" & lastrow_SHEETNAME1)
            column_a_MappingPivots = Sheets("Mapping Pivots").Range("A4:A" & lastrow_MappingPivots)
            column_c_MappingPivots = Sheets("Mapping Pivots").Range("C4:C" & lastrow_MappingPivots)
            column_f_MappingPivots = Sheets("Mapping Pivots").Range("F4:F" & lastrow_MappingPivots2)
            column_h_MappingPivots = Sheets("Mapping Pivots").Range("H4:H" & lastrow_MappingPivots2)
 
            ' Tidy up for Mapping Pivots columns.  Often they are Empty when reporting a 2nd line for same key value.
            ' This effects binary searches, so initially in the columns if a blank is encountered then actual value
            ' is written in its place.
            prev_a = column_a_MappingPivots(LBound(column_a_MappingPivots), 1)
            prev_c = column_c_MappingPivots(LBound(column_c_MappingPivots), 1)
            For n = LBound(column_a_MappingPivots) To UBound(column_a_MappingPivots)
                If column_a_MappingPivots(n, 1) = "" Then
                    column_a_MappingPivots(n, 1) = prev_a
                End If
                If column_c_MappingPivots(n, 1) = "" Then
                    column_c_MappingPivots(n, 1) = prev_c
                End If
                prev_a = column_a_MappingPivots(n, 1)
                prev_c = column_c_MappingPivots(n, 1)
            Next n
 
            prev_f = column_f_MappingPivots(LBound(column_f_MappingPivots), 1)
            prev_h = column_h_MappingPivots(LBound(column_h_MappingPivots), 1)
            For n = LBound(column_f_MappingPivots) To UBound(column_f_MappingPivots)
                If column_f_MappingPivots(n, 1) = "" Then
                    column_f_MappingPivots(n, 1) = prev_f
                End If
                If column_h_MappingPivots(n, 1) = "" Then
                    column_h_MappingPivots(n, 1) = prev_h
                End If
                prev_f = column_f_MappingPivots(n, 1)
                prev_h = column_h_MappingPivots(n, 1)
            Next n
 
            For n = LBound(working) To UBound(working)
 
                If (column_x(n, 1) = "NON EXIST" Or column_y(n, 1) = "EXCLUDE") Then
                    working(n, 1) = "NON REPORTABLE"
                Else
                    If ArrayCountIf(column_a_MappingPivots, column_a(n, 1)) > 0 Then
                        working(n, 1) = ArrayFind(column_a_MappingPivots, column_a(n, 1), column_c_MappingPivots, 0)
                    Else
                        If ArrayCountIf(column_f_MappingPivots, column_ab(n, 1)) > 0 Then
                            working(n, 1) = ArrayFind(column_f_MappingPivots, column_ab(n, 1), column_h_MappingPivots, 0)
                        Else
                            working(n, 1) = "MANUAL INPUT"
                        End If
                    End If
                End If
            Next n
 
            .Range("AE3:AE" & lastrow_SHEETNAME1).Value = working
 
            ' TODO Peter, this might be able to be combined with previous calc on column AC, as using same lookups.
            ' Simply use a different 'working' for data to write to column AE.
 
'            .Range("AE2:AE2").AutoFill Destination:=.Range("AE2:AE" & lastrow_SHEETNAME1)
'            .Range("AE2:AE" & lastrow_SHEETNAME1).Calculate
'            .Range("AE3:AE" & lastrow_SHEETNAME1) = .Range("AE3:AE" & lastrow_SHEETNAME1).Value
 
 
            ' Column AG
            ' =IF(OR($X2="NON EXIST",$Y2="EXCLUDE"),"NON REPORTABLE",IF(COUNTIF($A$1:A2,A2)>1,"AGGREGATE",ROUND(SUMIF($A$1:$A$52435,A2,$I$1:$I$52435)-SUMIF(FinalABC!$A$1:$A$2227,A2,FinalABC!$N$1:$N$2227),2)))
            column_x = Range("X3:X" & lastrow_SHEETNAME1)
            column_y = Range("Y3:Y" & lastrow_SHEETNAME1)
            column_a = Range("A3:A" & lastrow_SHEETNAME1)
            column_i = Range("I3:I" & lastrow_SHEETNAME1)
            column_a_FinalABC = Sheets("FinalABC").Range("A3:A" & lastrow_FinalABC)
            column_n_FinalABC = Sheets("FinalABC").Range("N3:N" & lastrow_FinalABC)
            For n = LBound(working) To UBound(working)
 
                If (column_x(n, 1) = "NON EXIST" Or column_y(n, 1) = "EXCLUDE") Then
                    working(n, 1) = "NON REPORTABLE"
                Else
                    If ArrayCountIf(column_a, column_a(n, 1)) > 1 Then
                        working(n, 1) = "AGGREGATE"
                    Else
                        working(n, 1) = Round(ArraySumIf(column_a, column_a(n, 1), column_i) - ArraySumIf(column_a_FinalABC, column_a(n, 1), column_n_FinalABC), 2)
                    End If
                End If
            Next n
 
            .Range("AG3:AG" & lastrow_SHEETNAME1).Value = working
 
 
 
            ' Column AH
            ' =IF(AG2="NON REPORTABLE",AG2,IF(AND(ROUND(SUMIFS($I$1:$I$52435,$A$1:$A$52435,A2,$Y$1:$Y$52435,"INCLUDE")-SUMIF(FinalABC!$A$1:$A$2227,A2,FinalABC!$N$1:$N$2227),2)>-1,ROUND(SUMIFS($I$1:$I$52435,$A$1:$A$52435,A2,$Y$1:$Y$52435,"INCLUDE")-SUMIF(FinalABC!$A$1:$A$2227,A2,FinalABC!$N$1:$N$2227),2)<1),K2,"MANUAL INPUT"))
            column_x = Range("X3:X" & lastrow_SHEETNAME1)
            column_y = Range("Y3:Y" & lastrow_SHEETNAME1)
            column_a = Range("A3:A" & lastrow_SHEETNAME1)
            column_i = Range("I3:I" & lastrow_SHEETNAME1)
            column_a_FinalABC = Sheets("FinalABC").Range("A3:A" & lastrow_FinalABC)
            column_n_FinalABC = Sheets("FinalABC").Range("N3:N" & lastrow_FinalABC)
            For n = LBound(working) To UBound(working)
 
                If (column_x(n, 1) = "NON EXIST" Or column_y(n, 1) = "EXCLUDE") Then
                'If working(n, 1) = "NON REPORTABLE" Then
                    working(n, 1) = "NON REPORTABLE"
                Else
                    If (column_y(n, 1) = "INCLUDE") Then
                        working(n, 1) = Round(ArraySumIf(column_a, column_a(n, 1), column_i) - ArraySumIf(column_a_FinalABC, column_a(n, 1), column_n_FinalABC), 2)
 
                        If ((working(n, 1) > -1) Or (working(n, 1) < 1)) Then
                            working(n, 1) = column_k(n, 1)
                        Else
                            working(n, 1) = "MANUAL INPUT"
                        End If
                    Else
                        working(n, 1) = "MANUAL INPUT"
                    End If
                End If
            Next n
 
            .Range("AH3:AH" & lastrow_SHEETNAME1).Value = working
 
 
            ' Copy adjustment data.
'zzzz            .Range("AI2:AI" & lastrow_SHEETNAME1) = .Range("AH2:AH" & lastrow_SHEETNAME1).Value
 
 
            ' Column AJ
            ' =IF(OR($X2="NON EXIST",$Y2="EXCLUDE"),"NON REPORTABLE",ROUND(E2*SUM(AI2/100),2))
            column_x = Range("X3:X" & lastrow_SHEETNAME1)
            column_y = Range("Y3:Y" & lastrow_SHEETNAME1)
            column_e = Range("E3:E" & lastrow_SHEETNAME1)
            column_ai = Range("AI3:AI" & lastrow_SHEETNAME1)
            For n = LBound(working) To UBound(working)
 
                If (column_x(n, 1) = "NON EXIST" Or column_y(n, 1) = "EXCLUDE") Then
                    working(n, 1) = "NON REPORTABLE"
                Else
                    If IsNumeric(column_ai(n, 1)) Then ' To cater for "Manual Input" in column AI.
                        working(n, 1) = Round(column_e(n, 1) * column_ai(n, 1) / 100, 2)
                    Else
                        working(n, 1) = 0
                    End If
                End If
            Next n
 
            .Range("AJ3:AJ" & lastrow_SHEETNAME1).Value = working
 
 
            ' Column AK
            ' =IF(OR($X2="NON EXIST",$Y2="EXCLUDE"),"NON REPORTABLE",SUMIF($A$1:$A$52435,A2,$AJ$1:$AJ$52435)-SUMIF(FinalABC!$A$1:$A$2227,A2,FinalABC!$N$1:$N$2227))
            column_x = Range("X3:X" & lastrow_SHEETNAME1)
            column_y = Range("Y3:Y" & lastrow_SHEETNAME1)
            column_a = Range("A3:A" & lastrow_SHEETNAME1)
            column_aj = Range("AJ3:AJ" & lastrow_SHEETNAME1)
            column_a_FinalABC = Sheets("FinalABC").Range("A3:A" & lastrow_FinalABC)
            column_n_FinalABC = Sheets("FinalABC").Range("N3:N" & lastrow_FinalABC)
            For n = LBound(working) To UBound(working)
 
                If (column_x(n, 1) = "NON EXIST" Or column_y(n, 1) = "EXCLUDE") Then
                    working(n, 1) = "NON REPORTABLE"
                Else
                    'working(n, 1) = Round(ArraySumIf(column_a, column_a(n, 1), column_ai) - ArraySumIf(column_a_FinalABC, column_a(n, 1), column_n_FinalABC), 2)
                    working(n, 1) = ArraySumIf(column_a, column_a(n, 1), column_aj) - ArraySumIf(column_a_FinalABC, column_a(n, 1), column_n_FinalABC)
                End If
            Next n
 
            .Range("AK3:AK" & lastrow_SHEETNAME1).Value = working
 
 
 
            ' Column AL
            ' =IF(OR($X2="NON EXIST",$Y2="EXCLUDE"), "NON REPORTABLE", IFERROR(VLOOKUP($A2,'Mapping Pivots'!$A$4:$D$1458,4,FALSE), IFERROR(VLOOKUP($AB2,'Mapping Pivots'!$F$4:$I$2230,4,FALSE), "MANUAL INPUT")))
 
            column_x = Range("X3:X" & lastrow_SHEETNAME1)
            column_y = Range("Y3:Y" & lastrow_SHEETNAME1)
            column_a = Range("A3:A" & lastrow_SHEETNAME1)
            column_ab = Range("AB3:AB" & lastrow_SHEETNAME1)
            column_a_MappingPivots = Sheets("Mapping Pivots").Range("A4:A" & lastrow_MappingPivots)
            column_d_MappingPivots = Sheets("Mapping Pivots").Range("D4:D" & lastrow_MappingPivots)
            column_f_MappingPivots = Sheets("Mapping Pivots").Range("F4:F" & lastrow_MappingPivots2)
            column_i_MappingPivots = Sheets("Mapping Pivots").Range("I4:I" & lastrow_MappingPivots2)
 
            ' Tidy up for Mapping Pivots columns.  Often they are Empty when reporting a 2nd line for same key value.
            ' This effects binary searches, so initially in the columns if a blank is encountered then actual value
            ' is written in its place.
            prev_a = column_a_MappingPivots(LBound(column_a_MappingPivots), 1)
            prev_d = column_d_MappingPivots(LBound(column_d_MappingPivots), 1)
            For n = LBound(column_a_MappingPivots) To UBound(column_a_MappingPivots)
                If column_a_MappingPivots(n, 1) = "" Then
                    column_a_MappingPivots(n, 1) = prev_a
                End If
                If column_d_MappingPivots(n, 1) = "" Then
                    column_d_MappingPivots(n, 1) = prev_d
                End If
                prev_a = column_a_MappingPivots(n, 1)
                prev_d = column_d_MappingPivots(n, 1)
            Next n
 
            prev_f = column_f_MappingPivots(LBound(column_f_MappingPivots), 1)
            prev_i = column_i_MappingPivots(LBound(column_i_MappingPivots), 1)
            For n = LBound(column_f_MappingPivots) To UBound(column_f_MappingPivots)
                If column_f_MappingPivots(n, 1) = "" Then
                    column_f_MappingPivots(n, 1) = prev_f
                End If
                If column_i_MappingPivots(n, 1) = "" Then
                    column_i_MappingPivots(n, 1) = prev_i
                End If
                prev_f = column_f_MappingPivots(n, 1)
                prev_i = column_i_MappingPivots(n, 1)
            Next n
 
            For n = LBound(working) To UBound(working)
 
                If (column_x(n, 1) = "NON EXIST" Or column_y(n, 1) = "EXCLUDE") Then
                    working(n, 1) = "NON REPORTABLE"
                Else
                    If ArrayCountIf(column_a_MappingPivots, column_a(n, 1)) > 0 Then
                        working(n, 1) = ArrayFind(column_a_MappingPivots, column_a(n, 1), column_d_MappingPivots, 0)
                    Else
                        If ArrayCountIf(column_f_MappingPivots, column_ab(n, 1)) > 0 Then
                            working(n, 1) = ArrayFind(column_f_MappingPivots, column_ab(n, 1), column_i_MappingPivots, 0)
                        Else
                            working(n, 1) = "MANUAL INPUT"
                        End If
                    End If
                End If
            Next n
 
            .Range("AL3:AL" & lastrow_SHEETNAME1).Value = working
 
 
 
'            .Range("AL2:AL2").AutoFill Destination:=.Range("AL2:AL" & lastrow_SHEETNAME1)
'            .Range("AL2:AL" & lastrow_SHEETNAME1).Calculate
'            .Range("AL3:AL" & lastrow_SHEETNAME1) = .Range("AL3:AL" & lastrow_SHEETNAME1).Value
 
 
            ' Copy adjustment data.
'zzzz            .Range("AM2:AM" & lastrow_SHEETNAME1) = .Range("AL2:AL" & lastrow_SHEETNAME1).Value
 
 
            ' Column AN
            ' =IF(OR($X2="NON EXIST",$Y2="EXCLUDE"),"NON REPORTABLE",IFERROR(VLOOKUP(A2&" - "&AM2,'Mapping Pivots'!$K$4:$M$1458,2,FALSE), 0))
            column_x = Range("X3:X" & lastrow_SHEETNAME1)
            column_y = Range("Y3:Y" & lastrow_SHEETNAME1)
            column_a = Range("A3:A" & lastrow_SHEETNAME1)
            column_am = Range("AM3:AM" & lastrow_SHEETNAME1)
            column_k_MappingPivots = Sheets("Mapping Pivots").Range("K4:K" & lastrow_MappingPivots3)
            column_m_MappingPivots = Sheets("Mapping Pivots").Range("M4:M" & lastrow_MappingPivots3)
 
            For n = LBound(working) To UBound(working)
 
                If (column_x(n, 1) = "NON EXIST" Or column_y(n, 1) = "EXCLUDE") Then
                    working(n, 1) = "NON REPORTABLE"
                Else
                    working(n, 1) = ArrayFind(column_k_MappingPivots, column_a(n, 1) & " - " & column_am(n, 1), column_m_MappingPivots, 0)
                End If
 
            Next n
 
            .Range("AN3:AN" & lastrow_SHEETNAME1).Value = working
 
 
'            .Range("AN2:AN2").AutoFill Destination:=.Range("AN2:AN" & lastrow_SHEETNAME1)
'            .Range("AN2:AN" & lastrow_SHEETNAME1).Calculate
'            .Range("AN3:AN" & lastrow_SHEETNAME1) = .Range("AN3:AN" & lastrow_SHEETNAME1).Value
 
 
 
            ' Column AO
            ' =IF(OR($X2="NON EXIST",$Y2="EXCLUDE"),"NON REPORTABLE",F2/AN2)
            column_x = Range("X3:X" & lastrow_SHEETNAME1)
            column_y = Range("Y3:Y" & lastrow_SHEETNAME1)
            column_f = Range("F3:F" & lastrow_SHEETNAME1)
            column_an = Range("AN3:AN" & lastrow_SHEETNAME1)
            For n = LBound(working) To UBound(working)
 
                If (column_x(n, 1) = "NON EXIST" Or column_y(n, 1) = "EXCLUDE") Then
                    working(n, 1) = "NON REPORTABLE"
                Else
                    If (column_an(n, 1) = 0) Then   ' Can't SHEETNAME1de by zero.
                        working(n, 1) = 0
                    Else
                        working(n, 1) = column_f(n, 1) / column_an(n, 1)
                    End If
                End If
            Next n
 
            .Range("AO3:AO" & lastrow_SHEETNAME1).Value = working
 
 
            ' Column AP
            ' =IF(OR($X2="NON EXIST",$Y2="EXCLUDE"),"NON REPORTABLE",IF(COUNTIF($A$1:A2,A2)>1,"AGGREGATE",SUMIF($A:$A,A2,$AO:$AO)-SUMIF(FinalABC!$A:$A,A2,FinalABC!$K:$K)))
            column_x = Range("X3:X" & lastrow_SHEETNAME1)
            column_y = Range("Y3:Y" & lastrow_SHEETNAME1)
            column_a = Range("A3:A" & lastrow_SHEETNAME1)
            column_ao = Range("AO3:AO" & lastrow_SHEETNAME1)
            column_a_FinalABC = Sheets("FinalABC").Range("A3:A" & lastrow_FinalABC)
            column_k_FinalABC = Sheets("FinalABC").Range("K3:K" & lastrow_FinalABC)
            For n = LBound(working) To UBound(working)
 
                If (column_x(n, 1) = "NON EXIST" Or column_y(n, 1) = "EXCLUDE") Then
                    working(n, 1) = "NON REPORTABLE"
                Else
                    If ArrayCountIf(column_a, column_a(n, 1)) > 1 Then
                        working(n, 1) = "AGGREGATE"
                    Else
                        working(n, 1) = Round(ArraySumIf(column_a, column_a(n, 1), column_ao) - ArraySumIf(column_a_FinalABC, column_a(n, 1), column_k_FinalABC), 2)
                    End If
                End If
            Next n
 
            .Range("AP3:AP" & lastrow_SHEETNAME1).Value = working
 
 
            ' Column AQ
            ' =IF(OR($X2="NON EXIST",$Y2="EXCLUDE"),"NON REPORTABLE",T2&" - "&  IFERROR(IF(VLOOKUP(R2,Wxxxx!B:Z,24,FALSE)="YES", "VALID", "INVALID"),"INVALID")&" - " & IFERROR(VLOOKUP(R2,Wxxxx!B:Z,25,FALSE),"N") &" - "&K2)
 
            column_x = Range("X3:X" & lastrow_SHEETNAME1)
            column_y = Range("Y3:Y" & lastrow_SHEETNAME1)
            column_t = Range("T3:T" & lastrow_SHEETNAME1)
            column_r = Range("R3:R" & lastrow_SHEETNAME1)
            column_b_Wxxxx = Sheets("Wxxxx").Range("B3:B" & lastrow_Wxxxx)
            column_y_Wxxxx = Sheets("Wxxxx").Range("Y3:Y" & lastrow_Wxxxx)
            column_z_Wxxxx = Sheets("Wxxxx").Range("Z3:Z" & lastrow_Wxxxx)
            column_k = Range("K3:K" & lastrow_SHEETNAME1)
            For n = LBound(working) To UBound(working)
 
                If (column_x(n, 1) = "NON EXIST" Or column_y(n, 1) = "EXCLUDE") Then
                    working(n, 1) = "NON REPORTABLE"
                Else
                    working(n, 1) = column_t(n, 1) & " - "
 
                    tmp = ArrayFind(column_b_Wxxxx, column_r(n, 1), column_y_Wxxxx, 0)
                    If tmp = "YES" Then
                        working(n, 1) = working(n, 1) & "VALID" & " - "
                    Else
                        working(n, 1) = working(n, 1) & "INVALID" & " - "
                    End If
 
                    tmp = ArrayFind(column_b_Wxxxx, column_r(n, 1), column_z_Wxxxx, "N")
                    working(n, 1) = working(n, 1) & tmp & " - " & column_k(n, 1)
                End If
            Next n
 
            .Range("AQ3:AQ" & lastrow_SHEETNAME1).Value = working
 
'            .Range("AQ2:AQ2").AutoFill Destination:=.Range("AQ2:AQ" & lastrow_SHEETNAME1)
'            .Range("AQ2:AQ" & lastrow_SHEETNAME1).Calculate
'            .Range("AQ3:AQ" & lastrow_SHEETNAME1) = .Range("AQ3:AQ" & lastrow_SHEETNAME1).Value
 
 
            ' Column AR
            ' =IF(OR($X2="NON EXIST",$Y2="EXCLUDE"),"NON REPORTABLE",IFERROR(VLOOKUP(AQ2,References!$H$1:$K$45,2,FALSE),0))
            column_x = Range("X3:X" & lastrow_SHEETNAME1)
            column_y = Range("Y3:Y" & lastrow_SHEETNAME1)
            column_aq = Range("AQ3:AQ" & lastrow_SHEETNAME1)
            column_h_References = Sheets("References").Range("H3:H" & lastrow_References_adjusted_rate)
            column_i_References = Sheets("References").Range("I3:I" & lastrow_References_adjusted_rate)
            For n = LBound(working) To UBound(working)
 
                If (column_x(n, 1) = "NON EXIST" Or column_y(n, 1) = "EXCLUDE") Then
                    working(n, 1) = "NON REPORTABLE"
                Else
                    working(n, 1) = ArrayFind(column_h_References, column_aq(n, 1), column_i_References, 0)
                End If
            Next n
 
            .Range("AR3:AR" & lastrow_SHEETNAME1).Value = working
 
 
'            .Range("AR2:AR2").AutoFill Destination:=.Range("AR2:AR" & lastrow_SHEETNAME1)
'            .Range("AR2:AR" & lastrow_SHEETNAME1).Calculate
'            .Range("AR3:AR" & lastrow_SHEETNAME1) = .Range("AR3:AR" & lastrow_SHEETNAME1).Value
 
 
            ' Column AS
            ' =IF(OR($X2="NON EXIST",$Y2="EXCLUDE"),"NON REPORTABLE",IFERROR(VLOOKUP(AQ2,References!$H$1:$K$45,3,FALSE),0))
            column_x = Range("X3:X" & lastrow_SHEETNAME1)
            column_y = Range("Y3:Y" & lastrow_SHEETNAME1)
            column_aq = Range("AQ3:AQ" & lastrow_SHEETNAME1)
            column_h_References = Sheets("References").Range("H3:H" & lastrow_References_adjusted_rate)
            column_j_References = Sheets("References").Range("J3:J" & lastrow_References_adjusted_rate)
            For n = LBound(working) To UBound(working)
 
                If (column_x(n, 1) = "NON EXIST" Or column_y(n, 1) = "EXCLUDE") Then
                    working(n, 1) = "NON REPORTABLE"
                Else
                    working(n, 1) = ArrayFind(column_h_References, column_aq(n, 1), column_j_References, 0)
                End If
            Next n
 
            .Range("AS3:AS" & lastrow_SHEETNAME1).Value = working
 
'            .Range("AS2:AS2").AutoFill Destination:=.Range("AS2:AS" & lastrow_SHEETNAME1)
'            .Range("AS2:AS" & lastrow_SHEETNAME1).Calculate
'            .Range("AS3:AS" & lastrow_SHEETNAME1) = .Range("AS3:AS" & lastrow_SHEETNAME1).Value
 
 
            ' Column AT
            ' =IF(OR($X2="NON EXIST",$Y2="EXCLUDE"),"NON REPORTABLE",IFERROR(VLOOKUP(AQ2,References!$H$1:$K$45,4,FALSE),0))
            column_x = Range("X3:X" & lastrow_SHEETNAME1)
            column_y = Range("Y3:Y" & lastrow_SHEETNAME1)
            column_aq = Range("AQ3:AQ" & lastrow_SHEETNAME1)
            column_h_References = Sheets("References").Range("H3:H" & lastrow_References_adjusted_rate)
            column_k_References = Sheets("References").Range("K3:K" & lastrow_References_adjusted_rate)
            For n = LBound(working) To UBound(working)
 
                If (column_x(n, 1) = "NON EXIST" Or column_y(n, 1) = "EXCLUDE") Then
                    working(n, 1) = "NON REPORTABLE"
                Else
                    working(n, 1) = ArrayFind(column_h_References, column_aq(n, 1), column_k_References, 0)
                End If
            Next n
 
            .Range("AT3:AT" & lastrow_SHEETNAME1).Value = working
 
'            .Range("AT2:AT2").AutoFill Destination:=.Range("AT2:AT" & lastrow_SHEETNAME1)
'            .Range("AT2:AT" & lastrow_SHEETNAME1).Calculate
'            .Range("AT3:AT" & lastrow_SHEETNAME1) = .Range("AT3:AT" & lastrow_SHEETNAME1).Value
 
 
            ' Copy adjustment data.
'zzzz            .Range("AU2:AU" & lastrow_SHEETNAME1) = .Range("AT2:AT" & lastrow_SHEETNAME1).Value
 
 
            ' Column AV
            ' =IF(OR($X2="NON EXIST",$Y2="EXCLUDE"),"NON REPORTABLE",IFERROR(VLOOKUP(AD2&" - "&AF2,References!S:W,3,FALSE),0))
            column_x = Range("X3:X" & lastrow_SHEETNAME1)
            column_y = Range("Y3:Y" & lastrow_SHEETNAME1)
            column_ad = Range("AD3:AD" & lastrow_SHEETNAME1)
            column_af = Range("AF3:AF" & lastrow_SHEETNAME1)
            column_s_References = Sheets("References").Range("S3:S" & lastrow_References_income_type)
            column_u_References = Sheets("References").Range("U3:U" & lastrow_References_income_type)
            For n = LBound(working) To UBound(working)
 
                If (column_x(n, 1) = "NON EXIST" Or column_y(n, 1) = "EXCLUDE") Then
                    working(n, 1) = "NON REPORTABLE"
                Else
                    working(n, 1) = ArrayFind(column_s_References, column_ad(n, 1) & " - " & column_af(n, 1), column_u_References, 0)
                End If
            Next n
 
            .Range("AV3:AV" & lastrow_SHEETNAME1).Value = working
 
'            .Range("AV2:AV2").AutoFill Destination:=.Range("AV2:AV" & lastrow_SHEETNAME1)
'            .Range("AV2:AV" & lastrow_SHEETNAME1).Calculate
'            .Range("AV3:AV" & lastrow_SHEETNAME1) = .Range("AV3:AV" & lastrow_SHEETNAME1).Value
 
 
            ' Column AW
            ' =IF(OR($X2="NON EXIST",$Y2="EXCLUDE"),"NON REPORTABLE",IF(OR(AR2="NO ADJUSTMENT REQUIRED",K2=AU2),"NO ADJUSTMENT REQUIRED","ADJUST FROM "&K2&"% TO "&AU2&"% - BBH REPORTED "&AI2&"%"))
            column_x = Range("X3:X" & lastrow_SHEETNAME1)
            column_y = Range("Y3:Y" & lastrow_SHEETNAME1)
            column_ar = Range("AR3:AR" & lastrow_SHEETNAME1)
            column_k = Range("K3:K" & lastrow_SHEETNAME1)
            column_au = Range("AU3:AU" & lastrow_SHEETNAME1)
            column_ai = Range("AI3:AI" & lastrow_SHEETNAME1)
            For n = LBound(working) To UBound(working)
 
                If (column_x(n, 1) = "NON EXIST" Or column_y(n, 1) = "EXCLUDE") Then
                    working(n, 1) = "NON REPORTABLE"
                Else
                    If (column_ar(n, 1) = "NO ADJUSTMENT REQUIRED" Or column_k(n, 1) = column_au(n, 1)) Then
                        working(n, 1) = "NO ADJUSTMENT REQUIRED"
                    Else
                        working(n, 1) = "ADJUST FROM " & column_k(n, 1) & "% TO " & column_au(n, 1) & "% - BBH REPORTED " & column_ai(n, 1) & "%"
                    End If
                End If
            Next n
 
            .Range("AW3:AW" & lastrow_SHEETNAME1).Value = working
 
 
            ' Column AX
            ' =IF(OR($X2="NON EXIST",$Y2="EXCLUDE"),"NON REPORTABLE",IF(R2=530572,"BPB&T IOM",IF(T2="IBGC","BPCI","BPB&T Jersey")))
            column_x = Range("X3:X" & lastrow_SHEETNAME1)
            column_y = Range("Y3:Y" & lastrow_SHEETNAME1)
            column_r = Range("R3:R" & lastrow_SHEETNAME1)
            column_t = Range("T3:T" & lastrow_SHEETNAME1)
            For n = LBound(working) To UBound(working)
 
                If (column_x(n, 1) = "NON EXIST" Or column_y(n, 1) = "EXCLUDE") Then
                    working(n, 1) = "NON REPORTABLE"
                Else
                    If (column_r(n, 1) = 530572) Then
                        working(n, 1) = "BPB&T IOM"
                    Else
                        If (column_t(n, 1) = "IBGC") Then
                            working(n, 1) = "BPCI"
                        Else
                            working(n, 1) = "BPB&T Jersey"
                        End If
                    End If
                End If
            Next n
 
            .Range("AX3:AX" & lastrow_SHEETNAME1).Value = working
 
 
            ' Column AY
            ' =IF(AW2="NO ADJUSTMENT REQUIRED","NO ADJUSTMENT REQUIRED",IF(AW2="NON REPORTABLE","NON REPORTABLE",ROUND((F2*AU2%)-I2,2)))
            column_aw = Range("AW3:AW" & lastrow_SHEETNAME1)
            column_f = Range("F3:F" & lastrow_SHEETNAME1)
            column_au = Range("AU3:AU" & lastrow_SHEETNAME1)
            column_i = Range("I3:I" & lastrow_SHEETNAME1)
            For n = LBound(working) To UBound(working)
 
                If (column_aw(n, 1) = "NO ADJUSTMENT REQUIRED") Then
                    working(n, 1) = "NO ADJUSTMENT REQUIRED"
                Else
                    If (column_aw(n, 1) = "NON REPORTABLE") Then
                        working(n, 1) = "NON REPORTABLE"
                    Else
                        working(n, 1) = Round((column_f(n, 1) * column_au(n, 1) / 100) - column_i(n, 1), 2)
                    End If
                End If
            Next n
 
            .Range("AY3:AY" & lastrow_SHEETNAME1).Value = working
 
 
            ' Column BB
            ' =IF(ISNA(VLOOKUP(U2,References!$AG:$AG,1,FALSE)),"NO ADJUSTMENT REQUIRED",IF(AW2="NO ADJUSTMENT REQUIRED","NO ADJUSTMENT REQUIRED",IF(AW2="NON REPORTABLE","NON REPORTABLE",IFERROR(VLOOKUP(T2&" - "&AU2,References!$O$2:$Q$5,3,FALSE),0))))
            column_u = Range("U3:U" & lastrow_SHEETNAME1)
            column_ag_References = Sheets("References").Range("AG3:AG" & lastrow_References_allowed_locations)
            column_aw = Range("AW3:AW" & lastrow_SHEETNAME1)
            column_t = Range("T3:T" & lastrow_SHEETNAME1)
            column_au = Range("AU3:AU" & lastrow_SHEETNAME1)
            column_o_References = Sheets("References").Range("O3:O" & lastrow_References_g3_location)
            column_q_References = Sheets("References").Range("Q3:Q" & lastrow_References_g3_location)
            For n = LBound(working) To UBound(working)
 
                If ArrayCountIf(column_ag_References, column_u(n, 1)) > 0 Then
                    If column_aw(n, 1) = "NO ADJUSTMENT REQUIRED" Then
                        working(n, 1) = "NO ADJUSTMENT REQUIRED"
                    Else
                        If column_aw(n, 1) = "NON REPORTABLE" Then
                            working(n, 1) = "NON REPORTABLE"
                        Else
                            working(n, 1) = ArrayFind(column_o_References, column_t(n, 1) & " - " & column_au(n, 1), column_q_References, 0)
                        End If
 
                    End If
                    'working(n, 1) = Round(ArraySumIf(column_a, column_a(n, 1), column_an) - ArraySumIf(column_a_FinalABC, column_a(n, 1), column_k_FinalABC), 2)
                Else
                    working(n, 1) = "NO ADJUSTMENT REQUIRED"
                End If
            Next n
 
            .Range("BB3:BB" & lastrow_SHEETNAME1).Value = working
 
 
'            .Range("BB2:BB2").AutoFill Destination:=.Range("BB2:BB" & lastrow_SHEETNAME1)
'            .Range("BB2:BB" & lastrow_SHEETNAME1).Calculate
'            .Range("BB3:BB" & lastrow_SHEETNAME1) = .Range("BB3:BB" & lastrow_SHEETNAME1).Value
 
 
            ' Column BD
            ' =IF(AW2="NO ADJUSTMENT REQUIRED","NO ADJUSTMENT REQUIRED",IF(AW2="NON REPORTABLE","NON REPORTABLE",IFERROR(VLOOKUP(T2& " - " &AU2,References!$O$2:$Q$5,2,FALSE),0)))
            column_aw = Range("AW3:AW" & lastrow_SHEETNAME1)
            column_au = Range("AU3:AU" & lastrow_SHEETNAME1)
            column_o_References = Sheets("References").Range("O3:O" & lastrow_References_g3_location)
            column_p_References = Sheets("References").Range("P3:P" & lastrow_References_g3_location)
            For n = LBound(working) To UBound(working)
 
                If (column_aw(n, 1) = "NO ADJUSTMENT REQUIRED") Then
                    working(n, 1) = "NO ADJUSTMENT REQUIRED"
                Else
                    If (column_aw(n, 1) = "NON REPORTABLE") Then
                        working(n, 1) = "NON REPORTABLE"
                    Else
                        working(n, 1) = ArrayFind(column_o_References, column_t(n, 1) & " - " & column_au(n, 1), column_p_References, 0)
                    End If
                End If
            Next n
 
            .Range("BD3:BD" & lastrow_SHEETNAME1).Value = working
 
'            .Range("BD2:BD2").AutoFill Destination:=.Range("BD2:BD" & lastrow_SHEETNAME1)
'            .Range("BD2:BD" & lastrow_SHEETNAME1).Calculate
'            .Range("BD3:BD" & lastrow_SHEETNAME1) = .Range("BD3:BD" & lastrow_SHEETNAME1).Value
 
 
            ' Column BE
            '=IF(AW2="NO ADJUSTMENT REQUIRED","NO ADJUSTMENT REQUIRED",IF(AW2="NON REPORTABLE","NON REPORTABLE",IF(BD2<>M2,"Yes","No")))
            column_aw = Range("AW3:AW" & lastrow_SHEETNAME1)
            column_bd = Range("BD3:BD" & lastrow_SHEETNAME1)
            column_m = Range("M3:M" & lastrow_SHEETNAME1)
            For n = LBound(working) To UBound(working)
 
                If (column_aw(n, 1) = "NO ADJUSTMENT REQUIRED") Then
                    working(n, 1) = "NO ADJUSTMENT REQUIRED"
                Else
                    If (column_aw(n, 1) = "NON REPORTABLE") Then
                        working(n, 1) = "NON REPORTABLE"
                    Else
                        If (column_bd(n, 1) <> column_m(n, 1)) Then
                            working(n, 1) = "Yes"
                        Else
                            working(n, 1) = "No"
                        End If
                    End If
                End If
            Next n
 
            .Range("BE3:BE" & lastrow_SHEETNAME1).Value = working
 
 
            ' Column BG
            ' =IF(ISNA(VLOOKUP(R2&N2,HOLDINGS!A:A,1,FALSE)),"NO HOLDINGS","STILL HAS HOLDINGS")
            column_r = Range("R3:R" & lastrow_SHEETNAME1)
            column_n = Range("N3:N" & lastrow_SHEETNAME1)
            column_a_HOLDINGS = Sheets("HOLDINGS").Range("A3:A" & lastrow_HOLDINGS)
            For n = LBound(working) To UBound(working)
                working(n, 1) = ArrayFindEx(column_a_HOLDINGS, column_r(n, 1) & column_n(n, 1), "STILL HAS HOLDINGS", "NO HOLDINGS")
            Next n
 
            .Range("BG3:BG" & lastrow_SHEETNAME1).Value = working
 
'            .Range("BG2:BG2").AutoFill Destination:=.Range("BG2:BG" & lastrow_SHEETNAME1)
'            .Range("BG2:BG" & lastrow_SHEETNAME1).Calculate
'            .Range("BG3:BG" & lastrow_SHEETNAME1) = .Range("BG3:BG" & lastrow_SHEETNAME1).Value
 
 
            ' Column BH
            '=IF(ISNA(VLOOKUP(R2&N2,HOLDINGS!A:F,6,FALSE)),"NO HOLDINGS",VLOOKUP(R2&N2,HOLDINGS!A:F,6,FALSE))
            column_r = Range("R3:R" & lastrow_SHEETNAME1)
            column_n = Range("N3:N" & lastrow_SHEETNAME1)
            column_a_HOLDINGS = Sheets("HOLDINGS").Range("A3:A" & lastrow_HOLDINGS)
            column_f_HOLDINGS = Sheets("HOLDINGS").Range("F3:F" & lastrow_HOLDINGS)
            For n = LBound(working) To UBound(working)
                working(n, 1) = ArrayFind(column_a_HOLDINGS, column_r(n, 1) & column_n(n, 1), column_f_HOLDINGS, "NO HOLDINGS")
            Next n
 
            .Range("BH3:BH" & lastrow_SHEETNAME1).Value = working
 
'            .Range("BH2:BH2").AutoFill Destination:=.Range("BH2:BH" & lastrow_SHEETNAME1)
'            .Range("BH2:BH" & lastrow_SHEETNAME1).Calculate
'            .Range("BH3:BH" & lastrow_SHEETNAME1) = .Range("BH3:BH" & lastrow_SHEETNAME1).Value
 
 
            ' Column BI
            ' =IF(BH2="NO HOLDINGS","NO HOLDINGS",VLOOKUP(BH2,References!A:B,2,FALSE))
            column_bh = Range("BH3:BH" & lastrow_SHEETNAME1)
            column_a_References = Sheets("References").Range("A3:A" & lastrow_References)
            column_b_References = Sheets("References").Range("B3:B" & lastrow_References)
            For n = LBound(working) To UBound(working)
                If column_bh(n, 1) = "NO HOLDINGS" Then
                    working(n, 1) = "NO HOLDINGS"
                Else
                    working(n, 1) = ArrayFind(column_a_References, column_bh(n, 1), column_b_References, 0)
                End If
            Next n
 
            .Range("BI3:BI" & lastrow_SHEETNAME1).Value = working
 
'            .Range("BI2:BI2").AutoFill Destination:=.Range("BI2:BI" & lastrow_SHEETNAME1)
'            .Range("BI2:BI" & lastrow_SHEETNAME1).Calculate
'            .Range("BI3:BI" & lastrow_SHEETNAME1) = .Range("BI3:BI" & lastrow_SHEETNAME1).Value
 
 
            ' Column BJ
            ' =IF(OR(BB2="NO ADJUSTMENT REQUIRED",Y2="EXCLUDE"),"NO ADJUSTMENT REQUIRED",IFERROR(VLOOKUP(LEFT(P2,6)&TEXT(H2,"#.00")&R2,TRANSACTIONS!A:L,12,FALSE),0))
            column_bb = Range("BB3:BB" & lastrow_SHEETNAME1)
            column_y = Range("Y3:Y" & lastrow_SHEETNAME1)
            column_p = Range("P3:P" & lastrow_SHEETNAME1)
            column_h = Range("H3:H" & lastrow_SHEETNAME1)
            column_r = Range("R3:R" & lastrow_SHEETNAME1)
            column_a_TRANSACTIONS = Sheets("TRANSACTIONS").Range("A3:A" & lastrow_TRANSACTIONS)
            column_l_TRANSACTIONS = Sheets("TRANSACTIONS").Range("L3:L" & lastrow_TRANSACTIONS)
            For n = LBound(working) To UBound(working)
                If column_bb(n, 1) = "NO ADJUSTMENT REQUIRED" Or column_y(n, 1) = "EXCLUDE" Then
                    working(n, 1) = "NO ADJUSTMENT REQUIRED"
                Else
                    working(n, 1) = ArrayFind(column_a_TRANSACTIONS, Left(column_p(n, 1), 6) & WorksheetFunction.Text(column_h(n, 1), "#.00") & column_r(n, 1), column_l_TRANSACTIONS, 0)
                End If
            Next n
 
            .Range("BJ3:BJ" & lastrow_SHEETNAME1).Value = working
 
'            .Range("BJ2:BJ2").AutoFill Destination:=.Range("BJ2:BJ" & lastrow_SHEETNAME1)
'            .Range("BJ2:BJ" & lastrow_SHEETNAME1).Calculate
'            .Range("BJ3:BJ" & lastrow_SHEETNAME1) = .Range("BJ3:BJ" & lastrow_SHEETNAME1).Value
 
 
            ' Column BK
            ' =IF(OR(BB2="NO ADJUSTMENT REQUIRED",Y2="EXCLUDE"),"NO ADJUSTMENT REQUIRED",VLOOKUP(LEFT(P2,6)&TEXT(H2,"#.00")&R2,TRANSACTIONS!A:M,13,FALSE))
            column_bb = Range("BB3:BB" & lastrow_SHEETNAME1)
            column_y = Range("Y3:Y" & lastrow_SHEETNAME1)
            column_p = Range("P3:P" & lastrow_SHEETNAME1)
            column_h = Range("H3:H" & lastrow_SHEETNAME1)
            column_r = Range("R3:R" & lastrow_SHEETNAME1)
            column_a_TRANSACTIONS = Sheets("TRANSACTIONS").Range("A3:A" & lastrow_TRANSACTIONS)
            column_m_TRANSACTIONS = Sheets("TRANSACTIONS").Range("M3:M" & lastrow_TRANSACTIONS)
            For n = LBound(working) To UBound(working)
                If column_bb(n, 1) = "NO ADJUSTMENT REQUIRED" Or column_y(n, 1) = "EXCLUDE" Then
                    working(n, 1) = "NO ADJUSTMENT REQUIRED"
                Else
                    working(n, 1) = ArrayFind(column_a_TRANSACTIONS, Left(column_p(n, 1), 6) & WorksheetFunction.Text(column_h(n, 1), "#.00") & column_r(n, 1), column_m_TRANSACTIONS, 0)
                End If
            Next n
 
            .Range("BK3:BK" & lastrow_SHEETNAME1).Value = working
 
'            .Range("BK2:BK2").AutoFill Destination:=.Range("BK2:BK" & lastrow_SHEETNAME1)
'            .Range("BK2:BK" & lastrow_SHEETNAME1).Calculate
'            .Range("BK3:BK" & lastrow_SHEETNAME1) = .Range("BK3:BK" & lastrow_SHEETNAME1).Value
 
 
            ' Column BL
            ' =IF(OR(BB2="NO ADJUSTMENT REQUIRED",Y2="EXCLUDE"),"NO ADJUSTMENT REQUIRED",VLOOKUP(LEFT(P2,6)&TEXT(H2,"#.00")&R2,TRANSACTIONS!A:N,14,FALSE))
            column_bb = Range("BB3:BB" & lastrow_SHEETNAME1)
            column_y = Range("Y3:Y" & lastrow_SHEETNAME1)
            column_p = Range("P3:P" & lastrow_SHEETNAME1)
            column_h = Range("H3:H" & lastrow_SHEETNAME1)
            column_r = Range("R3:R" & lastrow_SHEETNAME1)
            column_a_TRANSACTIONS = Sheets("TRANSACTIONS").Range("A3:A" & lastrow_TRANSACTIONS)
            column_n_TRANSACTIONS = Sheets("TRANSACTIONS").Range("N3:N" & lastrow_TRANSACTIONS)
            For n = LBound(working) To UBound(working)
                If column_bb(n, 1) = "NO ADJUSTMENT REQUIRED" Or column_y(n, 1) = "EXCLUDE" Then
                    working(n, 1) = "NO ADJUSTMENT REQUIRED"
                Else
                    working(n, 1) = ArrayFind(column_a_TRANSACTIONS, Left(column_p(n, 1), 6) & WorksheetFunction.Text(column_h(n, 1), "#.00") & column_r(n, 1), column_n_TRANSACTIONS, 0)
                End If
            Next n
 
            .Range("BL3:BL" & lastrow_SHEETNAME1).Value = working
 
'            .Range("BL2:BL2").AutoFill Destination:=.Range("BL2:BL" & lastrow_SHEETNAME1)
'            .Range("BL2:BL" & lastrow_SHEETNAME1).Calculate
'            .Range("BL3:BL" & lastrow_SHEETNAME1) = .Range("BL3:BL" & lastrow_SHEETNAME1).Value
 
 
            ' Column BM
            ' =IF(ISNA(VLOOKUP(R2,QSHEET!A:A,1,FALSE)),"NOT ON QSHEET", "ON QSHEET")
            column_r = Range("R3:R" & lastrow_SHEETNAME1)
            column_a_QSHEET = Sheets("QSHEET").Range("A3:A" & lastrow_QSHEET)
            For n = LBound(working) To UBound(working)
                working(n, 1) = ArrayFindEx(column_a_QSHEET, column_r(n, 1), "ON QSHEET", "NOT ON QSHEET")
            Next n
 
            .Range("BM3:BM" & lastrow_SHEETNAME1).Value = working
 
'            .Range("BM2:BM2").AutoFill Destination:=.Range("BM2:BM" & lastrow_SHEETNAME1)
'            .Range("BM2:BM" & lastrow_SHEETNAME1).Calculate
'            .Range("BM3:BM" & lastrow_SHEETNAME1) = .Range("BM3:BM" & lastrow_SHEETNAME1).Value
 
        End With
    End With
 
 
    ' Clear all objects.
    Set working = Nothing
 
    Set column_a = Nothing
    Set column_b = Nothing
    Set column_e = Nothing
    Set column_f = Nothing
    Set column_g = Nothing
    Set column_h = Nothing
    Set column_i = Nothing
    Set column_k = Nothing
    Set column_m = Nothing
    Set column_n = Nothing
    Set column_p = Nothing
    Set column_r = Nothing
    Set column_t = Nothing
    Set column_u = Nothing
    Set column_x = Nothing
    Set column_y = Nothing
    Set column_ab = Nothing
    Set column_ad = Nothing
    Set column_af = Nothing
    Set column_ai = Nothing
    Set column_aj = Nothing
    Set column_an = Nothing
    Set column_ao = Nothing
    Set column_aq = Nothing
    Set column_ar = Nothing
    Set column_au = Nothing
    Set column_aw = Nothing
    Set column_bb = Nothing
    Set column_bd = Nothing
    Set column_bh = Nothing
 
    Set column_a_CUST = Nothing
    Set column_b_CUST = Nothing
    Set column_a_FinalABC = Nothing
    Set column_d_FinalABC = Nothing
    Set column_k_FinalABC = Nothing
    Set column_n_FinalABC = Nothing
    Set column_a_HOLDINGS = Nothing
    Set column_f_HOLDINGS = Nothing
    Set column_a_MappingPivots = Nothing
    Set column_b_MappingPivots = Nothing
    Set column_c_MappingPivots = Nothing
    Set column_f_MappingPivots = Nothing
    Set column_g_MappingPivots = Nothing
    Set column_h_MappingPivots = Nothing
    Set column_a_References = Nothing
    Set column_b_References = Nothing
    Set column_h_References = Nothing
    Set column_k_References = Nothing
    Set column_s_References = Nothing
    Set column_u_References = Nothing
    Set column_ag_References = Nothing
    Set column_a_QSHEET = Nothing
    Set column_a_TRANSACTIONS = Nothing
    Set column_l_TRANSACTIONS = Nothing
    Set column_m_TRANSACTIONS = Nothing
    Set column_n_TRANSACTIONS = Nothing
    Set column_b_Wxxxx = Nothing
    Set column_y_Wxxxx = Nothing
    Set column_z_Wxxxx = Nothing
 
    Set prev_a = Nothing
    Set prev_b = Nothing
    Set prev_c = Nothing
    Set prev_f = Nothing
    Set prev_g = Nothing
    Set prev_h = Nothing
 
    Set tmp = Nothing
 
End Sub
 
 
 
' Copies remaining formulae down on the SHEETNAME1 sheet.
Sub M10625_Recalc_SHEETNAME1_Formulae()
 
    Dim lastrow_SHEETNAME1 As Long
    Dim lastrow_FinalABC As Long
    Dim top_row As Integer
    Dim source As String
    Dim SHEETNAME1_range As Range
    Dim FinalABC_range As Range
 
 
    ' Set top row for pivots.
    ' top_row is row in which pivots at the top are created.
    top_row = 5
 
 
    ' Initialize global vars.
    Call Z00000_Init
 
 
    ' Ask user.
    If ctrl_ask_before_running_subroutine = True Then
        If MsgBox("Recalc SHEETNAME1 PIVOT formulae?", vbYesNo) = vbNo Then Exit Sub
    End If
 
 
    'Creating Pivot cache
    On Error Resume Next
 
 
    With Workbooks(wb_name)
 
        ' Get how many rows of data have been loaded into the sheet.
        'lastrow = Workbooks(my1042Rec).Sheets("SHEETNAME1").Range("D65536").End(xlUp).Row
        lastrow_SHEETNAME1 = .Sheets("SHEETNAME1").Cells(Rows.Count, 4).End(xlUp).Row
        ' Prevent line 2 being deleted - as this contains the formulae which need coping down later.
        If lastrow_SHEETNAME1 < 3 Then
            lastrow_SHEETNAME1 = 3
        End If
 
 
        ' Get how many rows of data have been loaded into the sheet.
        'SHEETNAME1_lastrow = Workbooks(my1042Rec).Sheets("SHEETNAME1").Cells(Rows.Count, 4).End(xlUp).Row
        lastrow_FinalABC = .Sheets("FinalABC").Cells(Rows.Count, 4).End(xlUp).Row
 
        Set SHEETNAME1_range = Range("SHEETNAME1!A1:BO" & lastrow_SHEETNAME1)
        Set FinalABC_range = Range("FinalABC!A1:AT" & lastrow_FinalABC)
 
 
        With .Sheets("SHEETNAME1")
 
            ' Activate the sheet.
            .Activate
 
 
            ' Select A1.
            ScrollTo ActiveSheet.name, "A1"
 
 
            .Range("X2:X2").AutoFill Destination:=.Range("X2:X" & lastrow_SHEETNAME1)
            .Range("X2:X" & lastrow_SHEETNAME1).Calculate
            .Range("X3:X" & lastrow_SHEETNAME1) = .Range("X3:X" & lastrow_SHEETNAME1).Value
 
            .Range("AB2:AB2").AutoFill Destination:=.Range("AB2:AB" & lastrow_SHEETNAME1)
            .Range("AB2:AB" & lastrow_SHEETNAME1).Calculate
            .Range("AB3:AB" & lastrow_SHEETNAME1) = .Range("AB3:AB" & lastrow_SHEETNAME1).Value
 
            .Range("AC2:AC2").AutoFill Destination:=.Range("AC2:AC" & lastrow_SHEETNAME1)
            .Range("AC2:AC" & lastrow_SHEETNAME1).Calculate
            .Range("AC3:AC" & lastrow_SHEETNAME1) = .Range("AC3:AC" & lastrow_SHEETNAME1).Value
 
 
            ' Copy adjustment data.
'zzzz            .Range("AD2:AD" & lastrow_SHEETNAME1) = .Range("AC2:AC" & lastrow_SHEETNAME1).Value
 
 
            .Range("AE2:AE2").AutoFill Destination:=.Range("AE2:AE" & lastrow_SHEETNAME1)
            .Range("AE2:AE" & lastrow_SHEETNAME1).Calculate
            .Range("AE3:AE" & lastrow_SHEETNAME1) = .Range("AE3:AE" & lastrow_SHEETNAME1).Value
 
 
            ' Copy adjustment data.
'zzzz            .Range("AF2:AF" & lastrow_SHEETNAME1) = .Range("AE2:AE" & lastrow_SHEETNAME1).Value
 
 
            .Range("AG2:AG2").AutoFill Destination:=.Range("AG2:AG" & lastrow_SHEETNAME1)
            .Range("AG2:AG" & lastrow_SHEETNAME1).Calculate
            .Range("AG3:AG" & lastrow_SHEETNAME1) = .Range("AG3:AG" & lastrow_SHEETNAME1).Value
 
            .Range("AH2:AH2").AutoFill Destination:=.Range("AH2:AH" & lastrow_SHEETNAME1)
            .Range("AH2:AH" & lastrow_SHEETNAME1).Calculate
            .Range("AH3:AH" & lastrow_SHEETNAME1) = .Range("AH3:AH" & lastrow_SHEETNAME1).Value
 
 
            ' Copy adjustment data.
'zzzz            .Range("AI2:AI" & lastrow_SHEETNAME1) = .Range("AH2:AH" & lastrow_SHEETNAME1).Value
 
            .Range("AJ2:AJ2").AutoFill Destination:=.Range("AJ2:AJ" & lastrow_SHEETNAME1)
            .Range("AJ2:AJ" & lastrow_SHEETNAME1).Calculate
            .Range("AJ3:AJ" & lastrow_SHEETNAME1) = .Range("AJ3:AJ" & lastrow_SHEETNAME1).Value
 
 
            ' Depends on the earlier pivots.
            .Range("AK2:AK2").AutoFill Destination:=.Range("AK2:AK" & lastrow_SHEETNAME1)
            .Range("AK2:AK" & lastrow_SHEETNAME1).Calculate
            .Range("AK3:AK" & lastrow_SHEETNAME1) = .Range("AK3:AK" & lastrow_SHEETNAME1).Value
 
            .Range("AL2:AL2").AutoFill Destination:=.Range("AL2:AL" & lastrow_SHEETNAME1)
            .Range("AL2:AL" & lastrow_SHEETNAME1).Calculate
            .Range("AL3:AL" & lastrow_SHEETNAME1) = .Range("AL3:AL" & lastrow_SHEETNAME1).Value
 
 
            ' Copy adjustment data.
'zzzz            .Range("AM2:AM" & lastrow_SHEETNAME1) = .Range("AL2:AL" & lastrow_SHEETNAME1).Value
 
 
            .Range("AN2:AN2").AutoFill Destination:=.Range("AN2:AN" & lastrow_SHEETNAME1)
            .Range("AN2:AN" & lastrow_SHEETNAME1).Calculate
            .Range("AN3:AN" & lastrow_SHEETNAME1) = .Range("AN3:AN" & lastrow_SHEETNAME1).Value
 
            .Range("AO2:AO2").AutoFill Destination:=.Range("AO2:AO" & lastrow_SHEETNAME1)
            .Range("AO2:AO" & lastrow_SHEETNAME1).Calculate
            .Range("AO3:AO" & lastrow_SHEETNAME1) = .Range("AO3:AO" & lastrow_SHEETNAME1).Value
 
            .Range("AP2:AP2").AutoFill Destination:=.Range("AP2:AP" & lastrow_SHEETNAME1)
            .Range("AP2:AP" & lastrow_SHEETNAME1).Calculate
            .Range("AP3:AP" & lastrow_SHEETNAME1) = .Range("AP3:AP" & lastrow_SHEETNAME1).Value
 
            .Range("AQ2:AQ2").AutoFill Destination:=.Range("AQ2:AQ" & lastrow_SHEETNAME1)
            .Range("AQ2:AQ" & lastrow_SHEETNAME1).Calculate
            .Range("AQ3:AQ" & lastrow_SHEETNAME1) = .Range("AQ3:AQ" & lastrow_SHEETNAME1).Value
 
            .Range("AR2:AR2").AutoFill Destination:=.Range("AR2:AR" & lastrow_SHEETNAME1)
            .Range("AR2:AR" & lastrow_SHEETNAME1).Calculate
            .Range("AR3:AR" & lastrow_SHEETNAME1) = .Range("AR3:AR" & lastrow_SHEETNAME1).Value
 
            .Range("AS2:AS2").AutoFill Destination:=.Range("AS2:AS" & lastrow_SHEETNAME1)
            .Range("AS2:AS" & lastrow_SHEETNAME1).Calculate
            .Range("AS3:AS" & lastrow_SHEETNAME1) = .Range("AS3:AS" & lastrow_SHEETNAME1).Value
 
            .Range("AT2:AT2").AutoFill Destination:=.Range("AT2:AT" & lastrow_SHEETNAME1)
            .Range("AT2:AT" & lastrow_SHEETNAME1).Calculate
            .Range("AT3:AT" & lastrow_SHEETNAME1) = .Range("AT3:AT" & lastrow_SHEETNAME1).Value
 
 
            ' Copy adjustment data.
'zzzz            .Range("AU2:AU" & lastrow_SHEETNAME1) = .Range("AT2:AT" & lastrow_SHEETNAME1).Value
 
 
            .Range("AV2:AV2").AutoFill Destination:=.Range("AV2:AV" & lastrow_SHEETNAME1)
            .Range("AV2:AV" & lastrow_SHEETNAME1).Calculate
            .Range("AV3:AV" & lastrow_SHEETNAME1) = .Range("AV3:AV" & lastrow_SHEETNAME1).Value
 
            .Range("AW2:AW2").AutoFill Destination:=.Range("AW2:AW" & lastrow_SHEETNAME1)
            .Range("AW2:AW" & lastrow_SHEETNAME1).Calculate
            .Range("AW3:AW" & lastrow_SHEETNAME1) = .Range("AW3:AW" & lastrow_SHEETNAME1).Value
 
            .Range("AX2:AX2").AutoFill Destination:=.Range("AX2:AX" & lastrow_SHEETNAME1)
            .Range("AX2:AX" & lastrow_SHEETNAME1).Calculate
            .Range("AX3:AX" & lastrow_SHEETNAME1) = .Range("AX3:AX" & lastrow_SHEETNAME1).Value
 
            .Range("AY2:AY2").AutoFill Destination:=.Range("AY2:AY" & lastrow_SHEETNAME1)
            .Range("AY2:AY" & lastrow_SHEETNAME1).Calculate
            .Range("AY3:AY" & lastrow_SHEETNAME1) = .Range("AY3:AY" & lastrow_SHEETNAME1).Value
 
            .Range("BB2:BB2").AutoFill Destination:=.Range("BB2:BB" & lastrow_SHEETNAME1)
            .Range("BB2:BB" & lastrow_SHEETNAME1).Calculate
            .Range("BB3:BB" & lastrow_SHEETNAME1) = .Range("BB3:BB" & lastrow_SHEETNAME1).Value
 
            .Range("BD2:BD2").AutoFill Destination:=.Range("BD2:BD" & lastrow_SHEETNAME1)
            .Range("BD2:BD" & lastrow_SHEETNAME1).Calculate
            .Range("BD3:BD" & lastrow_SHEETNAME1) = .Range("BD3:BD" & lastrow_SHEETNAME1).Value
 
            .Range("BE2:BE2").AutoFill Destination:=.Range("BE2:BE" & lastrow_SHEETNAME1)
            .Range("BE2:BE" & lastrow_SHEETNAME1).Calculate
            .Range("BE3:BE" & lastrow_SHEETNAME1) = .Range("BE3:BE" & lastrow_SHEETNAME1).Value
 
            .Range("BG2:BG2").AutoFill Destination:=.Range("BG2:BG" & lastrow_SHEETNAME1)
            .Range("BG2:BG" & lastrow_SHEETNAME1).Calculate
            .Range("BG3:BG" & lastrow_SHEETNAME1) = .Range("BG3:BG" & lastrow_SHEETNAME1).Value
 
            .Range("BH2:BH2").AutoFill Destination:=.Range("BH2:BH" & lastrow_SHEETNAME1)
            .Range("BH2:BH" & lastrow_SHEETNAME1).Calculate
            .Range("BH3:BH" & lastrow_SHEETNAME1) = .Range("BH3:BH" & lastrow_SHEETNAME1).Value
 
            .Range("BI2:BI2").AutoFill Destination:=.Range("BI2:BI" & lastrow_SHEETNAME1)
            .Range("BI2:BI" & lastrow_SHEETNAME1).Calculate
            .Range("BI3:BI" & lastrow_SHEETNAME1) = .Range("BI3:BI" & lastrow_SHEETNAME1).Value
 
            .Range("BJ2:BJ2").AutoFill Destination:=.Range("BJ2:BJ" & lastrow_SHEETNAME1)
            .Range("BJ2:BJ" & lastrow_SHEETNAME1).Calculate
            .Range("BJ3:BJ" & lastrow_SHEETNAME1) = .Range("BJ3:BJ" & lastrow_SHEETNAME1).Value
 
            .Range("BK2:BK2").AutoFill Destination:=.Range("BK2:BK" & lastrow_SHEETNAME1)
            .Range("BK2:BK" & lastrow_SHEETNAME1).Calculate
            .Range("BK3:BK" & lastrow_SHEETNAME1) = .Range("BK3:BK" & lastrow_SHEETNAME1).Value
 
            .Range("BL2:BL2").AutoFill Destination:=.Range("BL2:BL" & lastrow_SHEETNAME1)
            .Range("BL2:BL" & lastrow_SHEETNAME1).Calculate
            .Range("BL3:BL" & lastrow_SHEETNAME1) = .Range("BL3:BL" & lastrow_SHEETNAME1).Value
 
            .Range("BM2:BM2").AutoFill Destination:=.Range("BM2:BM" & lastrow_SHEETNAME1)
            .Range("BM2:BM" & lastrow_SHEETNAME1).Calculate
            .Range("BM3:BM" & lastrow_SHEETNAME1) = .Range("BM3:BM" & lastrow_SHEETNAME1).Value
        End With
    End With
 
 
    ' Clear all objects.
    Set SHEETNAME1_range = Nothing
    Set FinalABC_range = Nothing
 
End Sub
 
 
 
' Format the FinalABC sheet to put lines between ISINs.
Sub M10700_Format_FinalABC_lines()
 
    Dim myISIN_Change As Variant
    Dim lastrow_FinalABC As Long
 
    ' Initialize global vars.
    Call Z00000_Init
 
 
    ' Ask user.
    If ctrl_ask_before_running_subroutine = True Then
        If MsgBox("Format the FinalABC sheet to put lines between ISIN's?", vbYesNo) = vbNo Then Exit Sub
    End If
 
 
    With Workbooks(wb_name)
 
        ' Get how many rows of data have been loaded into the sheet.
        'lastrow = Workbooks(my1042Rec).Sheets("FinalABC").Range("D65536").End(xlUp).Row
        lastrow_FinalABC = .Sheets("FinalABC").Cells(Rows.Count, 4).End(xlUp).Row
        ' Prevent line 2 being deleted - as this contains the formulae which need coping down later.
        If lastrow_FinalABC < 3 Then
            lastrow_FinalABC = 3
        End If
 
 
 
        With .Sheets("FinalABC")
 
            ' Activate the sheet.
            .Activate
 
 
            ' Calculate first to ensure that we know when there is a change to the ISIN.
            'Application.Calculate
            '.Range("AJ2:AJ" & lastrow_FinalABC).Calculate
            .Range("AJ2:AJ2").AutoFill Destination:=.Range("AJ2:AJ" & lastrow_FinalABC)
            .Range("AJ2:AJ" & lastrow_FinalABC).Calculate
            .Range("AJ3:AJ" & lastrow_FinalABC) = .Range("AJ3:AJ" & lastrow_FinalABC).Value
 
 
 
'            For Each myISIN_Change In .Range("AJ2", Range("AJ65536").End(xlUp))
            For Each myISIN_Change In .Range("AJ2:AJ" & lastrow_FinalABC)
                If myISIN_Change = False Then
                    .Range("A" & myISIN_Change.Row & ":AT" & myISIN_Change.Row).Select
                    With Selection.Borders(xlEdgeTop)
                        .LineStyle = xlDouble
                        .Color = -4165632
                        .TintAndShade = 0
                        .Weight = xlThick
                    End With
                End If
            Next myISIN_Change
        End With
    End With
 
 
    ' Clear all objects.
    Set myISIN_Change = Nothing
 
End Sub
 
 
 
' Format the SHEETNAME1 sheet by placing lines between ISINs.
Sub M10710_Format_SHEETNAME1_Lines()
 
    Dim lastrow_SHEETNAME1 As Long
    Dim myISIN_Change As Variant
 
 
    ' Initialize global vars.
    Call Z00000_Init
 
 
    ' Ask user.
    If ctrl_ask_before_running_subroutine = True Then
        If MsgBox("Format the SHEETNAME1 sheet to put lines between ISIN's?", vbYesNo) = vbNo Then Exit Sub
    End If
 
 
    With Workbooks(wb_name)
 
 
        ' Get how many rows of data have been loaded into the sheet.
        lastrow_SHEETNAME1 = .Sheets("SHEETNAME1").Cells(Rows.Count, 4).End(xlUp).Row
        ' Prevent line 2 being deleted - as this contains the formulae which need coping down later.
        If lastrow_SHEETNAME1 < 3 Then
            lastrow_SHEETNAME1 = 3
        End If
 
 
        With .Sheets("SHEETNAME1")
 
            ' Activate the sheet.
            .Activate
 
 
            ' Application.Calculate
            '.Range("W2:W" & lastrow_SHEETNAME1).Calculate
            .Range("W2:W2").AutoFill Destination:=.Range("W2:W" & lastrow_SHEETNAME1)
            .Range("W2:W" & lastrow_SHEETNAME1).Calculate
            .Range("W3:W" & lastrow_SHEETNAME1) = .Range("W3:W" & lastrow_SHEETNAME1).Value
 
 
'            For Each myISIN_Change In .Range("W2", Range("W65536").End(xlUp))
            For Each myISIN_Change In .Range("W2:W" & lastrow_SHEETNAME1)
                If myISIN_Change = False Then
                    .Range("A" & myISIN_Change.Row & ":BO" & myISIN_Change.Row).Select
                    With Selection.Borders(xlEdgeTop)
                        .LineStyle = xlDouble
                        .Color = -4165632
                        .TintAndShade = 0
                        .Weight = xlThick
                    End With
                End If
            Next myISIN_Change
        End With
    End With
 
 
    ' Clear all objects.
    Set myISIN_Change = Nothing
 
End Sub
 
 
 
' Refresh the PIVOT tables on the REC DASHBOARD sheet.
Sub M10800_Refresh_Rec_Dashboard_Pivots()
 
    Dim lastrow_SHEETNAME1 As Long
    Dim lastrow_FinalABC As Long
 
    Dim pc As PivotCache
    Dim pt As PivotTable
 
    Dim top_row As Integer
    Dim bottom_row As Integer
 
 
    ' Set top and bottom row for pivots.
    ' top_row is row in which pivots at the top are created.
    ' bottom_row is row in which pivots below are created.
    top_row = 5
    bottom_row = 20
 
 
    ' Initialize global vars.
    Call Z00000_Init
 
 
    ' Ask user.
    If ctrl_ask_before_running_subroutine = True Then
        If MsgBox("Refresh Rec Dashboard Pivots?", vbYesNo) = vbNo Then Exit Sub
    End If
 
 
    ' Stop alerts about replacing contents of cells.
    Application.DisplayAlerts = False
 
 
    With Workbooks(wb_name)
 
        ' Get how many rows of data have been loaded into the sheet.
        'lastrow = Workbooks(my1042Rec).Sheets("FinalABC").Range("D65536").End(xlUp).Row
        lastrow_FinalABC = .Sheets("FinalABC").Cells(Rows.Count, 4).End(xlUp).Row
        ' Prevent line 2 being deleted - as this contains the formulae which need coping down later.
        If lastrow_FinalABC < 3 Then
            lastrow_FinalABC = 3
        End If
 
 
        lastrow_SHEETNAME1 = .Sheets("SHEETNAME1").Cells(Rows.Count, 4).End(xlUp).Row
        ' Prevent line 2 being deleted - as this contains the formulae which need coping down later.
        If lastrow_SHEETNAME1 < 3 Then
            lastrow_SHEETNAME1 = 3
        End If
 
 
        With Sheets("REC DASHBOARD")
 
            ' Activate the sheet.
            .Activate
 
 
            ' Delete all existing Pivot Tables in the worksheet.
            ' In the TableRange1 property, page fields are excluded;
            ' To select the entire PivotTable report, including the page fields, use the TableRange2 property.
            For Each pt In .PivotTables
                pt.TableRange2.Clear
            Next pt
 
 
            '**************************** BBH PIVOT Gross Totals **********************
 
            ' Creating Pivot cache.
            Set pc = ActiveWorkbook.PivotCaches.Create(xlDatabase, "FinalABC!A1:AT" & lastrow_FinalABC)
 
 
            ' Creating Pivot table.
            Set pt = pc.CreatePivotTable(.Range("A" & top_row), "PivotTableBBHRec")
 
 
            ' Set the Pivot fields to display.
            With pt
                ' Turn off automatic updation of Pivot Table during the process of its creation to speed up code.
                .ManualUpdate = True
 
                '.Orientation = xlPageField
                '.Orientation = xlColumnField
 
 
                ' Set row field.
                With .PivotFields("Account")
                    'pvi = .PivotItems("1")
                    '.PivotItems("Row Label").Caption = "Account"
                    .Orientation = xlRowField
                    .Position = 1
                End With
 
 
                ' Set column field.
                'With .PivotFields("Region")
                '    .Orientation = xlColumnField
                '    .Position = 1
                'End With
 
 
                ' Set data field.
                '.AddDataField .PivotFields("Gross CCY Converted"), "Sum of Gross CCY Converted", xlSum
 
 
                ' Set data field.
                With .PivotFields("Gross CCY Converted")
                    .Orientation = xlDataField
                    .Function = xlSum
                    .NumberFormat = "#,##0"
                    .Position = 1
                End With
 
 
                ' Turn on automatic update / calculation in the Pivot Table.
                .ManualUpdate = False
 
 
                ' Get the actual data.
                .RefreshTable
 
 
                ' Make the Grand Total yellow.
                .PivotSelect name:="Column Grand Total", Mode:=xlDataAndLabel, UseStandardName:=True
                Selection.Interior.Color = vbYellow
 
            End With
 
 
 
            '**************************** SHEETNAME1 PIVOT Gross Totals **********************
 
            ' Creating Pivot cache.
            Set pc = ActiveWorkbook.PivotCaches.Create(xlDatabase, "SHEETNAME1!A1:BO" & lastrow_SHEETNAME1)
 
 
            ' Creating Pivot table.
            'Set pt = pc.CreatePivotTable(ws.Range("A17"))
            Set pt = pc.CreatePivotTable(.Range("A" & bottom_row), "PivotTableSHEETNAME1Rec")
 
 
            ' Set the Pivot fields to display.
            With pt
                ' Turn off automatic updation of Pivot Table during the process of its creation to speed up code.
                .ManualUpdate = True
 
 
                ' Set row field.
                With .PivotFields("Pool Account BBH")
                    '.Caption = "Account"
                    .Orientation = xlRowField
                    .Position = 1
                End With
 
 
                ' Set data field.
                With .PivotFields("Gross Payment To Include")
                    .Orientation = xlDataField
                    .Function = xlSum
                    .NumberFormat = "#,##0"
                    .Position = 1
                End With
 
 
                ' Turn on automatic update / calculation in the Pivot Table.
                .ManualUpdate = False
 
 
                ' Get the actual data.
                .RefreshTable
 
 
                ' Make the Grand Total yellow.
                .PivotSelect name:="Column Grand Total", Mode:=xlDataAndLabel, UseStandardName:=True
                Selection.Interior.Color = vbYellow
 
            End With
 
 
 
            '**************************** BBH PIVOT "INCOME & EXEMPTION TOTALS" **********************
 
            ' Creating Pivot cache.
            Set pc = ActiveWorkbook.PivotCaches.Create(xlDatabase, "FinalABC!A1:AT" & lastrow_FinalABC)
 
 
            ' Creating Pivot table.
            Set pt = pc.CreatePivotTable(.Range("I" & top_row), "PivotTableBBH_IncomeRec")
 
 
            ' Set the Pivot fields to display.
            With pt
                ' Set tabular form for entire pivot table.
                '.RowAxisLayout xlTabularRow
 
 
                ' Turn off automatic updation of Pivot Table during the process of its creation to speed up code.
                .ManualUpdate = True
 
 
                ' Set row field.
                With .PivotFields("INC_CDE")
                    .Orientation = xlRowField
                    .Position = 1
                    .Subtotals = Array(False, False, False, False, False, False, False, False, False, False, False, False)
                    .LayoutForm = xlTabular
                End With
 
                With .PivotFields("NRA_Exm_Cde")
                    .Orientation = xlRowField
                    .Position = 2
                    .Subtotals = Array(False, False, False, False, False, False, False, False, False, False, False, False)
                    .LayoutForm = xlTabular
                End With
 
 
                ' Set data field.
                With .PivotFields("Gross CCY Converted")
                    .Orientation = xlDataField
                    .Function = xlSum
                    .NumberFormat = "#,##0"
                    .Position = 1
                End With
 
 
                ' Turn on automatic update / calculation in the Pivot Table.
                .ManualUpdate = False
 
 
                ' Get the actual data.
                .RefreshTable
 
 
                ' Make the Grand Total yellow.
                .PivotSelect name:="Column Grand Total", Mode:=xlDataAndLabel, UseStandardName:=True
                Selection.Interior.Color = vbYellow
 
            End With
 
 
            '**************************** SHEETNAME1 PIVOT "INCOME & EXEMPTION TOTALS" **********************
 
            ' Creating Pivot cache.
            Set pc = ActiveWorkbook.PivotCaches.Create(xlDatabase, "SHEETNAME1!A1:BO" & lastrow_SHEETNAME1)
 
 
            ' Creating Pivot table.
            'Set pt = pc.CreatePivotTable(ws.Range("A17"))
            Set pt = pc.CreatePivotTable(.Range("I" & bottom_row), "PivotTableSHEETNAME1_IncomeRec")
 
 
            ' Set the Pivot fields to display.
            With pt
                ' Turn off automatic updation of Pivot Table during the process of its creation to speed up code.
                .ManualUpdate = True
 
 
                ' Set row field.
                With .PivotFields("Income Code Adjusted")
                    .Orientation = xlRowField
                    .Position = 1
                    .Subtotals = Array(False, False, False, False, False, False, False, False, False, False, False, False)
                    .LayoutForm = xlTabular
                End With
 
                With .PivotFields("Exemption Code Adjusted")
                    .Orientation = xlRowField
                    .Position = 2
                    .Subtotals = Array(False, False, False, False, False, False, False, False, False, False, False, False)
                    .LayoutForm = xlTabular
                End With
 
 
                ' Set data field.
                With .PivotFields("Gross Payment To Include")
                    .Orientation = xlDataField
                    .Function = xlSum
                    .NumberFormat = "#,##0"
                    .Position = 1
                End With
 
 
                ' Turn on automatic update / calculation in the Pivot Table.
                .ManualUpdate = False
 
 
                ' Get the actual data.
                .RefreshTable
 
 
                ' Make the Grand Total yellow.
                .PivotSelect name:="Column Grand Total", Mode:=xlDataAndLabel, UseStandardName:=True
                Selection.Interior.Color = vbYellow
 
            End With
 
 
 
            '**************************** BBH PIVOT "CCY TOTALS" **********************
 
            ' Creating Pivot cache.
            Set pc = ActiveWorkbook.PivotCaches.Create(xlDatabase, "FinalABC!A1:AT" & lastrow_FinalABC)
 
 
            ' Creating Pivot table.
            Set pt = pc.CreatePivotTable(.Range("S" & top_row), "PivotTableBBH_CCYRec")
 
 
            ' Set the Pivot fields to display.
            With pt
                ' Set tabular form for entire pivot table.
                '.RowAxisLayout xlTabularRow
 
 
                ' Turn off automatic updation of Pivot Table during the process of its creation to speed up code.
                .ManualUpdate = True
 
 
                ' Set row field.
                With .PivotFields("PMT_Curr")
                    .Orientation = xlRowField
                    .Position = 1
                    .Subtotals = Array(False, False, False, False, False, False, False, False, False, False, False, False)
                    .LayoutForm = xlTabular
                End With
 
 
                ' Set data field.
                With .PivotFields("USD Gross Amount Adjusted")
                    .Orientation = xlDataField
                    .Function = xlSum
                    .NumberFormat = "#,##0"
                    .Position = 1
                End With
 
 
                ' Turn on automatic update / calculation in the Pivot Table.
                .ManualUpdate = False
 
 
                ' Get the actual data.
                .RefreshTable
 
 
                ' Make the Grand Total yellow.
                .PivotSelect name:="Column Grand Total", Mode:=xlDataAndLabel, UseStandardName:=True
                Selection.Interior.Color = vbYellow
 
            End With
 
 
            '**************************** SHEETNAME1 PIVOT "CCY TOTALS" **********************
 
            ' Creating Pivot cache.
            Set pc = ActiveWorkbook.PivotCaches.Create(xlDatabase, "SHEETNAME1!A1:BO" & lastrow_SHEETNAME1)
 
 
            ' Creating Pivot table.
            'Set pt = pc.CreatePivotTable(ws.Range("A17"))
            Set pt = pc.CreatePivotTable(.Range("S" & bottom_row), "PivotTableSHEETNAME1_CCYRec")
 
 
            ' Set the Pivot fields to display.
            With pt
                ' Turn off automatic updation of Pivot Table during the process of its creation to speed up code.
                .ManualUpdate = True
 
 
                ' Set row field.
                With .PivotFields("BBH CCY Adjusted")
                    .Orientation = xlRowField
                    .Position = 1
                    .Subtotals = Array(False, False, False, False, False, False, False, False, False, False, False, False)
                    .LayoutForm = xlTabular
                End With
 
 
                ' Set data field.
                With .PivotFields("USD Gross Converted")
                    .Orientation = xlDataField
                    .Function = xlSum
                    .NumberFormat = "#,##0"
                    .Position = 1
                End With
 
 
                ' Turn on automatic update / calculation in the Pivot Table.
                .ManualUpdate = False
 
 
                ' Get the actual data.
                .RefreshTable
 
 
                ' Make the Grand Total yellow.
                .PivotSelect name:="Column Grand Total", Mode:=xlDataAndLabel, UseStandardName:=True
                Selection.Interior.Color = vbYellow
 
            End With
 
 
 
 
            '**************************** SHEETNAME1 PIVOT "FINAL REPORTS" **********************
 
            ' Creating Pivot cache.
            Set pc = ActiveWorkbook.PivotCaches.Create(xlDatabase, "SHEETNAME1!A1:BO" & lastrow_SHEETNAME1)
 
 
            ' Creating Pivot table.
            'Set pt = pc.CreatePivotTable(ws.Range("A17"))
            Set pt = pc.CreatePivotTable(.Range("AA" & top_row), "PivotTableSHEETNAME1_FinalRec")
 
 
            ' Set the Pivot fields to display.
            With pt
                ' Turn off automatic updation of Pivot Table during the process of its creation to speed up code.
                .ManualUpdate = True
 
 
                ' Set row field.
                With .PivotFields("QI Entity")
                    .Orientation = xlRowField
                    .Position = 1
                    '.Subtotals = Array(False, False, False, False, False, False, False, False, False, False, False, False)
                    'set Index 1 (Automatic) to True which sets all other values to False:
                    .Subtotals(1) = True
                    .LayoutForm = xlTabular
                End With
 
                With .PivotFields("Income Code Adjusted")
                    .Orientation = xlRowField
                    .Position = 2
                    .Subtotals = Array(False, False, False, False, False, False, False, False, False, False, False, False)
                    .LayoutForm = xlTabular
                End With
 
                With .PivotFields("Exemption Code Adjusted")
                    .Orientation = xlRowField
                    .Position = 3
                    .Subtotals = Array(False, False, False, False, False, False, False, False, False, False, False, False)
                    .LayoutForm = xlTabular
                End With
 
                With .PivotFields("Suggested Rate Adjusted")
                    .Orientation = xlRowField
                    .Position = 4
                    .Subtotals = Array(False, False, False, False, False, False, False, False, False, False, False, False)
                    .LayoutForm = xlTabular
                End With
 
 
                ' Set data field.
                With .PivotFields("USD Gross Converted")
                    .Orientation = xlDataField
                    .Function = xlSum
                    .NumberFormat = "#,##0"
                    .Position = 1
                End With
 
 
                ' Turn on automatic update / calculation in the Pivot Table.
                .ManualUpdate = False
 
 
                ' Get the actual data.
                .RefreshTable
 
 
                ' Make the Grand Total yellow.
                .PivotSelect name:="Column Grand Total", Mode:=xlDataAndLabel, UseStandardName:=True
                Selection.Interior.Color = vbYellow
 
 
                ' Make QI Entity headings green
                .PivotSelect "QI Entity[All]", xlDataAndLabel, True
                Selection.Interior.Color = RGB(204, 255, 204)
 
 
                ' Make QI Entity Sub totals yellow.
                .PivotSelect "QI Entity[All;Total]", xlDataAndLabel, True
                Selection.Interior.Color = RGB(255, 255, 153)
            End With
 
 
 
            ' ***** END PIVOT CREATION **** END PIVOT CREATION ***
 
            ' Refresh the pivot tables.
            For Each pt In .PivotTables
                pt.RefreshTable
                pt.Update
            Next
 
 
            ' Put text to display on the sheet.
            ' Some text was overwritten by the pivot creation.
            ' Other text is to replace the "Row Labels" fieldname that Excel 2007 automatically uses.
            .Range("A" & top_row).Value = "Account"
            .Range("A" & bottom_row - 2).Value = "G3"
            .Range("A" & bottom_row - 2).Font.Bold = True
            .Range("A" & bottom_row).Value = "Account"
            .Range("I" & top_row).Value = "INC_CDE"
            .Range("I" & bottom_row - 2).Value = "G3"
            .Range("I" & bottom_row - 2).Font.Bold = True
            .Range("I" & bottom_row).Value = "Income Code Adjusted"
            .Range("S" & top_row).Value = "PMT_Curr"
            .Range("S" & bottom_row - 2).Value = "G3"
            .Range("S" & bottom_row - 2).Font.Bold = True
            .Range("S" & bottom_row).Value = "BBH CCY Converted"
            .Range("AA" & top_row).Value = "QI Entity"
 
 
            ' Select A1.
            ScrollTo ActiveSheet.name, "A1"
 
        End With
    End With
 
 
    ' Clear all objects.
    Set pt = Nothing
    Set pc = Nothing
 
End Sub
 
 
 
 
 
 
 
' Refresh the PIVOT tables on the ADJ DASHBOARD sheet.
Sub M10810_Refresh_Adj_Dashboard_Pivots()
 
    Dim lastrow_SHEETNAME1 As Long
 
    Dim pc As PivotCache
    Dim pt As PivotTable
 
    Dim top_row As Integer
    Dim bottom_row As Integer
 
 
    ' Set top and bottom row for pivots.
    ' top_row is row in which pivots at the top are created.
    ' bottom_row is row in which pivots below are created.
    top_row = 5
    bottom_row = 20
 
 
    ' Initialize global vars.
    Call Z00000_Init
 
 
    ' Ask user.
    If ctrl_ask_before_running_subroutine = True Then
        If MsgBox("Refresh Adj Dashboard Pivots?", vbYesNo) = vbNo Then Exit Sub
    End If
 
 
    ' Stop alerts about replacing contents of cells.
    Application.DisplayAlerts = False
 
 
    With Workbooks(wb_name)
 
        ' Get how many rows of data have been loaded into the sheet.
        lastrow_SHEETNAME1 = .Sheets("SHEETNAME1").Cells(Rows.Count, 4).End(xlUp).Row
        ' Prevent line 2 being deleted - as this contains the formulae which need coping down later.
        If lastrow_SHEETNAME1 < 3 Then
            lastrow_SHEETNAME1 = 3
        End If
 
 
        With Sheets("ADJ DASHBOARD")
 
            ' Activate the sheet.
            .Activate
 
 
            ' Delete all existing Pivot Tables in the worksheet.
            ' In the TableRange1 property, page fields are excluded;
            ' To select the entire PivotTable report, including the page fields, use the TableRange2 property.
            For Each pt In .PivotTables
                pt.TableRange2.Clear
            Next pt
 
 
            '**************************** REPORTING ADJUSTMENT SUMMARY **********************
 
            ' Creating Pivot cache.
            Set pc = ActiveWorkbook.PivotCaches.Create(xlDatabase, "SHEETNAME1!A1:BO" & lastrow_SHEETNAME1)
 
 
            ' Creating Pivot table.
            'Set pt = pc.CreatePivotTable(ws.Range("A17"))
            Set pt = pc.CreatePivotTable(.Range("A" & top_row), "PivotTableSHEETNAME1")
 
 
            ' Set the Pivot fields to display.
            With pt
                ' Turn off automatic updation of Pivot Table during the process of its creation to speed up code.
                .ManualUpdate = True
 
 
                ' Set row field.
                With .PivotFields("BBH Income Type")
                    .Orientation = xlRowField
                    .Position = 1
                    .Subtotals = Array(False, False, False, False, False, False, False, False, False, False, False, False)
                    .LayoutForm = xlTabular
                End With
 
                With .PivotFields("Adjustment Description")
                    .Orientation = xlRowField
                    .Position = 2
                    .Subtotals = Array(False, False, False, False, False, False, False, False, False, False, False, False)
                    .LayoutForm = xlTabular
                End With
 
 
                ' Set column field.
                'With .PivotFields("USD Gross")
                '    .Orientation = xlColumnField
                '    .Position = 1
                '    .Subtotals = Array(False, False, False, False, False, False, False, False, False, False, False, False)
                '    .LayoutForm = xlTabular
                'End With
 
                'With .PivotFields("Vol of Transactions")
                '    .Orientation = xlColumnField
                '    .Position = 1
                '    .Subtotals = Array(False, False, False, False, False, False, False, False, False, False, False, False)
                '    .LayoutForm = xlTabular
                'End With
 
 
 
                ' Set data field.
                With .PivotFields("USD Gross Converted")
                    .Orientation = xlDataField
                    .Function = xlSum
                    .NumberFormat = "#,##0"
                    .Position = 1
                End With
 
 
                'With .PivotFields("Vol of Transactions")
                With .PivotFields("Client Code")
                    .Orientation = xlDataField
                    .Function = xlCount
                    .NumberFormat = "#,##0"
                    .Position = 2
                End With
 
 
                ' Turn on automatic update / calculation in the Pivot Table.
                .ManualUpdate = False
 
 
                ' Get the actual data.
                .RefreshTable
 
 
                ' Make BBH Income Type headings green
            '    .PivotSelect "USD Gross Converted[All;Total]", xlDataAndLabel, True
            '    Selection.Interior.Color = RGB(204, 255, 204)
 
 
                ' Make the Grand Total yellow.
                .PivotSelect name:="Column Grand Total", Mode:=xlDataAndLabel, UseStandardName:=True
                Selection.Interior.Color = vbYellow
 
            End With
 
 
 
            ' ***** END PIVOT CREATION **** END PIVOT CREATION ***
 
 
            ' Refresh the pivot tables.
            For Each pt In .PivotTables
                pt.RefreshTable
                pt.Update
            Next
 
 
            ' Put text to display on the sheet.
            ' Some text was overwritten by the pivot creation.
            ' Other text is to replace the "Row Labels" fieldname that Excel 2007 automatically uses.
            .Range("A" & top_row + 1).Value = "BBH Income Type"
 
 
            ' Select A1.
            ScrollTo ActiveSheet.name, "A1"
 
        End With
    End With
 
 
    ' Clear all objects.
    Set pt = Nothing
    Set pc = Nothing
 
End Sub
 
 
 
' Reverts the Corrected Date, column E, in the FinalABC sheet back to its original calculated date.
' It only does this for cells where column AJ does not still reconciles, i.e. does not show "MATCHED GROSS AMOUNT ISIN BY MONTH".
' This requires the following columns to have formulae throughout:  E, L, K, AI, AJ
Sub M10910_Revert_Reformatted_FinalABC_Corrected_Dates()
 
    Dim lastrow_FinalABC As Long
 
 
    ' Initialize global vars.
    Call Z00000_Init
 
 
    ' Ask user.
    If ctrl_ask_before_running_subroutine = True Then
        If MsgBox("Revert Reformatted FinalABC Corrected Dates?", vbYesNo) = vbNo Then Exit Sub
    End If
 
 
    With Workbooks(wb_name)
 
        With .Sheets("FinalABC")
 
            ' Activate the sheet.
            .Activate
 
 
            ' Get how many rows of data have been loaded into the sheet.
            'lastrow = Workbooks(my1042Rec).Sheets("FinalABC").Range("D65536").End(xlUp).Row
            lastrow_FinalABC = .Cells(Rows.Count, 4).End(xlUp).Row
            ' Prevent line 2 being deleted - as this contains the formulae which need coping down later.
            If lastrow_FinalABC < 3 Then
                lastrow_FinalABC = 3
            End If
 
 
            ' Change for formula in column E to add 1 to the date.
            ' This should make dates that are the last day of the month now reflect the 1st of the following month.
            .Range("E2").Formula = "=TEXT(MID(F2,FIND("" "",F2)+1,FIND("","",F2)-FIND("" "",F2)-1)&"" ""&LEFT(F2,FIND("" "",F2)-1)&"" ""&RIGHT(F2,4),""dd/mm/yyyy"")"
 
 
            ' Copies formulae down.
            .Range("A2:C2").AutoFill Destination:=.Range("A2:C" & lastrow_FinalABC)
            .Range("E2").AutoFill Destination:=.Range("E2:E" & lastrow_FinalABC)
            .Range("K2:N2").AutoFill Destination:=.Range("K2:N" & lastrow_FinalABC)
            .Range("P2:Q2").AutoFill Destination:=.Range("P2:Q" & lastrow_FinalABC)
            .Range("AI2:AM2").AutoFill Destination:=.Range("AI2:AM" & lastrow_FinalABC)
            .Range("AR2:AT2").AutoFill Destination:=.Range("AR2:AT" & lastrow_FinalABC)
 
 
            ' Calculations.
            .Range("E2:E" & lastrow_FinalABC).Calculate
            .Range("A2:C" & lastrow_FinalABC).Calculate
            .Range("P2:Q" & lastrow_FinalABC).Calculate
            .Range("K2:N" & lastrow_FinalABC).Calculate
            .Range("AI2:AM" & lastrow_FinalABC).Calculate
            .Range("AR2:AT" & lastrow_FinalABC).Calculate
 
 
            ' Now copy and paste formula ranges as values to speed up the file processing.
            .Range("E3:E" & lastrow_FinalABC) = .Range("E3:E" & lastrow_FinalABC).Value
            .Range("A3:A" & lastrow_FinalABC) = .Range("A3:A" & lastrow_FinalABC).Value
            .Range("K3:N" & lastrow_FinalABC) = .Range("K3:L" & lastrow_FinalABC).Value
            .Range("P3:Q" & lastrow_FinalABC) = .Range("P3:q" & lastrow_FinalABC).Value
            .Range("AI3:AM" & lastrow_FinalABC) = .Range("AI3:AM" & lastrow_FinalABC).Value
            .Range("AR3:AT" & lastrow_FinalABC) = .Range("AR3:AT" & lastrow_FinalABC).Value
        End With
    End With
End Sub
 
 
 
' Clears formatting on the SHEETNAME1 sheet.  Removes the lines between ISINs.
Sub M11000_Clear_SHEETNAME1_lines()
 
    Dim lastrow_SHEETNAME1 As Long
 
 
    ' Initialize global vars.
    Call Z00000_Init
 
 
    ' Ask user.
    If ctrl_ask_before_running_subroutine = True Then
        If MsgBox("Clear format lines on the SHEETNAME1 sheet?", vbYesNo) = vbNo Then Exit Sub
    End If
 
 
    With Workbooks(wb_name)
        With .Sheets("SHEETNAME1")
 
            ' Activate the sheet.
            .Activate
 
 
            ' Get how many rows of data have been loaded into the sheet.
            lastrow_SHEETNAME1 = .Cells(Rows.Count, 4).End(xlUp).Row
            ' Prevent line 2 being deleted - as this contains the formulae which need coping down later.
            If lastrow_SHEETNAME1 < 3 Then
                lastrow_SHEETNAME1 = 3
            End If
 
 
            ' Clear any double lines.  These are used to flag where the ISIN changes.
            .Range("A1:BO" & lastrow_SHEETNAME1).Borders.LineStyle = xlNone
        End With
    End With
End Sub
 
 
 
' Clears formatting on the FinalABC sheet.  Removes the lines between ISINs.
Sub M11110_Clear_FinalABC_lines()
 
    Dim lastrow_FinalABC As Long
 
 
    ' Initialize global vars.
    Call Z00000_Init
 
 
    ' Ask user.
    If ctrl_ask_before_running_subroutine = True Then
        If MsgBox("Clear format lines on the FinalABC sheet?", vbYesNo) = vbNo Then Exit Sub
    End If
 
 
    With Workbooks(wb_name)
        With .Sheets("FinalABC")
 
            ' Activate the sheet.
            .Activate
 
 
            ' Get how many rows of data have been loaded into the sheet.
            lastrow_FinalABC = .Cells(Rows.Count, 4).End(xlUp).Row
            ' Prevent line 2 being deleted - as this contains the formulae which need coping down later.
            If lastrow_FinalABC < 3 Then
                lastrow_FinalABC = 3
            End If
 
 
            ' Clear any double lines.  These are used to flag where the ISIN changes.
            .Range("A1:AT" & lastrow_FinalABC).Borders.LineStyle = xlNone
        End With
    End With
End Sub
 
 
 
' For any row that has adjusted values different than the original value it recalculates the values against that row.
' It does this by putting formulae back in only for the specific row and then performing the recalc.
' Later the formula are replaced by values again.
Sub M11200_Recalc_changed_adjusted_rows_Array()
 
    Dim lastrow_SHEETNAME1 As Long
    Dim lastrow_FinalABC As Long
 
    Dim recalc As Boolean
    Dim recalc_row As Boolean
 
    Dim FinalABC_ISIN As String
    Dim SHEETNAME1_ISIN As String
    Dim rng As Range
    Dim var As Variant
 
    Dim i As Long
    Dim J As Long
 
    Dim tmpMonth1 As String
    Dim tmpMonth2 As String
 
    Dim pt As PivotTable
 
    Dim column_k As Variant
    Dim column_y As Variant
    Dim column_ac As Variant
    Dim column_ad As Variant
    Dim column_ae As Variant
    Dim column_af As Variant
    Dim column_ah As Variant
    Dim column_ai As Variant
    Dim column_al As Variant
    Dim column_am As Variant
    Dim column_at As Variant
    Dim column_au As Variant
 
    Dim working As Variant
 
 
    ' Initialize global vars.
    Call Z00000_Init
 
 
    ' Ask user.
    If ctrl_ask_before_running_subroutine = True Then
        If MsgBox("Recalc changed adjusted SHEETNAME1 rows?", vbYesNo) = vbNo Then Exit Sub
    End If
 
 
 
    With Workbooks(wb_name)
 
        ' Get how many rows of data have been loaded into the sheet.
        lastrow_SHEETNAME1 = .Sheets("SHEETNAME1").Cells(Rows.Count, 4).End(xlUp).Row
        ' Prevent line 2 being deleted - as this contains the formulae which need coping down later.
        If lastrow_SHEETNAME1 < 3 Then
            lastrow_SHEETNAME1 = 3
        End If
 
        lastrow_FinalABC = .Sheets("FinalABC").Cells(Rows.Count, 4).End(xlUp).Row
        ' Prevent line 2 being deleted - as this contains the formulae which need coping down later.
        If lastrow_FinalABC < 3 Then
            lastrow_FinalABC = 3
        End If
 
 
        ' Loop through every row in SHEETNAME1 and check if any adjusted cell differs from the original.
        ' If so then continues with the recalc.
        recalc = False
 
 
        ReDim working(1 To lastrow_SHEETNAME1, 1) ' Working array
        ReDim column_k(1 To lastrow_SHEETNAME1, 1)
        ReDim column_y(1 To lastrow_SHEETNAME1, 1)
        ReDim column_ac(1 To lastrow_SHEETNAME1, 1)
        ReDim column_ad(1 To lastrow_SHEETNAME1, 1)
        ReDim column_ae(1 To lastrow_SHEETNAME1, 1)
        ReDim column_af(1 To lastrow_SHEETNAME1, 1)
        ReDim column_ah(1 To lastrow_SHEETNAME1, 1)
        ReDim column_ai(1 To lastrow_SHEETNAME1, 1)
        ReDim column_al(1 To lastrow_SHEETNAME1, 1)
        ReDim column_am(1 To lastrow_SHEETNAME1, 1)
        ReDim column_at(1 To lastrow_SHEETNAME1, 1)
        ReDim column_au(1 To lastrow_SHEETNAME1, 1)
 
 
        ' Check SHEETNAME1 for changes.
        With .Sheets("SHEETNAME1")
 
            ' Activate the sheet.
            .Activate
 
 
            ' Load working with dummy values - just to set its size.
            working = .Range("D1:D" & lastrow_SHEETNAME1)
 
 
            ' Load SHEETNAME1 columns into array variables.
            column_k = .Range("K1:K" & lastrow_SHEETNAME1)
            column_y = .Range("Y1:Y" & lastrow_SHEETNAME1)
            column_ac = .Range("AC1:AC" & lastrow_SHEETNAME1)
            column_ad = .Range("AD1:AD" & lastrow_SHEETNAME1)
            column_ae = .Range("AE1:AE" & lastrow_SHEETNAME1)
            column_af = .Range("AF1:AF" & lastrow_SHEETNAME1)
            column_ah = .Range("AH1:AH" & lastrow_SHEETNAME1)
            column_ai = .Range("AI1:AI" & lastrow_SHEETNAME1)
            column_al = .Range("AL1:AL" & lastrow_SHEETNAME1)
            column_am = .Range("AM1:AM" & lastrow_SHEETNAME1)
            column_at = .Range("AT1:AT" & lastrow_SHEETNAME1)
            column_au = .Range("AU1:AU" & lastrow_SHEETNAME1)
 
            For i = LBound(working) To UBound(working)
 
                ' If row 1, heading, skip
                If i = 1 Then
                    GoTo NextIteration ' next i
                End If
 
 
                ' Default to false
                recalc_row = False
 
 
                ' Tax rate adjusted.
                If column_k(i, 1) <> "" Then
                    recalc_row = True
                End If
 
 
                ' Include / Exclude.
                If column_y(i, 1) <> "INCLUDE" Then
                    recalc_row = True
                End If
 
 
                ' Income Code Adjusted.
                If column_ad(i, 1) <> "" Then
                    If column_ad(i, 1) <> column_ac(i, 1) Then
                        recalc_row = True
                    End If
                End If
 
 
                ' Exemption Code Adjusted.
                If column_af(i, 1) <> "" Then
                    If column_af(i, 1) <> column_ae(i, 1) Then
                        recalc_row = True
                    End If
                End If
 
 
                ' BBH Rate Adjusted.
                If column_ai(i, 1) <> "" Then
                    If column_ai(i, 1) <> column_ah(i, 1) Then
                        recalc_row = True
                    End If
                End If
 
 
                ' BBH CCY Adjusted.
                If column_am(i, 1) <> "" Then
                    If column_am(i, 1) <> column_al(i, 1) Then
                        recalc_row = True
                    End If
                End If
 
 
                ' Suggested Rate Adjusted.
                If column_au(i, 1) <> "" Then
                    If column_au(i, 1) <> column_at(i, 1) Then
                        recalc_row = True
                    End If
                End If
 
 
                ' Check if recalc_row is true.
                If recalc_row = True Then
                    ' Set recalc to true
                    recalc = True
 
 
                    ' Convert all formula cells in the row back to formulae.
                    .Range("A" & i & ":A" & i).Formula = .Range("A2:A2").FormulaR1C1
                    .Range("B" & i & ":B" & i).Formula = .Range("B2:B2").FormulaR1C1
                    .Range("F" & i & ":F" & i).Formula = .Range("F2:F2").FormulaR1C1
                    .Range("H" & i & ":H" & i).Formula = .Range("H2:H2").FormulaR1C1
                    .Range("J" & i & ":J" & i).Formula = .Range("J2:J2").FormulaR1C1
                    .Range("L" & i & ":L" & i).Formula = .Range("L2:L2").FormulaR1C1
                    .Range("M" & i & ":M" & i).Formula = .Range("M2:M2").FormulaR1C1
                    .Range("T" & i & ":T" & i).Formula = .Range("T2:T2").FormulaR1C1
                    .Range("V" & i & ":V" & i).Formula = .Range("V2:V2").FormulaR1C1
                    .Range("W" & i & ":W" & i).Formula = .Range("W2:W2").FormulaR1C1
                    .Range("X" & i & ":X" & i).Formula = .Range("X2:X2").FormulaR1C1
                    .Range("AB" & i & ":AB" & i).Formula = .Range("AB2:AB2").FormulaR1C1
                    .Range("AC" & i & ":AC" & i).Formula = .Range("AC2:AC2").FormulaR1C1
                    .Range("AE" & i & ":AE" & i).Formula = .Range("AE2:AE2").FormulaR1C1
                    .Range("AG" & i & ":AG" & i).Formula = .Range("AG2:AG2").FormulaR1C1
                    .Range("AH" & i & ":AH" & i).Formula = .Range("AH2:AH2").FormulaR1C1
                    .Range("AJ" & i & ":AJ" & i).Formula = .Range("AJ2:AJ2").FormulaR1C1
                    .Range("AK" & i & ":AK" & i).Formula = .Range("AK2:AK2").FormulaR1C1
                    .Range("AL" & i & ":AL" & i).Formula = .Range("AL2:AL2").FormulaR1C1
                    .Range("AN" & i & ":AN" & i).Formula = .Range("AN2:AN2").FormulaR1C1
                    .Range("AO" & i & ":AO" & i).Formula = .Range("AO2:AO2").FormulaR1C1
                    .Range("AP" & i & ":AP" & i).Formula = .Range("AP2:AP2").FormulaR1C1
                    .Range("AQ" & i & ":AQ" & i).Formula = .Range("AQ2:AQ2").FormulaR1C1
                    .Range("AR" & i & ":AR" & i).Formula = .Range("AR2:AR2").FormulaR1C1
                    .Range("AS" & i & ":AS" & i).Formula = .Range("AS2:AS2").FormulaR1C1
                    .Range("AT" & i & ":AT" & i).Formula = .Range("AT2:AT2").FormulaR1C1
                    .Range("AV" & i & ":AU" & i).Formula = .Range("AV2:AV2").FormulaR1C1
                    .Range("AW" & i & ":AW" & i).Formula = .Range("AW2:AW2").FormulaR1C1
                    .Range("AX" & i & ":AX" & i).Formula = .Range("AX2:AX2").FormulaR1C1
                    .Range("AY" & i & ":AY" & i).Formula = .Range("AY2:AY2").FormulaR1C1
                    .Range("BB" & i & ":BB" & i).Formula = .Range("BB2:BB2").FormulaR1C1
                    .Range("BD" & i & ":BD" & i).Formula = .Range("BD2:BD2").FormulaR1C1
                    .Range("BE" & i & ":BE" & i).Formula = .Range("BE2:BE2").FormulaR1C1
                    .Range("BG" & i & ":BG" & i).Formula = .Range("BG2:BG2").FormulaR1C1
                    .Range("BH" & i & ":BH" & i).Formula = .Range("BH2:BH2").FormulaR1C1
                    .Range("BI" & i & ":BI" & i).Formula = .Range("BI2:BI2").FormulaR1C1
                    .Range("BJ" & i & ":BJ" & i).Formula = .Range("BJ2:JI2").FormulaR1C1
                    .Range("BK" & i & ":BK" & i).Formula = .Range("BK2:BK2").FormulaR1C1
                    .Range("BL" & i & ":BL" & i).Formula = .Range("BL2:BL2").FormulaR1C1
 
                    ' Recalculate the entire row.
                    .Range("A" & i & ":BO" & i).Calculate
                End If
 
 
                ' TODO - Add in here loop for all affected lines in FinalABC sheet with same ISIN.
                ' Then we can remove the below copy all BBH formulae down.
 
 
NextIteration:
 
            Next i
        End With
 
 
        If recalc = True Then
 
            ' Refresh all impacted formula on the FinalABC sheet.
            With Sheets("FinalABC")
 
                ' Activate the FinalABC sheet.
                .Activate
 
                .Range("K2:K2").AutoFill Destination:=.Range("K2:K" & lastrow_FinalABC)
                .Range("L2:L2").AutoFill Destination:=.Range("L2:L" & lastrow_FinalABC)
                .Range("M2:M2").AutoFill Destination:=.Range("M2:M" & lastrow_FinalABC)
                .Range("N2:N2").AutoFill Destination:=.Range("N2:N" & lastrow_FinalABC)
                .Range("P2:P2").AutoFill Destination:=.Range("P2:P" & lastrow_FinalABC)
                .Range("Q2:Q2").AutoFill Destination:=.Range("Q2:Q" & lastrow_FinalABC)
                .Range("AI2:AI2").AutoFill Destination:=.Range("AI2:AI" & lastrow_FinalABC)
                .Range("AJ2:AJ2").AutoFill Destination:=.Range("AJ2:AJ" & lastrow_FinalABC)
                .Range("AK2:AK2").AutoFill Destination:=.Range("AK2:AK" & lastrow_FinalABC)
                .Range("AL2:AL2").AutoFill Destination:=.Range("AL2:AL" & lastrow_FinalABC)
                .Range("AM2:AM2").AutoFill Destination:=.Range("AM2:AM" & lastrow_FinalABC)
                .Range("AR2:AR2").AutoFill Destination:=.Range("AR2:AR" & lastrow_FinalABC)
                .Range("AS2:AS2").AutoFill Destination:=.Range("AS2:AS" & lastrow_FinalABC)
                .Range("AT2:AT2").AutoFill Destination:=.Range("AT2:AT" & lastrow_FinalABC)
 
 
                ' Recalculate the entire row.
                '.Range("AK2:AK" & FinalABC_lastrow).Calculate
 
            End With
 
 
            ' Recalculate all worksheets.
            Application.Calculate
 
 
            ' Do refresh of pivots.
            With Sheets("Mapping Pivots")
 
                ' Activate the Mapping Pivots sheet.
                .Activate
 
 
                ' Refresh the pivot tables.
                For Each pt In .PivotTables
                    pt.RefreshTable
                    pt.Update
                Next
 
            End With
 
 
            ' Recalculate all worksheets again to pick up Pivot values.
            Application.Calculate
 
 
            ' Now convert all impacted formulae back to values.
            'TODO. loop through SHEETNAME1 as above and change formulae to values for any row impacted.
 
 
            ' Convert all formulae on the FinalABC sheet to values.  Leaves row 2 alone.
            With Sheets("FinalABC")
 
                ' Activate the sheet.
                .Activate
 
 
                .Range("K3:K" & lastrow_FinalABC) = .Range("K3:K" & lastrow_FinalABC).Value
                .Range("L3:L" & lastrow_FinalABC) = .Range("L3:L" & lastrow_FinalABC).Value
                .Range("M3:M" & lastrow_FinalABC) = .Range("M3:M" & lastrow_FinalABC).Value
                .Range("N3:N" & lastrow_FinalABC) = .Range("N3:N" & lastrow_FinalABC).Value
                .Range("P3:P" & lastrow_FinalABC) = .Range("P3:P" & lastrow_FinalABC).Value
                .Range("Q3:Q" & lastrow_FinalABC) = .Range("Q3:Q" & lastrow_FinalABC).Value
                .Range("AI3:AI" & lastrow_FinalABC) = .Range("AI3:AI" & lastrow_FinalABC).Value
                .Range("AJ3:AJ" & lastrow_FinalABC) = .Range("AJ3:AJ" & lastrow_FinalABC).Value
                .Range("AK3:AK" & lastrow_FinalABC) = .Range("AK3:AK" & lastrow_FinalABC).Value
                .Range("AL3:AL" & lastrow_FinalABC) = .Range("AL3:AL" & lastrow_FinalABC).Value
                .Range("AM3:AM" & lastrow_FinalABC) = .Range("AM3:AM" & lastrow_FinalABC).Value
                .Range("AR3:AR" & lastrow_FinalABC) = .Range("AR3:AR" & lastrow_FinalABC).Value
                .Range("AS3:AS" & lastrow_FinalABC) = .Range("AS3:AS" & lastrow_FinalABC).Value
                .Range("AT3:AT" & lastrow_FinalABC) = .Range("AT3:AT" & lastrow_FinalABC).Value
 
            End With
 
        End If
 
 
        ' Convert all formulae on the SHEETNAME1 sheet to values.  Leaves row 2 alone.
        ' Loop through every row in SHEETNAME1 and check if any adjusted cell differs from the original.
        ' If so then continues with the changing of the formula back to values.
        recalc = False
 
 
        ' Check SHEETNAME1 for changes.
        With .Sheets("SHEETNAME1")
 
            ' Activate the sheet.
            .Activate
 
            ' Load working with dummy values - just to set its size.
            working = Range("D1:D" & lastrow_SHEETNAME1)
 
 
            ' Load SHEETNAME1 columns into array variables.
            column_k = .Range("K1:K" & lastrow_SHEETNAME1)
            column_y = .Range("Y1:Y" & lastrow_SHEETNAME1)
            column_ac = .Range("AC1:AC" & lastrow_SHEETNAME1)
            column_ad = .Range("AD1:AD" & lastrow_SHEETNAME1)
            column_ae = .Range("AE1:AE" & lastrow_SHEETNAME1)
            column_af = .Range("AF1:AF" & lastrow_SHEETNAME1)
            column_ah = .Range("AH1:AH" & lastrow_SHEETNAME1)
            column_ai = .Range("AI1:AI" & lastrow_SHEETNAME1)
            column_al = .Range("AL1:AL" & lastrow_SHEETNAME1)
            column_am = .Range("AM1:AM" & lastrow_SHEETNAME1)
            column_at = .Range("AT1:AT" & lastrow_SHEETNAME1)
            column_au = .Range("AU1:AU" & lastrow_SHEETNAME1)
 
            For i = LBound(working) To UBound(working)
 
                ' If row 1, heading, skip
                If i = 1 Then
                    GoTo NextIteration2 ' next i
                End If
 
 
                ' Default to false
                recalc_row = False
 
 
                ' Tax rate adjusted.
                If column_k(i, 1) <> "" Then
                    recalc_row = True
                End If
 
 
                ' Include / Exclude.
                If column_y(i, 1) <> "INCLUDE" Then
                    recalc_row = True
                End If
 
 
                ' Income Code Adjusted.
                If column_ad(i, 1) <> "" Then
                    If column_ad(i, 1) <> column_ac(i, 1) Then
                        recalc_row = True
                    End If
                End If
 
 
                ' Exemption Code Adjusted.
                If column_af(i, 1) <> "" Then
                    If column_af(i, 1) <> column_ae(i, 1) Then
                        recalc_row = True
                    End If
                End If
 
 
                ' BBH Rate Adjusted.
                If column_ai(i, 1) <> "" Then
                    If column_ai(i, 1) <> column_ah(i, 1) Then
                        recalc_row = True
                    End If
                End If
 
 
                ' BBH CCY Adjusted.
                If column_am(i, 1) <> "" Then
                    If column_am(i, 1) <> column_al(i, 1) Then
                        recalc_row = True
                    End If
                End If
 
 
                ' Suggested Rate Adjusted.
                If column_au(i, 1) <> "" Then
                    If column_au(i, 1) <> column_at(i, 1) Then
                        recalc_row = True
                    End If
                End If
 
 
                ' Check if recalc_row is true.
                If recalc_row = True Then
 
                    ' Set recalc to true
                    'recalc = True
 
                    If (i > 2) Then     ' leave row 2 alone, i.e. leave as formulae.
                        .Range("A" & i & ":A" & i) = .Range("A" & i & ":A" & i).Value
                        .Range("B" & i & ":B" & i) = .Range("B" & i & ":B" & i).Value
                        .Range("F" & i & ":F" & i) = .Range("F" & i & ":F" & i).Value
                        .Range("H" & i & ":H" & i) = .Range("H" & i & ":H" & i).Value
                        .Range("J" & i & ":J" & i) = .Range("J" & i & ":J" & i).Value
                        .Range("L" & i & ":L" & i) = .Range("L" & i & ":L" & i).Value
                        .Range("M" & i & ":M" & i) = .Range("M" & i & ":M" & i).Value
                        .Range("T" & i & ":T" & i) = .Range("T" & i & ":T" & i).Value
                        .Range("V" & i & ":V" & i) = .Range("V" & i & ":V" & i).Value
                        .Range("W" & i & ":W" & i) = .Range("W" & i & ":W" & i).Value
                        .Range("X" & i & ":X" & i) = .Range("X" & i & ":X" & i).Value
                        .Range("AB" & i & ":AB" & i) = .Range("AB" & i & ":AB" & i).Value
                        .Range("AC" & i & ":AC" & i) = .Range("AC" & i & ":AC" & i).Value
                        .Range("AE" & i & ":AE" & i) = .Range("AE" & i & ":AE" & i).Value
                        .Range("AG" & i & ":AG" & i) = .Range("AG" & i & ":AG" & i).Value
                        .Range("AH" & i & ":AH" & i) = .Range("AH" & i & ":AH" & i).Value
                        .Range("AJ" & i & ":AJ" & i) = .Range("AJ" & i & ":AJ" & i).Value
                        .Range("AK" & i & ":AK" & i) = .Range("AK" & i & ":AK" & i).Value
                        .Range("AL" & i & ":AL" & i) = .Range("AL" & i & ":AL" & i).Value
                        .Range("AN" & i & ":AN" & i) = .Range("AN" & i & ":AN" & i).Value
                        .Range("AO" & i & ":AO" & i) = .Range("AO" & i & ":AO" & i).Value
                        .Range("AP" & i & ":AP" & i) = .Range("AP" & i & ":AP" & i).Value
                        .Range("AQ" & i & ":AQ" & i) = .Range("AQ" & i & ":AQ" & i).Value
                        .Range("AR" & i & ":AR" & i) = .Range("AR" & i & ":AR" & i).Value
                        .Range("AS" & i & ":AS" & i) = .Range("AS" & i & ":AS" & i).Value
                        .Range("AT" & i & ":AT" & i) = .Range("AT" & i & ":AT" & i).Value
                        .Range("AV" & i & ":AV" & i) = .Range("AV" & i & ":AV" & i).Value
                        .Range("AW" & i & ":AW" & i) = .Range("AW" & i & ":AW" & i).Value
                        .Range("AX" & i & ":AX" & i) = .Range("AX" & i & ":AX" & i).Value
                        .Range("AY" & i & ":AY" & i) = .Range("AY" & i & ":AY" & i).Value
                        .Range("BB" & i & ":BB" & i) = .Range("BB" & i & ":BB" & i).Value
                        .Range("BD" & i & ":BD" & i) = .Range("BD" & i & ":BD" & i).Value
                        .Range("BE" & i & ":BE" & i) = .Range("BE" & i & ":BE" & i).Value
                        .Range("BG" & i & ":BG" & i) = .Range("BG" & i & ":BG" & i).Value
                        .Range("BH" & i & ":BH" & i) = .Range("BH" & i & ":BH" & i).Value
                        .Range("BI" & i & ":BI" & i) = .Range("BI" & i & ":BI" & i).Value
                        .Range("BJ" & i & ":BJ" & i) = .Range("BJ" & i & ":BJ" & i).Value
                        .Range("BK" & i & ":BK" & i) = .Range("BK" & i & ":BK" & i).Value
                        .Range("BL" & i & ":BL" & i) = .Range("BL" & i & ":BL" & i).Value
                    End If
                End If
 
NextIteration2:
            Next i
        End With
 
 
        '*********************************************************************************************
        ' Check FinalABC for adjustment changes.
 
        ' Loop through every row in SHEETNAME1 and check if any adjusted cell differs from the original.
        ' If so then continues with the recalc.
        For i = 2 To lastrow_FinalABC
 
            ' Default to false
            recalc_row = False
            recalc = False
 
 
            ' Check FinalABC for changes.
            With .Sheets("FinalABC")
 
                ' Activate the sheet.
                .Activate
 
 
                ' USD Adjustments.
                If .Range("J" & i).Value <> "" Then
                    recalc_row = True
                End If
 
 
                ' Tax Rate Adjusted
                If .Range("R" & i).Value <> "" Then
                    recalc_row = True
                End If
 
 
                ' Adjusted date.
                tmpMonth1 = UCase(Left(.Range("F" & i).Value, 3))
                tmpMonth2 = UCase(Left(Right(.Range("A" & i).Value, 8), 3))
 
                If (tmpMonth1 <> tmpMonth2) Then
                    recalc_row = True
                End If
 
 
                ' Check if recalc_row is true.
                If recalc_row = True Then
 
                    ' Set recalc to true
                    recalc = True
 
 
                    ' Convert all formula cells in the row back to formulae.
                    .Range("K" & i & ":K" & i).Formula = .Range("K2:K2").FormulaR1C1
                    .Range("L" & i & ":L" & i).Formula = .Range("L2:L2").FormulaR1C1
                    .Range("M" & i & ":M" & i).Formula = .Range("M2:M2").FormulaR1C1
                    .Range("N" & i & ":N" & i).Formula = .Range("N2:N2").FormulaR1C1
                    .Range("P" & i & ":P" & i).Formula = .Range("P2:P2").FormulaR1C1
                    .Range("Q" & i & ":Q" & i).Formula = .Range("Q2:Q2").FormulaR1C1
                    .Range("AI" & i & ":AI" & i).Formula = .Range("AI2:AI2").FormulaR1C1
                    .Range("AJ" & i & ":AJ" & i).Formula = .Range("AJ2:AJ2").FormulaR1C1
                    .Range("AK" & i & ":AK" & i).Formula = .Range("AK2:AK2").FormulaR1C1
                    .Range("AL" & i & ":AL" & i).Formula = .Range("AL2:AL2").FormulaR1C1
                    .Range("AM" & i & ":AM" & i).Formula = .Range("AM2:AM2").FormulaR1C1
                    .Range("AR" & i & ":AR" & i).Formula = .Range("AR2:AR2").FormulaR1C1
                    .Range("AS" & i & ":AS" & i).Formula = .Range("AS2:AS2").FormulaR1C1
                    .Range("AT" & i & ":AT" & i).Formula = .Range("AT2:AT2").FormulaR1C1
 
 
                    ' Recalculate the entire row.
                    .Range("A" & i & ":AR" & i).Calculate
 
 
                    ' Get starting position of the affected ISIN within the SHEETNAME1 sheet.
                    FinalABC_ISIN = .Range("A" & i).Value
                End If
 
            End With
 
 
            If recalc = True Then
 
                ' Do refresh of Mapping pivots
                With .Sheets("Mapping Pivots")
 
                    ' Activate the sheet.
                    .Activate
 
 
                    ' Refresh the pivots.
                    For Each pt In .PivotTables
                        pt.RefreshTable
                        pt.Update
                    Next
 
                End With
 
 
                ' Now get index of first row in SHEETNAME1 sheet that contains same affected ISIN.
                With .Sheets("SHEETNAME1")
 
                    Set rng = .Range("A1:A" & lastrow_SHEETNAME1)
 
                    If WorksheetFunction.CountIf(rng, FinalABC_ISIN) > 0 Then
 
                        var = WorksheetFunction.Match(FinalABC_ISIN, rng, 0)
 
                        If Not IsError(var) Then
 
                            J = var
                            SHEETNAME1_ISIN = .Range("A" & J).Value
 
 
                            ' For every row that has same ISIN re-enable formulae in SHEETNAME1 sheet.
                            ' Convert all formula cells in the row back to formulae.
                            While .Range("A" & J).Value = SHEETNAME1_ISIN
 
                                .Range("A" & J & ":A" & J).Formula = .Range("A2:A2").FormulaR1C1
                                .Range("B" & J & ":B" & J).Formula = .Range("B2:B2").FormulaR1C1
                                .Range("F" & J & ":F" & J).Formula = .Range("F2:F2").FormulaR1C1
                                .Range("H" & J & ":H" & J).Formula = .Range("H2:H2").FormulaR1C1
                                .Range("J" & J & ":J" & J).Formula = .Range("J2:J2").FormulaR1C1
                                .Range("L" & J & ":L" & J).Formula = .Range("L2:L2").FormulaR1C1
                                .Range("M" & J & ":M" & J).Formula = .Range("M2:M2").FormulaR1C1
                                .Range("T" & J & ":T" & J).Formula = .Range("T2:T2").FormulaR1C1
                                .Range("V" & J & ":V" & J).Formula = .Range("V2:V2").FormulaR1C1
                                .Range("W" & J & ":W" & J).Formula = .Range("W2:W2").FormulaR1C1
                                .Range("X" & J & ":X" & J).Formula = .Range("X2:X2").FormulaR1C1
                                .Range("AB" & J & ":AB" & J).Formula = .Range("AB2:AB2").FormulaR1C1
                                .Range("AC" & J & ":AD" & J).Formula = .Range("AC2:AC2").FormulaR1C1
                                .Range("AE" & J & ":AE" & J).Formula = .Range("AE2:AE2").FormulaR1C1
                                .Range("AG" & J & ":AG" & J).Formula = .Range("AG2:AG2").FormulaR1C1
                                .Range("AH" & J & ":AH" & J).Formula = .Range("AH2:AH2").FormulaR1C1
                                .Range("AJ" & J & ":AJ" & J).Formula = .Range("AJ2:AJ2").FormulaR1C1
                                .Range("AK" & J & ":AK" & J).Formula = .Range("AK2:AK2").FormulaR1C1
                                .Range("AL" & J & ":AL" & J).Formula = .Range("AL2:AL2").FormulaR1C1
                                .Range("AN" & J & ":AN" & J).Formula = .Range("AN2:AN2").FormulaR1C1
                                .Range("AO" & J & ":AO" & J).Formula = .Range("AO2:AO2").FormulaR1C1
                                .Range("AP" & J & ":AP" & J).Formula = .Range("AP2:AP2").FormulaR1C1
                                .Range("AQ" & J & ":AQ" & J).Formula = .Range("AQ2:AQ2").FormulaR1C1
                                .Range("AR" & J & ":AR" & J).Formula = .Range("AR2:AR2").FormulaR1C1
                                .Range("AS" & J & ":AS" & J).Formula = .Range("AS2:AS2").FormulaR1C1
                                .Range("AT" & J & ":AT" & J).Formula = .Range("AT2:AT2").FormulaR1C1
                                .Range("AV" & J & ":AV" & J).Formula = .Range("AV2:AV2").FormulaR1C1
                                .Range("AW" & J & ":AW" & J).Formula = .Range("AW2:AW2").FormulaR1C1
                                .Range("AX" & J & ":AX" & J).Formula = .Range("AX2:AX2").FormulaR1C1
                                .Range("AY" & J & ":AY" & J).Formula = .Range("AY2:AY2").FormulaR1C1
                                .Range("BB" & J & ":BB" & J).Formula = .Range("BB2:BB2").FormulaR1C1
                                .Range("BD" & J & ":BD" & J).Formula = .Range("BD2:BD2").FormulaR1C1
                                .Range("BE" & J & ":BE" & J).Formula = .Range("BE2:BE2").FormulaR1C1
                                .Range("BG" & J & ":BG" & J).Formula = .Range("BG2:BG2").FormulaR1C1
                                .Range("BH" & J & ":BH" & J).Formula = .Range("BH2:BH2").FormulaR1C1
                                .Range("BI" & J & ":BI" & J).Formula = .Range("BI2:BI2").FormulaR1C1
                                .Range("BJ" & J & ":BJ" & J).Formula = .Range("BJ2:BJ2").FormulaR1C1
                                .Range("BK" & J & ":BK" & J).Formula = .Range("BK2:BK2").FormulaR1C1
                                .Range("BL" & J & ":BL" & J).Formula = .Range("BL2:BL2").FormulaR1C1
 
 
                                ' Recalculate the entire row.
                                .Range("A" & J & ":BO" & J).Calculate
 
 
                                ' next row
                                J = J + 1
                            Wend
 
                        Else
                            Message "The ISIN " & FinalABC_ISIN & " cannot be found in the SHEETNAME1 sheet."
                        End If
                    End If
 
                End With
 
 
                ' Recalculate all worksheets.
                Application.Calculate
 
 
                ' Now convert all impacted formulae back to values.
                'TODO. loop through SHEETNAME1 as above and change formulae to values for any row impacted.
 
 
                ' Convert all formulae on the FinalABC sheet to values.  Leaves row 2 alone.
                If (i > 2) Then     ' leave row 2 alone, i.e. leave as formulae.
                    With .Sheets("FinalABC")
 
                        ' Activate the sheet.
                        .Activate
 
                        .Range("K" & i & ":K" & i) = .Range("K" & i & ":K" & i).Value
                        .Range("L" & i & ":L" & i) = .Range("L" & i & ":L" & i).Value
                        .Range("M" & i & ":M" & i) = .Range("M" & i & ":M" & i).Value
                        .Range("N" & i & ":N" & i) = .Range("N" & i & ":N" & i).Value
                        .Range("P" & i & ":P" & i) = .Range("P" & i & ":P" & i).Value
                        .Range("Q" & i & ":Q" & i) = .Range("Q" & i & ":Q" & i).Value
                        .Range("AI" & i & ":AI" & i) = .Range("AI" & i & ":AI" & i).Value
                        .Range("AJ" & i & ":AJ" & i) = .Range("AJ" & i & ":AJ" & i).Value
                        .Range("AK" & i & ":AK" & i) = .Range("AK" & i & ":AK" & i).Value
                        .Range("AL" & i & ":AL" & i) = .Range("AL" & i & ":AL" & i).Value
                        .Range("AM" & i & ":AM" & i) = .Range("AM" & i & ":AM" & i).Value
                        .Range("AR" & i & ":AR" & i) = .Range("AR" & i & ":AR" & i).Value
                        .Range("AS" & i & ":AS" & i) = .Range("AS" & i & ":AS" & i).Value
                        .Range("AT" & i & ":AT" & i) = .Range("AT" & i & ":AT" & i).Value
                    End With
                End If
 
 
 
                ' Convert all formulae on the SHEETNAME1 sheet to values.  Leaves row 2 alone.
                With .Sheets("SHEETNAME1")
 
                    ' Activate the sheet.
                    .Activate
 
 
                    ' Now get index of first row in SHEETNAME1 sheet that contains same affected ISIN.
                    Set rng = .Range("A1:A" & lastrow_SHEETNAME1)
 
                    If WorksheetFunction.CountIf(rng, FinalABC_ISIN) > 0 Then
 
                        var = WorksheetFunction.Match(FinalABC_ISIN, rng, 0)
 
                        If Not IsError(var) Then
 
                            J = var
                            SHEETNAME1_ISIN = .Range("A" & J).Value
 
 
                            ' For every row that has same ISIN re-enable formulae in SHEETNAME1 sheet.
                            ' Convert all formula cells in the row back to values.
                            While .Range("A" & J).Value = SHEETNAME1_ISIN
                                If (J > 2) Then     ' leave row 2 alone, i.e. leave as formulae.
                                    .Range("A" & J & ":A" & J) = .Range("A" & J & ":A" & J).Value
                                    .Range("B" & J & ":B" & J) = .Range("B" & J & ":B" & J).Value
                                    .Range("F" & J & ":F" & J) = .Range("F" & J & ":F" & J).Value
                                    .Range("H" & J & ":H" & J) = .Range("H" & J & ":H" & J).Value
                                    .Range("J" & J & ":J" & J) = .Range("J" & J & ":J" & J).Value
                                    .Range("L" & J & ":L" & J) = .Range("L" & J & ":L" & J).Value
                                    .Range("M" & J & ":M" & J) = .Range("M" & J & ":M" & J).Value
                                    .Range("T" & J & ":T" & J) = .Range("T" & J & ":T" & J).Value
                                    .Range("V" & J & ":V" & J) = .Range("V" & J & ":V" & J).Value
                                    .Range("W" & J & ":W" & J) = .Range("W" & J & ":W" & J).Value
                                    .Range("X" & J & ":X" & J) = .Range("X" & J & ":X" & J).Value
                                    .Range("AB" & J & ":AB" & J) = .Range("AB" & J & ":AB" & J).Value
                                    .Range("AC" & J & ":AC" & J) = .Range("AC" & J & ":AC" & J).Value
                                    .Range("AE" & J & ":AE" & J) = .Range("AE" & J & ":AE" & J).Value
                                    .Range("AG" & J & ":AG" & J) = .Range("AG" & J & ":AG" & J).Value
                                    .Range("AH" & J & ":AH" & J) = .Range("AH" & J & ":AH" & J).Value
                                    .Range("AJ" & J & ":AJ" & J) = .Range("AJ" & J & ":AJ" & J).Value
                                    .Range("AK" & J & ":AK" & J) = .Range("AK" & J & ":AK" & J).Value
                                    .Range("AL" & J & ":AL" & J) = .Range("AL" & J & ":AL" & J).Value
                                    .Range("AN" & J & ":AN" & J) = .Range("AN" & J & ":AN" & J).Value
                                    .Range("AO" & J & ":AO" & J) = .Range("AO" & J & ":AO" & J).Value
                                    .Range("AP" & J & ":AP" & J) = .Range("AP" & J & ":AP" & J).Value
                                    .Range("AQ" & J & ":AQ" & J) = .Range("AQ" & J & ":AQ" & J).Value
                                    .Range("AR" & J & ":AR" & J) = .Range("AR" & J & ":AR" & J).Value
                                    .Range("AS" & J & ":AS" & J) = .Range("AS" & J & ":AS" & J).Value
                                    .Range("AT" & J & ":AT" & J) = .Range("AT" & J & ":AT" & J).Value
                                    .Range("AV" & J & ":AV" & J) = .Range("AV" & J & ":AV" & J).Value
                                    .Range("AW" & J & ":AW" & J) = .Range("AW" & J & ":AW" & J).Value
                                    .Range("AX" & J & ":AX" & J) = .Range("AX" & J & ":AX" & J).Value
                                    .Range("AY" & J & ":AY" & J) = .Range("AY" & J & ":AY" & J).Value
                                    .Range("BB" & J & ":BB" & J) = .Range("BB" & J & ":BB" & J).Value
                                    .Range("BD" & J & ":BD" & J) = .Range("BD" & J & ":BD" & J).Value
                                    .Range("BE" & J & ":BE" & J) = .Range("BE" & J & ":BE" & J).Value
                                    .Range("BG" & J & ":BG" & J) = .Range("BG" & J & ":BG" & J).Value
                                    .Range("BH" & J & ":BH" & J) = .Range("BH" & J & ":BH" & J).Value
                                    .Range("BI" & J & ":BI" & J) = .Range("BI" & J & ":BI" & J).Value
                                    .Range("BJ" & J & ":BJ" & J) = .Range("BJ" & J & ":BJ" & J).Value
                                    .Range("BK" & J & ":BK" & J) = .Range("BK" & J & ":BK" & J).Value
                                    .Range("BL" & J & ":BL" & J) = .Range("BL" & J & ":BL" & J).Value
                                End If
 
                                ' next row
                                J = J + 1
                            Wend
                        Else
                            Message "The ISIN " & FinalABC_ISIN & " cannot be found in the SHEETNAME1 sheet."
                        End If
                    End If
                End With
            End If
        Next i
    End With
 
 
    ' Clear all objects.
    Set pt = Nothing
    Set rng = Nothing
    Set var = Nothing
    Set working = Nothing
    Set column_k = Nothing
    Set column_y = Nothing
    Set column_ac = Nothing
    Set column_ad = Nothing
    Set column_ae = Nothing
    Set column_af = Nothing
    Set column_ah = Nothing
    Set column_ai = Nothing
    Set column_al = Nothing
    Set column_am = Nothing
    Set column_at = Nothing
    Set column_au = Nothing
 
End Sub
 
 
' For any row that has adjusted values different than the original value it recalculates the values against that row.
' It does this by putting formulae back in only for the specific row and then performing the recalc.
' Later the formula are replaced by values again.
Sub M11205_Recalc_changed_adjusted_rows_Array_NEW()
 
    Dim lastrow_SHEETNAME1 As Long
    Dim lastrow_FinalABC As Long
 
    Dim recalc As Boolean
    Dim recalc_row As Boolean
 
    Dim FinalABC_ISIN As String
    Dim SHEETNAME1_ISIN As String
    Dim rng As Range
    Dim var As Variant
 
    Dim i As Long
    Dim J As Long
 
    Dim tmpMonth1 As String
    Dim tmpMonth2 As String
 
    Dim pt As PivotTable
 
    Dim column_k As Variant
    Dim column_y As Variant
    Dim column_ac As Variant
    Dim column_ad As Variant
    Dim column_ae As Variant
    Dim column_af As Variant
    Dim column_ah As Variant
    Dim column_ai As Variant
    Dim column_al As Variant
    Dim column_am As Variant
    Dim column_at As Variant
    Dim column_au As Variant
 
    Dim working As Variant
 
 
    ' Initialize global vars.
    Call Z00000_Init
 
 
    ' Ask user.
    If ctrl_ask_before_running_subroutine = True Then
        If MsgBox("Recalc changed adjusted SHEETNAME1 rows?", vbYesNo) = vbNo Then Exit Sub
    End If
 
 
 
    With Workbooks(wb_name)
 
        ' Get how many rows of data have been loaded into the sheet.
        lastrow_SHEETNAME1 = .Sheets("SHEETNAME1").Cells(Rows.Count, 4).End(xlUp).Row
        ' Prevent line 2 being deleted - as this contains the formulae which need coping down later.
        If lastrow_SHEETNAME1 < 3 Then
            lastrow_SHEETNAME1 = 3
        End If
 
        lastrow_FinalABC = .Sheets("FinalABC").Cells(Rows.Count, 4).End(xlUp).Row
        ' Prevent line 2 being deleted - as this contains the formulae which need coping down later.
        If lastrow_FinalABC < 3 Then
            lastrow_FinalABC = 3
        End If
 
 
        ' Loop through every row in SHEETNAME1 and check if any adjusted cell differs from the original.
        ' If so then continues with the recalc.
        recalc = False
 
 
        ReDim working(1 To lastrow_SHEETNAME1, 1) ' Working array
        ReDim column_k(1 To lastrow_SHEETNAME1, 1)
        ReDim column_y(1 To lastrow_SHEETNAME1, 1)
        ReDim column_ac(1 To lastrow_SHEETNAME1, 1)
        ReDim column_ad(1 To lastrow_SHEETNAME1, 1)
        ReDim column_ae(1 To lastrow_SHEETNAME1, 1)
        ReDim column_af(1 To lastrow_SHEETNAME1, 1)
        ReDim column_ah(1 To lastrow_SHEETNAME1, 1)
        ReDim column_ai(1 To lastrow_SHEETNAME1, 1)
        ReDim column_al(1 To lastrow_SHEETNAME1, 1)
        ReDim column_am(1 To lastrow_SHEETNAME1, 1)
        ReDim column_at(1 To lastrow_SHEETNAME1, 1)
        ReDim column_au(1 To lastrow_SHEETNAME1, 1)
 
 
        ' Check SHEETNAME1 for changes.
        With .Sheets("SHEETNAME1")
 
            ' Activate the sheet.
            .Activate
 
 
            ' Load working with dummy values - just to set its size.
            working = .Range("D1:D" & lastrow_SHEETNAME1)
 
 
            ' Load SHEETNAME1 columns into array variables.
            column_k = .Range("K1:K" & lastrow_SHEETNAME1)
            column_y = .Range("Y1:Y" & lastrow_SHEETNAME1)
            column_ac = .Range("AC1:AC" & lastrow_SHEETNAME1)
            column_ad = .Range("AD1:AD" & lastrow_SHEETNAME1)
            column_ae = .Range("AE1:AE" & lastrow_SHEETNAME1)
            column_af = .Range("AF1:AF" & lastrow_SHEETNAME1)
            column_ah = .Range("AH1:AH" & lastrow_SHEETNAME1)
            column_ai = .Range("AI1:AI" & lastrow_SHEETNAME1)
            column_al = .Range("AL1:AL" & lastrow_SHEETNAME1)
            column_am = .Range("AM1:AM" & lastrow_SHEETNAME1)
            column_at = .Range("AT1:AT" & lastrow_SHEETNAME1)
            column_au = .Range("AU1:AU" & lastrow_SHEETNAME1)
 
            For i = LBound(working) To UBound(working)
 
                ' If row 1, heading, skip
                If i = 1 Then
                    GoTo NextIteration ' next i
                End If
 
 
                ' Default to false
                recalc_row = False
 
 
                ' Tax rate adjusted.
                If column_k(i, 1) <> "" Then
                    recalc_row = True
                End If
 
 
                ' Include / Exclude.
                If column_y(i, 1) <> "INCLUDE" Then
                    recalc_row = True
                End If
 
 
                ' Income Code Adjusted.
                If column_ad(i, 1) <> "" Then
                    If column_ad(i, 1) <> column_ac(i, 1) Then
                        recalc_row = True
                    End If
                End If
 
 
                ' Exemption Code Adjusted.
                If column_af(i, 1) <> "" Then
                    If column_af(i, 1) <> column_ae(i, 1) Then
                        recalc_row = True
                    End If
                End If
 
 
                ' BBH Rate Adjusted.
                If column_ai(i, 1) <> "" Then
                    If column_ai(i, 1) <> column_ah(i, 1) Then
                        recalc_row = True
                    End If
                End If
 
 
                ' BBH CCY Adjusted.
                If column_am(i, 1) <> "" Then
                    If column_am(i, 1) <> column_al(i, 1) Then
                        recalc_row = True
                    End If
                End If
 
 
                ' Suggested Rate Adjusted.
                If column_au(i, 1) <> "" Then
                    If column_au(i, 1) <> column_at(i, 1) Then
                        recalc_row = True
                    End If
                End If
 
 
                ' Check if recalc_row is true.
                If recalc_row = True Then
                    ' Set recalc to true
                    recalc = True
 
 
                    ' Get starting position of the affected ISIN within the SHEETNAME1 sheet.
                    SHEETNAME1_ISIN = .Range("A" & i).Value
 
 
                    ' Convert all formula cells in the row back to formulae.
                    .Range("A" & i & ":A" & i).Formula = .Range("A2:A2").FormulaR1C1
                    .Range("B" & i & ":B" & i).Formula = .Range("B2:B2").FormulaR1C1
                    .Range("F" & i & ":F" & i).Formula = .Range("F2:F2").FormulaR1C1
                    .Range("H" & i & ":H" & i).Formula = .Range("H2:H2").FormulaR1C1
                    .Range("J" & i & ":J" & i).Formula = .Range("J2:J2").FormulaR1C1
                    .Range("L" & i & ":L" & i).Formula = .Range("L2:L2").FormulaR1C1
                    .Range("M" & i & ":M" & i).Formula = .Range("M2:M2").FormulaR1C1
                    .Range("T" & i & ":T" & i).Formula = .Range("T2:T2").FormulaR1C1
                    .Range("V" & i & ":V" & i).Formula = .Range("V2:V2").FormulaR1C1
                    .Range("W" & i & ":W" & i).Formula = .Range("W2:W2").FormulaR1C1
                    .Range("X" & i & ":X" & i).Formula = .Range("X2:X2").FormulaR1C1
                    .Range("AB" & i & ":AB" & i).Formula = .Range("AB2:AB2").FormulaR1C1
                    .Range("AC" & i & ":AC" & i).Formula = .Range("AC2:AC2").FormulaR1C1
                    .Range("AE" & i & ":AE" & i).Formula = .Range("AE2:AE2").FormulaR1C1
                    .Range("AG" & i & ":AG" & i).Formula = .Range("AG2:AG2").FormulaR1C1
                    .Range("AH" & i & ":AH" & i).Formula = .Range("AH2:AH2").FormulaR1C1
                    .Range("AJ" & i & ":AJ" & i).Formula = .Range("AJ2:AJ2").FormulaR1C1
                    .Range("AK" & i & ":AK" & i).Formula = .Range("AK2:AK2").FormulaR1C1
                    .Range("AL" & i & ":AL" & i).Formula = .Range("AL2:AL2").FormulaR1C1
                    .Range("AN" & i & ":AN" & i).Formula = .Range("AN2:AN2").FormulaR1C1
                    .Range("AO" & i & ":AO" & i).Formula = .Range("AO2:AO2").FormulaR1C1
                    .Range("AP" & i & ":AP" & i).Formula = .Range("AP2:AP2").FormulaR1C1
                    .Range("AQ" & i & ":AQ" & i).Formula = .Range("AQ2:AQ2").FormulaR1C1
                    .Range("AR" & i & ":AR" & i).Formula = .Range("AR2:AR2").FormulaR1C1
                    .Range("AS" & i & ":AS" & i).Formula = .Range("AS2:AS2").FormulaR1C1
                    .Range("AT" & i & ":AT" & i).Formula = .Range("AT2:AT2").FormulaR1C1
                    .Range("AV" & i & ":AU" & i).Formula = .Range("AV2:AV2").FormulaR1C1
                    .Range("AW" & i & ":AW" & i).Formula = .Range("AW2:AW2").FormulaR1C1
                    .Range("AX" & i & ":AX" & i).Formula = .Range("AX2:AX2").FormulaR1C1
                    .Range("AY" & i & ":AY" & i).Formula = .Range("AY2:AY2").FormulaR1C1
                    .Range("BB" & i & ":BB" & i).Formula = .Range("BB2:BB2").FormulaR1C1
                    .Range("BD" & i & ":BD" & i).Formula = .Range("BD2:BD2").FormulaR1C1
                    .Range("BE" & i & ":BE" & i).Formula = .Range("BE2:BE2").FormulaR1C1
                    .Range("BG" & i & ":BG" & i).Formula = .Range("BG2:BG2").FormulaR1C1
                    .Range("BH" & i & ":BH" & i).Formula = .Range("BH2:BH2").FormulaR1C1
                    .Range("BI" & i & ":BI" & i).Formula = .Range("BI2:BI2").FormulaR1C1
                    .Range("BJ" & i & ":BJ" & i).Formula = .Range("BJ2:JI2").FormulaR1C1
                    .Range("BK" & i & ":BK" & i).Formula = .Range("BK2:BK2").FormulaR1C1
                    .Range("BL" & i & ":BL" & i).Formula = .Range("BL2:BL2").FormulaR1C1
 
 
                    ' Recalculate the entire row.
                    .Range("A" & i & ":BO" & i).Calculate
 
 
'--------------------------------------------------------------------------
                    ' TODO - Add in here loop for all affected lines in FinalABC sheet with same ISIN.
                    ' Then we can remove the below copy all BBH formulae down.
 
 
                    ' Now get index of first row in FinalABC sheet that contains same affected ISIN.
                    With Sheets("FinalABC")
 
                        Set rng = .Range("A1:A" & lastrow_FinalABC)
 
                        If WorksheetFunction.CountIf(rng, SHEETNAME1_ISIN) > 0 Then
 
                            var = WorksheetFunction.Match(SHEETNAME1_ISIN, rng, 0)
 
                            If Not IsError(var) Then
 
                                J = var
                                FinalABC_ISIN = .Range("A" & J).Value
 
 
                                ' For every row that has same ISIN re-enable formulae in SHEETNAME1 sheet.
                                ' Convert all formula cells in the row back to formulae.
                                While .Range("A" & J).Value = FinalABC_ISIN
 
                                    ' Convert all formula cells in the row back to formulae.
                                    .Range("K" & J & ":K" & J).Formula = .Range("K2:K2").FormulaR1C1
                                    .Range("L" & J & ":L" & J).Formula = .Range("L2:L2").FormulaR1C1
                                    .Range("M" & J & ":M" & J).Formula = .Range("M2:M2").FormulaR1C1
                                    .Range("N" & J & ":N" & J).Formula = .Range("N2:N2").FormulaR1C1
                                    .Range("P" & J & ":P" & J).Formula = .Range("P2:P2").FormulaR1C1
                                    .Range("Q" & J & ":Q" & J).Formula = .Range("Q2:Q2").FormulaR1C1
                                    .Range("AI" & J & ":AI" & J).Formula = .Range("AI2:AI2").FormulaR1C1
                                    .Range("AJ" & J & ":AJ" & J).Formula = .Range("AJ2:AJ2").FormulaR1C1
                                    .Range("AK" & J & ":AK" & J).Formula = .Range("AK2:AK2").FormulaR1C1
                                    .Range("AL" & J & ":AL" & J).Formula = .Range("AL2:AL2").FormulaR1C1
                                    .Range("AM" & J & ":AM" & J).Formula = .Range("AM2:AM2").FormulaR1C1
                                    .Range("AR" & J & ":AR" & J).Formula = .Range("AR2:AR2").FormulaR1C1
                                    .Range("AS" & J & ":AS" & J).Formula = .Range("AS2:AS2").FormulaR1C1
                                    .Range("AT" & J & ":AT" & J).Formula = .Range("AT2:AT2").FormulaR1C1
 
 
                                    ' Recalculate the entire row.
                                    .Range("A" & J & ":AT" & J).Calculate
 
 
                                    ' Convert all formulae on the FinalABC sheet to values.  Leaves row 2 alone.
                                    If (J > 2) Then
                                        .Range("K" & J & ":K" & J) = .Range("K" & J & ":K" & J).Value
                                        .Range("L" & J & ":L" & J) = .Range("L" & J & ":L" & J).Value
                                        .Range("M" & J & ":M" & J) = .Range("M" & J & ":M" & J).Value
                                        .Range("N" & J & ":N" & J) = .Range("N" & J & ":N" & J).Value
                                        .Range("P" & J & ":P" & J) = .Range("P" & J & ":P" & J).Value
                                        .Range("Q" & J & ":Q" & J) = .Range("Q" & J & ":Q" & J).Value
                                        .Range("AI" & J & ":AI" & J) = .Range("AI" & J & ":AI" & J).Value
                                        .Range("AJ" & J & ":AJ" & J) = .Range("AJ" & J & ":AJ" & J).Value
                                        .Range("AK" & J & ":AK" & J) = .Range("AK" & J & ":AK" & J).Value
                                        .Range("AL" & J & ":AL" & J) = .Range("AL" & J & ":AL" & J).Value
                                        .Range("AM" & J & ":AM" & J) = .Range("AM" & J & ":AM" & J).Value
                                        .Range("AR" & J & ":AR" & J) = .Range("AR" & J & ":AR" & J).Value
                                        .Range("AS" & J & ":AS" & J) = .Range("AS" & J & ":AS" & J).Value
                                        .Range("AT" & J & ":AT" & J) = .Range("AT" & J & ":AT" & J).Value
                                    End If
 
                                    ' next row
                                    J = J + 1
                                Wend
 
                            Else
                                Message "The ISIN " & SHEETNAME1_ISIN & " cannot be found in the FinalABC sheet."
                            End If
                        End If
                    End With
 
 
 
                    ' Convert all formulae on the SHEETNAME1 sheet to values.  Leaves row 2 alone.
                    If (i > 2) Then
                        .Range("A" & i & ":A" & i) = .Range("A" & i & ":A" & i).Value
                        .Range("B" & i & ":B" & i) = .Range("B" & i & ":B" & i).Value
                        .Range("F" & i & ":F" & i) = .Range("F" & i & ":F" & i).Value
                        .Range("H" & i & ":H" & i) = .Range("H" & i & ":H" & i).Value
                        .Range("J" & i & ":J" & i) = .Range("J" & i & ":J" & i).Value
                        .Range("L" & i & ":L" & i) = .Range("L" & i & ":L" & i).Value
                        .Range("M" & i & ":M" & i) = .Range("M" & i & ":M" & i).Value
                        .Range("T" & i & ":T" & i) = .Range("T" & i & ":T" & i).Value
                        .Range("V" & i & ":V" & i) = .Range("V" & i & ":V" & i).Value
                        .Range("W" & i & ":W" & i) = .Range("W" & i & ":W" & i).Value
                        .Range("X" & i & ":X" & i) = .Range("X" & i & ":X" & i).Value
                        .Range("AB" & i & ":AB" & i) = .Range("AB" & i & ":AB" & i).Value
                        .Range("AC" & i & ":AC" & i) = .Range("AC" & i & ":AC" & i).Value
                        .Range("AE" & i & ":AE" & i) = .Range("AE" & i & ":AE" & i).Value
                        .Range("AG" & i & ":AG" & i) = .Range("AG" & i & ":AG" & i).Value
                        .Range("AH" & i & ":AH" & i) = .Range("AH" & i & ":AH" & i).Value
                        .Range("AJ" & i & ":AJ" & i) = .Range("AJ" & i & ":AJ" & i).Value
                        .Range("AK" & i & ":AK" & i) = .Range("AK" & i & ":AK" & i).Value
                        .Range("AL" & i & ":AL" & i) = .Range("AL" & i & ":AL" & i).Value
                        .Range("AN" & i & ":AN" & i) = .Range("AN" & i & ":AN" & i).Value
                        .Range("AO" & i & ":AO" & i) = .Range("AO" & i & ":AO" & i).Value
                        .Range("AP" & i & ":AP" & i) = .Range("AP" & i & ":AP" & i).Value
                        .Range("AQ" & i & ":AQ" & i) = .Range("AQ" & i & ":AQ" & i).Value
                        .Range("AR" & i & ":AR" & i) = .Range("AR" & i & ":AR" & i).Value
                        .Range("AS" & i & ":AS" & i) = .Range("AS" & i & ":AS" & i).Value
                        .Range("AT" & i & ":AT" & i) = .Range("AT" & i & ":AT" & i).Value
                        .Range("AV" & i & ":AV" & i) = .Range("AV" & i & ":AV" & i).Value
                        .Range("AW" & i & ":AW" & i) = .Range("AW" & i & ":AW" & i).Value
                        .Range("AX" & i & ":AX" & i) = .Range("AX" & i & ":AX" & i).Value
                        .Range("AY" & i & ":AY" & i) = .Range("AY" & i & ":AY" & i).Value
                        .Range("BB" & i & ":BB" & i) = .Range("BB" & i & ":BB" & i).Value
                        .Range("BD" & i & ":BD" & i) = .Range("BD" & i & ":BD" & i).Value
                        .Range("BE" & i & ":BE" & i) = .Range("BE" & i & ":BE" & i).Value
                        .Range("BG" & i & ":BG" & i) = .Range("BG" & i & ":BG" & i).Value
                        .Range("BH" & i & ":BH" & i) = .Range("BH" & i & ":BH" & i).Value
                        .Range("BI" & i & ":BI" & i) = .Range("BI" & i & ":BI" & i).Value
                        .Range("BJ" & i & ":BJ" & i) = .Range("BJ" & i & ":BJ" & i).Value
                        .Range("BK" & i & ":BK" & i) = .Range("BK" & i & ":BK" & i).Value
                        .Range("BL" & i & ":BL" & i) = .Range("BL" & i & ":BL" & i).Value
 
                    End If
 
'+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
                End If
 
 
 
NextIteration:
 
            Next i
        End With
 
 
 
        If recalc = True Then
 
            ' Do refresh of pivots.
            With Sheets("Mapping Pivots")
 
                ' Activate the Mapping Pivots sheet.
                .Activate
 
 
                ' Refresh the pivot tables.
                For Each pt In .PivotTables
                    pt.RefreshTable
                    pt.Update
                Next
 
            End With
 
        End If
 
 
 
 
        '*********************************************************************************************
        ' Check FinalABC for adjustment changes.
 
        ' Loop through every row in SHEETNAME1 and check if any adjusted cell differs from the original.
        ' If so then continues with the recalc.
        For i = 2 To lastrow_FinalABC
 
            ' Default to false
            recalc_row = False
            recalc = False
 
 
            ' Check FinalABC for changes.
            With .Sheets("FinalABC")
 
                ' Activate the sheet.
                .Activate
 
 
                ' USD Adjustments.
                If .Range("J" & i).Value <> "" Then
                    recalc_row = True
                End If
 
 
                ' Tax Rate Adjusted
                If .Range("R" & i).Value <> "" Then
                    recalc_row = True
                End If
 
 
                ' Adjusted date.
                tmpMonth1 = UCase(Left(.Range("F" & i).Value, 3))
                tmpMonth2 = UCase(Left(Right(.Range("A" & i).Value, 8), 3))
 
                If (tmpMonth1 <> tmpMonth2) Then
                    recalc_row = True
                End If
 
 
                ' Check if recalc_row is true.
                If recalc_row = True Then
 
                    ' Set recalc to true
                    recalc = True
 
 
                    ' Convert all formula cells in the row back to formulae.
                    .Range("K" & i & ":K" & i).Formula = .Range("K2:K2").FormulaR1C1
                    .Range("L" & i & ":L" & i).Formula = .Range("L2:L2").FormulaR1C1
                    .Range("M" & i & ":M" & i).Formula = .Range("M2:M2").FormulaR1C1
                    .Range("N" & i & ":N" & i).Formula = .Range("N2:N2").FormulaR1C1
                    .Range("P" & i & ":P" & i).Formula = .Range("P2:P2").FormulaR1C1
                    .Range("Q" & i & ":Q" & i).Formula = .Range("Q2:Q2").FormulaR1C1
                    .Range("AI" & i & ":AI" & i).Formula = .Range("AI2:AI2").FormulaR1C1
                    .Range("AJ" & i & ":AJ" & i).Formula = .Range("AJ2:AJ2").FormulaR1C1
                    .Range("AK" & i & ":AK" & i).Formula = .Range("AK2:AK2").FormulaR1C1
                    .Range("AL" & i & ":AL" & i).Formula = .Range("AL2:AL2").FormulaR1C1
                    .Range("AM" & i & ":AM" & i).Formula = .Range("AM2:AM2").FormulaR1C1
                    .Range("AR" & i & ":AR" & i).Formula = .Range("AR2:AR2").FormulaR1C1
                    .Range("AS" & i & ":AS" & i).Formula = .Range("AS2:AS2").FormulaR1C1
                    .Range("AT" & i & ":AT" & i).Formula = .Range("AT2:AT2").FormulaR1C1
 
 
                    ' Recalculate the entire row.
                    .Range("A" & i & ":AT" & i).Calculate
 
 
                    ' Get starting position of the affected ISIN within the SHEETNAME1 sheet.
                    FinalABC_ISIN = .Range("A" & i).Value
                End If
 
            End With
 
 
            If recalc = True Then
 
                ' Do refresh of Mapping pivots
                With .Sheets("Mapping Pivots")
 
                    ' Activate the sheet.
                    .Activate
 
 
                    ' Refresh the pivots.
                    For Each pt In .PivotTables
                        pt.RefreshTable
                        pt.Update
                    Next
 
                End With
 
 
                ' Now get index of first row in SHEETNAME1 sheet that contains same affected ISIN.
                With .Sheets("SHEETNAME1")
 
                    Set rng = .Range("A1:A" & lastrow_SHEETNAME1)
 
                    If WorksheetFunction.CountIf(rng, FinalABC_ISIN) > 0 Then
 
                        var = WorksheetFunction.Match(FinalABC_ISIN, rng, 0)
 
                        If Not IsError(var) Then
 
                            J = var
                            SHEETNAME1_ISIN = .Range("A" & J).Value
 
 
                            ' For every row that has same ISIN re-enable formulae in SHEETNAME1 sheet.
                            ' Convert all formula cells in the row back to formulae.
                            While .Range("A" & J).Value = SHEETNAME1_ISIN
 
                                .Range("A" & J & ":A" & J).Formula = .Range("A2:A2").FormulaR1C1
                                .Range("B" & J & ":B" & J).Formula = .Range("B2:B2").FormulaR1C1
                                .Range("F" & J & ":F" & J).Formula = .Range("F2:F2").FormulaR1C1
                                .Range("H" & J & ":H" & J).Formula = .Range("H2:H2").FormulaR1C1
                                .Range("J" & J & ":J" & J).Formula = .Range("J2:J2").FormulaR1C1
                                .Range("L" & J & ":L" & J).Formula = .Range("L2:L2").FormulaR1C1
                                .Range("M" & J & ":M" & J).Formula = .Range("M2:M2").FormulaR1C1
                                .Range("T" & J & ":T" & J).Formula = .Range("T2:T2").FormulaR1C1
                                .Range("V" & J & ":V" & J).Formula = .Range("V2:V2").FormulaR1C1
                                .Range("W" & J & ":W" & J).Formula = .Range("W2:W2").FormulaR1C1
                                .Range("X" & J & ":X" & J).Formula = .Range("X2:X2").FormulaR1C1
                                .Range("AB" & J & ":AB" & J).Formula = .Range("AB2:AB2").FormulaR1C1
                                .Range("AC" & J & ":AD" & J).Formula = .Range("AC2:AC2").FormulaR1C1
                                .Range("AE" & J & ":AE" & J).Formula = .Range("AE2:AE2").FormulaR1C1
                                .Range("AG" & J & ":AG" & J).Formula = .Range("AG2:AG2").FormulaR1C1
                                .Range("AH" & J & ":AH" & J).Formula = .Range("AH2:AH2").FormulaR1C1
                                .Range("AJ" & J & ":AJ" & J).Formula = .Range("AJ2:AJ2").FormulaR1C1
                                .Range("AK" & J & ":AK" & J).Formula = .Range("AK2:AK2").FormulaR1C1
                                .Range("AL" & J & ":AL" & J).Formula = .Range("AL2:AL2").FormulaR1C1
                                .Range("AN" & J & ":AN" & J).Formula = .Range("AN2:AN2").FormulaR1C1
                                .Range("AO" & J & ":AO" & J).Formula = .Range("AO2:AO2").FormulaR1C1
                                .Range("AP" & J & ":AP" & J).Formula = .Range("AP2:AP2").FormulaR1C1
                                .Range("AQ" & J & ":AQ" & J).Formula = .Range("AQ2:AQ2").FormulaR1C1
                                .Range("AR" & J & ":AR" & J).Formula = .Range("AR2:AR2").FormulaR1C1
                                .Range("AS" & J & ":AS" & J).Formula = .Range("AS2:AS2").FormulaR1C1
                                .Range("AT" & J & ":AT" & J).Formula = .Range("AT2:AT2").FormulaR1C1
                                .Range("AV" & J & ":AV" & J).Formula = .Range("AV2:AV2").FormulaR1C1
                                .Range("AW" & J & ":AW" & J).Formula = .Range("AW2:AW2").FormulaR1C1
                                .Range("AX" & J & ":AX" & J).Formula = .Range("AX2:AX2").FormulaR1C1
                                .Range("AY" & J & ":AY" & J).Formula = .Range("AY2:AY2").FormulaR1C1
                                .Range("BB" & J & ":BB" & J).Formula = .Range("BB2:BB2").FormulaR1C1
                                .Range("BD" & J & ":BD" & J).Formula = .Range("BD2:BD2").FormulaR1C1
                                .Range("BE" & J & ":BE" & J).Formula = .Range("BE2:BE2").FormulaR1C1
                                .Range("BG" & J & ":BG" & J).Formula = .Range("BG2:BG2").FormulaR1C1
                                .Range("BH" & J & ":BH" & J).Formula = .Range("BH2:BH2").FormulaR1C1
                                .Range("BI" & J & ":BI" & J).Formula = .Range("BI2:BI2").FormulaR1C1
                                .Range("BJ" & J & ":BJ" & J).Formula = .Range("BJ2:BJ2").FormulaR1C1
                                .Range("BK" & J & ":BK" & J).Formula = .Range("BK2:BK2").FormulaR1C1
                                .Range("BL" & J & ":BL" & J).Formula = .Range("BL2:BL2").FormulaR1C1
 
 
                                ' Recalculate the entire row.
                                .Range("A" & J & ":BO" & J).Calculate
 
 
                                ' next row
                                J = J + 1
                            Wend
 
                        Else
                            Message "The ISIN " & SHEETNAME1_ISIN & " cannot be found in the FinalABC sheet."
                        End If
                    End If
 
                End With
 
 
                ' Recalculate all worksheets.
                Application.Calculate
 
 
                ' Now convert all impacted formulae back to values.
                'TODO. loop through SHEETNAME1 as above and change formulae to values for any row impacted.
 
 
                ' Convert all formulae on the FinalABC sheet to values.  Leaves row 2 alone.
                If (i > 2) Then     ' leave row 2 alone, i.e. leave as formulae.
                    With .Sheets("FinalABC")
 
                        ' Activate the sheet.
                        .Activate
 
                        .Range("K" & i & ":K" & i) = .Range("K" & i & ":K" & i).Value
                        .Range("L" & i & ":L" & i) = .Range("L" & i & ":L" & i).Value
                        .Range("M" & i & ":M" & i) = .Range("M" & i & ":M" & i).Value
                        .Range("N" & i & ":N" & i) = .Range("N" & i & ":N" & i).Value
                        .Range("P" & i & ":P" & i) = .Range("P" & i & ":P" & i).Value
                        .Range("Q" & i & ":Q" & i) = .Range("Q" & i & ":Q" & i).Value
                        .Range("AI" & i & ":AI" & i) = .Range("AI" & i & ":AI" & i).Value
                        .Range("AJ" & i & ":AJ" & i) = .Range("AJ" & i & ":AJ" & i).Value
                        .Range("AK" & i & ":AK" & i) = .Range("AK" & i & ":AK" & i).Value
                        .Range("AL" & i & ":AL" & i) = .Range("AL" & i & ":AL" & i).Value
                        .Range("AM" & i & ":AM" & i) = .Range("AM" & i & ":AM" & i).Value
                        .Range("AR" & i & ":AR" & i) = .Range("AR" & i & ":AR" & i).Value
                        .Range("AS" & i & ":AS" & i) = .Range("AS" & i & ":AS" & i).Value
                        .Range("AT" & i & ":AT" & i) = .Range("AT" & i & ":AT" & i).Value
                    End With
                End If
 
 
 
                ' Convert all formulae on the SHEETNAME1 sheet to values.  Leaves row 2 alone.
                With .Sheets("SHEETNAME1")
 
                    ' Activate the sheet.
                    .Activate
 
 
                    ' Now get index of first row in SHEETNAME1 sheet that contains same affected ISIN.
                    Set rng = .Range("A1:A" & lastrow_SHEETNAME1)
 
                    If WorksheetFunction.CountIf(rng, FinalABC_ISIN) > 0 Then
 
                        var = WorksheetFunction.Match(FinalABC_ISIN, rng, 0)
 
                        If Not IsError(var) Then
 
                            J = var
                            SHEETNAME1_ISIN = .Range("A" & J).Value
 
 
                            ' For every row that has same ISIN re-enable formulae in SHEETNAME1 sheet.
                            ' Convert all formula cells in the row back to values.
                            While .Range("A" & J).Value = SHEETNAME1_ISIN
                                If (J > 2) Then     ' leave row 2 alone, i.e. leave as formulae.
                                    .Range("A" & J & ":A" & J) = .Range("A" & J & ":A" & J).Value
                                    .Range("B" & J & ":B" & J) = .Range("B" & J & ":B" & J).Value
                                    .Range("F" & J & ":F" & J) = .Range("F" & J & ":F" & J).Value
                                    .Range("H" & J & ":H" & J) = .Range("H" & J & ":H" & J).Value
                                    .Range("J" & J & ":J" & J) = .Range("J" & J & ":J" & J).Value
                                    .Range("L" & J & ":L" & J) = .Range("L" & J & ":L" & J).Value
                                    .Range("M" & J & ":M" & J) = .Range("M" & J & ":M" & J).Value
                                    .Range("T" & J & ":T" & J) = .Range("T" & J & ":T" & J).Value
                                    .Range("V" & J & ":V" & J) = .Range("V" & J & ":V" & J).Value
                                    .Range("W" & J & ":W" & J) = .Range("W" & J & ":W" & J).Value
                                    .Range("X" & J & ":X" & J) = .Range("X" & J & ":X" & J).Value
                                    .Range("AB" & J & ":AB" & J) = .Range("AB" & J & ":AB" & J).Value
                                    .Range("AC" & J & ":AC" & J) = .Range("AC" & J & ":AC" & J).Value
                                    .Range("AE" & J & ":AE" & J) = .Range("AE" & J & ":AE" & J).Value
                                    .Range("AG" & J & ":AG" & J) = .Range("AG" & J & ":AG" & J).Value
                                    .Range("AH" & J & ":AH" & J) = .Range("AH" & J & ":AH" & J).Value
                                    .Range("AJ" & J & ":AJ" & J) = .Range("AJ" & J & ":AJ" & J).Value
                                    .Range("AK" & J & ":AK" & J) = .Range("AK" & J & ":AK" & J).Value
                                    .Range("AL" & J & ":AL" & J) = .Range("AL" & J & ":AL" & J).Value
                                    .Range("AN" & J & ":AN" & J) = .Range("AN" & J & ":AN" & J).Value
                                    .Range("AO" & J & ":AO" & J) = .Range("AO" & J & ":AO" & J).Value
                                    .Range("AP" & J & ":AP" & J) = .Range("AP" & J & ":AP" & J).Value
                                    .Range("AQ" & J & ":AQ" & J) = .Range("AQ" & J & ":AQ" & J).Value
                                    .Range("AR" & J & ":AR" & J) = .Range("AR" & J & ":AR" & J).Value
                                    .Range("AS" & J & ":AS" & J) = .Range("AS" & J & ":AS" & J).Value
                                    .Range("AT" & J & ":AT" & J) = .Range("AT" & J & ":AT" & J).Value
                                    .Range("AV" & J & ":AV" & J) = .Range("AV" & J & ":AV" & J).Value
                                    .Range("AW" & J & ":AW" & J) = .Range("AW" & J & ":AW" & J).Value
                                    .Range("AX" & J & ":AX" & J) = .Range("AX" & J & ":AX" & J).Value
                                    .Range("AY" & J & ":AY" & J) = .Range("AY" & J & ":AY" & J).Value
                                    .Range("BB" & J & ":BB" & J) = .Range("BB" & J & ":BB" & J).Value
                                    .Range("BD" & J & ":BD" & J) = .Range("BD" & J & ":BD" & J).Value
                                    .Range("BE" & J & ":BE" & J) = .Range("BE" & J & ":BE" & J).Value
                                    .Range("BG" & J & ":BG" & J) = .Range("BG" & J & ":BG" & J).Value
                                    .Range("BH" & J & ":BH" & J) = .Range("BH" & J & ":BH" & J).Value
                                    .Range("BI" & J & ":BI" & J) = .Range("BI" & J & ":BI" & J).Value
                                    .Range("BJ" & J & ":BJ" & J) = .Range("BJ" & J & ":BJ" & J).Value
                                    .Range("BK" & J & ":BK" & J) = .Range("BK" & J & ":BK" & J).Value
                                    .Range("BL" & J & ":BL" & J) = .Range("BL" & J & ":BL" & J).Value
                                End If
 
                                ' next row
                                J = J + 1
                            Wend
                        Else
                            Message "The ISIN " & FinalABC_ISIN & " cannot be found in the SHEETNAME1 sheet."
                        End If
                    End If
                End With
            End If
        Next i
    End With
 
 
    ' Clear all objects.
    Set pt = Nothing
    Set rng = Nothing
    Set var = Nothing
    Set working = Nothing
    Set column_k = Nothing
    Set column_y = Nothing
    Set column_ac = Nothing
    Set column_ad = Nothing
    Set column_ae = Nothing
    Set column_af = Nothing
    Set column_ah = Nothing
    Set column_ai = Nothing
    Set column_al = Nothing
    Set column_am = Nothing
    Set column_at = Nothing
    Set column_au = Nothing
 
End Sub
 
 
 
' For any row that has adjusted values different than the original value it recalculates the values against that row.
' It does this by putting formulae back in only for the specific row and then performing the recalc.
' Later the formula are replaced by values again.
Sub M11207_Recalc_changed_adjusted_rows_Array_NEW()
 
    Dim lastrow_SHEETNAME1 As Long
    Dim lastrow_FinalABC As Long
 
    Dim recalc As Boolean
    Dim recalc_row As Boolean
 
    Dim FinalABC_ISIN As String
    Dim SHEETNAME1_ISIN As String
    Dim rng As Range
    Dim var As Variant
 
    Dim i As Long
    Dim J As Long
 
    Dim tmpMonth1 As String
    Dim tmpMonth2 As String
 
    Dim pt As PivotTable
 
    Dim column_k As Variant
    Dim column_y As Variant
    Dim column_ac As Variant
    Dim column_ad As Variant
    Dim column_ae As Variant
    Dim column_af As Variant
    Dim column_ah As Variant
    Dim column_ai As Variant
    Dim column_al As Variant
    Dim column_am As Variant
    Dim column_at As Variant
    Dim column_au As Variant
 
    Dim working As Variant
 
 
    ' Initialize global vars.
    Call Z00000_Init
 
 
    ' Ask user.
    If ctrl_ask_before_running_subroutine = True Then
        If MsgBox("Recalc changed adjusted SHEETNAME1 rows?", vbYesNo) = vbNo Then Exit Sub
    End If
 
 
 
    With Workbooks(wb_name)
 
        ' Get how many rows of data have been loaded into the sheet.
        lastrow_SHEETNAME1 = .Sheets("SHEETNAME1").Cells(Rows.Count, 4).End(xlUp).Row
        ' Prevent line 2 being deleted - as this contains the formulae which need coping down later.
        If lastrow_SHEETNAME1 < 3 Then
            lastrow_SHEETNAME1 = 3
        End If
 
        lastrow_FinalABC = .Sheets("FinalABC").Cells(Rows.Count, 4).End(xlUp).Row
        ' Prevent line 2 being deleted - as this contains the formulae which need coping down later.
        If lastrow_FinalABC < 3 Then
            lastrow_FinalABC = 3
        End If
 
 
        ' Loop through every row in SHEETNAME1 and check if any adjusted cell differs from the original.
        ' If so then continues with the recalc.
        recalc = False
 
 
        ReDim working(1 To lastrow_SHEETNAME1, 1) ' Working array
        ReDim column_k(1 To lastrow_SHEETNAME1, 1)
        ReDim column_y(1 To lastrow_SHEETNAME1, 1)
        ReDim column_ac(1 To lastrow_SHEETNAME1, 1)
        ReDim column_ad(1 To lastrow_SHEETNAME1, 1)
        ReDim column_ae(1 To lastrow_SHEETNAME1, 1)
        ReDim column_af(1 To lastrow_SHEETNAME1, 1)
        ReDim column_ah(1 To lastrow_SHEETNAME1, 1)
        ReDim column_ai(1 To lastrow_SHEETNAME1, 1)
        ReDim column_al(1 To lastrow_SHEETNAME1, 1)
        ReDim column_am(1 To lastrow_SHEETNAME1, 1)
        ReDim column_at(1 To lastrow_SHEETNAME1, 1)
        ReDim column_au(1 To lastrow_SHEETNAME1, 1)
 
 
        ' Check SHEETNAME1 for changes.
        With .Sheets("SHEETNAME1")
 
            ' Activate the sheet.
            .Activate
 
 
            ' Load working with dummy values - just to set its size.
            working = .Range("D1:D" & lastrow_SHEETNAME1)
 
 
            ' Load SHEETNAME1 columns into array variables.
            column_k = .Range("K1:K" & lastrow_SHEETNAME1)
            column_y = .Range("Y1:Y" & lastrow_SHEETNAME1)
            column_ac = .Range("AC1:AC" & lastrow_SHEETNAME1)
            column_ad = .Range("AD1:AD" & lastrow_SHEETNAME1)
            column_ae = .Range("AE1:AE" & lastrow_SHEETNAME1)
            column_af = .Range("AF1:AF" & lastrow_SHEETNAME1)
            column_ah = .Range("AH1:AH" & lastrow_SHEETNAME1)
            column_ai = .Range("AI1:AI" & lastrow_SHEETNAME1)
            column_al = .Range("AL1:AL" & lastrow_SHEETNAME1)
            column_am = .Range("AM1:AM" & lastrow_SHEETNAME1)
            column_at = .Range("AT1:AT" & lastrow_SHEETNAME1)
            column_au = .Range("AU1:AU" & lastrow_SHEETNAME1)
 
 
            ' Prompt the user for the row to change
            i = Application.InputBox _
                (Prompt:="Please enter which line to recalc in the SHEETNAME1 sheet.", _
                    Title:="SHEETNAME1 line to recalc", Type:=1)
 
            If i < LBound(working) Then
               GoTo IncorrectRow
            End If
 
            If i > UBound(working) Then
                GoTo IncorrectRow
            End If
 
 
 
            'For i = LBound(working) To UBound(working)
 
                ' If row 1, heading, skip
                If i = 1 Then
                    GoTo IncorrectRow ' next i
                End If
 
 
                ' Default to false
                recalc_row = False
 
 
                ' Tax rate adjusted.
                If column_k(i, 1) <> "" Then
                    recalc_row = True
                End If
 
 
                ' Include / Exclude.
                If column_y(i, 1) <> "INCLUDE" Then
                    recalc_row = True
                End If
 
 
                ' Income Code Adjusted.
                If column_ad(i, 1) <> "" Then
                    If column_ad(i, 1) <> column_ac(i, 1) Then
                        recalc_row = True
                    End If
                End If
 
 
                ' Exemption Code Adjusted.
                If column_af(i, 1) <> "" Then
                    If column_af(i, 1) <> column_ae(i, 1) Then
                        recalc_row = True
                    End If
                End If
 
 
                ' BBH Rate Adjusted.
                If column_ai(i, 1) <> "" Then
                    If column_ai(i, 1) <> column_ah(i, 1) Then
                        recalc_row = True
                    End If
                End If
 
 
                ' BBH CCY Adjusted.
                If column_am(i, 1) <> "" Then
                    If column_am(i, 1) <> column_al(i, 1) Then
                        recalc_row = True
                    End If
                End If
 
 
                ' Suggested Rate Adjusted.
                If column_au(i, 1) <> "" Then
                    If column_au(i, 1) <> column_at(i, 1) Then
                        recalc_row = True
                    End If
                End If
 
 
                ' Check if recalc_row is true.
                If recalc_row = True Then
                    ' Set recalc to true
                    recalc = True
 
 
                    ' Get starting position of the affected ISIN within the SHEETNAME1 sheet.
                    SHEETNAME1_ISIN = .Range("A" & i).Value
 
 
                    ' Convert all formula cells in the row back to formulae.
                    .Range("A" & i & ":A" & i).Formula = .Range("A2:A2").FormulaR1C1
                    .Range("B" & i & ":B" & i).Formula = .Range("B2:B2").FormulaR1C1
                    .Range("F" & i & ":F" & i).Formula = .Range("F2:F2").FormulaR1C1
                    .Range("H" & i & ":H" & i).Formula = .Range("H2:H2").FormulaR1C1
                    .Range("J" & i & ":J" & i).Formula = .Range("J2:J2").FormulaR1C1
                    .Range("L" & i & ":L" & i).Formula = .Range("L2:L2").FormulaR1C1
                    .Range("M" & i & ":M" & i).Formula = .Range("M2:M2").FormulaR1C1
                    .Range("T" & i & ":T" & i).Formula = .Range("T2:T2").FormulaR1C1
                    .Range("V" & i & ":V" & i).Formula = .Range("V2:V2").FormulaR1C1
                    .Range("W" & i & ":W" & i).Formula = .Range("W2:W2").FormulaR1C1
                    .Range("X" & i & ":X" & i).Formula = .Range("X2:X2").FormulaR1C1
                    .Range("AB" & i & ":AB" & i).Formula = .Range("AB2:AB2").FormulaR1C1
                    .Range("AC" & i & ":AC" & i).Formula = .Range("AC2:AC2").FormulaR1C1
                    .Range("AE" & i & ":AE" & i).Formula = .Range("AE2:AE2").FormulaR1C1
                    .Range("AG" & i & ":AG" & i).Formula = .Range("AG2:AG2").FormulaR1C1
                    .Range("AH" & i & ":AH" & i).Formula = .Range("AH2:AH2").FormulaR1C1
                    .Range("AJ" & i & ":AJ" & i).Formula = .Range("AJ2:AJ2").FormulaR1C1
                    .Range("AK" & i & ":AK" & i).Formula = .Range("AK2:AK2").FormulaR1C1
                    .Range("AL" & i & ":AL" & i).Formula = .Range("AL2:AL2").FormulaR1C1
                    .Range("AN" & i & ":AN" & i).Formula = .Range("AN2:AN2").FormulaR1C1
                    .Range("AO" & i & ":AO" & i).Formula = .Range("AO2:AO2").FormulaR1C1
                    .Range("AP" & i & ":AP" & i).Formula = .Range("AP2:AP2").FormulaR1C1
                    .Range("AQ" & i & ":AQ" & i).Formula = .Range("AQ2:AQ2").FormulaR1C1
                    .Range("AR" & i & ":AR" & i).Formula = .Range("AR2:AR2").FormulaR1C1
                    .Range("AS" & i & ":AS" & i).Formula = .Range("AS2:AS2").FormulaR1C1
                    .Range("AT" & i & ":AT" & i).Formula = .Range("AT2:AT2").FormulaR1C1
                    .Range("AV" & i & ":AU" & i).Formula = .Range("AV2:AV2").FormulaR1C1
                    .Range("AW" & i & ":AW" & i).Formula = .Range("AW2:AW2").FormulaR1C1
                    .Range("AX" & i & ":AX" & i).Formula = .Range("AX2:AX2").FormulaR1C1
                    .Range("AY" & i & ":AY" & i).Formula = .Range("AY2:AY2").FormulaR1C1
                    .Range("BB" & i & ":BB" & i).Formula = .Range("BB2:BB2").FormulaR1C1
                    .Range("BD" & i & ":BD" & i).Formula = .Range("BD2:BD2").FormulaR1C1
                    .Range("BE" & i & ":BE" & i).Formula = .Range("BE2:BE2").FormulaR1C1
                    .Range("BG" & i & ":BG" & i).Formula = .Range("BG2:BG2").FormulaR1C1
                    .Range("BH" & i & ":BH" & i).Formula = .Range("BH2:BH2").FormulaR1C1
                    .Range("BI" & i & ":BI" & i).Formula = .Range("BI2:BI2").FormulaR1C1
                    .Range("BJ" & i & ":BJ" & i).Formula = .Range("BJ2:JI2").FormulaR1C1
                    .Range("BK" & i & ":BK" & i).Formula = .Range("BK2:BK2").FormulaR1C1
                    .Range("BL" & i & ":BL" & i).Formula = .Range("BL2:BL2").FormulaR1C1
 
 
                    ' Recalculate the entire row.
                    .Range("A" & i & ":BO" & i).Calculate
 
 
'--------------------------------------------------------------------------
                    ' TODO - Add in here loop for all affected lines in FinalABC sheet with same ISIN.
                    ' Then we can remove the below copy all BBH formulae down.
 
 
                    ' Now get index of first row in FinalABC sheet that contains same affected ISIN.
                    With Sheets("FinalABC")
 
                        Set rng = .Range("A1:A" & lastrow_FinalABC)
 
                        If WorksheetFunction.CountIf(rng, SHEETNAME1_ISIN) > 0 Then
 
                            var = WorksheetFunction.Match(SHEETNAME1_ISIN, rng, 0)
 
                            If Not IsError(var) Then
 
                                J = var
                                FinalABC_ISIN = .Range("A" & J).Value
 
 
                                ' For every row that has same ISIN re-enable formulae in SHEETNAME1 sheet.
                                ' Convert all formula cells in the row back to formulae.
                                While .Range("A" & J).Value = FinalABC_ISIN
 
                                    ' Convert all formula cells in the row back to formulae.
                                    .Range("K" & J & ":K" & J).Formula = .Range("K2:K2").FormulaR1C1
                                    .Range("L" & J & ":L" & J).Formula = .Range("L2:L2").FormulaR1C1
                                    .Range("M" & J & ":M" & J).Formula = .Range("M2:M2").FormulaR1C1
                                    .Range("N" & J & ":N" & J).Formula = .Range("N2:N2").FormulaR1C1
                                    .Range("P" & J & ":P" & J).Formula = .Range("P2:P2").FormulaR1C1
                                    .Range("Q" & J & ":Q" & J).Formula = .Range("Q2:Q2").FormulaR1C1
                                    .Range("AI" & J & ":AI" & J).Formula = .Range("AI2:AI2").FormulaR1C1
                                    .Range("AJ" & J & ":AJ" & J).Formula = .Range("AJ2:AJ2").FormulaR1C1
                                    .Range("AK" & J & ":AK" & J).Formula = .Range("AK2:AK2").FormulaR1C1
                                    .Range("AL" & J & ":AL" & J).Formula = .Range("AL2:AL2").FormulaR1C1
                                    .Range("AM" & J & ":AM" & J).Formula = .Range("AM2:AM2").FormulaR1C1
                                    .Range("AR" & J & ":AR" & J).Formula = .Range("AR2:AR2").FormulaR1C1
                                    .Range("AS" & J & ":AS" & J).Formula = .Range("AS2:AS2").FormulaR1C1
                                    .Range("AT" & J & ":AT" & J).Formula = .Range("AT2:AT2").FormulaR1C1
 
 
                                    ' Recalculate the entire row.
                                    .Range("A" & J & ":AT" & J).Calculate
 
 
                                    ' Convert all formulae on the FinalABC sheet to values.  Leaves row 2 alone.
                                    If (J > 2) Then
                                        .Range("K" & J & ":K" & J) = .Range("K" & J & ":K" & J).Value
                                        .Range("L" & J & ":L" & J) = .Range("L" & J & ":L" & J).Value
                                        .Range("M" & J & ":M" & J) = .Range("M" & J & ":M" & J).Value
                                        .Range("N" & J & ":N" & J) = .Range("N" & J & ":N" & J).Value
                                        .Range("P" & J & ":P" & J) = .Range("P" & J & ":P" & J).Value
                                        .Range("Q" & J & ":Q" & J) = .Range("Q" & J & ":Q" & J).Value
                                        .Range("AI" & J & ":AI" & J) = .Range("AI" & J & ":AI" & J).Value
                                        .Range("AJ" & J & ":AJ" & J) = .Range("AJ" & J & ":AJ" & J).Value
                                        .Range("AK" & J & ":AK" & J) = .Range("AK" & J & ":AK" & J).Value
                                        .Range("AL" & J & ":AL" & J) = .Range("AL" & J & ":AL" & J).Value
                                        .Range("AM" & J & ":AM" & J) = .Range("AM" & J & ":AM" & J).Value
                                        .Range("AR" & J & ":AR" & J) = .Range("AR" & J & ":AR" & J).Value
                                        .Range("AS" & J & ":AS" & J) = .Range("AS" & J & ":AS" & J).Value
                                        .Range("AT" & J & ":AT" & J) = .Range("AT" & J & ":AT" & J).Value
                                    End If
 
                                    ' next row
                                    J = J + 1
                                Wend
 
                            Else
                                Message "The ISIN " & SHEETNAME1_ISIN & " cannot be found in the FinalABC sheet."
                            End If
                        End If
                    End With
 
 
 
                    ' Convert all formulae on the SHEETNAME1 sheet to values.  Leaves row 2 alone.
                    If (i > 2) Then
                        .Range("A" & i & ":A" & i) = .Range("A" & i & ":A" & i).Value
                        .Range("B" & i & ":B" & i) = .Range("B" & i & ":B" & i).Value
                        .Range("F" & i & ":F" & i) = .Range("F" & i & ":F" & i).Value
                        .Range("H" & i & ":H" & i) = .Range("H" & i & ":H" & i).Value
                        .Range("J" & i & ":J" & i) = .Range("J" & i & ":J" & i).Value
                        .Range("L" & i & ":L" & i) = .Range("L" & i & ":L" & i).Value
                        .Range("M" & i & ":M" & i) = .Range("M" & i & ":M" & i).Value
                        .Range("T" & i & ":T" & i) = .Range("T" & i & ":T" & i).Value
                        .Range("V" & i & ":V" & i) = .Range("V" & i & ":V" & i).Value
                        .Range("W" & i & ":W" & i) = .Range("W" & i & ":W" & i).Value
                        .Range("X" & i & ":X" & i) = .Range("X" & i & ":X" & i).Value
                        .Range("AB" & i & ":AB" & i) = .Range("AB" & i & ":AB" & i).Value
                        .Range("AC" & i & ":AC" & i) = .Range("AC" & i & ":AC" & i).Value
                        .Range("AE" & i & ":AE" & i) = .Range("AE" & i & ":AE" & i).Value
                        .Range("AG" & i & ":AG" & i) = .Range("AG" & i & ":AG" & i).Value
                        .Range("AH" & i & ":AH" & i) = .Range("AH" & i & ":AH" & i).Value
                        .Range("AJ" & i & ":AJ" & i) = .Range("AJ" & i & ":AJ" & i).Value
                        .Range("AK" & i & ":AK" & i) = .Range("AK" & i & ":AK" & i).Value
                        .Range("AL" & i & ":AL" & i) = .Range("AL" & i & ":AL" & i).Value
                        .Range("AN" & i & ":AN" & i) = .Range("AN" & i & ":AN" & i).Value
                        .Range("AO" & i & ":AO" & i) = .Range("AO" & i & ":AO" & i).Value
                        .Range("AP" & i & ":AP" & i) = .Range("AP" & i & ":AP" & i).Value
                        .Range("AQ" & i & ":AQ" & i) = .Range("AQ" & i & ":AQ" & i).Value
                        .Range("AR" & i & ":AR" & i) = .Range("AR" & i & ":AR" & i).Value
                        .Range("AS" & i & ":AS" & i) = .Range("AS" & i & ":AS" & i).Value
                        .Range("AT" & i & ":AT" & i) = .Range("AT" & i & ":AT" & i).Value
                        .Range("AV" & i & ":AV" & i) = .Range("AV" & i & ":AV" & i).Value
                        .Range("AW" & i & ":AW" & i) = .Range("AW" & i & ":AW" & i).Value
                        .Range("AX" & i & ":AX" & i) = .Range("AX" & i & ":AX" & i).Value
                        .Range("AY" & i & ":AY" & i) = .Range("AY" & i & ":AY" & i).Value
                        .Range("BB" & i & ":BB" & i) = .Range("BB" & i & ":BB" & i).Value
                        .Range("BD" & i & ":BD" & i) = .Range("BD" & i & ":BD" & i).Value
                        .Range("BE" & i & ":BE" & i) = .Range("BE" & i & ":BE" & i).Value
                        .Range("BG" & i & ":BG" & i) = .Range("BG" & i & ":BG" & i).Value
                        .Range("BH" & i & ":BH" & i) = .Range("BH" & i & ":BH" & i).Value
                        .Range("BI" & i & ":BI" & i) = .Range("BI" & i & ":BI" & i).Value
                        .Range("BJ" & i & ":BJ" & i) = .Range("BJ" & i & ":BJ" & i).Value
                        .Range("BK" & i & ":BK" & i) = .Range("BK" & i & ":BK" & i).Value
                        .Range("BL" & i & ":BL" & i) = .Range("BL" & i & ":BL" & i).Value
 
                    End If
 
'+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
                End If
 
 
 
IncorrectRow:
 
            'Next i
        End With
 
 
 
        If recalc = True Then
 
            ' Do refresh of pivots.
            With Sheets("Mapping Pivots")
 
                ' Activate the Mapping Pivots sheet.
                .Activate
 
 
                ' Refresh the pivot tables.
                For Each pt In .PivotTables
                    pt.RefreshTable
                    pt.Update
                Next
 
            End With
 
        End If
    End With
 
 
    ' Clear all objects.
    Set pt = Nothing
    Set rng = Nothing
    Set var = Nothing
    Set working = Nothing
    Set column_k = Nothing
    Set column_y = Nothing
    Set column_ac = Nothing
    Set column_ad = Nothing
    Set column_ae = Nothing
    Set column_af = Nothing
    Set column_ah = Nothing
    Set column_ai = Nothing
    Set column_al = Nothing
    Set column_am = Nothing
    Set column_at = Nothing
    Set column_au = Nothing
 
End Sub
 
 
' For any row that has adjusted values different than the original value it recalculates the values against that row.
' It does this by putting formulae back in only for the specific row and then performing the recalc.
' Later the formula are replaced by values again.
Sub M11208_Recalc_changed_adjusted_rows_Array_NEW()
 
    Dim lastrow_SHEETNAME1 As Long
    Dim lastrow_FinalABC As Long
 
    Dim recalc As Boolean
    Dim recalc_row As Boolean
 
    Dim FinalABC_ISIN As String
    Dim SHEETNAME1_ISIN As String
    Dim rng As Range
    Dim var As Variant
 
    Dim i As Long
    Dim J As Long
 
    Dim tmpMonth1 As String
    Dim tmpMonth2 As String
 
    Dim pt As PivotTable
 
    Dim column_k As Variant
    Dim column_y As Variant
    Dim column_ac As Variant
    Dim column_ad As Variant
    Dim column_ae As Variant
    Dim column_af As Variant
    Dim column_ah As Variant
    Dim column_ai As Variant
    Dim column_al As Variant
    Dim column_am As Variant
    Dim column_at As Variant
    Dim column_au As Variant
 
    Dim working As Variant
 
 
    ' Initialize global vars.
    Call Z00000_Init
 
 
    ' Ask user.
    If ctrl_ask_before_running_subroutine = True Then
        If MsgBox("Recalc changed adjusted FinalABC rows?", vbYesNo) = vbNo Then Exit Sub
    End If
 
 
 
    With Workbooks(wb_name)
 
        ' Get how many rows of data have been loaded into the sheet.
        lastrow_SHEETNAME1 = .Sheets("SHEETNAME1").Cells(Rows.Count, 4).End(xlUp).Row
        ' Prevent line 2 being deleted - as this contains the formulae which need coping down later.
        If lastrow_SHEETNAME1 < 3 Then
            lastrow_SHEETNAME1 = 3
        End If
 
        lastrow_FinalABC = .Sheets("FinalABC").Cells(Rows.Count, 4).End(xlUp).Row
        ' Prevent line 2 being deleted - as this contains the formulae which need coping down later.
        If lastrow_FinalABC < 3 Then
            lastrow_FinalABC = 3
        End If
 
 
        ' Loop through every row in SHEETNAME1 and check if any adjusted cell differs from the original.
        ' If so then continues with the recalc.
        recalc = False
 
 
        ReDim working(1 To lastrow_SHEETNAME1, 1) ' Working array
        ReDim column_k(1 To lastrow_SHEETNAME1, 1)
        ReDim column_y(1 To lastrow_SHEETNAME1, 1)
        ReDim column_ac(1 To lastrow_SHEETNAME1, 1)
        ReDim column_ad(1 To lastrow_SHEETNAME1, 1)
        ReDim column_ae(1 To lastrow_SHEETNAME1, 1)
        ReDim column_af(1 To lastrow_SHEETNAME1, 1)
        ReDim column_ah(1 To lastrow_SHEETNAME1, 1)
        ReDim column_ai(1 To lastrow_SHEETNAME1, 1)
        ReDim column_al(1 To lastrow_SHEETNAME1, 1)
        ReDim column_am(1 To lastrow_SHEETNAME1, 1)
        ReDim column_at(1 To lastrow_SHEETNAME1, 1)
        ReDim column_au(1 To lastrow_SHEETNAME1, 1)
 
 
        If recalc = True Then
 
            ' Do refresh of pivots.
            With Sheets("Mapping Pivots")
 
                ' Activate the Mapping Pivots sheet.
                .Activate
 
 
                ' Refresh the pivot tables.
                For Each pt In .PivotTables
                    pt.RefreshTable
                    pt.Update
                Next
 
            End With
 
        End If
 
 
 
 
        '*********************************************************************************************
        ' Check FinalABC for adjustment changes.
 
        ' Loop through every row in SHEETNAME1 and check if any adjusted cell differs from the original.
        ' If so then continues with the recalc.
 
 
            i = Application.InputBox _
                (Prompt:="Please enter which line to recalc in the FinalABC sheet.", _
                    Title:="FinalABC line to recalc", Type:=1)
 
            If i < LBound(working) Then
               GoTo IncorrectRow
            End If
 
            If i > UBound(working) Then
                GoTo IncorrectRow
            End If
 
 
        'For i = 2 To lastrow_FinalABC
 
            ' Default to false
            recalc_row = False
            recalc = False
 
 
            ' Check FinalABC for changes.
            With .Sheets("FinalABC")
 
                ' Activate the sheet.
                .Activate
 
 
 
 
                ' USD Adjustments.
                If .Range("J" & i).Value <> "" Then
                    recalc_row = True
                End If
 
 
                ' Tax Rate Adjusted
                If .Range("R" & i).Value <> "" Then
                    recalc_row = True
                End If
 
 
                ' Adjusted date.
                tmpMonth1 = UCase(Left(.Range("F" & i).Value, 3))
                tmpMonth2 = UCase(Left(Right(.Range("A" & i).Value, 8), 3))
 
                If (tmpMonth1 <> tmpMonth2) Then
                    recalc_row = True
                End If
 
 
                ' Check if recalc_row is true.
                If recalc_row = True Then
 
                    ' Set recalc to true
                    recalc = True
 
 
                    ' Convert all formula cells in the row back to formulae.
                    .Range("K" & i & ":K" & i).Formula = .Range("K2:K2").FormulaR1C1
                    .Range("L" & i & ":L" & i).Formula = .Range("L2:L2").FormulaR1C1
                    .Range("M" & i & ":M" & i).Formula = .Range("M2:M2").FormulaR1C1
                    .Range("N" & i & ":N" & i).Formula = .Range("N2:N2").FormulaR1C1
                    .Range("P" & i & ":P" & i).Formula = .Range("P2:P2").FormulaR1C1
                    .Range("Q" & i & ":Q" & i).Formula = .Range("Q2:Q2").FormulaR1C1
                    .Range("AI" & i & ":AI" & i).Formula = .Range("AI2:AI2").FormulaR1C1
                    .Range("AJ" & i & ":AJ" & i).Formula = .Range("AJ2:AJ2").FormulaR1C1
                    .Range("AK" & i & ":AK" & i).Formula = .Range("AK2:AK2").FormulaR1C1
                    .Range("AL" & i & ":AL" & i).Formula = .Range("AL2:AL2").FormulaR1C1
                    .Range("AM" & i & ":AM" & i).Formula = .Range("AM2:AM2").FormulaR1C1
                    .Range("AR" & i & ":AR" & i).Formula = .Range("AR2:AR2").FormulaR1C1
                    .Range("AS" & i & ":AS" & i).Formula = .Range("AS2:AS2").FormulaR1C1
                    .Range("AT" & i & ":AT" & i).Formula = .Range("AT2:AT2").FormulaR1C1
 
 
                    ' Recalculate the entire row.
                    .Range("A" & i & ":AT" & i).Calculate
 
 
                    ' Get starting position of the affected ISIN within the SHEETNAME1 sheet.
                    FinalABC_ISIN = .Range("A" & i).Value
                End If
 
            End With
 
 
            If recalc = True Then
 
                ' Do refresh of Mapping pivots
                With .Sheets("Mapping Pivots")
 
                    ' Activate the sheet.
                    .Activate
 
 
                    ' Refresh the pivots.
                    For Each pt In .PivotTables
                        pt.RefreshTable
                        pt.Update
                    Next
 
                End With
 
 
                ' Now get index of first row in SHEETNAME1 sheet that contains same affected ISIN.
                With .Sheets("SHEETNAME1")
 
                    Set rng = .Range("A1:A" & lastrow_SHEETNAME1)
 
                    If WorksheetFunction.CountIf(rng, FinalABC_ISIN) > 0 Then
 
                        var = WorksheetFunction.Match(FinalABC_ISIN, rng, 0)
 
                        If Not IsError(var) Then
 
                            J = var
                            SHEETNAME1_ISIN = .Range("A" & J).Value
 
 
                            ' For every row that has same ISIN re-enable formulae in SHEETNAME1 sheet.
                            ' Convert all formula cells in the row back to formulae.
                            While .Range("A" & J).Value = SHEETNAME1_ISIN
 
                                .Range("A" & J & ":A" & J).Formula = .Range("A2:A2").FormulaR1C1
                                .Range("B" & J & ":B" & J).Formula = .Range("B2:B2").FormulaR1C1
                                .Range("F" & J & ":F" & J).Formula = .Range("F2:F2").FormulaR1C1
                                .Range("H" & J & ":H" & J).Formula = .Range("H2:H2").FormulaR1C1
                                .Range("J" & J & ":J" & J).Formula = .Range("J2:J2").FormulaR1C1
                                .Range("L" & J & ":L" & J).Formula = .Range("L2:L2").FormulaR1C1
                                .Range("M" & J & ":M" & J).Formula = .Range("M2:M2").FormulaR1C1
                                .Range("T" & J & ":T" & J).Formula = .Range("T2:T2").FormulaR1C1
                                .Range("V" & J & ":V" & J).Formula = .Range("V2:V2").FormulaR1C1
                                .Range("W" & J & ":W" & J).Formula = .Range("W2:W2").FormulaR1C1
                                .Range("X" & J & ":X" & J).Formula = .Range("X2:X2").FormulaR1C1
                                .Range("AB" & J & ":AB" & J).Formula = .Range("AB2:AB2").FormulaR1C1
                                .Range("AC" & J & ":AD" & J).Formula = .Range("AC2:AC2").FormulaR1C1
                                .Range("AE" & J & ":AE" & J).Formula = .Range("AE2:AE2").FormulaR1C1
                                .Range("AG" & J & ":AG" & J).Formula = .Range("AG2:AG2").FormulaR1C1
                                .Range("AH" & J & ":AH" & J).Formula = .Range("AH2:AH2").FormulaR1C1
                                .Range("AJ" & J & ":AJ" & J).Formula = .Range("AJ2:AJ2").FormulaR1C1
                                .Range("AK" & J & ":AK" & J).Formula = .Range("AK2:AK2").FormulaR1C1
                                .Range("AL" & J & ":AL" & J).Formula = .Range("AL2:AL2").FormulaR1C1
                                .Range("AN" & J & ":AN" & J).Formula = .Range("AN2:AN2").FormulaR1C1
                                .Range("AO" & J & ":AO" & J).Formula = .Range("AO2:AO2").FormulaR1C1
                                .Range("AP" & J & ":AP" & J).Formula = .Range("AP2:AP2").FormulaR1C1
                                .Range("AQ" & J & ":AQ" & J).Formula = .Range("AQ2:AQ2").FormulaR1C1
                                .Range("AR" & J & ":AR" & J).Formula = .Range("AR2:AR2").FormulaR1C1
                                .Range("AS" & J & ":AS" & J).Formula = .Range("AS2:AS2").FormulaR1C1
                                .Range("AT" & J & ":AT" & J).Formula = .Range("AT2:AT2").FormulaR1C1
                                .Range("AV" & J & ":AV" & J).Formula = .Range("AV2:AV2").FormulaR1C1
                                .Range("AW" & J & ":AW" & J).Formula = .Range("AW2:AW2").FormulaR1C1
                                .Range("AX" & J & ":AX" & J).Formula = .Range("AX2:AX2").FormulaR1C1
                                .Range("AY" & J & ":AY" & J).Formula = .Range("AY2:AY2").FormulaR1C1
                                .Range("BB" & J & ":BB" & J).Formula = .Range("BB2:BB2").FormulaR1C1
                                .Range("BD" & J & ":BD" & J).Formula = .Range("BD2:BD2").FormulaR1C1
                                .Range("BE" & J & ":BE" & J).Formula = .Range("BE2:BE2").FormulaR1C1
                                .Range("BG" & J & ":BG" & J).Formula = .Range("BG2:BG2").FormulaR1C1
                                .Range("BH" & J & ":BH" & J).Formula = .Range("BH2:BH2").FormulaR1C1
                                .Range("BI" & J & ":BI" & J).Formula = .Range("BI2:BI2").FormulaR1C1
                                .Range("BJ" & J & ":BJ" & J).Formula = .Range("BJ2:BJ2").FormulaR1C1
                                .Range("BK" & J & ":BK" & J).Formula = .Range("BK2:BK2").FormulaR1C1
                                .Range("BL" & J & ":BL" & J).Formula = .Range("BL2:BL2").FormulaR1C1
 
 
                                ' Recalculate the entire row.
                                .Range("A" & J & ":BO" & J).Calculate
 
 
                                ' next row
                                J = J + 1
                            Wend
 
                        Else
                            Message "The ISIN " & SHEETNAME1_ISIN & " cannot be found in the FinalABC sheet."
                        End If
                    End If
 
                End With
 
 
                ' Recalculate all worksheets.
                Application.Calculate
 
 
                ' Now convert all impacted formulae back to values.
                'TODO. loop through SHEETNAME1 as above and change formulae to values for any row impacted.
 
 
                ' Convert all formulae on the FinalABC sheet to values.  Leaves row 2 alone.
                If (i > 2) Then     ' leave row 2 alone, i.e. leave as formulae.
                    With .Sheets("FinalABC")
 
                        ' Activate the sheet.
                        .Activate
 
                        .Range("K" & i & ":K" & i) = .Range("K" & i & ":K" & i).Value
                        .Range("L" & i & ":L" & i) = .Range("L" & i & ":L" & i).Value
                        .Range("M" & i & ":M" & i) = .Range("M" & i & ":M" & i).Value
                        .Range("N" & i & ":N" & i) = .Range("N" & i & ":N" & i).Value
                        .Range("P" & i & ":P" & i) = .Range("P" & i & ":P" & i).Value
                        .Range("Q" & i & ":Q" & i) = .Range("Q" & i & ":Q" & i).Value
                        .Range("AI" & i & ":AI" & i) = .Range("AI" & i & ":AI" & i).Value
                        .Range("AJ" & i & ":AJ" & i) = .Range("AJ" & i & ":AJ" & i).Value
                        .Range("AK" & i & ":AK" & i) = .Range("AK" & i & ":AK" & i).Value
                        .Range("AL" & i & ":AL" & i) = .Range("AL" & i & ":AL" & i).Value
                        .Range("AM" & i & ":AM" & i) = .Range("AM" & i & ":AM" & i).Value
                        .Range("AR" & i & ":AR" & i) = .Range("AR" & i & ":AR" & i).Value
                        .Range("AS" & i & ":AS" & i) = .Range("AS" & i & ":AS" & i).Value
                        .Range("AT" & i & ":AT" & i) = .Range("AT" & i & ":AT" & i).Value
                    End With
                End If
 
 
 
                ' Convert all formulae on the SHEETNAME1 sheet to values.  Leaves row 2 alone.
                With .Sheets("SHEETNAME1")
 
                    ' Activate the sheet.
                    .Activate
 
 
                    ' Now get index of first row in SHEETNAME1 sheet that contains same affected ISIN.
                    Set rng = .Range("A1:A" & lastrow_SHEETNAME1)
 
                    If WorksheetFunction.CountIf(rng, FinalABC_ISIN) > 0 Then
 
                        var = WorksheetFunction.Match(FinalABC_ISIN, rng, 0)
 
                        If Not IsError(var) Then
 
                            J = var
                            SHEETNAME1_ISIN = .Range("A" & J).Value
 
 
                            ' For every row that has same ISIN re-enable formulae in SHEETNAME1 sheet.
                            ' Convert all formula cells in the row back to values.
                            While .Range("A" & J).Value = SHEETNAME1_ISIN
                                If (J > 2) Then     ' leave row 2 alone, i.e. leave as formulae.
                                    .Range("A" & J & ":A" & J) = .Range("A" & J & ":A" & J).Value
                                    .Range("B" & J & ":B" & J) = .Range("B" & J & ":B" & J).Value
                                    .Range("F" & J & ":F" & J) = .Range("F" & J & ":F" & J).Value
                                    .Range("H" & J & ":H" & J) = .Range("H" & J & ":H" & J).Value
                                    .Range("J" & J & ":J" & J) = .Range("J" & J & ":J" & J).Value
                                    .Range("L" & J & ":L" & J) = .Range("L" & J & ":L" & J).Value
                                    .Range("M" & J & ":M" & J) = .Range("M" & J & ":M" & J).Value
                                    .Range("T" & J & ":T" & J) = .Range("T" & J & ":T" & J).Value
                                    .Range("V" & J & ":V" & J) = .Range("V" & J & ":V" & J).Value
                                    .Range("W" & J & ":W" & J) = .Range("W" & J & ":W" & J).Value
                                    .Range("X" & J & ":X" & J) = .Range("X" & J & ":X" & J).Value
                                    .Range("AB" & J & ":AB" & J) = .Range("AB" & J & ":AB" & J).Value
                                    .Range("AC" & J & ":AC" & J) = .Range("AC" & J & ":AC" & J).Value
                                    .Range("AE" & J & ":AE" & J) = .Range("AE" & J & ":AE" & J).Value
                                    .Range("AG" & J & ":AG" & J) = .Range("AG" & J & ":AG" & J).Value
                                    .Range("AH" & J & ":AH" & J) = .Range("AH" & J & ":AH" & J).Value
                                    .Range("AJ" & J & ":AJ" & J) = .Range("AJ" & J & ":AJ" & J).Value
                                    .Range("AK" & J & ":AK" & J) = .Range("AK" & J & ":AK" & J).Value
                                    .Range("AL" & J & ":AL" & J) = .Range("AL" & J & ":AL" & J).Value
                                    .Range("AN" & J & ":AN" & J) = .Range("AN" & J & ":AN" & J).Value
                                    .Range("AO" & J & ":AO" & J) = .Range("AO" & J & ":AO" & J).Value
                                    .Range("AP" & J & ":AP" & J) = .Range("AP" & J & ":AP" & J).Value
                                    .Range("AQ" & J & ":AQ" & J) = .Range("AQ" & J & ":AQ" & J).Value
                                    .Range("AR" & J & ":AR" & J) = .Range("AR" & J & ":AR" & J).Value
                                    .Range("AS" & J & ":AS" & J) = .Range("AS" & J & ":AS" & J).Value
                                    .Range("AT" & J & ":AT" & J) = .Range("AT" & J & ":AT" & J).Value
                                    .Range("AV" & J & ":AV" & J) = .Range("AV" & J & ":AV" & J).Value
                                    .Range("AW" & J & ":AW" & J) = .Range("AW" & J & ":AW" & J).Value
                                    .Range("AX" & J & ":AX" & J) = .Range("AX" & J & ":AX" & J).Value
                                    .Range("AY" & J & ":AY" & J) = .Range("AY" & J & ":AY" & J).Value
                                    .Range("BB" & J & ":BB" & J) = .Range("BB" & J & ":BB" & J).Value
                                    .Range("BD" & J & ":BD" & J) = .Range("BD" & J & ":BD" & J).Value
                                    .Range("BE" & J & ":BE" & J) = .Range("BE" & J & ":BE" & J).Value
                                    .Range("BG" & J & ":BG" & J) = .Range("BG" & J & ":BG" & J).Value
                                    .Range("BH" & J & ":BH" & J) = .Range("BH" & J & ":BH" & J).Value
                                    .Range("BI" & J & ":BI" & J) = .Range("BI" & J & ":BI" & J).Value
                                    .Range("BJ" & J & ":BJ" & J) = .Range("BJ" & J & ":BJ" & J).Value
                                    .Range("BK" & J & ":BK" & J) = .Range("BK" & J & ":BK" & J).Value
                                    .Range("BL" & J & ":BL" & J) = .Range("BL" & J & ":BL" & J).Value
                                End If
 
                                ' next row
                                J = J + 1
                            Wend
                        Else
                            Message "The ISIN " & FinalABC_ISIN & " cannot be found in the SHEETNAME1 sheet."
                        End If
                    End If
                End With
            End If
IncorrectRow:
        'Next i
 
    End With
 
 
    ' Clear all objects.
    Set pt = Nothing
    Set rng = Nothing
    Set var = Nothing
    Set working = Nothing
    Set column_k = Nothing
    Set column_y = Nothing
    Set column_ac = Nothing
    Set column_ad = Nothing
    Set column_ae = Nothing
    Set column_af = Nothing
    Set column_ah = Nothing
    Set column_ai = Nothing
    Set column_al = Nothing
    Set column_am = Nothing
    Set column_at = Nothing
    Set column_au = Nothing
 
End Sub
 
 
 
 
' For any row that has adjusted values different than the original value it recalculates the values against that row.
' It does this by putting formulae back in only for the specific row and then performing the recalc.
' Later the formula are replaced by values again.
Sub M11210_Recalc_changed_adjusted_rows()
 
    Dim lastrow_SHEETNAME1 As Long
    Dim lastrow_FinalABC As Long
 
    Dim sheet As Worksheet
 
    Dim recalc As Boolean
    Dim recalc_row As Boolean
 
    Dim FinalABC_ISIN As String
    Dim SHEETNAME1_ISIN As String
    Dim rng As Range
    Dim var As Variant
 
    Dim i As Long
    Dim J As Long
 
    Dim tmpMonth1 As String
    Dim tmpMonth2 As String
 
    Dim pt As PivotTable
 
 
    ' Initialize global vars.
    Call Z00000_Init
 
 
    ' Ask user.
    If ctrl_ask_before_running_subroutine = True Then
        If MsgBox("Recalc changed adjusted SHEETNAME1 rows?", vbYesNo) = vbNo Then Exit Sub
    End If
 
 
 
    With Workbooks(wb_name)
 
        ' Get how many rows of data have been loaded into the sheet.
        lastrow_SHEETNAME1 = .Sheets("SHEETNAME1").Cells(Rows.Count, 4).End(xlUp).Row
        lastrow_FinalABC = .Sheets("FinalABC").Cells(Rows.Count, 4).End(xlUp).Row
        ' Prevent line 2 being deleted - as this contains the formulae which need coping down later.
        If lastrow_SHEETNAME1 < 3 Then
            lastrow_SHEETNAME1 = 3
        End If
        If lastrow_FinalABC < 3 Then
            lastrow_FinalABC = 3
        End If
 
 
        ' Loop through every row in SHEETNAME1 and check if any adjusted cell differs from the original.
        ' If so then continues with the recalc.
        recalc = False
 
 
 
        ' Check SHEETNAME1 for changes.
         With .Sheets("SHEETNAME1")
 
            ' Activate the sheet.
            .Activate
 
 
            For i = 2 To lastrow_SHEETNAME1
            'For i = lastrow To lastrow ' for testing area below.
 
                ' Default to false
                recalc_row = False
 
 
                ' Tax rate adjusted.
                If .Range("K" & i).Text <> "" Then
                    recalc_row = True
                End If
 
 
                ' Include / Exclude
                If .Range("Y" & i).Text <> "INCLUDE" Then
                    recalc_row = True
                End If
 
 
                ' Income Code Adjusted.
                If .Range("AD" & i).Text <> .Range("AC" & i).Text Then
                    recalc_row = True
                End If
 
 
                ' Exemption Code Adjusted.
                If .Range("AF" & i).Text <> .Range("AE" & i).Text Then
                    recalc_row = True
                End If
 
 
                ' BBH Rate Adjusted.
                If .Range("AI" & i).Text <> .Range("AH" & i).Text Then
                    recalc_row = True
                End If
 
 
                ' BBH CCY Adjusted.
                If .Range("AM" & i).Text <> .Range("AL" & i).Text Then
                    recalc_row = True
                End If
 
 
                ' Suggested Rate Adjusted.
                If .Range("AU" & i).Text <> .Range("AT" & i).Text Then
                    recalc_row = True
                End If
 
 
                ' Check if recalc_row is true.
                If recalc_row = True Then
                    ' Set recalc to true
                    recalc = True
 
                    ' Convert all formula cells in the row back to formulae.
                    .Range("A" & i & ":A" & i).Formula = .Range("A2:A2").FormulaR1C1
                    .Range("B" & i & ":B" & i).Formula = .Range("B2:B2").FormulaR1C1
                    .Range("F" & i & ":F" & i).Formula = .Range("F2:F2").FormulaR1C1
                    .Range("H" & i & ":H" & i).Formula = .Range("H2:H2").FormulaR1C1
                    .Range("J" & i & ":J" & i).Formula = .Range("J2:J2").FormulaR1C1
                    .Range("L" & i & ":L" & i).Formula = .Range("L2:L2").FormulaR1C1
                    .Range("M" & i & ":M" & i).Formula = .Range("M2:M2").FormulaR1C1
                    .Range("T" & i & ":T" & i).Formula = .Range("T2:T2").FormulaR1C1
                    .Range("V" & i & ":V" & i).Formula = .Range("V2:V2").FormulaR1C1
                    .Range("W" & i & ":W" & i).Formula = .Range("W2:W2").FormulaR1C1
                    .Range("X" & i & ":X" & i).Formula = .Range("X2:X2").FormulaR1C1
                    .Range("AB" & i & ":AB" & i).Formula = .Range("AB2:AB2").FormulaR1C1
                    .Range("AC" & i & ":AC" & i).Formula = .Range("AC2:AC2").FormulaR1C1
                    .Range("AE" & i & ":AE" & i).Formula = .Range("AE2:AE2").FormulaR1C1
                    .Range("AG" & i & ":AG" & i).Formula = .Range("AG2:AG2").FormulaR1C1
                    .Range("AH" & i & ":AH" & i).Formula = .Range("AH2:AH2").FormulaR1C1
                    .Range("AJ" & i & ":AJ" & i).Formula = .Range("AJ2:AJ2").FormulaR1C1
                    .Range("AK" & i & ":AK" & i).Formula = .Range("AK2:AK2").FormulaR1C1
                    .Range("AL" & i & ":AL" & i).Formula = .Range("AL2:AL2").FormulaR1C1
                    .Range("AN" & i & ":AN" & i).Formula = .Range("AN2:AN2").FormulaR1C1
                    .Range("AO" & i & ":AO" & i).Formula = .Range("AO2:AO2").FormulaR1C1
                    .Range("AP" & i & ":AP" & i).Formula = .Range("AP2:AP2").FormulaR1C1
                    .Range("AQ" & i & ":AQ" & i).Formula = .Range("AQ2:AQ2").FormulaR1C1
                    .Range("AR" & i & ":AR" & i).Formula = .Range("AR2:AR2").FormulaR1C1
                    .Range("AS" & i & ":AS" & i).Formula = .Range("AS2:AS2").FormulaR1C1
                    .Range("AT" & i & ":AT" & i).Formula = .Range("AT2:AT2").FormulaR1C1
                    .Range("AV" & i & ":AV" & i).Formula = .Range("AV2:AV2").FormulaR1C1
                    .Range("AW" & i & ":AW" & i).Formula = .Range("AW2:AW2").FormulaR1C1
                    .Range("AX" & i & ":AX" & i).Formula = .Range("AX2:AX2").FormulaR1C1
                    .Range("AY" & i & ":AY" & i).Formula = .Range("AY2:AY2").FormulaR1C1
                    .Range("BB" & i & ":BB" & i).Formula = .Range("BB2:BB2").FormulaR1C1
                    .Range("BD" & i & ":BD" & i).Formula = .Range("BD2:BD2").FormulaR1C1
                    .Range("BE" & i & ":BE" & i).Formula = .Range("BE2:BE2").FormulaR1C1
                    .Range("BG" & i & ":BG" & i).Formula = .Range("BG2:BG2").FormulaR1C1
                    .Range("BH" & i & ":BH" & i).Formula = .Range("BH2:BH2").FormulaR1C1
                    .Range("BI" & i & ":BI" & i).Formula = .Range("BI2:BI2").FormulaR1C1
                    .Range("BJ" & i & ":BJ" & i).Formula = .Range("BJ2:BJ2").FormulaR1C1
                    .Range("BK" & i & ":BK" & i).Formula = .Range("BK2:BK2").FormulaR1C1
                    .Range("BL" & i & ":BL" & i).Formula = .Range("BL2:BL2").FormulaR1C1
 
                    ' Recalculate the entire row.
                    .Range("A" & i & ":BO" & i).Calculate
                End If
 
            Next i
        End With
 
 
        If recalc = True Then
 
            ' Refresh all impacted formula on the FinalABC sheet.
            With Sheets("FinalABC")
 
                ' Activate the FinalABC sheet.
                .Activate
 
                .Range("K2:K2").AutoFill Destination:=.Range("K2:K" & lastrow_FinalABC)
                .Range("L2:L2").AutoFill Destination:=.Range("L2:L" & lastrow_FinalABC)
                .Range("M2:M2").AutoFill Destination:=.Range("M2:M" & lastrow_FinalABC)
                .Range("N2:N2").AutoFill Destination:=.Range("N2:N" & lastrow_FinalABC)
                .Range("P2:P2").AutoFill Destination:=.Range("P2:P" & lastrow_FinalABC)
                .Range("Q2:Q2").AutoFill Destination:=.Range("Q2:Q" & lastrow_FinalABC)
                .Range("AI2:AI2").AutoFill Destination:=.Range("AI2:AI" & lastrow_FinalABC)
                .Range("AJ2:AJ2").AutoFill Destination:=.Range("AJ2:AJ" & lastrow_FinalABC)
                .Range("AK2:AK2").AutoFill Destination:=.Range("AK2:AK" & lastrow_FinalABC)
                .Range("AL2:AL2").AutoFill Destination:=.Range("AL2:AL" & lastrow_FinalABC)
                .Range("AM2:AM2").AutoFill Destination:=.Range("AM2:AM" & lastrow_FinalABC)
                .Range("AR2:AR2").AutoFill Destination:=.Range("AR2:AR" & lastrow_FinalABC)
                .Range("AS2:AS2").AutoFill Destination:=.Range("AS2:AS" & lastrow_FinalABC)
                .Range("AT2:AT2").AutoFill Destination:=.Range("AT2:AT" & lastrow_FinalABC)
 
                ' Recalculate the entire row.
                '.Range("AK2:AK" & FinalABC_lastrow).Calculate
 
            End With
 
 
            ' Recalculate all worksheets.
            Application.Calculate
 
 
            ' Do refresh of pivots.
            With Sheets("Mapping Pivots")
 
                ' Activate the Mapping Pivots sheet.
                .Activate
 
 
                ' Refresh the pivot tables.
                For Each pt In .PivotTables
                    pt.RefreshTable
                    pt.Update
                Next
 
            End With
 
 
            ' Recalculate all worksheets again to pick up Pivot values.
            Application.Calculate
 
 
            ' Now convert all impacted formulae back to values.
            'TODO. loop through SHEETNAME1 as above and change formulae to values for any row impacted.
 
 
            ' Convert all formulae on the FinalABC sheet to values.  Leaves row 2 alone.
            With Sheets("FinalABC")
 
                ' Activate the sheet.
                .Activate
 
 
                .Range("K3:K" & lastrow_FinalABC) = .Range("K3:K" & lastrow_FinalABC).Value
                .Range("L3:L" & lastrow_FinalABC) = .Range("L3:L" & lastrow_FinalABC).Value
                .Range("M3:M" & lastrow_FinalABC) = .Range("M3:M" & lastrow_FinalABC).Value
                .Range("N3:N" & lastrow_FinalABC) = .Range("N3:N" & lastrow_FinalABC).Value
                .Range("P3:P" & lastrow_FinalABC) = .Range("P3:P" & lastrow_FinalABC).Value
                .Range("Q3:Q" & lastrow_FinalABC) = .Range("Q3:Q" & lastrow_FinalABC).Value
                .Range("AI3:AI" & lastrow_FinalABC) = .Range("AI3:AI" & lastrow_FinalABC).Value
                .Range("AJ3:AJ" & lastrow_FinalABC) = .Range("AJ3:AJ" & lastrow_FinalABC).Value
                .Range("AK3:AK" & lastrow_FinalABC) = .Range("AK3:AK" & lastrow_FinalABC).Value
                .Range("AL3:AL" & lastrow_FinalABC) = .Range("AL3:AL" & lastrow_FinalABC).Value
                .Range("AM3:AM" & lastrow_FinalABC) = .Range("AM3:AM" & lastrow_FinalABC).Value
                .Range("AR3:AR" & lastrow_FinalABC) = .Range("AR3:AR" & lastrow_FinalABC).Value
                .Range("AS3:AS" & lastrow_FinalABC) = .Range("AS3:AS" & lastrow_FinalABC).Value
                .Range("AT3:AT" & lastrow_FinalABC) = .Range("AT3:AT" & lastrow_FinalABC).Value
 
            End With
 
        End If
 
 
        ' Convert all formulae on the SHEETNAME1 sheet to values.  Leaves row 2 alone.
        ' Loop through every row in SHEETNAME1 and check if any adjusted cell differs from the original.
        ' If so then continues with the changing of the formula back to values.
        recalc = False
 
        For i = 2 To lastrow_SHEETNAME1
 
            ' Default to false
            recalc_row = False
 
 
            ' Check SHEETNAME1 for changes.
            With .Sheets("SHEETNAME1")
 
                ' Tax rate adjusted.
                If .Range("K" & i).Text <> "" Then
                    recalc_row = True
                End If
 
 
                ' Include / Exclude
                If .Range("Y" & i).Text <> "INCLUDE" Then
                    recalc_row = True
                End If
 
 
                ' Income Code Adjusted.
                If .Range("AD" & i).Text <> .Range("AC" & i).Text Then
                    recalc_row = True
                End If
 
 
                ' Exemption Code Adjusted.
                If .Range("AF" & i).Text <> .Range("AE" & i).Text Then
                    recalc_row = True
                End If
 
 
                ' BBH Rate Adjusted.
                If .Range("AI" & i).Text <> .Range("AH" & i).Text Then
                    recalc_row = True
                End If
 
 
                ' BBH CCY Adjusted.
                If .Range("AM" & i).Text <> .Range("AL" & i).Text Then
                    recalc_row = True
                End If
 
 
                ' Suggested Rate Adjusted.
                If .Range("AU" & i).Text <> .Range("AT" & i).Text Then
                    recalc_row = True
                End If
 
 
                ' Check if recalc_row is true.
                If recalc_row = True Then
 
                    ' Set recalc to true
                    'recalc = True
 
                    If (i > 2) Then     ' leave row 2 alone, i.e. leave as formulae.
                        .Range("A" & i & ":A" & i) = .Range("A" & i & ":A" & i).Value
                        .Range("B" & i & ":B" & i) = .Range("B" & i & ":B" & i).Value
                        .Range("F" & i & ":F" & i) = .Range("F" & i & ":F" & i).Value
                        .Range("H" & i & ":H" & i) = .Range("H" & i & ":H" & i).Value
                        .Range("J" & i & ":J" & i) = .Range("J" & i & ":J" & i).Value
                        .Range("L" & i & ":L" & i) = .Range("L" & i & ":L" & i).Value
                        .Range("M" & i & ":M" & i) = .Range("M" & i & ":L" & i).Value
                        .Range("T" & i & ":T" & i) = .Range("T" & i & ":T" & i).Value
                        .Range("V" & i & ":V" & i) = .Range("V" & i & ":V" & i).Value
                        .Range("W" & i & ":W" & i) = .Range("W" & i & ":W" & i).Value
                        .Range("X" & i & ":X" & i) = .Range("X" & i & ":X" & i).Value
                        .Range("AB" & i & ":AB" & i) = .Range("AB" & i & ":AB" & i).Value
                        .Range("AC" & i & ":AC" & i) = .Range("AC" & i & ":AC" & i).Value
                        .Range("AE" & i & ":AE" & i) = .Range("AE" & i & ":AE" & i).Value
                        .Range("AG" & i & ":AG" & i) = .Range("AG" & i & ":AG" & i).Value
                        .Range("AH" & i & ":AH" & i) = .Range("AH" & i & ":AG" & i).Value
                        .Range("AJ" & i & ":AJ" & i) = .Range("AJ" & i & ":AH" & i).Value
                        .Range("AK" & i & ":AK" & i) = .Range("AK" & i & ":AK" & i).Value
                        .Range("AL" & i & ":AL" & i) = .Range("AL" & i & ":AL" & i).Value
                        .Range("AN" & i & ":AN" & i) = .Range("AN" & i & ":AN" & i).Value
                        .Range("AO" & i & ":AO" & i) = .Range("AO" & i & ":AO" & i).Value
                        .Range("AP" & i & ":AP" & i) = .Range("AP" & i & ":AP" & i).Value
                        .Range("AQ" & i & ":AQ" & i) = .Range("AQ" & i & ":AQ" & i).Value
                        .Range("AR" & i & ":AR" & i) = .Range("AR" & i & ":AR" & i).Value
                        .Range("AS" & i & ":AS" & i) = .Range("AS" & i & ":AS" & i).Value
                        .Range("AT" & i & ":AT" & i) = .Range("AT" & i & ":AT" & i).Value
                        .Range("AV" & i & ":AV" & i) = .Range("AV" & i & ":AV" & i).Value
                        .Range("AW" & i & ":AW" & i) = .Range("AW" & i & ":AW" & i).Value
                        .Range("AX" & i & ":AX" & i) = .Range("AX" & i & ":AX" & i).Value
                        .Range("AY" & i & ":AY" & i) = .Range("AY" & i & ":AY" & i).Value
                        .Range("BB" & i & ":BB" & i) = .Range("BB" & i & ":BB" & i).Value
                        .Range("BD" & i & ":BD" & i) = .Range("BD" & i & ":BD" & i).Value
                        .Range("BE" & i & ":BE" & i) = .Range("BE" & i & ":BE" & i).Value
                        .Range("BG" & i & ":BG" & i) = .Range("BG" & i & ":BG" & i).Value
                        .Range("BH" & i & ":BH" & i) = .Range("BH" & i & ":BH" & i).Value
                        .Range("BI" & i & ":BI" & i) = .Range("BI" & i & ":BI" & i).Value
                        .Range("BJ" & i & ":BJ" & i) = .Range("BJ" & i & ":BJ" & i).Value
                        .Range("BK" & i & ":BK" & i) = .Range("BK" & i & ":BK" & i).Value
                        .Range("BL" & i & ":BL" & i) = .Range("BL" & i & ":BL" & i).Value
                    End If
                End If
            End With
        Next i
 
 
        '*********************************************************************************************
        ' Check FinalABC for adjustment changes.
 
        ' Loop through every row in SHEETNAME1 and check if any adjusted cell differs from the original.
        ' If so then continues with the recalc.
        recalc = False
        For i = 2 To lastrow_FinalABC
 
            ' Default to false
            recalc_row = False
 
 
            ' Check FinalABC for changes.
            With .Sheets("FinalABC")
 
                ' Activate the sheet.
                .Activate
 
 
                ' USD Adjustments.
                If .Range("J" & i).Value <> "" Then
                    recalc_row = True
                End If
 
 
                ' Adjusted date.
                tmpMonth1 = UCase(Left(.Range("F" & i).Value, 3))
                tmpMonth2 = UCase(Left(Right(.Range("A" & i).Value, 8), 3))
 
                If (tmpMonth1 <> tmpMonth2) Then
                    recalc_row = True
                End If
 
 
                ' Check if recalc_row is true.
                If recalc_row = True Then
 
                    ' Set recalc to true
                    recalc = True
 
 
                    ' Convert all formula cells in the row back to formulae.
                    .Range("K" & i & ":K" & i).Formula = .Range("K2:K2").FormulaR1C1
                    .Range("L" & i & ":L" & i).Formula = .Range("L2:L2").FormulaR1C1
                    .Range("M" & i & ":M" & i).Formula = .Range("M2:M2").FormulaR1C1
                    .Range("N" & i & ":N" & i).Formula = .Range("N2:N2").FormulaR1C1
                    .Range("P" & i & ":P" & i).Formula = .Range("P2:P2").FormulaR1C1
                    .Range("Q" & i & ":Q" & i).Formula = .Range("Q2:Q2").FormulaR1C1
                    .Range("AI" & i & ":AI" & i).Formula = .Range("AI2:AI2").FormulaR1C1
                    .Range("AJ" & i & ":AJ" & i).Formula = .Range("AJ2:AJ2").FormulaR1C1
                    .Range("AK" & i & ":AK" & i).Formula = .Range("AK2:AK2").FormulaR1C1
                    .Range("AL" & i & ":AL" & i).Formula = .Range("AL2:AL2").FormulaR1C1
                    .Range("AM" & i & ":AM" & i).Formula = .Range("AM2:AM2").FormulaR1C1
                    .Range("AR" & i & ":AR" & i).Formula = .Range("AR2:AR2").FormulaR1C1
                    .Range("AS" & i & ":AS" & i).Formula = .Range("AS2:AS2").FormulaR1C1
                    .Range("AT" & i & ":AT" & i).Formula = .Range("AT2:AT2").FormulaR1C1
 
                    ' Recalculate the entire row.
                    .Range("A" & i & ":AR" & i).Calculate
 
                    ' Get starting position of the affected ISIN within the SHEETNAME1 sheet.
                    FinalABC_ISIN = .Range("A" & i).Value
                End If
 
            End With
 
 
            ' Do refresh of Mapping pivots
            With .Sheets("Mapping Pivots")
 
                ' Activate the sheet.
                .Activate
 
 
                ' Refresh the pivots.
                For Each pt In .PivotTables
                    pt.RefreshTable
                    pt.Update
                Next
 
            End With
 
 
            ' Now get index of first row in SHEETNAME1 sheet that contains same affected ISIN.
            With .Sheets("SHEETNAME1")
 
                Set rng = .Range("A1:A" & lastrow_SHEETNAME1)
 
                If WorksheetFunction.CountIf(rng, FinalABC_ISIN) > 0 Then
 
                    var = WorksheetFunction.Match(FinalABC_ISIN, rng, 0)
 
                    If Not IsError(var) Then
 
                        J = var
                        SHEETNAME1_ISIN = .Range("A" & J).Value
 
 
                        ' For every row that has same ISIN re-enable formulae in SHEETNAME1 sheet.
                        ' Convert all formula cells in the row back to formulae.
                        While .Range("A" & J).Value = SHEETNAME1_ISIN
 
                            .Range("A" & J & ":A" & J).Formula = .Range("A2:A2").FormulaR1C1
                            .Range("B" & J & ":B" & J).Formula = .Range("B2:B2").FormulaR1C1
                            .Range("F" & J & ":F" & J).Formula = .Range("F2:F2").FormulaR1C1
                            .Range("H" & J & ":H" & J).Formula = .Range("H2:H2").FormulaR1C1
                            .Range("J" & J & ":J" & J).Formula = .Range("J2:J2").FormulaR1C1
                            .Range("L" & J & ":L" & J).Formula = .Range("L2:L2").FormulaR1C1
                            .Range("M" & J & ":M" & J).Formula = .Range("M2:M2").FormulaR1C1
                            .Range("T" & J & ":T" & J).Formula = .Range("T2:T2").FormulaR1C1
                            .Range("V" & J & ":V" & J).Formula = .Range("V2:V2").FormulaR1C1
                            .Range("W" & J & ":W" & J).Formula = .Range("W2:W2").FormulaR1C1
                            .Range("X" & J & ":X" & J).Formula = .Range("X2:X2").FormulaR1C1
                            .Range("AB" & J & ":AB" & J).Formula = .Range("AB2:AB2").FormulaR1C1
                            .Range("AC" & J & ":AC" & J).Formula = .Range("AC2:AC2").FormulaR1C1
                            .Range("AE" & J & ":AE" & J).Formula = .Range("AE2:AE2").FormulaR1C1
                            .Range("AG" & J & ":AG" & J).Formula = .Range("AG2:AG2").FormulaR1C1
                            .Range("AH" & J & ":AH" & J).Formula = .Range("AH2:AH2").FormulaR1C1
                            .Range("AJ" & J & ":AJ" & J).Formula = .Range("AJ2:AJ2").FormulaR1C1
                            .Range("AK" & J & ":AK" & J).Formula = .Range("AK2:AK2").FormulaR1C1
                            .Range("AL" & J & ":AL" & J).Formula = .Range("AL2:AL2").FormulaR1C1
                            .Range("AN" & J & ":AN" & J).Formula = .Range("AN2:AN2").FormulaR1C1
                            .Range("AO" & J & ":AO" & J).Formula = .Range("AO2:AO2").FormulaR1C1
                            .Range("AP" & J & ":AP" & J).Formula = .Range("AP2:AP2").FormulaR1C1
                            .Range("AQ" & J & ":AQ" & J).Formula = .Range("AQ2:AQ2").FormulaR1C1
                            .Range("AR" & J & ":AR" & J).Formula = .Range("AR2:AR2").FormulaR1C1
                            .Range("AS" & J & ":AS" & J).Formula = .Range("AS2:AS2").FormulaR1C1
                            .Range("AT" & J & ":AT" & J).Formula = .Range("AT2:AT2").FormulaR1C1
                            .Range("AV" & J & ":AV" & J).Formula = .Range("AV2:AV2").FormulaR1C1
                            .Range("AW" & J & ":AW" & J).Formula = .Range("AW2:AW2").FormulaR1C1
                            .Range("AX" & J & ":AX" & J).Formula = .Range("AX2:AX2").FormulaR1C1
                            .Range("AY" & J & ":AY" & J).Formula = .Range("AY2:AY2").FormulaR1C1
                            .Range("BB" & J & ":BB" & J).Formula = .Range("BB2:BB2").FormulaR1C1
                            .Range("BD" & J & ":BD" & J).Formula = .Range("BD2:BD2").FormulaR1C1
                            .Range("BE" & J & ":BE" & J).Formula = .Range("BE2:BE2").FormulaR1C1
                            .Range("BG" & J & ":BG" & J).Formula = .Range("BG2:BG2").FormulaR1C1
                            .Range("BH" & J & ":BH" & J).Formula = .Range("BH2:BH2").FormulaR1C1
                            .Range("BI" & J & ":BI" & J).Formula = .Range("BI2:BI2").FormulaR1C1
                            .Range("BJ" & J & ":BJ" & J).Formula = .Range("BJ2:BJ2").FormulaR1C1
                            .Range("BK" & J & ":BK" & J).Formula = .Range("BK2:BK2").FormulaR1C1
                            .Range("BL" & J & ":BL" & J).Formula = .Range("BL2:BL2").FormulaR1C1
 
 
                            ' Recalculate the entire row.
                            .Range("A" & J & ":BO" & J).Calculate
 
 
                            ' next row
                            J = J + 1
                        Wend
                    Else
                        MsgBox ("The ISIN " & FinalABC_ISIN & " cannot be found in the SHEETNAME1 sheet.")
                    End If
                End If
 
            End With
 
 
            ' Recalculate all worksheets.
            Application.Calculate
 
 
            ' Now convert all impacted formulae back to values.
            'TODO. loop through SHEETNAME1 as above and change formulae to values for any row impacted.
 
 
            ' Convert all formulae on the FinalABC sheet to values.  Leaves row 2 alone.
            If (i > 2) Then     ' leave row 2 alone, i.e. leave as formulae.
 
                With .Sheets("FinalABC")
 
                    ' Activate the sheet.
                    .Activate
 
                    .Range("K" & i & ":K" & i) = .Range("K" & i & ":K" & i).Value
                    .Range("L" & i & ":L" & i) = .Range("L" & i & ":L" & i).Value
                    .Range("M" & i & ":M" & i) = .Range("M" & i & ":M" & i).Value
                    .Range("N" & i & ":N" & i) = .Range("N" & i & ":N" & i).Value
                    .Range("P" & i & ":P" & i) = .Range("P" & i & ":P" & i).Value
                    .Range("Q" & i & ":Q" & i) = .Range("Q" & i & ":Q" & i).Value
                    .Range("AI" & i & ":AI" & i) = .Range("AI" & i & ":AI" & i).Value
                    .Range("AJ" & i & ":AJ" & i) = .Range("AJ" & i & ":AJ" & i).Value
                    .Range("AK" & i & ":AK" & i) = .Range("AK" & i & ":AK" & i).Value
                    .Range("AL" & i & ":AL" & i) = .Range("AL" & i & ":AL" & i).Value
                    .Range("AM" & i & ":AM" & i) = .Range("AM" & i & ":AM" & i).Value
                    .Range("AR" & i & ":AR" & i) = .Range("AR" & i & ":AR" & i).Value
                    .Range("AS" & i & ":AS" & i) = .Range("AS" & i & ":AS" & i).Value
                    .Range("AT" & i & ":AT" & i) = .Range("AT" & i & ":AT" & i).Value
                End With
            End If
 
 
            ' Convert all formulae on the SHEETNAME1 sheet to values.  Leaves row 2 alone.
            'With Workbooks(my1042Rec).Sheets("SHEETNAME1")
            '    .Range("A3:A" & lastrow) = .Range("A3:A" & lastrow).Value
            '    .Range("B3:B" & lastrow) = .Range("B3:B" & lastrow).Value
            '    '...
            '    '...
            'End With
 
 
 
            ' Convert all formulae on the SHEETNAME1 sheet to values.  Leaves row 2 alone.
            With .Sheets("SHEETNAME1")
 
                ' Activate the sheet.
                .Activate
 
 
                ' Now get index of first row in SHEETNAME1 sheet that contains same affected ISIN.
                Set rng = .Range("A1:A" & lastrow_SHEETNAME1)
 
                If WorksheetFunction.CountIf(rng, FinalABC_ISIN) > 0 Then
 
                    var = WorksheetFunction.Match(FinalABC_ISIN, rng, 0)
 
                    If Not IsError(var) Then
 
                        J = var
                        SHEETNAME1_ISIN = .Range("A" & J).Value
 
 
                        ' For every row that has same ISIN re-enable formulae in SHEETNAME1 sheet.
                        ' Convert all formula cells in the row back to values.
                        While .Range("A" & J).Value = SHEETNAME1_ISIN
                            If (J > 2) Then     ' leave row 2 alone, i.e. leave as formulae.
                                .Range("A" & J & ":A" & J) = .Range("A" & J & ":A" & J).Value
                                .Range("B" & J & ":B" & J) = .Range("B" & J & ":B" & J).Value
                                .Range("F" & J & ":F" & J) = .Range("F" & J & ":F" & J).Value
                                .Range("H" & J & ":H" & J) = .Range("H" & J & ":H" & J).Value
                                .Range("J" & J & ":J" & J) = .Range("J" & J & ":J" & J).Value
                                .Range("L" & J & ":L" & J) = .Range("L" & J & ":L" & J).Value
                                .Range("M" & J & ":M" & J) = .Range("M" & J & ":M" & J).Value
                                .Range("T" & J & ":T" & J) = .Range("T" & J & ":T" & J).Value
                                .Range("V" & J & ":V" & J) = .Range("V" & J & ":V" & J).Value
                                .Range("W" & J & ":W" & J) = .Range("W" & J & ":W" & J).Value
                                .Range("X" & J & ":X" & J) = .Range("X" & J & ":X" & J).Value
                                .Range("AB" & J & ":AB" & J) = .Range("AB" & J & ":AB" & J).Value
                                .Range("AC" & J & ":AC" & J) = .Range("AC" & J & ":AC" & J).Value
                                .Range("AE" & J & ":AE" & J) = .Range("AE" & J & ":AE" & J).Value
                                .Range("AG" & J & ":AG" & J) = .Range("AG" & J & ":AG" & J).Value
                                .Range("AH" & J & ":AH" & J) = .Range("AH" & J & ":AH" & J).Value
                                .Range("AJ" & J & ":AJ" & J) = .Range("AJ" & J & ":AJ" & J).Value
                                .Range("AK" & J & ":AK" & J) = .Range("AK" & J & ":AK" & J).Value
                                .Range("AL" & J & ":AL" & J) = .Range("AL" & J & ":AL" & J).Value
                                .Range("AN" & J & ":AN" & J) = .Range("AN" & J & ":AN" & J).Value
                                .Range("AO" & J & ":AO" & J) = .Range("AO" & J & ":AO" & J).Value
                                .Range("AP" & J & ":AP" & J) = .Range("AP" & J & ":AP" & J).Value
                                .Range("AQ" & J & ":AQ" & J) = .Range("AQ" & J & ":AQ" & J).Value
                                .Range("AR" & J & ":AR" & J) = .Range("AR" & J & ":AR" & J).Value
                                .Range("AS" & J & ":AS" & J) = .Range("AS" & J & ":AS" & J).Value
                                .Range("AT" & J & ":AT" & J) = .Range("AT" & J & ":AT" & J).Value
                                .Range("AV" & J & ":AV" & J) = .Range("AV" & J & ":AV" & J).Value
                                .Range("AW" & J & ":AW" & J) = .Range("AW" & J & ":AW" & J).Value
                                .Range("AX" & J & ":AX" & J) = .Range("AX" & J & ":AX" & J).Value
                                .Range("AY" & J & ":AY" & J) = .Range("AY" & J & ":AY" & J).Value
                                .Range("BB" & J & ":BB" & J) = .Range("BB" & J & ":BB" & J).Value
                                .Range("BD" & J & ":BD" & J) = .Range("BD" & J & ":BD" & J).Value
                                .Range("BE" & J & ":BE" & J) = .Range("BE" & J & ":BE" & J).Value
                                .Range("BG" & J & ":BG" & J) = .Range("BG" & J & ":BG" & J).Value
                                .Range("BH" & J & ":BH" & J) = .Range("BH" & J & ":BH" & J).Value
                                .Range("BI" & J & ":BI" & J) = .Range("BI" & J & ":BI" & J).Value
                                .Range("BJ" & J & ":BJ" & J) = .Range("BJ" & J & ":BJ" & J).Value
                                .Range("BK" & J & ":BK" & J) = .Range("BK" & J & ":BK" & J).Value
                                .Range("BL" & J & ":BL" & J) = .Range("BL" & J & ":BL" & J).Value
                            End If
 
                            ' next row
                            J = J + 1
 
                        Wend
                    Else
                        MsgBox ("The ISIN " & FinalABC_ISIN & " cannot be found in the SHEETNAME1 sheet.")
                    End If
                End If
 
            End With
 
        Next i
 
    End With
 
 
    ' Clear all objects.
    Set pt = Nothing
 
End Sub
 
 
 
 
 
 
'*************************************************************************************************
'*************************************************************************************************
'*************************************************************************************************
'*************************************************************************************************
'*************************************************************************************************
'*************************************************************************************************
'*************************************************************************************************
'*************************************************************************************************
'*************************************************************************************************
 
 
 
 
' Copies all formulae down on the FinalABC sheet.
' Does not calculate.  This needs to be requested separately when needed.  Probably only once the SHEETNAME1 sheet populated too.
' Does not change the formula to values.  For that use the separate subroutine.
' This may run for a very long time.  Go have a coffee.
Sub M12000_Copy_FinalABC_Formulae_Down()
 
    Dim mycell As Variant
    Dim lastrow_FinalABC As Long
    Dim Pmt_Curr As Variant
    Dim FX_Rate As Variant
 
 
    ' Initialize global vars.
    Call Z00000_Init
 
 
    ' Ask user.
    If ctrl_ask_before_running_subroutine = True Then
        If MsgBox("Copy all FinalABC formulae down?", vbYesNo) = vbNo Then Exit Sub
    End If
 
 
    With Workbooks(wb_name)
 
        With .Sheets("FinalABC")
 
            ' Activate the sheet.
            .Activate
 
 
            ' Get how many rows of data have been loaded into the sheet.
            'lastrow = Workbooks(my1042Rec).Sheets("FinalABC").Range("D65536").End(xlUp).Row
            lastrow_FinalABC = .Cells(Rows.Count, 4).End(xlUp).Row
            ' Prevent line 2 being deleted - as this contains the formulae which need coping down later.
            If lastrow_FinalABC < 3 Then
                lastrow_FinalABC = 3
            End If
 
 
            ' Ensure that FX_Rate has a default value.
            'For Each mycell In Workbooks(my1042Rec).Sheets("FinalABC").Range("AC2", Range("AC65536").End(xlUp))
            For Each mycell In .Range("AE2:AE" & lastrow_FinalABC)
                If Not mycell Like "*[0-9]*" Then mycell.Formula = 1
            Next mycell
 
 
            ' Copies formulae down.
            .Range("A2:C2").AutoFill Destination:=.Range("A2:C" & lastrow_FinalABC)
            .Range("E2").AutoFill Destination:=.Range("E2:E" & lastrow_FinalABC)
            .Range("K2:N2").AutoFill Destination:=.Range("K2:N" & lastrow_FinalABC)
            .Range("P2:Q2").AutoFill Destination:=.Range("P2:Q" & lastrow_FinalABC)
            .Range("AI2:AM2").AutoFill Destination:=.Range("AI2:AM" & lastrow_FinalABC)
            .Range("AR2:AT2").AutoFill Destination:=.Range("AR2:AT" & lastrow_FinalABC)
 
 
            ' Calculations.
            '  .Range("K2:N" & lastrow_FinalABC).Calculate
            '  .Range("P2:P" & lastrow_FinalABC).Calculate
            '  .Range("E2:E" & lastrow_FinalABC).Calculate
            '  .Range("A2:C" & lastrow_FinalABC).Calculate
            '  .Range("AG2:AK" & lastrow_FinalABC).Calculate
            '  .Range("AP2:AR" & lastrow_FinalABC).Calculate
 
 
            ' Now copy and paste formula ranges as values to speed up the file processing.
            '    .Range("E3:E" & lastrow_FinalABC) = .Range("E3:E" & lastrow_FinalABC).Value
            '    .Range("K3:N" & lastrow_FinalABC) = .Range("K3:N" & lastrow_FinalABC).Value
            '    .Range("A3:C" & lastrow_FinalABC) = .Range("A3:C" & lastrow_FinalABC).Value
            '    .Range("P3:P" & lastrow_FinalABC) = .Range("P3:P" & lastrow_FinalABC).Value
            '    .Range("AG3:AK" & lastrow_FinalABC) = .Range("AG3:AK" & lastrow_FinalABC).Value
            '    .Range("AP3:AR" & lastrow_FinalABC) = .Range("AP3:AR" & lastrow_FinalABC).Value
 
 
            'For Each Pmt_Curr In Sheets("FinalABC").Range("G2", Range("H65536").End(xlUp).Offset(0, -1))
            'For Each Pmt_Curr In Sheets("FinalABC").Range("G2", Range("G65536").End(xlUp))
            For Each Pmt_Curr In Sheets("FinalABC").Range("G2:G" & lastrow_FinalABC)
                If RTrim(LTrim(Pmt_Curr)) = "" Then Pmt_Curr.Value = "USD"
            Next Pmt_Curr
 
 
            'For Each FX_Rate In Sheets("FinalABC").Range("AE2", Range("AE65536").End(xlUp).Offset(0, -1))
            'For Each FX_Rate In Sheets("FinalABC").Range("AE2", Range("AE65536").End(xlUp))
            For Each FX_Rate In Sheets("FinalABC").Range("AE2:AE" & lastrow_FinalABC)
                If IsNumeric(FX_Rate) = False Then FX_Rate.Value = 1
            Next FX_Rate
 
 
            ' Select A1.
            ScrollTo ActiveSheet.name, "A1"
        End With
    End With
 
 
    ' Clear all objects.
    Set mycell = Nothing
    Set Pmt_Curr = Nothing
    Set FX_Rate = Nothing
 
End Sub
 
 
 
' Converts all formulae on the FinalABC sheet to Values.
' Does not change row 2 of the FinalABC sheet.  This retains the formulae in this row.
' This may run for a very long time.  Go have a coffee.
Sub M12010_Convert_FinalABC_Formulae_to_Values()
 
    Dim lastrow_FinalABC As Long
 
 
    ' Initialize global vars.
    Call Z00000_Init
 
 
    ' Ask user.
    If ctrl_ask_before_running_subroutine = True Then
        If MsgBox("Convert all FinalABC formulae to Values?", vbYesNo) = vbNo Then Exit Sub
    End If
 
 
    With Workbooks(wb_name)
 
        With .Sheets("FinalABC")
 
            ' Activate the sheet.
            .Activate
 
 
            ' Get how many rows of data have been loaded into the sheet.
            'lastrow = .Range("D65536").End(xlUp).Row
            lastrow_FinalABC = .Cells(Rows.Count, 4).End(xlUp).Row
            ' Prevent line 2 being deleted - as this contains the formulae which need coping down later.
            If lastrow_FinalABC < 3 Then
                lastrow_FinalABC = 3
            End If
 
 
            ' Now copy and paste formula ranges as values to speed up the file processing.
            .Range("A3:C" & lastrow_FinalABC) = .Range("A3:C" & lastrow_FinalABC).Value
            .Range("E3:E" & lastrow_FinalABC) = .Range("E3:E" & lastrow_FinalABC).Value
            .Range("K3:N" & lastrow_FinalABC) = .Range("K3:N" & lastrow_FinalABC).Value
            .Range("P3:Q" & lastrow_FinalABC) = .Range("P3:Q" & lastrow_FinalABC).Value
            .Range("AI3:AM" & lastrow_FinalABC) = .Range("AI3:AM" & lastrow_FinalABC).Value
            .Range("AR3:AT" & lastrow_FinalABC) = .Range("AR3:AT" & lastrow_FinalABC).Value
 
 
            ' Select A1.
            ScrollTo ActiveSheet.name, "A1"
        End With
    End With
End Sub
 
 
 
 
 
' Copies down all formulae on the SHEETNAME1 sheet.
' Does not change the formula to values.  For that use the separate subroutine.
' Does not calculate.  This needs to be requested separately when needed.  Probably only once the FinalABC sheet populated too.
' This may run for a very long time.  Go have a coffee.
Sub M12020_Copy_SHEETNAME1_Formulae_Down()
 
    Dim lastrow_SHEETNAME1 As Long
 
 
    ' Initialize global vars.
    Call Z00000_Init
 
 
    ' Ask user.
    If ctrl_ask_before_running_subroutine = True Then
        If MsgBox("Copy all SHEETNAME1 formulae down?", vbYesNo) = vbNo Then Exit Sub
    End If
 
 
    With Workbooks(wb_name)
 
        With .Sheets("SHEETNAME1")
 
            ' Activate the sheet.
            .Activate
 
 
            ' Get how many rows of data have been loaded into the sheet.
            'lastrow = .Range("D65536").End(xlUp).Row
            lastrow_SHEETNAME1 = .Cells(Rows.Count, 4).End(xlUp).Row
            ' Prevent line 2 being deleted - as this contains the formulae which need coping down later.
            If lastrow_SHEETNAME1 < 3 Then
                lastrow_SHEETNAME1 = 3
            End If
 
 
            ' Copies formulae down.
            .Range("A2:B2").AutoFill Destination:=.Range("A2:B" & lastrow_SHEETNAME1)
            .Range("F2:F2").AutoFill Destination:=.Range("F2:F" & lastrow_SHEETNAME1)
            .Range("H2:H2").AutoFill Destination:=.Range("H2:H" & lastrow_SHEETNAME1)
            .Range("J2:J2").AutoFill Destination:=.Range("J2:J" & lastrow_SHEETNAME1)
            .Range("L2:L2").AutoFill Destination:=.Range("L2:L" & lastrow_SHEETNAME1)
            .Range("T2:T2").AutoFill Destination:=.Range("T2:T" & lastrow_SHEETNAME1)
            .Range("V2:X2").AutoFill Destination:=.Range("V2:X" & lastrow_SHEETNAME1)
            .Range("AB2:AC2").AutoFill Destination:=.Range("AB2:AC" & lastrow_SHEETNAME1)
            .Range("AE2:AE2").AutoFill Destination:=.Range("AE2:AE" & lastrow_SHEETNAME1)
            .Range("AG2:AH2").AutoFill Destination:=.Range("AG2:AH" & lastrow_SHEETNAME1)
            .Range("AJ2:AL2").AutoFill Destination:=.Range("AJ2:AL" & lastrow_SHEETNAME1)
            .Range("AN2:AT2").AutoFill Destination:=.Range("AN2:AT" & lastrow_SHEETNAME1)
            .Range("AV2:AY2").AutoFill Destination:=.Range("AV2:AY" & lastrow_SHEETNAME1)
            .Range("BB2:BB2").AutoFill Destination:=.Range("BB2:BB" & lastrow_SHEETNAME1)
            .Range("BD2:BE2").AutoFill Destination:=.Range("BD2:BE" & lastrow_SHEETNAME1)
            .Range("BG2:BL2").AutoFill Destination:=.Range("BG2:BL" & lastrow_SHEETNAME1)
            .Range("BM2:BM2").AutoFill Destination:=.Range("BM2:BM" & lastrow_SHEETNAME1)
 
 
 
            ' Calculations.
            '.Range("A2", Range("B" & lastrow_SHEETNAME1 + 1).End(xlUp).Offset(0, 0)).Calculate
            '.Range("A2:B" & lastrow_SHEETNAME1).Calculate
            '.Range("F2:F" & lastrow_SHEETNAME1).Calculate
            '.Range("H2:H" & lastrow_SHEETNAME1).Calculate
            '.Range("J2:L" & lastrow_SHEETNAME1).Calculate
            '.Range("S2:S" & lastrow_SHEETNAME1).Calculate
            '.Range("U2:W" & lastrow_SHEETNAME1).Calculate
            '.Range("AA2:AB" & lastrow_SHEETNAME1).Calculate
            '.Range("AD2:AD" & lastrow_SHEETNAME1).Calculate
            '.Range("AF2:AG" & lastrow_SHEETNAME1).Calculate
            '.Range("AI2:AK" & lastrow_SHEETNAME1).Calculate
            '.Range("AM2:AS" & lastrow_SHEETNAME1).Calculate
            '.Range("AU2:AX" & lastrow_SHEETNAME1).Calculate
            '.Range("BA2:BA" & lastrow_SHEETNAME1).Calculate
            '.Range("BC2:BD" & lastrow_SHEETNAME1).Calculate
            '.Range("BF2:BK" & lastrow_SHEETNAME1).Calculate
            '.Range("BL2:BL" & lastrow_SHEETNAME1).Calculate
 
 
            ' Now copy and paste formula ranges as values to speed up the file processing.
            '.Range("A3:A" & lastrow_SHEETNAME1) = .Range("A3:A" & lastrow_SHEETNAME1).Value
            '.Range("B3:B" & lastrow_SHEETNAME1) = .Range("B3:B" & lastrow_SHEETNAME1).Value
            '.Range("F3:F" & lastrow_SHEETNAME1) = .Range("F3:F" & lastrow_SHEETNAME1).Value
            '.Range("H3:H" & lastrow_SHEETNAME1) = .Range("H3:H" & lastrow_SHEETNAME1).Value
            '.Range("J3:J" & lastrow_SHEETNAME1) = .Range("J3:J" & lastrow_SHEETNAME1).Value
            '.Range("K3:K" & lastrow_SHEETNAME1) = .Range("K3:K" & lastrow_SHEETNAME1).Value
            '.Range("L3:L" & lastrow_SHEETNAME1) = .Range("L3:L" & lastrow_SHEETNAME1).Value
            '.Range("S3:S" & lastrow_SHEETNAME1) = .Range("S3:S" & lastrow_SHEETNAME1).Value
            '.Range("U3:U" & lastrow_SHEETNAME1) = .Range("U3:U" & lastrow_SHEETNAME1).Value
            '.Range("V3:V" & lastrow_SHEETNAME1) = .Range("V3:V" & lastrow_SHEETNAME1).Value
            '.Range("W3:W" & lastrow_SHEETNAME1) = .Range("W3:W" & lastrow_SHEETNAME1).Value
            '.Range("AA3:AA" & lastrow_SHEETNAME1) = .Range("AA3:AA" & lastrow_SHEETNAME1).Value
            '.Range("AB3:AB" & lastrow_SHEETNAME1) = .Range("AB3:AB" & lastrow_SHEETNAME1).Value
            '.Range("AD3:AD" & lastrow_SHEETNAME1) = .Range("AD3:AD" & lastrow_SHEETNAME1).Value
            '.Range("AF3:AF" & lastrow_SHEETNAME1) = .Range("AF3:AF" & lastrow_SHEETNAME1).Value
            '.Range("AG3:AG" & lastrow_SHEETNAME1) = .Range("AG3:AG" & lastrow_SHEETNAME1).Value
            '.Range("AI3:AI" & lastrow_SHEETNAME1) = .Range("AI3:AI" & lastrow_SHEETNAME1).Value
            '.Range("AJ3:AJ" & lastrow_SHEETNAME1) = .Range("AJ3:AJ" & lastrow_SHEETNAME1).Value
            '.Range("AK3:AK" & lastrow_SHEETNAME1) = .Range("AK3:AK" & lastrow_SHEETNAME1).Value
            '.Range("AM3:AM" & lastrow_SHEETNAME1) = .Range("AM3:AM" & lastrow_SHEETNAME1).Value
            '.Range("AN3:AN" & lastrow_SHEETNAME1) = .Range("AN3:AN" & lastrow_SHEETNAME1).Value
            '.Range("AO3:AR" & lastrow_SHEETNAME1) = .Range("AO3:AR" & lastrow_SHEETNAME1).Value
            '.Range("AP3:AP" & lastrow_SHEETNAME1) = .Range("AP3:AP" & lastrow_SHEETNAME1).Value
            '.Range("AQ3:AQ" & lastrow_SHEETNAME1) = .Range("AQ3:AQ" & lastrow_SHEETNAME1).Value
            '.Range("AR3:AR" & lastrow_SHEETNAME1) = .Range("AR3:AR" & lastrow_SHEETNAME1).Value
            '.Range("AS3:AS" & lastrow_SHEETNAME1) = .Range("AS3:AS" & lastrow_SHEETNAME1).Value
            '.Range("AU3:AU" & lastrow_SHEETNAME1) = .Range("AU3:AU" & lastrow_SHEETNAME1).Value
            '.Range("AV3:AV" & lastrow_SHEETNAME1) = .Range("AV3:AV" & lastrow_SHEETNAME1).Value
            '.Range("AW3:AW" & lastrow_SHEETNAME1) = .Range("AW3:AW" & lastrow_SHEETNAME1).Value
            '.Range("AX3:AX" & lastrow_SHEETNAME1) = .Range("AX3:AX" & lastrow_SHEETNAME1).Value
            '.Range("BA3:BA" & lastrow_SHEETNAME1) = .Range("BA3:BA" & lastrow_SHEETNAME1).Value
            '.Range("BC3:BC" & lastrow_SHEETNAME1) = .Range("BC3:BC" & lastrow_SHEETNAME1).Value
            '.Range("BD3:BD" & lastrow_SHEETNAME1) = .Range("BD3:BD" & lastrow_SHEETNAME1).Value
            '.Range("BF3:BF" & lastrow_SHEETNAME1) = .Range("BF3:BF" & lastrow_SHEETNAME1).Value
            '.Range("BG3:BG" & lastrow_SHEETNAME1) = .Range("BG3:BG" & lastrow_SHEETNAME1).Value
            '.Range("BH3:BH" & lastrow_SHEETNAME1) = .Range("BH3:BH" & lastrow_SHEETNAME1).Value
            '.Range("BI3:BI" & lastrow_SHEETNAME1) = .Range("BI3:BI" & lastrow_SHEETNAME1).Value
            '.Range("BJ3:BJ" & lastrow_SHEETNAME1) = .Range("BJ3:BJ" & lastrow_SHEETNAME1).Value
            '.Range("BK3:BK" & lastrow_SHEETNAME1) = .Range("BK3:BK" & lastrow_SHEETNAME1).Value
            '.Range("BL3:BL" & lastrow_SHEETNAME1) = .Range("BL3:BL" & lastrow_SHEETNAME1).Value
 
 
            ' Select A1.
            ScrollTo ActiveSheet.name, "A1"
        End With
    End With
End Sub
 
 
' Converts all formulae cells on the SHEETNAME1 sheet into values.
' Does not change row 2 of the SHEETNAME1 sheet.  This retains the formulae in this row.
' This may run for a very long time.  Go have a coffee.
Sub M12030_Convert_SHEETNAME1_Formulae_to_Values()
 
    Dim lastrow_SHEETNAME1 As Long
 
 
    ' Initialize global vars.
    Call Z00000_Init
 
 
    ' Ask user.
    If ctrl_ask_before_running_subroutine = True Then
        If MsgBox("Convert SHEETNAME1 formulae to values?", vbYesNo) = vbNo Then Exit Sub
    End If
 
 
    With Workbooks(wb_name)
 
        With .Sheets("SHEETNAME1")
 
            ' Activate the sheet.
            .Activate
 
 
            ' Get how many rows of data have been loaded into the sheet.
            'lastrow = Workbooks(my1042Rec).Sheets("SHEETNAME1").Range("D65536").End(xlUp).Row
            lastrow_SHEETNAME1 = .Cells(Rows.Count, 4).End(xlUp).Row
            ' Prevent line 2 being deleted - as this contains the formulae which need coping down later.
            If lastrow_SHEETNAME1 < 3 Then
                lastrow_SHEETNAME1 = 3
            End If
 
 
            ' Now copy and paste formula ranges as values to speed up the file processing.
            .Range("A3:A" & lastrow_SHEETNAME1) = .Range("A3:A" & lastrow_SHEETNAME1).Value
            .Range("B3:B" & lastrow_SHEETNAME1) = .Range("B3:B" & lastrow_SHEETNAME1).Value
            .Range("F3:F" & lastrow_SHEETNAME1) = .Range("F3:F" & lastrow_SHEETNAME1).Value
            .Range("H3:H" & lastrow_SHEETNAME1) = .Range("H3:H" & lastrow_SHEETNAME1).Value
            .Range("J3:J" & lastrow_SHEETNAME1) = .Range("J3:J" & lastrow_SHEETNAME1).Value
            .Range("L3:L" & lastrow_SHEETNAME1) = .Range("L3:L" & lastrow_SHEETNAME1).Value
            .Range("M3:M" & lastrow_SHEETNAME1) = .Range("M3:M" & lastrow_SHEETNAME1).Value
            .Range("T3:T" & lastrow_SHEETNAME1) = .Range("T3:T" & lastrow_SHEETNAME1).Value
            .Range("V3:V" & lastrow_SHEETNAME1) = .Range("V3:V" & lastrow_SHEETNAME1).Value
            .Range("W3:W" & lastrow_SHEETNAME1) = .Range("W3:W" & lastrow_SHEETNAME1).Value
            .Range("X3:X" & lastrow_SHEETNAME1) = .Range("X3:X" & lastrow_SHEETNAME1).Value
            .Range("AB3:AB" & lastrow_SHEETNAME1) = .Range("AB3:AB" & lastrow_SHEETNAME1).Value
            .Range("AC3:AC" & lastrow_SHEETNAME1) = .Range("AC3:AC" & lastrow_SHEETNAME1).Value
            .Range("AE3:AE" & lastrow_SHEETNAME1) = .Range("AE3:AE" & lastrow_SHEETNAME1).Value
            .Range("AG3:AG" & lastrow_SHEETNAME1) = .Range("AG3:AG" & lastrow_SHEETNAME1).Value
            .Range("AH3:AH" & lastrow_SHEETNAME1) = .Range("AH3:AH" & lastrow_SHEETNAME1).Value
            .Range("AJ3:AJ" & lastrow_SHEETNAME1) = .Range("AJ3:AJ" & lastrow_SHEETNAME1).Value
            .Range("AK3:AK" & lastrow_SHEETNAME1) = .Range("AK3:AK" & lastrow_SHEETNAME1).Value
            .Range("AL3:AL" & lastrow_SHEETNAME1) = .Range("AL3:AL" & lastrow_SHEETNAME1).Value
            .Range("AN3:AN" & lastrow_SHEETNAME1) = .Range("AN3:AN" & lastrow_SHEETNAME1).Value
            .Range("AO3:AO" & lastrow_SHEETNAME1) = .Range("AO3:AO" & lastrow_SHEETNAME1).Value
            .Range("AP3:AP" & lastrow_SHEETNAME1) = .Range("AP3:AP" & lastrow_SHEETNAME1).Value
            .Range("AQ3:AQ" & lastrow_SHEETNAME1) = .Range("AQ3:AQ" & lastrow_SHEETNAME1).Value
            .Range("AR3:AR" & lastrow_SHEETNAME1) = .Range("AR3:AR" & lastrow_SHEETNAME1).Value
            .Range("AS3:AS" & lastrow_SHEETNAME1) = .Range("AS3:AS" & lastrow_SHEETNAME1).Value
            .Range("AT3:AT" & lastrow_SHEETNAME1) = .Range("AT3:AT" & lastrow_SHEETNAME1).Value
            .Range("AV3:AV" & lastrow_SHEETNAME1) = .Range("AV3:AV" & lastrow_SHEETNAME1).Value
            .Range("AW3:AW" & lastrow_SHEETNAME1) = .Range("AW3:AW" & lastrow_SHEETNAME1).Value
            .Range("AX3:AX" & lastrow_SHEETNAME1) = .Range("AX3:AX" & lastrow_SHEETNAME1).Value
            .Range("AY3:AY" & lastrow_SHEETNAME1) = .Range("AY3:AY" & lastrow_SHEETNAME1).Value
            .Range("BB3:BB" & lastrow_SHEETNAME1) = .Range("BB3:BB" & lastrow_SHEETNAME1).Value
            .Range("BD3:BD" & lastrow_SHEETNAME1) = .Range("BD3:BD" & lastrow_SHEETNAME1).Value
            .Range("BE3:BE" & lastrow_SHEETNAME1) = .Range("BE3:BE" & lastrow_SHEETNAME1).Value
            .Range("BG3:BG" & lastrow_SHEETNAME1) = .Range("BG3:BG" & lastrow_SHEETNAME1).Value
            .Range("BH3:BH" & lastrow_SHEETNAME1) = .Range("BH3:BH" & lastrow_SHEETNAME1).Value
            .Range("BI3:BI" & lastrow_SHEETNAME1) = .Range("BI3:BI" & lastrow_SHEETNAME1).Value
            .Range("BJ3:BJ" & lastrow_SHEETNAME1) = .Range("BJ3:BJ" & lastrow_SHEETNAME1).Value
            .Range("BK3:BK" & lastrow_SHEETNAME1) = .Range("BK3:BK" & lastrow_SHEETNAME1).Value
            .Range("BL3:BL" & lastrow_SHEETNAME1) = .Range("BL3:BL" & lastrow_SHEETNAME1).Value
            .Range("BM3:BM" & lastrow_SHEETNAME1) = .Range("BM3:BM" & lastrow_SHEETNAME1).Value
 
 
            ' Select A1.
            ScrollTo ActiveSheet.name, "A1"
        End With
    End With
End Sub
 
 
 
 
 
 
 
' Imports the Wxxxx file.
Sub M13000_Import_Wxxxx()
 
    Dim fileToOpen As Variant
    Dim count_Wxxxx As Double
    Dim count_InputFile As Double
    Dim lastrow_Wxxxx As Long
    Dim lastrow_InputFile As Long
    Dim my_from_column As Variant
    Dim my_to_column As Variant
    Dim fileToOpen_name As String
    Dim FileParts() As String
 
 
    ' Initialize global vars.
    Call Z00000_Init
 
 
    ' Ask user.
    If ctrl_ask_before_running_subroutine = True Then
        If MsgBox("Import Wxxxx?", vbYesNo) = vbNo Then Exit Sub
    End If
 
 
    With Workbooks(wb_name)
 
        ' First clears out existing Wxxxx sheet, besides row 2 which is kept as it contains formulae.
        With .Sheets("Wxxxx")
 
            ' Activates the sheet.
            .Activate
 
 
            ' Get how many rows of data have been loaded into the sheet.
            lastrow_Wxxxx = .Cells(Rows.Count, 2).End(xlUp).Row
            ' Prevent line 2 being deleted - as this contains the formulae which need coping down later.
            If lastrow_Wxxxx < 2 Then
                lastrow_Wxxxx = 2
            End If
 
            ' Clear entire Wxxxx sheet, except for columns Y & Z which contains formulae.
            DeleteUnusedOnSheet ("Wxxxx")
            .Range("A2:Z" & lastrow_Wxxxx).ClearContents
            .Range("A2:Z" & lastrow_Wxxxx).Delete
 
 
            ' Control to confirm there is currently no data in the sheet.
            If WorksheetFunction.CountA(.Range("A2:Z" & lastrow_Wxxxx)) Then
                MsgBox "There is data still present in the Wxxxx sheet, these should be blank. Ensure they are empty before running this process"
                Exit Sub
            End If
 
        End With
 
    End With
 
 
    ' Ask user for a Wxxxx file to load.
    fileToOpen = Application.GetOpenFilename("Excel files (*.xls; *.xlsx; *.csv),*.xls; *.xlsx; *.csv", , "Select Wxxxx file")
    If fileToOpen = False Then
        MsgBox "No Wxxxx file selected.  No data copied across to the Wxxxx sheet."
        Exit Sub
    End If
 
    FileParts() = Split(fileToOpen, Application.PathSeparator)
    fileToOpen_name = FileParts(UBound(FileParts))
 
 
    ' Start of copying columns across.
    With Workbooks.Open(fileToOpen)
 
        With .Sheets(1)
 
            ' Activate the workbook.
            .Activate
 
 
            ' Control to check that the Wxxxx file is in the usual format.
'            If .Range("A2") Like "???????" Then
'            Else
 
'                If ctrl_close_erroneous_files = True Then
                    ' Close the file.
'                    Application.DisplayAlerts = False
'                    Workbooks(fileToOpen_name).Close
'                    Application.DisplayAlerts = True
'                End If
 
'                MsgBox "The Wxxxx file is not in the usual format, it may have been change since the code was written, please follow the procedure to manually copy the columns across."
'                Exit Sub
'            End If
 
 
            ' Control to check that the Wxxxx file is in the usual format.
            If WorksheetFunction.CountA(.Range("A1:X1")) = 24 Then
            Else
                If ctrl_close_erroneous_files = True Then
                    ' Close the file.
                   Application.DisplayAlerts = False
                    Workbooks(fileToOpen_name).Close
                    Application.DisplayAlerts = True
                End If
 
                MsgBox "The Wxxxx file is not in the usual format, it may have been change since the code was written, please follow the procedure to manually copy the columns across"
                Exit Sub
            End If
 
 
            ' Determine how many rows in the input file.
            lastrow_InputFile = .Cells(Rows.Count, 2).End(xlUp).Row
 
'            MsgBox ActiveWorkbook.Sheets(1).Name
 
 
 
 
            ' Copy all columns from Wxxxx file into master sheet where column names match.
            For Each my_from_column In .Range("A1:X1") ' Range is all columns in Wxxxx file.
                For Each my_to_column In Workbooks(wb_name).Sheets("Wxxxx").Range("A1:X1") ' X is last column containing data from Wxxxx file.
                    If my_from_column = my_to_column Then
                        .Range(Cells(2, my_from_column.Column), Cells(lastrow_InputFile + 1, my_from_column.Column).End(xlUp)).Copy Workbooks(wb_name).Sheets("Wxxxx").Cells(2, my_to_column.Column)
                    End If
                Next my_to_column
            Next my_from_column
 
 
            ' Counts the number of cells from the input file that should have been copied across.
            count_InputFile = WorksheetFunction.CountA(.Range("A2:X" & lastrow_InputFile))
 
        End With
 
 
        ' Close the file.
        Application.DisplayAlerts = False
        .Close
        Application.DisplayAlerts = True
 
    End With
 
 
    ' Counts the number of cells in the Wxxxx sheet that have been copied across.
    With Workbooks(wb_name)
 
        ' Activate the workbook.
        .Activate
 
        With .Sheets("Wxxxx")
 
            ' Activate the sheet.
            .Activate
 
 
            ' Get how many rows of data have been loaded into the sheet.
            lastrow_Wxxxx = .Cells(Rows.Count, 2).End(xlUp).Row
            ' Prevent line 2 being deleted - as this contains the formulae which need coping down later.
            If lastrow_Wxxxx < 2 Then
                lastrow_Wxxxx = 2
            End If
 
 
            ' Count how much data has been loaded into the Wxxxx sheet.
            count_Wxxxx = WorksheetFunction.CountA(.Range("A2:X" & lastrow_Wxxxx))
 
 
            ' Select A1.
            ScrollTo ActiveSheet.name, "A1"
 
        End With
 
    End With
 
 
    ' Control to ensure that the number of cells copied across matches those in the originating file.
    If count_Wxxxx <> count_InputFile Then
        MsgBox "The number of cells copied from the Wxxxx file does not equal the number of cells copied to the 1042 rec. Please manually copy them across."
        Exit Sub
    End If
 
 
 
    ' Add in formulae and sort the Wxxxx sheet.
    With Workbooks(wb_name)
 
        With .Sheets("Wxxxx")
 
            ' Activates the sheet.
            .Activate
 
 
            ' Determine the number of rows.
            lastrow_Wxxxx = .Cells(Rows.Count, 2).End(xlUp).Row
            ' Prevent line 2 being deleted - as this contains the formulae which need coping down later.
            If lastrow_Wxxxx < 2 Then
                lastrow_Wxxxx = 2
            End If
 
 
            ' Resets formulae on "Wxxxx".
            .Range("Y2").Formula = "=IF(AND(YEAR(T2)>=YEAR(NOW()), YEAR(T2)-YEAR(S2)<=3),IF(TRIM(C2)<>"""",IF(E2=TRUE,IF(G2=TRUE,IF(TRIM(K2)<>""All Other Countries"",IF(O2=TRUE,IF(P2=TRUE,IF(Q2=TRUE,IF(X2=FALSE,""YES"",""NO1""),""NO2""),""NO3""),""NO4""),""NO5""),""NO6""),""NO7""),""NO8""),""NO9"")"
            .Range("Z2").Formula = "=IF(Y2=""YES"",IFERROR(VLOOKUP(K2,References!AI:AJ,2,FALSE),30),30)"
            .Range("Y2:Z2").AutoFill Destination:=.Range("Y2:Z" & lastrow_Wxxxx)
            .Range("Y3:Z" & lastrow_Wxxxx) = .Range("Y3:Z" & lastrow_Wxxxx).Value
 
 
           ' Do the sort.
            With .Sort
 
                '.AutoFilter
                With .SortFields
                    .Clear
                    .Add Key:=Range("B1:B" & lastrow_Wxxxx), SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:=xlSortNormal
                End With
 
                .SetRange Range("A1:Z" & lastrow_Wxxxx)
                .Header = xlYes
                .MatchCase = False
                .Orientation = xlTopToBottom
                .SortMethod = xlPinYin
                .Apply
 
            End With
 
 
            ' Select A1.
            ScrollTo ActiveSheet.name, "A1"
 
        End With
    End With
 
 
 
    ' Clear all objects.
    Set my_from_column = Nothing
    Set my_to_column = Nothing
 
End Sub
microsoft_excel/macros/macro_full_example_program.txt · Last modified: 2021/08/04 14:59 by peter

Donate Powered by PHP Valid HTML5 Valid CSS Driven by DokuWiki