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
这取决于你如何编写代码。
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