temp2inaits-blog
temp2inaits-blog
temp2 INAITS
1 post
Don't wanna be here? Send us removal request.
temp2inaits-blog · 7 years ago
Text
sim
Option Explicit Option Base 1
Dim dicOrder As New Dictionary Dim arrOrder() As String Dim dicOpeNum As New Dictionary Dim arrOpeNum() As Integer Dim outputData() As Variant
Sub Main()
   Dim startTime As Single: startTime = Timer
   GetDefData
   Matching
   OutputResult
   Debug.Print "Main : " & Format((Timer - startTime) * 1000, "0.000") & " ms"
End Sub
Sub GetDefData()
   Dim tmpArr As Variant    Dim i As Integer, j As Integer
   '' 優先度    tmpArr = ThisWorkbook.Names("def_優先度").RefersToRange
   ReDim Preserve arrOrder(UBound(tmpArr), 3)
   For i = 1 To UBound(tmpArr)        For j = 1 To 3            arrOrder(i, j) = tmpArr(i, j + 1)        Next j        dicOrder(tmpArr(i, 1)) = i    Next i    tmpArr = Empty
   'dbg'    Dim itm As Variant    For Each itm In dicOrder        Debug.Print "dicOrder.key = " & itm & vbTab & " | ";        For i = 1 To 3            Debug.Print vbTab & arrOrder(dicOrder.Item(itm), i);        Next i        Debug.Print vbNullString    Next itm
   '' 人数    tmpArr = ThisWorkbook.Names("def_人数").RefersToRange
   ReDim Preserve arrOpeNum(UBound(tmpArr), 3)
   For i = 1 To UBound(tmpArr)        For j = 1 To 3            arrOpeNum(i, j) = tmpArr(i, j + 1)        Next j        dicOpeNum(CStr(CDate(tmpArr(i, 1)))) = i    Next i    tmpArr = Empty
   'dbg' '    dim itm as Variant    For Each itm In dicOpeNum        Debug.Print "dicOpeNum.key = " & itm & vbTab & " | ";        For i = 1 To 3            Debug.Print vbTab & arrOpeNum(dicOpeNum.Item(itm), i);        Next i        Debug.Print vbNullString    Next itm
End Sub
Sub Matching()
   Dim targetData(6) As Variant    Dim outputRowData(11) As Variant
   Dim arrQueue As Variant    With ThisWorkbook.Worksheets(1)        arrQueue = .Range(.Cells(START_ROW + 1, START_COL), .Cells(END_ROW, END_COL))    End With
   Dim responsibleOpeNum As New Dictionary: responsibleOpeNum.RemoveAll    ' initialize [0:00]    Dim procHour As String: procHour = CStr(CDate(TimeSerial(0, 0, 0)))    responsibleOpeNum("種別1") = arrOpeNum(dicOpeNum.Item(procHour), 1)    responsibleOpeNum("種別2") = arrOpeNum(dicOpeNum.Item(procHour), 2)    responsibleOpeNum("種別3") = arrOpeNum(dicOpeNum.Item(procHour), 3)
   Dim callingOpeStatus As New Dictionary: callingOpeStatus.RemoveAll    callingOpeStatus("種別1") = ""    callingOpeStatus("種別2") = ""    callingOpeStatus("種別3") = ""
   Dim idx As Long    Dim endIdx As Long: endIdx = UBound(arrQueue)    Dim i As Integer
   Dim oIdx As Integer    Dim resultId As Long
   Dim itmX As Variant, itmY As Variant    Dim tmpArr As Variant, tmpArr2() As Variant, tmpArr3 As Variant    Dim tmpStr As String, setStr As String    Dim x As Integer
   Dim targetOpeType As String
'    For idx = LBound(arrQueue) To endIdx    For idx = LBound(arrQueue) To 100        For i = 1 To END_COL            targetData(i) = arrQueue(idx, i)        Next i
       If (Minute(CDate(procHour)) <> Minute(CDate(targetData(2)))) Then            procHour = CStr(CDate(targetData(2)))            For Each itmX In callingOpeStatus                tmpArr = Split(callingOpeStatus.Item(itmX), ":")                If (UBound(tmpArr) > 0) Then                    For x = 0 To UBound(tmpArr)                        ReDim tmpArr2(1)                        If (tmpArr(x) <> "") Then                            If (tmpArr(x) <= 1) Then                                responsibleOpeNum.Item(itmX) = responsibleOpeNum.Item(itmX) + 1                            Else                                ReDim Preserve tmpArr2(x + 1)                                tmpArr2(x + 1) = tmpArr(x) - 1                            End If                            callingOpeStatus.Item(itmX) = Join(tmpArr2, ":")                        End If                    Next x                    Erase tmpArr2                End If            Next itmX        End If
       If (Hour(CDate(procHour)) <> Hour(CDate(targetData(2)))) Then            Debug.Print "* procHour = " & procHour & " | targetData(2) = " & CDate(targetData(2))            procHour = CStr(CDate(targetData(2)))            responsibleOpeNum("種別1") = arrOpeNum(dicOpeNum.Item(procHour), 1)            responsibleOpeNum("種別2") = arrOpeNum(dicOpeNum.Item(procHour), 2)            responsibleOpeNum("種別3") = arrOpeNum(dicOpeNum.Item(procHour), 3)        End If
       For oIdx = 1 To 3            targetOpeType = arrOrder(dicOrder(targetData(3)), oIdx)            If (targetOpeType = "なし") Then                ' 溢れ or 待ち                outputRowData(9) = "溢れ/待ち"                Debug.Print "[" & targetData(1) & "] -> 溢れ/待ち"                Exit For            End If
           If (responsibleOpeNum(targetOpeType) > 0) Then                ' 応答                outputRowData(9) = "応答"                outputRowData(10) = CDate(targetData(2)) + TimeSerial(0, 4, 0)                outputRowData(11) = targetOpeType
               responsibleOpeNum.Item(targetOpeType) = responsibleOpeNum.Item(targetOpeType) - 1                callingOpeStatus.Item(targetOpeType) = callingOpeStatus.Item(targetOpeType) & ":" & CStr(4)
               Debug.Print "[" & targetData(1) & "] -> 応答 | targetOpeType = " & targetOpeType & " | 空き = " & responsibleOpeNum.Item(targetOpeType)                Exit For            End If        Next oIdx
       If (outputRowData(9) = "") Then            ' 溢れ(空きなし)            outputRowData(9) = "空きなし"            Debug.Print "[" & targetData(1) & "] -> 空きなし"        End If
       resultId = resultId + 1        outputRowData(1) = resultId        outputRowData(2) = CDate(targetData(2))        outputRowData(3) = targetData(1)        outputRowData(4) = CDate(targetData(2))        outputRowData(5) = targetData(3)        outputRowData(6) = targetData(4)        outputRowData(7) = targetData(5)        outputRowData(8) = targetData(6)
       ReDim Preserve outputData(resultId)        outputData(resultId) = outputRowData
       Erase outputRowData        Erase targetData        targetOpeType = Empty    Next idx
End Sub
Sub OutputResult()
End Sub
0 notes