WorksheetFunction.Small错误?

我有以下代码:

Option Explicit Dim ArrTest() As Variant Dim ArrSmall() As Variant Dim ArrTemp() As Variant Dim k As Integer Dim i As Integer Sub test() ReDim ArrTest(10, 2) ReDim ArrSmall(10, 2) ReDim ArrTemp(10, 1) ArrTest = Range("A1:B10") For k = 1 To 2 For i = 1 To 10 ArrTemp(i, 1) = ArrTest(i, k) ArrSmall(i, k) = WorksheetFunction.Small(ArrTemp, i) Cells(i, k + 10) = ArrSmall(i, k) Next i Next k End Sub 

Range("A1:B10")是一个任意范围的数字,根据WorksheetFunction.Small应该从小到大sorting。 用一个单独的列,这工作得很好。 但是,如果这样应用(使用循环),函数会复制原始范围中的值,并且输出是错误的。

请在Excel工作表中自己尝试,并告诉我我做错了什么或function是错误的?

谢谢。

编辑:我有它的Application.Index工作在这个特定的例子。 看到:

 Sub test() ReDim ArrTest(10, 2) ReDim ArrSmall(10, 2) ReDim ArrTemp(10, 1) ArrTest = Range("A1:B10") For k = 1 To 2 For i = 1 To 10 ArrTemp = Application.Index(ArrTest, 0, k) 'ArrTemp(i, 1) = ArrTest(i, 1) ArrSmall(i, 1) = WorksheetFunction.Small(ArrTemp, i) Cells(i, k + 10) = ArrSmall(i, 1) Next i Next k End Sub 

哪个工作正常。 但是,当我将完全相同的逻辑应用到我的原始代码时,它给了我1004错误:无法获得小属性。 我没有任何线索。

让代码尽可能多(第一个例子)完美:

 Option Explicit Dim ArrTest() As Variant Dim ArrSmall() As Variant Dim ArrTemp() As Variant Dim k As Integer Dim i As Integer Sub test() ReDim ArrTest(10, 2) '* ReDim ArrSmall(10, 2) ReDim ArrTemp(10, 1) ArrTest = Range("A1:B10") For k = 1 To 2 For i = 1 To 10 ArrTemp(i, 1) = ArrTest(i, k) Next i For i = 1 To 10 ArrSmall(i, k) = WorksheetFunction.Small(ArrTemp, i) Cells(i, k + 10) = ArrSmall(i, k) Next i Next k End Sub 

没有错误或任何东西… '*只是不使用ArrTest = Range("A1:B10")将自动设置所有范围…仍然范围将是其他范围大…

我得到完全相同的输出,就像你的第二个例子…

编辑:
如果你想sorting整个范围(不是每一列本身),那么你需要像这样的东西:

 Option Explicit Dim ArrTest() As Variant Dim ArrSmall() As Variant Dim ArrTemp() As Variant Dim k As Integer Dim i As Integer Sub test() ReDim ArrTest(10, 2) ReDim ArrSmall(10, 2) ReDim ArrTemp(10, 1) ArrTest = Range("A1:B10") For k = 1 To UBound(ArrTest, 2) For i = 1 To UBound(ArrTest) ArrSmall(i, k) = WorksheetFunction.Small(ArrTest, i + ((k - 1) * UBound(ArrTest))) Cells(i, k + 10) = ArrSmall(i, k) Next i Next k End Sub 

我仍然认为第一个代码应该做你想做的事情;)

您使用ReDim语句的方式是在数组中创build太多的元素。 将工作表范围值设置为第一个变体数组后,尝试使用LBound函数和UBound函数 。

 Option Explicit Sub test() Dim ArrTest() As Variant, ArrSmall() As Variant, ArrTemp() As Variant Dim k As Long, i As Long ReDim ArrTest(10, 2) '<~~ unnecessary if writing values from the worksheet Debug.Print LBound(ArrTest, 1) & ":" & UBound(ArrTest, 1) Debug.Print LBound(ArrTest, 2) & ":" & UBound(ArrTest, 2) '^^ this results in 0:10, 0:2. Not 1:10, 1:2 ArrTest = Range("A1:B10").Value2 '<~~ make sure you are putting values in Debug.Print LBound(ArrTest, 1) & ":" & UBound(ArrTest, 1) Debug.Print LBound(ArrTest, 2) & ":" & UBound(ArrTest, 2) '^^ this results in 1:10, 1:2. ReDim ArrSmall(LBound(ArrTest, 1) To UBound(ArrTest, 1), _ LBound(ArrTest, 2) To UBound(ArrTest, 2)) ReDim ArrTemp(LBound(ArrTest, 1) To UBound(ArrTest, 1), 1 To 1) For k = LBound(ArrTest, 2) To UBound(ArrTest, 2) For i = LBound(ArrTest, 1) To UBound(ArrTest, 1) ArrTemp(i, 1) = ArrTest(i, k) ArrSmall(i, k) = WorksheetFunction.Small(ArrTemp, i) Cells(i, k + 10) = ArrSmall(i, k) Next i Next k End Sub 

lbound_ubound_small

这取决于你如何编写代码。

 Sub test() With Range("A1:B10") For Each Column In .Columns x = x + 1 For i = 1 To Column.Cells.Count Cells(i, 10 + x).Value = Application.Small(Column, i) Next i Next Column End With End Sub 

编辑:

虽然这将适用于Range,但我的目标是从数组中提取列而不必返回到工作表。 我认为这是有限的

也添加数组方法

 Sub test() Dim vArr As Variant, varrTemp As Variant vArr = Application.Transpose(Range("A1:B10").Value) For i = LBound(vArr, 1) To UBound(vArr, 1) varrTemp = Application.Index(Application.Transpose(vArr), , i) For x = LBound(varrTemp) To UBound(varrTemp) Cells(x, 10 + i).Value = Application.Small(varrTemp, x) Next x Next i End Sub