2017-03-02 5 views
0

Ich kann nicht herausfinden, warum Excel diesen Code nicht mag und ich bin durch alle meine (wenn auch begrenzte) Kenntnisse darüber gegangen, wie man es beheben kann.Excel-Fehler 424 Hilfe benötigt

Mein Code ruft einen ProperUnion-Code auf, den ich online gefunden habe und der mit Nullbereichen und Duplikaten umgehen soll. Ich habe nur ein grundlegendes Verständnis davon, wie das zweite Bit des Codes funktioniert. Das erste Bit gehört mir.

Dieser Code wählt eine Liste von Elementen basierend darauf aus, ob sie markiert sind, speichert jedes Flag als Bereich und schneidet sie dann nach Bedarf. In dem Fall, in dem ich teste, wird nur das Feld "Flag 3" geprüft, was möglicherweise das Problem verursacht. (So ​​rngx (1) rngx (2) rngx (4) + sind alle Nullwerte.)

Ich legte 'xxxxxxx auf die Zeile in der richtigen Verbindung, die mir den Debug-Fehler gibt.

Jede und alle Hilfe wird sehr geschätzt.

Gather Gemeldet Information Code

Sub GSFlagged(prg As String) 'prg is the Program Name 
Dim rng As Range 
Dim rngA As Range 
Dim rngx(1 To 8) As Variant 
Dim rngu As Range 
Dim r As Long 
Dim wsMaster As Worksheet 
Dim wsGenScore As Worksheet 
Dim wsScore As Worksheet 

Set wsMaster = Worksheets("Master List") 
Set wsGenScore = Worksheets("Generate Scorecard") 
Set wsScore = Worksheets("Scorecard") 

wsMaster.Activate 
'Make sure that the master list is not filtered 
    If wsMaster.AutoFilterMode = True Then 
    wsMaster.AutoFilterMode = False 
    End If 

'Select all data in the Masterlist and then remove the headers 
Set rng = wsMaster.Range("B4:E4", Range("B4:E4").End(xlDown)) 
Set rng = rng.Offset(1, 0).Resize(rng.Rows.Count - 1) 

'Filter by the program name 
    wsMaster.Range("B4").AutoFilter Field:=2, Criteria1:=prg 
    Set rngA = rng.SpecialCells(xlCellTypeVisible) 
'Filter by flags with a loop over the variable r and save each set of visible cells as rngx(r) 
    For r = 1 To 8 
     If wsGenScore.Shapes("Flag" & r).ControlFormat.Value = 1 Then 
      wsMaster.Activate 
      If wsMaster.AutoFilterMode = True Then 
       wsMaster.AutoFilterMode = False 
      End If 
     wsMaster.Range("B4").AutoFilter Field:=r + 6, Criteria1:="<>" 
     Set rngx(r) = rng.SpecialCells(xlCellTypeVisible) 
     End If 
    Next r 
'After filtering through all the SKUs we union them using Proper Union a Custom VBA that allows for null values and removes duplicates. 
    Set rngu = ProperUnion(rngx(1), rngx(2), rngx(3), rngx(4), rngx(5), rngx(6), rngx(7), rngx(8)) 
'Now that we have rngu which is the union of all flagged SKUs we want to intersect that with the SKUs that are in the chosen program. 
    Set rngi = Intersect(rngA, rngu) 
End Sub 

Proper Union-Code Von: http://www.cpearson.com/Excel/BetterUnion.aspx

Function ProperUnion(ParamArray Ranges() As Variant) As Range 
    '''''''''''''''''''''''''''''''''''''''''''''''''''''''' 
    ' ProperUnion 
    ' This provides Union functionality without duplicating 
    ' cells when ranges overlap. Requires the Union2 function. 
    '''''''''''''''''''''''''''''''''''''''''''''''''''''''' 
     Dim ResR As Range 
     Dim n As Long 
     Dim r As Range 

     If Not Ranges(LBound(Ranges)) Is Nothing Then 'xxxxxxxxxx 
      Set ResR = Ranges(LBound(Ranges)) 
     End If 
     For n = LBound(Ranges) + 1 To UBound(Ranges) 
      If Not Ranges(n) Is Nothing Then 
       For Each r In Ranges(n).Cells 
        If Application.Intersect(ResR, r) Is Nothing Then 
         Set ResR = Union2(ResR, r) 
        End If 
       Next r 
      End If 
     Next n 
     Set ProperUnion = ResR 
    End Function 
'Union2 is required for ProperUnion 

Function Union2(ParamArray Ranges() As Variant) As Range 
    '''''''''''''''''''''''''''''''''''''''''''''''''''''''' 
    ' Union2 
    ' A Union operation that accepts parameters that are Nothing. 
    '''''''''''''''''''''''''''''''''''''''''''''''''''''''' 
     Dim n As Long 
     Dim RR As Range 
     For n = LBound(Ranges) To UBound(Ranges) 
      If IsObject(Ranges(n)) Then 
       If Not Ranges(n) Is Nothing Then 
        If TypeOf Ranges(n) Is Excel.Range Then 
         If Not RR Is Nothing Then 
          Set RR = Application.Union(RR, Ranges(n)) 
         Else 
          Set RR = Ranges(n) 
         End If 
        End If 
       End If 
      End If 
     Next n 
     Set Union2 = RR 
    End Function 
+1

Sie sollten die Quelle von 'ProperUnion' anführen, um diese Seitenanforderungen zu erfüllen - [Quelle: www.cpearson.com/Excel/BetterUnion.aspx Copyright 2013, Charles H. Pearson] (http://www.cpearson.com /Excel/BetterUnion.aspx) –

+0

Es tut mir leid. Ich habe diese Regel vergessen. Ich habe es im obersten Modul meines Projekts zitiert, aber vergessen, es hier zu verlinken. Vielen Dank für das Erwähnen. Ich werde es jetzt zum Beitrag hinzufügen. –

Antwort

1

Sie rngx erklärt haben, ein Variant Array sein, aber es sollte als ein Array von Range Objekte deklariert werden .

So die Erklärung ändern:

Dim rngx(1 To 8) As Range 

Wie zur Zeit geschrieben, die nicht zugewiesenen Elemente rngx übergeben werden, um ProperUnion mit einer Art von Variant/Empty, weshalb es abstürzt. Durch Ändern von rngx zu Range werden die Parameter als Variant/Range übergeben, wobei die nicht zugeordneten Elemente Nothing sind.

+0

Hmmm .... Jetzt bekomme ich den Fehler 5: Ungültige Prozedur in der Zeile: 'Wenn Application.Intersect (ResR, r) ist nichts Then', aber du hast meine erste Frage gelöst, also werde ich das definitiv als akzeptieren Die Antwort, wenn ich kann. –

+1

Ich denke nicht, dass 'ProperUnion' mit' Nothing' als erster Bereich arbeitet, da 'Application.Intersect' 'Nothing' nicht als einen der Parameter akzeptiert. Ich denke, es muss geändert werden, um zu verwenden, wenn ResR ist nichts Then'Set ResR = r' 'ElseIf Application.Intersect (ResR, r) ist nichts Then'' Set ResR = Union2 (ResR, r) '' End If'. – YowE3K

+0

Es funktioniert jetzt perfekt! Vielen Dank! –