0

数式が複雑すぎるメッセージ

ParamArray を使用して、定義されていない数の名前付き範囲に新しい行を挿入するマクロ (以下) があります。マクロに 5 ~ 6 個を超える引数を割り当てようとした場合を除いて、正常に動作します。というメッセージ ボックスが表示されます。 「数式が複雑すぎてオブジェクトに代入できません」(上の図を参照)

(以下の割り当て文字列を参照)

'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"'

大きい:

    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

マクロ自体は期待どおりに実行されますが、名前付き範囲を割り当てるだけで問題が発生します。これを行うより良い方法はありますか?

または、式が複雑すぎる方法を回避する方法はありますか? また、すべてのエンド ユーザーの PC または私の PC だけでそれを行う必要があり、設定が引き継がれる場合はありますか?

私が考えたことは、2つの名前付き範囲を取り込んで、次の範囲を取得することでした.前の範囲の行数でそれらをオフセットするだけなので、その場合Range2 = Sheets().Range("A1:A10")Range3 = Range2.Offset(Range2.Rows.Count,0)割り当て入力は、Range1 as string, Range2 as string, NumberOfExtraRanges as integer少なくとも2つの範囲が必要な理由であるだけで済みます.範囲 1 の後のすべての範囲は別のタブにあり、基本的にすべての給与情報時間などの生データ バージョンであるため、Range1_EmployeeList になる最初のタブにあります。

応答を待つ間、これで遊んでみます。

ティア

4

1 に答える 1