0

假设我有一个数组 arr1 ,其中包含如下日期值:

Arr1(50)=("9/3/2012 4:57:02 AM","22/3/2012 5:57:02 AM","9/5/2012 8:57:02 AM","9 /3/2011 凌晨 4:57:02")

编辑

 Dim CellCount
 Dim Arr(10)

 CellCount=0
 Do Untill arr(CellCount)="" And Ubound(Arr)>9

  If CStr(arr(CellCount) < arr(CellCount+1)) Then

    MsgBox(arr(CellCount)&"is good")

   Else

     MsgBox(arr(CellCount +1)&"is bad")
     Exit Do

   End if

CellCount=CellCount+1
Loop

现在,有没有直接的方法,不使用任何循环技术,来找出 Arr1() 的日期值是否上升?

谢谢,

4

2 回答 2

1

不,因为您必须检查元素直到/直到第一个反例(可能是最后一个)。

于 2012-12-15T20:30:31.670 回答
1

他正在回答你的问题。你问,有没有办法在没有循环的情况下找到排序? 他说不。你的眼睛,我的眼睛可以看出它是否已分类。但是您如何期望 Excel/计算机在不通过集合元素的情况下这样做呢?

当数据在数组中时,您需要遍历其元素。希望很清楚。

所以我能说的最好的,

  • 如果需要,用逗号分隔符将其拆分为变体。但不是必需的,因为 Array() 可以将元素放入一维变体中
  • 将其转储到Range使用转置
  • 使用工作表排序方法/功能对整个范围进行排序

    ---> 所以你知道它现在已经排序了。

  • 然后转回一个变体数组

一些代码片段可以让您朝着这个方向前进:

Option Explicit

    Sub omgArraySort()
       Dim inputArray As Variant
       Dim outputArray As Variant
       Dim upperB as Long

       inputArray = Array("9/3/2012 4:57:02 AM","22/3/2012 5:57:02 AM", _ 
                          "9/5/2012 8:57:02 AM","9/3/2011 4:57:02 AM")
       '-- sorted array
       outputArray = sortRange(inputArray)

          upperB = UBound(iArray, 1) '-- for 1D array you may also use UBound(iArray)
          If (Err.Number <> 0) Then '-- if there's an error, it's erro code is > 0
            MsgBox "Dates sorted, not empty"
          End If
    End Sub

    '-- dump into sheet and sort in the sheet and dump back into the array
    Function sortRange(ByVal iArray As Variant) As Variant
       Dim rngSort as Range
       Dim i As Long

       Set rngSort = WorkSheets(1).Range("B2")
       i = Ubound(iArray,1)

       With rngSort.Resize(i)
          .Value = WorksheetFunction.Transpose(iArray)
          .Sort rngSort, xlDescending, Header:=xlNo
          sortRange = .Value              
       End With
    End Function

在处理大量数据时,从工作表到代码的流量会降低性能。

请务必知道,当 SO 中具有可信度的人回答(例如 Ekkehard 的回答)时,您必须注意。他们没有正当理由不说。

于 2012-12-20T16:23:05.553 回答