2015-05-03 29 views
0

我試圖將範圍傳遞給子例程,但它拋出了對象'_Global'的「方法範圍'失敗」錯誤。如何在Excel VBA中的子例程之間傳遞範圍變量

在主我聲明和定義的範圍內可變我想使用:

Sub maintest() 

Dim ScheduledSort As Range 
Set ScheduledSort = Range("F4:F321") 

Call test(ScheduledSort) 
End Sub 

然後在子程序測試我希望它使用範圍我通過它從上面的例程進行排序:

Sub test(RangeForSort) 

Sheets("SheetTest").Select 

' Sort in descending order 
ActiveWorkbook.Worksheets("SheetTest").AutoFilter.Sort.SortFields.Add _ 
    Key:=Range("RangeForSort"), SortOn:=xlSortOnValues, Order:=xlDescending, _ 
    DataOption:=xlSortTextAsNumbers 
With ActiveWorkbook.Worksheets("SheetTest").AutoFilter.Sort 
    .Header = xlYes 
    .MatchCase = False 
    .Orientation = xlTopToBottom 
    .SortMethod = xlPinYin 
    .Apply 
End With 
End Sub 

我認爲它在Key:=Range("RangeForSort")出錯了,但我找不出爲什麼以及如何解決它。
它是什麼我做錯了的範圍和我如何解決它,使我可以通過它任何範圍進行排序?
如果您對我正在嘗試做的事有更好的建議,請隨時添加! :-)

+1

'鍵:= RangeForSort'或...'鍵: = Range(RangeForSort.address)'...'RangeForSort'是一個範圍對象,而不是一個字符串。 Jeeped指出你也可能有不正確的工作表,但第二個版本應該處理這個問題。 –

+0

你不需要'maintest()'子。你可以直接將範圍傳遞給你的'test()'子。 –

+0

'maintest()'是從一個更大的塊調用其他例程的代碼片段...在子測試中'test'sub被刪除,我排序從上面的sub傳遞給它的一些標準,然後我篩選特定細胞。我需要根據不同的標準進行過濾,然後在不同的列上進行排序。有一個通用的子程序來完成過濾和排序似乎是最好的方法。 –

回答

1

較短的版本是這樣的:

Sub test(rng As Range) 

    ' Sort in descending order 
    Worksheets(rng.Parent.Name).AutoFilter.Sort.SortFields.Add _ 
    Key:=rng, SortOn:=xlSortOnValues, Order:=xlDescending, _ 
    DataOption:=xlSortTextAsNumbers 

    With Worksheets(rng.Parent.Name).AutoFilter.Sort 
     .Header = xlYes 
     .MatchCase = False 
     .Orientation = xlTopToBottom 
     .SortMethod = xlPinYin 
     .Apply 
    End With 

End Sub 

運行:

Call test(Worksheets("YOUR WORKSHEET NAME").Range("YOUR RANGE")). 
+0

我目前正在從Excel中的PERSONAL.XLSB文件運行此宏,並從那裏運行適當的文件。如果我開始使用'ThisWorkbook'這個停止工作? –

+1

是的,它會的。如果您確定範圍工作表的名稱在所有打開的Excel工作簿中都是唯一的,則可以完全刪除「ThisWorkbook」。 –

1

如果將範圍對象傳遞給子,則傳遞的對象已與某個工作表關聯。該子選擇一個可能不同的工作表,然後在處理傳遞的範圍時遇到問題。

如果要將特定的單元塊傳遞給需要更改工作表的子部分,請改爲使用字符串變量。

UNTESTED

Sub maintest() 
    Dim ScheduledSort As String 
    ScheduledSort = "F4:F321" 
    Call test(ScheduledSort) 
End Sub 

Sub test(RangeForSort As String) 
    Sheets("SheetTest").Select 

    ActiveWorkbook.Worksheets("SheetTest").AutoFilter.Sort.SortFields.Add _ 
     Key:=Range(RangeForSort), SortOn:=xlSortOnValues, Order:=xlDescending, _ 
     DataOption:=xlSortTextAsNumbers 

    With ActiveWorkbook.Worksheets("SheetTest").AutoFilter.Sort 
     .Header = xlYes 
     .MatchCase = False 
     .Orientation = xlTopToBottom 
     .SortMethod = xlPinYin 
     .Apply 
    End With 
End Sub 
+0

我想我明白你的意思,當你說「ub選擇一個可能不同的工作表,然後在處理傳遞的範圍時遇到問題」,這就是爲什麼我的所有我的代碼選擇我想要工作的工作表,例如'表格(「SheetTest」)。在這裏選擇。這不是一個好的工作方式嗎? –