2017-06-26 4 views
1

Ich möchte Max und Min eines Bereichs innerhalb einer for-Schleife (für jede Zeile) abrufen.Laufzeitfehler '1004' auf WorksheetFunction.Max/Min für variablen Bereich

Welche Lösung ich auch im Internet gefunden habe, ist entweder für den statischen Bereich oder gibt mir den gleichen Fehler. Derzeit verwende ich die folgenden, die run-time error '1004' bei xMax Linie gibt:

Dim i As Long 
Dim xMax As Double 
Dim ws1 As Worksheet 
Set ws1 = Worksheets("Sheet1") 

For i = 2 To 15 
    xMax = Application.WorksheetFunction.Max(ws1.range(Cells(i, 6), Cells(i, 15))) 
Next 

jedoch die folgenden statischen Bereich arbeitet:

xMax = Application.WorksheetFunction.Max(ws1.range(Cells(2, 6), Cells(2, 15))) 

Ich habe versucht, es zu 2-Zellen siplify:

Statische Reichweite hat keine Probleme:

xMax = Application.WorksheetFunction.Max(Cells(2, 6).Value, Cells(2, 7).Value) 

Aber Dynamikbereich öffnet den gleichen Fehler:

For i = 2 To 15 
    xMax = Application.WorksheetFunction.Max(Cells(i, 6).Value, Cells(i, 7).Value) 
Next 

Wie kann ich innerhalb einer Schleife min/max für variable Bereich erreichen?

+0

Sie haben die Aufrufe von 'Cells' nicht richtig qualifiziert:' xMax = Application.WorksheetFunction.Max (ws1.range (ws1.Cells (i, 6), ws1.Cells (i, 15))) ' – Rory

+0

Don brauchst du 'Next i'? Und setze es als int –

+1

@David G: Nein, das 'i' ist optional - aber gute Praxis, es zu benutzen. – FunThomas

Antwort

1

Unter Ihrer ersten Stellungnahme nach der alle Bereiche der Qualifikation:

xMax = Application.WorksheetFunction.Max(ws1.range(ws1.Cells(i, 6), ws1.Cells(i, 15))) 

Wenn einige der Zellen innerhalb des Bereichs Fehler aufweisen, wie #NA oder #DIV!0, die Max Funktion einen Fehler auslöst. Damit die Berechnung Fehlerzellen im Bereich ignoriert, können Sie die Funktion Aggregate verwenden.

xMax = Application.Aggregate(14, 6, ws1.range(ws1.Cells(i, 6), ws1.Cells(i, 15)), 1) 
  • Der erste Parameter gibt an 14Large. Verwenden Sie 15 für Small.
  • Der zweite Parameter 6 gibt „Fehler bei der Berechnung ignorieren“
  • Der letzte Parameter 1 gibt „Zuerst größte Ergebnis“

Beachten Sie auch, dass die andere Version, die Sie versuchten, das heißt

xMax = Application.WorksheetFunction.Max(Cells(i, 6).Value, Cells(i, 7).Value) 

nicht festgelegt, einen kontinuierlichen Bereich, sondern eine Reihe von Werten (Varianten). Dies führt zu Fehlern, wenn eine dieser Varianten nicht numerisch ist. Aber du brauchst diese Version nicht.

+1

Brilliant! Danke, dass du meinen Kopf gegen die Wand hämmerst! –

+0

Ich habe 'xMax = Application.Aggregate (4, 6, ws1.range (ws1.Cells (i, 6), ws1.Cells (i, 15)))' für 'Max' und' xMin = Application.Aggregate (5, 6, ws1.range (ws1.Cells (i, 6), ws1.Cells (i, 15))) 'für' Min' anstelle von 14 für Large und 15 für Small, wenn sich jemand für die Zukunft interessiert. –

0

Ich schließe eine Split-Funktion, die den Brief leichter erfasst.

Dim i As Long 
Dim xMax As Double 
Dim ws1 As Worksheet 
Set ws1 = Worksheets("Sheet1") 

For i = 2 To 15 
    xMax = Application.WorksheetFunction.Max(ws1.range("F" & i & ":" & Split(Cells(, i).Address, "$")(1) & "15")) 
Next 
+0

Vielen Dank für Ihre Antwort. Die Variable i ist jedoch für Zeilen, nicht für Spalten. Ich brauche 'F2: O2, F3: O3 ..., F15: O15', Bitte beachten Sie, dass' xMax = Application.WorksheetFunction.Max (ws1.range ("F:" & i "O:" & i)) 'funktioniert auch nicht. Irgendwelche Ideen? –

+0

siehe aktualisiert, um jetzt eine statische Spalte enthalten – Lowpar

1

Sie haben Excel zu sagen, wo cell Punkte - sonst wird es das aktive Blatt verwenden, zum Beispiel

xMax = Application.WorksheetFunction.Max(ws1.range(ws1.Cells(i, 6), ws1.Cells(i, 15))) 

oder

With ws1 
    xMax = Application.WorksheetFunction.Max(.Range(.Cells(i, 6), .Cells(i, 15))) 
End With 

persönlich, ich in der Regel eine Reihe zuweisen eine Bereichsvariable zuerst - es hilft beim Debugging:

With ws1 
    dim r as range 
    ''' set r = .Range(.Cells(i, 6), .Cells(i, 15)) ' Fails if not all cells are numeric 
    set r = .Range(.Cells(i, 6), .Cells(i, 15)).SpecialCells(xlCellTypeConstants, xlNumbers) 
    xMax = Application.WorksheetFunction.Max(r) 
End With 
+0

Vielen Dank, das war das Problem. Allerdings habe ich den gleichen Fehler, wenn es um Zellen geht, die '# N/A' enthalten –

+0

Siehe meine Bearbeitung, um nicht-numerische Zellen herauszufiltern. – FunThomas

Verwandte Themen