|
楼主 |
发表于 2009-8-2 01:04:03
|
显示全部楼层
(3)ExcelVBA代码:
入口函数为GetOrder()。
TypeState
strStateAsString
lngOrderAsLong
EndType
DimlngSampleSizeAsLong
DimstaRawState()AsState
DimstaWorkState()AsState
DimlngIDAsLong'Debug
SubReadState()
'AssumetheStatedataarestoredincolumnBoftheactivesheet.F=Failed,S=Suspended(Censored).
DimlngRowAsLong
'Getsamplesize
lngSampleSize=0
lngRow=2
DoWhileCells(lngRow,2)<>""
lngSampleSize=lngSampleSize+1
lngRow=lngRow+1
Loop
'Initializearrays
ReDimstaRawState(1TolngSampleSize)
ReDimstaWorkState(1TolngSampleSize)
'ReadtheStatedata,andstorethemintothearraysstaStateandstaState.
ForlngRow=2TolngSampleSize+1
staRawState(lngRow-1).lngOrder=Cells(lngRow,1)
staRawState(lngRow-1).strState=Cells(lngRow,2)
staWorkState(lngRow-1).lngOrder=Cells(lngRow,1)
staWorkState(lngRow-1).strState=Cells(lngRow,2)
NextlngRow
EndSub
FunctionCmpState(staOp1AsState,staOp2AsState)AsInteger
'ComparetwodataofthetypeState.IfstaOp1<staOp2,return-1,ifstaOp1=staOp2,return0,ifstaOp1>staOp2,return1.
'Incomparison,thefieldstrStatevalueF<S
IfstaOp1.strState=staOp2.strStateThen
IfstaOp1.lngOrder<staOp2.lngOrderThen
CmpState=-1
ElseIfstaOp1.lngOrder=staOp2.lngOrderThen
CmpState=0
ElseIfstaOp1.lngOrder>staOp2.lngOrderThen
CmpState=1
EndIf
ElseIfstaOp1.strState="F"AndstaOp2.strState="S"Then
CmpState=-1
ElseIfstaOp1.strState="S"AndstaOp2.strState="F"Then
CmpState=1
EndIf
EndFunction
SubCopyState(staSrcAsState,staDstAsState)
'CopydatafromstaSrctostaDst.
staDst.lngOrder=staSrc.lngOrder
staDst.strState=staSrc.strState
EndSub
SubSwapState(staOp1AsState,staOp2AsState)
DimstaTmpAsState
CopyStatestaOp1,staTmp
CopyStatestaOp2,staOp1
CopyStatestaTmp,staOp2
EndSub
SubSortState()
'SorttheglobalarraystaWorkStateinascendorder:strState:F=>S,lngOrder:1=>lngSampleSize.
DimlngIdxAsLong
DimlngPtrAsLong
lngIdx=2
DoWhilelngIdx<=lngSampleSize
ForlngPtr=1TolngSampleSize-lngIdx+1
IfCmpState(staWorkState(lngPtr),staWorkState(lngPtr+1))=1Then
SwapStatestaWorkState(lngPtr),staWorkState(lngPtr+1)
EndIf
NextlngPtr
lngIdx=lngIdx+1
Loop
EndSub
SubRotateState(lngIdxAsLong)
DimstaTmpAsState
DimlngPtrAsLong
CopyStatestaWorkState(lngSampleSize),staTmp
ForlngPtr=lngSampleSize-1TolngIdxStep-1
CopyStatestaWorkState(lngPtr),staWorkState(lngPtr+1)
NextlngPtr
CopyStatestaTmp,staWorkState(lngIdx)
EndSub
SubCalOrder()
lngID=lngID+1
EndSub
SubIterateState(lngIdxAsLong)
'Iterateallthescenarios
DimlngPtrAsLong
IfstaWorkState(lngIdx).strState="S"Then
Return
ElseIfstaWorkState(lngIdx+1).strState="F"Then
IterateState(lngIdx+1)
ElseIfstaWorkState(lngIdx+1).strState="S"Then
lngPtr=lngIdx
WhilestaWorkState(lngPtr).lngOrder<>lngPtr
CalOrder
RotateStatelngIdx
lngPtr=lngPtr+1
Wend
EndIf
EndSub
SubOutputOrder()
'OutputtheorderincolumnCoftheactiveworksheet
EndSub
SubGetOrder()
DimlngIdxAsLong
ReadState
SortState
lngID=1
ForlngIdx=1TolngSampleSize
IterateStatelngIdx
NextlngIdx
EndSub |
[本帖最后由Jack315于2009-8-307:17编辑] |
|