Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/excel/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/vba/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Excel 下一个 msg=msg&Chr(10)&“操作已完成,但出现警告。”&Chr(10) msg=msg&Chr(10)&“是否保存结果?” 如果MsgBox(msg,vbequipment+vbYesNo,“Done”)=vbYes,则保存结果(msg) 出口接头 如果结束 下一个 msg=msg&Chr(10)和“操作完成”。&Chr(10) msg=msg&Chr(10)&“是否保存结果?” 如果MsgBox(msg,vbInformation+vbYesNo,“Done”)=vbYes,则保存结果(msg) 端接头 子保存结果(文本为字符串) Dim lines()作为字符串,temp()作为字符串 我和我一样长,我和我一样长 将文件名设置为字符串 行=拆分(文本,Chr(10)) 对于i=LBound(行)到UBound(行) 如果行(i)喜欢“任务:”,那么 雷迪姆温度(j) 温度(j)=线路(i) j=j+1 如果结束 下一个 暗淡如长 FileName=“任务重新分配日志” 文件名=应用程序.GetSaveAsFilename(初始文件名:=文件名,文件筛选器:=“文本文件(*.txt),*.txt”,标题:=“另存为文本…”) 如果UCase(文件名)=“FALSE”,则退出Sub 如果CheckFileExists(文件名),则 如果MsgBox(“文件”&Dir(FileName)和“已存在。覆盖?”,vbQuestion+vbYesNo)=vbYes,则 WriteToFile文件名,temp 其他的 i=0 直到不检查文件存在(文件名)为止 对于j=Len(文件名)到1步骤-1 如果Mid(文件名,j,1)=Application.PathSeparator,则退出 下一个 FileName=左(FileName,j) 如果i=0,那么 FileName=FileName&“任务重新分配日志.txt” 其他的 FileName=FileName&“任务重新分配日志(“&i&”&“.txt” 如果结束 i=i+1 环 WriteToFile文件名,temp MsgBox“该文件保存时带有”&Chr(34)&Dir(FileName)&Chr(34)&name“,vbInformation 如果结束 其他的 WriteToFile文件名,temp 如果结束 端接头 子WriteToFile(文件名为字符串,文本()为字符串) 我想我会坚持多久 打开文件名,输出为#1 对于i=LBound(文本)到UBound(文本) 写#1,正文(i) 下一个 关闭#1 端接头 函数CheckFileExists(文件名为字符串)为布尔值 CheckFileExists=False 如果不是Dir(FileName)=“”,则CheckFileExists=True 端函数_Excel_Vba_Excel Formula_Sampling - Fatal编程技术网

Excel 下一个 msg=msg&Chr(10)&“操作已完成,但出现警告。”&Chr(10) msg=msg&Chr(10)&“是否保存结果?” 如果MsgBox(msg,vbequipment+vbYesNo,“Done”)=vbYes,则保存结果(msg) 出口接头 如果结束 下一个 msg=msg&Chr(10)和“操作完成”。&Chr(10) msg=msg&Chr(10)&“是否保存结果?” 如果MsgBox(msg,vbInformation+vbYesNo,“Done”)=vbYes,则保存结果(msg) 端接头 子保存结果(文本为字符串) Dim lines()作为字符串,temp()作为字符串 我和我一样长,我和我一样长 将文件名设置为字符串 行=拆分(文本,Chr(10)) 对于i=LBound(行)到UBound(行) 如果行(i)喜欢“任务:”,那么 雷迪姆温度(j) 温度(j)=线路(i) j=j+1 如果结束 下一个 暗淡如长 FileName=“任务重新分配日志” 文件名=应用程序.GetSaveAsFilename(初始文件名:=文件名,文件筛选器:=“文本文件(*.txt),*.txt”,标题:=“另存为文本…”) 如果UCase(文件名)=“FALSE”,则退出Sub 如果CheckFileExists(文件名),则 如果MsgBox(“文件”&Dir(FileName)和“已存在。覆盖?”,vbQuestion+vbYesNo)=vbYes,则 WriteToFile文件名,temp 其他的 i=0 直到不检查文件存在(文件名)为止 对于j=Len(文件名)到1步骤-1 如果Mid(文件名,j,1)=Application.PathSeparator,则退出 下一个 FileName=左(FileName,j) 如果i=0,那么 FileName=FileName&“任务重新分配日志.txt” 其他的 FileName=FileName&“任务重新分配日志(“&i&”&“.txt” 如果结束 i=i+1 环 WriteToFile文件名,temp MsgBox“该文件保存时带有”&Chr(34)&Dir(FileName)&Chr(34)&name“,vbInformation 如果结束 其他的 WriteToFile文件名,temp 如果结束 端接头 子WriteToFile(文件名为字符串,文本()为字符串) 我想我会坚持多久 打开文件名,输出为#1 对于i=LBound(文本)到UBound(文本) 写#1,正文(i) 下一个 关闭#1 端接头 函数CheckFileExists(文件名为字符串)为布尔值 CheckFileExists=False 如果不是Dir(FileName)=“”,则CheckFileExists=True 端函数

Excel 下一个 msg=msg&Chr(10)&“操作已完成,但出现警告。”&Chr(10) msg=msg&Chr(10)&“是否保存结果?” 如果MsgBox(msg,vbequipment+vbYesNo,“Done”)=vbYes,则保存结果(msg) 出口接头 如果结束 下一个 msg=msg&Chr(10)和“操作完成”。&Chr(10) msg=msg&Chr(10)&“是否保存结果?” 如果MsgBox(msg,vbInformation+vbYesNo,“Done”)=vbYes,则保存结果(msg) 端接头 子保存结果(文本为字符串) Dim lines()作为字符串,temp()作为字符串 我和我一样长,我和我一样长 将文件名设置为字符串 行=拆分(文本,Chr(10)) 对于i=LBound(行)到UBound(行) 如果行(i)喜欢“任务:”,那么 雷迪姆温度(j) 温度(j)=线路(i) j=j+1 如果结束 下一个 暗淡如长 FileName=“任务重新分配日志” 文件名=应用程序.GetSaveAsFilename(初始文件名:=文件名,文件筛选器:=“文本文件(*.txt),*.txt”,标题:=“另存为文本…”) 如果UCase(文件名)=“FALSE”,则退出Sub 如果CheckFileExists(文件名),则 如果MsgBox(“文件”&Dir(FileName)和“已存在。覆盖?”,vbQuestion+vbYesNo)=vbYes,则 WriteToFile文件名,temp 其他的 i=0 直到不检查文件存在(文件名)为止 对于j=Len(文件名)到1步骤-1 如果Mid(文件名,j,1)=Application.PathSeparator,则退出 下一个 FileName=左(FileName,j) 如果i=0,那么 FileName=FileName&“任务重新分配日志.txt” 其他的 FileName=FileName&“任务重新分配日志(“&i&”&“.txt” 如果结束 i=i+1 环 WriteToFile文件名,temp MsgBox“该文件保存时带有”&Chr(34)&Dir(FileName)&Chr(34)&name“,vbInformation 如果结束 其他的 WriteToFile文件名,temp 如果结束 端接头 子WriteToFile(文件名为字符串,文本()为字符串) 我想我会坚持多久 打开文件名,输出为#1 对于i=LBound(文本)到UBound(文本) 写#1,正文(i) 下一个 关闭#1 端接头 函数CheckFileExists(文件名为字符串)为布尔值 CheckFileExists=False 如果不是Dir(FileName)=“”,则CheckFileExists=True 端函数,excel,vba,excel-formula,sampling,Excel,Vba,Excel Formula,Sampling,注意 1.我没有随机化自由人的名单,所以他们是一个接一个的。如果您确实需要,您可以很容易地找到一个宏来随机化数组并将其作为辅助函数插入。 2.我不确定它是否能完美工作-欢迎评论 更新 我在这个问题上睡了一觉,决定用一个基本的东西来完成我的回答,比如将重新分配日志保存到文本文件,这样代码就会更新。这是一个有趣的问题 这是我的解决办法。我尝试了几种可能的版本。 尝试1: 根据最初发布的数据-Chris Smith(h238)超负荷执行1项任务,并且有足够的人员重新分配任务: 尝试2: Chris S

注意
1.我没有随机化自由人的名单,所以他们是一个接一个的。如果您确实需要,您可以很容易地找到一个宏来随机化数组并将其作为辅助函数插入。
2.我不确定它是否能完美工作-欢迎评论

更新

我在这个问题上睡了一觉,决定用一个基本的东西来完成我的回答,比如将重新分配日志保存到文本文件,这样代码就会更新。

这是一个有趣的问题

这是我的解决办法。我尝试了几种可能的版本。
尝试1:
根据最初发布的数据-Chris Smith(h238)超负荷执行1项任务,并且有足够的人员重新分配任务: 尝试2:
Chris Smith(h238)仍然超负荷工作,但这次有3项任务,并且有足够的人员重新分配任务: 尝试3:
可怜的Chris Smith(h238)完全超载,但这次没有足够的人来重新分配任务: 尝试4: 这一次,Jane Doe(h324)和Chris Smith(h238)是一致的——他们超负荷工作,但没有足够的人来重新分配任务:

在没有超载或没有自由人发送适当消息的情况下,没有进行屏幕截图。
守则:

Sub ReassignCases()
' Variables
' people  related:
Dim handlerIdRange As Range, handlerId As Range
Dim maxCases As Long
Dim cases As Long
Dim name As String, id As String
Dim nameTo As String, idTo As String
Dim caseRef As Range

' arrays:
Dim overloaded() As String
Dim free() As String

' counters:
Dim o As Long, f As Long, i As Long, c As Long, j As Long

' unique values container
Dim handlersList As New Collection

' output
Dim msg As String

Dim workSht As Worksheet

'----------------------------------------------------
' reassign the sheet name as you have in your workbook
Set workSht = ThisWorkbook.Sheets("Sheet1")

' parameter that can be changed if needed
maxCases = 2

With workSht
    Set handlerIdRange = Range(.Cells(2, 2), .Cells(Rows.Count, 2).End(xlUp))
End With

' get the list of handlers
On Error Resume Next
For Each handlerId In handlerIdRange
    handlersList.Add handlerId & ";" & handlerId.Offset(0, -1), handlerId & ";" & handlerId.Offset(0, -1)
Next
Err.Clear
On Error GoTo 0

For i = 1 To handlersList.Count

    ' look for overloaded
    If Application.WorksheetFunction.CountIf(handlerIdRange, Split(handlersList(i), ";")(0)) > maxCases Then
        ReDim Preserve overloaded(o)
        ' adding to array: id;name;qty of cases
        overloaded(o) = handlersList.Item(i) & ";" & Application.WorksheetFunction.CountIf(handlerIdRange, Split(handlersList(i), ";")(0))
        o = o + 1
    ' look for those who has less the 2 cases. If one has 2 cases - he is not free
    ElseIf Application.WorksheetFunction.CountIf(handlerIdRange, Split(handlersList(i), ";")(0)) < maxCases Then
        ReDim Preserve free(f)
        free(f) = handlersList.Item(i)
        f = f + 1
    End If
Next

' check whether there are overloaded handlers
If Not Not overloaded Then
    ' if yes - proceed further
    Else
    ' if not - inform and quit
    MsgBox "There are no overloaded handlers.", vbInformation, "Info"
    Exit Sub
End If

' check whether there are free handlers
If Not Not free Then
    ' if yes - proceed further
    Else
    ' if not - inform and quit
    o = UBound(overloaded) + 1
    MsgBox "There " & IIf(o = 1, "is ", "are ") & o & " overloaded " & IIf(o = 1, "handler", "handlers") & ", but 0 free.", vbInformation, "Info"
    Exit Sub
End If
msg = ""
' go through array of overloaded
For i = LBound(overloaded) To UBound(overloaded)
    ' Id of overloaded
    id = Split(overloaded(i), ";")(0)
    ' Name of overloaded
    name = Split(overloaded(i), ";")(1)
    ' number of over cases = total assigned - 2 (max cases)
    cases = Split(overloaded(i), ";")(2) - maxCases
    '

    ' check that there some free people left
    If Not c > UBound(free) Then
    ' go through each handler in the array of free people
    ' free people are those, who have only 1 task and can take another 1

    ' if c was not used yet it is 0, otherwise, it will continue looping through free people
        For c = c To UBound(free)

            idTo = Split(free(c), ";")(0)
            nameTo = Split(free(c), ";")(1)

            ' find the first match of the id in Id range
            Set caseRef = handlerIdRange.Find(what:=id, LookIn:=xlValues)
            ' give an outcome of what was reassigned
            msg = msg & "Task: " & caseRef.Offset(0, 1).Text & " was reassigned from " & name & " (" & id & ") "
                With caseRef
                    .Value = idTo
                    .Offset(0, -1).Value = nameTo
                End With
            msg = msg & "to " & nameTo & " (" & idTo & ")" & Chr(10)
            cases = cases - 1
            ' when all needed cases are passed to other stop looking through free people
            If cases = 0 Then Exit For
        Next
        ' if the loop through free people is finished,
        ' but there left some more - go to warning creation
        If Not cases = 0 Then GoTo leftCases
    Else
leftCases:
        msg = msg & Chr(10) & Chr(10) & "There are no more free handlers." & Chr(10)

        For j = i To UBound(overloaded)
            msg = msg & Split(overloaded(j), ";")(1) & " is still overloaded with " & cases & " cases." & Chr(10)
        Next

        msg = msg & Chr(10) & "Operation completed with warnings." & Chr(10)
        msg = msg & Chr(10) & "Would you like to save results?"
        If MsgBox(msg, vbExclamation + vbYesNo, "Done") = vbYes Then SaveResults (msg)
        Exit Sub
    End If
Next

msg = msg & Chr(10) & "Operation completed." & Chr(10)

msg = msg & Chr(10) & "Would you like to save results?"

If MsgBox(msg, vbInformation + vbYesNo, "Done") = vbYes Then SaveResults (msg)

End Sub

Sub SaveResults(Text As String)

Dim lines() As String, temp() As String
Dim i As Long, j As Long

Dim FileName As String

lines = Split(Text, Chr(10))

For i = LBound(lines) To UBound(lines)
    If lines(i) Like "Task:*" Then
        ReDim Preserve temp(j)
        temp(j) = lines(i)
        j = j + 1
    End If
Next

Dim fi As Long

FileName = "Task reassignment log"

FileName = Application.GetSaveAsFilename(InitialFileName:=FileName, FileFilter:="Text Files (*.txt), *.txt", Title:="Saving as text...")

If UCase(FileName) = "FALSE" Then Exit Sub

If CheckFileExists(FileName) Then
    If MsgBox("The file " & Dir(FileName) & " already exists. Overwrite?", vbQuestion + vbYesNo) = vbYes Then
        WriteToFile FileName, temp
    Else
        i = 0
        Do Until Not CheckFileExists(FileName)
            For j = Len(FileName) To 1 Step -1
                If Mid(FileName, j, 1) = Application.PathSeparator Then Exit For
            Next

            FileName = Left(FileName, j)
            If i = 0 Then
                FileName = FileName & "Task reassignment log.txt"
            Else
                FileName = FileName & "Task reassignment log (" & i & ")" & ".txt"
            End If
            i = i + 1
        Loop
        WriteToFile FileName, temp
        MsgBox "The file was saved with " & Chr(34) & Dir(FileName) & Chr(34) & " name", vbInformation
    End If
Else
    WriteToFile FileName, temp
End If


End Sub

Sub WriteToFile(FileName As String, Text() As String)
Dim i As Long

Open FileName For Output As #1
    For i = LBound(Text) To UBound(Text)
        Write #1, Text(i)
    Next
Close #1
End Sub

Function CheckFileExists(FileName As String) As Boolean
CheckFileExists = False
If Not Dir(FileName) = "" Then CheckFileExists = True
End Function
子重新分配案例()
"变数",
“相关人员:
Dim handlerId范围作为范围,handlerId作为范围
暗淡的马克斯盒一样长
如长
Dim名称为字符串,id为字符串
Dim nameTo作为字符串,idTo作为字符串
Dim caseRef As范围
'数组:
Dim重载()作为字符串
Dim free()作为字符串
"柜台:
尺寸o等于长,f等于长,i等于长,c等于长,j等于长
'唯一值容器
Dim handlersList作为新系列
"产出",
作为字符串的Dim msg
将工作表设置为工作表
'----------------------------------------------------
'重新指定工作簿中的工作表名称
Set workSht=ThisWorkbook.Sheets(“Sheet1”)
'参数,可根据需要进行更改
maxCases=2
与workSht
Set handlerIdRange=范围(.Cells(2,2),.Cells(Rows.Count,2).End(xlUp))
以
'获取处理程序列表
出错时继续下一步
对于handlerIdRange中的每个handlerId
handlersList.Add handlerId&“;”&handlerId.Offset(0,-1),handlerId&“;”&handlerId.Offset(0,-1)
下一个
呃,明白了
错误转到0
对于i=1到handlersList.Count
"寻找超载,
如果Application.WorksheetFunction.CountIf(handlerIdRange,Split(handlersList(i),“;”)(0))>maxCases那么
重拨保留重载(o)
'添加到数组:id;名称案件数量
重载(o)=handlersList.Item(i)和“;”以及Application.WorksheetFunction.CountIf(HandlerdRange,Split(handlersList(i),”;”)(0))
o=o+1
“寻找那些在这两个病例中发病率较低的患者。如果一个人有两个箱子,他就不是自由的
ElseIf Application.WorksheetFunction.CountIf(handlerIdRange,Split(handlersList(i),“;”)(0))