2017-06-26 144 views
1

我想在for循環(對於每一行)中獲取範圍的最大值和最小值。WorksheetFunction.Max/Min對於變量範圍的運行時錯誤「1004」

無論我在互聯網上找到的解決方案是靜態範圍還是給我同樣的錯誤。目前我使用它在xMax行給出run-time error '1004'如下:

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 

但是下面的靜態範圍內工作:

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

我試圖把它siplify 2個細胞:

靜態範圍沒有問題:

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

但動態範圍彈出同樣的錯誤:在一個循環中

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

我如何能實現最小/最大變量範圍是多少?

+0

您沒有正確限定'Cells'調用:'xMax = Application.WorksheetFunction.Max(ws1.range(ws1.Cells(i,6),ws1.Cells(i,15)))' – Rory

+0

Don你不得不使用'下一個我'嗎?並將其設置爲int –

+1

@David G:不,「i」是可選的 - 但是使用它的很好的做法。 – FunThomas

回答

1

以您最初的聲明中排位所有範圍後:

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

當某些範圍內的細胞都有錯誤,如#NA#DIV!0,則Max拋出一個錯誤。爲了讓您的計算忽略範圍內的錯誤單元格,可以使用Aggregate函數。

xMax = Application.Aggregate(14, 6, ws1.range(ws1.Cells(i, 6), ws1.Cells(i, 15)), 1) 
  • 第一個參數14指定Large。使用15Small
  • 第二個參數6指定
  • 最後一個參數指定1「第一大結果」

還要注意的是,你嘗試過其他的版本,即「在計算中忽略錯誤」

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

不指定連續範圍,而是指定一組值(變體)。只要其中一個變量不是數字,就會引發錯誤。但是,你不需要這個版本。

+1

輝煌!謝謝你挽救我的頭撞牆! –

+0

我使用'xMax = Application.Aggregate(4,6,ws1.range(ws1.Cells(i,6),ws1.Cells(i,15)))''Max'和'xMin = Application.Aggregate 5,6,ws1.range(ws1.Cells(i,6),ws1.Cells(i,15)))''Min',而不是14對於Large,對於Small,如果有人對未來感興趣,則爲15。 –

0

我包含了一個可以更容易地捕捉到字母的分割函數。

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

謝謝你的回答。但是,我的變量是行而不是列。我需要'F2:O2,F3:O3 ...,F15:O15',請注意'xMax = Application.WorksheetFunction.Max(ws1.range(「F:」&i&「O:」&i ))'也不起作用。有任何想法嗎? –

+0

看到更新到現在包含一個靜態列 – Lowpar

1

你一定要告訴Excel的地方cell點 - 否則,它將使用主動片,例如

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

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

個人而言,我通常會指派一個範圍首先是範圍變量 - 它有助於調試:

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

謝謝,那就是問題所在。然而,當涉及包含「#N/A」的單元格時,我遇到了同樣的錯誤。 –

+0

請參閱我的編輯以濾除非數字單元格。 – FunThomas

相關問題