excelvbaparamarray

Assigning Macro with ParamArray: Formula is Too Complex to add to the Object


Formula Too Complex Message

I have a macro (below) that inserts a new row into an un-defined number of Named ranges using ParamArray, it works fine except for when I try to assign the macro with more than 5-6 arguments I get a message box that says "Formula Too Complex to Assign To Object" (see picture above)

(see assignment string below)

'InsertNewRow "ServiceCrewDay_EmployeeList", "SAP_SCD_InPool", "SAP_SCD_OutPool", "SAP_SCD_SecondaryIn", "SAP_SCD_SecondaryOut", "SAP_SCD_ORD","SAP_SCD_THF","SAP_SCD_LH", "SAP_SCD_LH"'

Macro:

    Sub InsertNewRow(ParamArray args() As Variant)
    
    Dim ans: ans = MsgBox("WARNING: " & vbNewLine _
    & "Action Cannot be undone!" & vbNewLine & "Continue?", vbYesNo, "Warning!")
    If ans = vbNo Then: Exit Sub
    
    Call HaltOperations
    Call ActiveSheet.Unprotect()
    Call Sheets("SAP Timesheet").Unprotect()
    On Error GoTo OnError_Exit
    
       'Loop and Check All Named Ranges Exist Before Proceeding
        For Each a In args
            If RangeExists(a) = False Then
                MsgBox ("Named Range: " & a & " Not Defined!" & vbNewLine & "Operation Cancelled")
                Exit Sub
            End If
        Next a
    
    Dim rng As Range
    
    'ADD ROW TO EACH NAMED INPUT RANGE
    For Each a In args
        Set rng = Range(a)
        With rng
            .Rows(.Rows.count).EntireRow.Insert
            .Rows(.Rows.count - 2).EntireRow.Copy
            .Rows(.Rows.count - 1).EntireRow.PasteSpecial (xlPasteFormulasAndNumberFormats)
            On Error Resume Next: .Rows(.Rows.count - 1).EntireRow.PasteSpecial (xlPasteFormats)
        End With
    Next a
    On Error GoTo OnError_Exit
    
    'ADJUST HEIRACHY NUMBERS ON FIRST INPUT RANGE (MANNING TAB)
    Set rng = Range(args(0))
        Dim col As Integer
        col = rng.Column
        
        Cells(rng.Row + rng.Rows.count - 2, col).Offset(0, -1).Value _ 
            = Cells(rng.Row + rng.Rows.count - 3, col).Offset(0, -1).Value + 1

        Cells(rng.Row + rng.Rows.count - 1, col).Offset(0, -1).Value _
            = Cells(rng.Row + rng.Rows.count - 3, col).Offset(0, -1).Value + 2
    
    Call ResumeOperations
    Application.CutCopyMode = False
    Call ActiveSheet.Protect()
    Call Sheets("SAP Timesheet").Protect()
    Exit Sub
    
    OnError_Exit:
        Call ResumeOperations
        Application.CutCopyMode = False
        Call ActiveSheet.Protect()
        Call Sheets("SAP Timesheet").Protect()
    End Sub
    Private Function RangeExists(rng As Variant) As Boolean
        Dim Test As Range
        On Error Resume Next
        Set Test = Range(rng)
        RangeExists = Err.Number = 0
    End Function
    Private Sub HaltOperations()
        Application.ScreenUpdating = False
        Application.EnableEvents = False
        Application.DisplayAlerts = False
        Application.Calculation = xlCalculationManual
    End Sub
    Private Sub ResumeOperations()
    ResumeOps:
        Application.ScreenUpdating = True
        Application.EnableEvents = True
        Application.DisplayAlerts = True
        Application.Calculation = xlCalculationAutomatic
    End Sub

The Macro itself runs as expected it's just the assigning the named ranges that is causing the issue. is there a better way to do this?

or is there a way to get around the Formula is too complex method? and if there is will that need to be done on all end user pc's or just on mine and the settings will carry over?

What I have thought about doing was just taking in 2 Named ranges and then for the following ranges Just offsetting those by the Row Count of the previous range so if Range2 = Sheets().Range("A1:A10") then Range3 = Range2.Offset(Range2.Rows.Count,0) then the assingment input would only need to be Range1 as string, Range2 as string, NumberOfExtraRanges as integer the reason I need atleast two ranges is because every range after range 1 is on a different tab and is essentially a raw data version of all pay info hours etc. in the first tab which will be Range1_EmployeeList

which I will play around with while I wait for a response.

TIA


Solution

  • Not a Complete answer but I did find that inside the ParamArray I could just assign One Input Range using a , to seperate each defined range. I haven't tested the limitations doing it this way but it does seem to atleast let me use a few extra inputs.

    Example (Not Working): Note: Each Defined Range is a Separate Input

    'InsertNewRow "ServiceCrewDay_EmployeeList", "SAP_SCD_InPool" ," SAP_SCD_OutPool","SAP_SCD_SecondaryIn", "SAP_SCD_SecondaryOut"'

    Example (Working): Note Each Defined Range is passed as 1 input

    'InsertNewRow "ServiceCrewDay_EmployeeList", "SAP_SCD_InPool, SAP_SCD_OutPool,SAP_SCD_SecondaryIn,SAP_SCD_SecondaryOut"'