我已經編寫了一個算法,按升序對整數值進行排序,但將相應的信息保留在與其相符的相鄰單元格中。它使用Arr作爲正在排序的單元格的快照,如果它們按升序排序,則構建值的索引(TagIndex)的數組,然後將TagIndex應用於該單元格和相鄰單元格。不等式運算符在比較變體時失敗
例如,應該把這個...
----------------------------------
| 5/14/12 | 87 | 91 | 102 |
| 12/8/11 | 96 | 81 | 93 |
| 9/30/10 | 75 | 101 | 74 |
| 4/26/08 | 107 | 95 | 64 |
----------------------------------
...和排序第二最左列把它變成這樣:
----------------------------------
| 9/30/10 | 75 | 101 | 74 |
| 5/4/12 | 87 | 91 | 102 |
| 12/8/11 | 96 | 81 | 93 |
| 4/26/08 | 107 | 95 | 64 |
----------------------------------
下面的代碼:
Dim cell as Range
Dim Arr, TempArr, BoundVal As Variant
For Each cell In ActiveSheet.ListObjects("Table2").ListColumns(targetColumn).DataBodyRange
Arr = Split(cell.Value, Chr(10))
ReDim TagIndex(0 To UBound(Arr)) As Variant
For i = 0 To UBound(Arr)
BoundVal = Arr(i) 'starts with first value and index
TagIndex(i) = i 'as defaults
For j = 0 To UBound(Arr)
If Arr(j) < BoundVal Then 'if sorter finds a smaller value,
BoundVal = Arr(j) 'flags it...
TagIndex(i) = j '...and its index as smaller,
End If 'keeps looking,
Next j 'leaves For loop with the smallest,
Arr(TagIndex(i)) = 201 'and moves it up out of reach so sorter won't
Next i 'flag it anymore (none of the values go above 200)
For j = leftBoundColumn To rightBoundColumn
TempArr = Split(Cells(cell.Row, j).Value, Chr(10))
For i = 0 To UBound(TempArr)
Arr(i) = TempArr(TagIndex(i))
Next i
Cells(cell.Row, j).Value = Join(Arr, Chr(10))
Next j
Next cell
這段代碼起初很花哨,但我有兩個單獨的版本 - 一個用於排序整數,另一個用於排序日期 - 並希望能夠處理兩者。爲此,我嘗試將BoundVal聲明爲新變量中的變體。當結果變得不可靠時,敏銳地使用MsgBox'es顯示它在<運營商處失敗邏輯測試,試圖告訴我否,對於107 < 201是肯定的(但是對於117/107不適用,就像它應該)。
如果我回去聲明BoundVal是一個整數,它開始工作罰款整數,但給我一個類型不匹配錯誤,當我嘗試它的日期。
比較Arr(j)< BoundVal有一些基本問題嗎?兩者都是變體,都是從字符串開始的。有任何想法嗎?
僅僅因爲你聲明一個變量是變體並不意味着它只是在運行時保持不變。只需自己測試一下:'Dim varTMP As Variant'然後在下一行'varTMP = 20'中將其設置爲20,最後詢問變量的類型是「Debug.Print TypeName(varTMP)'。你會得到「整數」的答案。所以,也許你想包括更多的文本框來檢查你在比較... – Ralph
謝謝,這就是問題所在。但BoundVal = CVar(Arr(i))在將BoundVal更改爲變體時沒有成功。該怎麼辦呢? –