Vba Excel宏--符合条件的项目返回列表

Vba Excel宏--符合条件的项目返回列表,vba,excel,Vba,Excel,我有一个非常简单的excel宏,它检查一系列单元格中是否存在引用单元格中的每个值。如果未找到参考范围内的值,则会显示未找到该值的消息。然后,用户必须单击“确定”以继续检查下一项。我想修改宏以检查所有值,并仅在所有检查完成后返回未找到值的列表。建议 当前代码: Sub ChkAfternoonAssignmentsV2() Dim dayToChk As Variant Dim i As Variant Dim r As Range Dim p As Variant

我有一个非常简单的excel宏,它检查一系列单元格中是否存在引用单元格中的每个值。如果未找到参考范围内的值,则会显示未找到该值的消息。然后,用户必须单击“确定”以继续检查下一项。我想修改宏以检查所有值,并仅在所有检查完成后返回未找到值的列表。建议

当前代码:

Sub ChkAfternoonAssignmentsV2()
    Dim dayToChk As Variant
    Dim i As Variant
    Dim r As Range
    Dim p As Variant

ReEnter:

    dayToChk = InputBox("Which day (use 3-letter abbreviation) would you like to check afternoon assignments?")
    If dayToChk = "Mon" Then
        Set r = ActiveSheet.Range("MonAft_MA_Slots")
    ElseIf dayToChk = "Tue" Then
        Set r = ActiveSheet.Range("TueAft_MA_Slots")
    ElseIf dayToChk = "Wed" Then
        Set r = ActiveSheet.Range("WedAft_MA_Slots")
    ElseIf dayToChk = "Thu" Then
        Set r = ActiveSheet.Range("ThuAft_MA_Slots")
    ElseIf dayToChk = "Fri" Then
        Set r = ActiveSheet.Range("FriAft_MA_Slots")
    Else
        MsgBox dayToChk & " is not in the expected format.  Try Mon, Tue, Wed, Thu, or Fri."
        GoTo ReEnter
    End If

    Dim AckTime As Integer, InfoBox As Object
    Set InfoBox = CreateObject("WScript.Shell")
    AckTime = 1
    Select Case InfoBox.Popup("Checking MA Assignments", _
    AckTime, "Checking MA Assignments", 0)
    Case 1, -1
    End Select

    For Each i In Sheets("Control").Range("MA_List")
        If WorksheetFunction.CountIf(r, i) < 1 Then
            If i <> "OOO" Then
                MsgBox i & " is not assigned"
            End If
        ElseIf WorksheetFunction.CountIf(r, i) > 1 Then
            If i <> "OOO" Then
                MsgBox i & " is assigned more than once.  Did you really mean to do that?"
            End If
        End If
    Next i
Sub-ChkAfternoonAssignmentsV2()
Dim dayToChk作为变体
Dim i作为变体
调光范围
dimpas变体
重新输入:
dayToChk=InputBox(“您希望在哪一天(使用三个字母的缩写)检查下午的作业?”)
如果dayToChk=“Mon”,则
设置r=ActiveSheet.Range(“MonAft\u MA\u插槽”)
ElseIf dayToChk=“Tue”然后
设置r=ActiveSheet.Range(“TueAft\u MA\u插槽”)
ElseIf dayToChk=“Wed”然后
设置r=ActiveSheet.Range(“WedAft\u MA\u插槽”)
ElseIf dayToChk=“Thu”然后
设置r=ActiveSheet.Range(“ThuAft\u MA\u插槽”)
ElseIf dayToChk=“Fri”然后
设置r=ActiveSheet.Range(“FriAft\u MA\u槽”)
其他的
MsgBox dayToChk&“不是预期的格式。请尝试周一、周二、周三、周四或周五。”
转到重新进入
如果结束
Dim AckTime为整数,InfoBox为对象
Set InfoBox=CreateObject(“WScript.Shell”)
确认时间=1
选择案例信息框。弹出(“检查MA分配”_
确认时间,“检查MA分配”,0)
案例1,-1
结束选择
对于每一个“控制”范围(“MA_列表”)
如果工作表function.CountIf(r,i)<1则
如果我“哦”那么
MsgBox i&“未分配”
如果结束
ElseIf WorksheetFunction.CountIf(r,i)>1则
如果我“哦”那么
MsgBox i&“被分配了不止一次。您真的打算这样做吗?”
如果结束
如果结束
接下来我

已编译但未测试:

Sub ChkAfternoonAssignmentsV2()
    Dim dayToChk As Variant
    Dim i As Variant
    Dim r As Range
    Dim p As Variant
    Dim days, m, sMsg As String, n

    days = Array("Mon", "Tue", "Wed", "Thu", "Fri")

    Do
        dayToChk = InputBox("Which day (Mon, Tue, Wed, Thu, Fri) " & _
                            "would you like to check afternoon assignments?")

        If Len(dayToChk) = 0 Then Exit Sub 'exit if nothing entered

        If IsError(Application.Match(dayToChk, days, 0)) Then
            MsgBox dayToChk & " is not in the expected format.", vbExclamation
        Else
            Set r = ActiveSheet.Range(dayToChk & "Aft_MA_Slots")
        End If
    Loop While r Is Nothing

    'skipping the wscript messagebox code...

    For Each i In Sheets("Control").Range("MA_List")
        If i <> "OOO" Then
            n = WorksheetFunction.CountIf(r, i)
            If n < 1 Then
                sMsg = sMsg & vbLf & i & " is not assigned"
            ElseIf n > 1 Then
                sMsg = sMsg & vbLf & i & " is assigned more than once." & _
                                  "  Did you really mean to do that?"
            End If
        End If
    Next i

    If sMsg <> "" Then
        MsgBox "Some issues were found:" & sMsg, vbExclamation
    End If

End Sub
Sub-ChkAfternoonAssignmentsV2()
Dim dayToChk作为变体
Dim i作为变体
调光范围
dimpas变体
暗日,m,sMsg作为字符串,n
天数=数组(“周一”、“周二”、“周三”、“周四”、“周五”)
做
dayToChk=InputBox(“哪一天(周一、周二、周三、周四、周五)”&_
“您想查看下午的作业吗?”)
如果Len(dayToChk)=0,则退出子项“如果未输入任何内容,则退出”
如果IsError(Application.Match(dayToChk,days,0))那么
MsgBox dayToChk&“格式不符合要求。”,请使用感叹号
其他的
设置r=ActiveSheet.Range(dayToChk和“后MA_槽”)
如果结束
循环,而r什么都不是
'正在跳过wscript messagebox代码。。。
对于每一个“控制”范围(“MA_列表”)
如果我“哦”那么
n=工作表函数.CountIf(r,i)
如果n<1,则
sMsg=sMsg&vbLf&i&“未分配”
如果n>1,则
sMsg=sMsg&vbLf&i&“分配了多次。”&_
“你真的想那样做吗?”
如果结束
如果结束
接下来我
如果是“sMsg”,则
MsgBox“发现了一些问题:&sMsg,VBS感叹号”
如果结束
端接头

已编译但未测试:

Sub ChkAfternoonAssignmentsV2()
    Dim dayToChk As Variant
    Dim i As Variant
    Dim r As Range
    Dim p As Variant
    Dim days, m, sMsg As String, n

    days = Array("Mon", "Tue", "Wed", "Thu", "Fri")

    Do
        dayToChk = InputBox("Which day (Mon, Tue, Wed, Thu, Fri) " & _
                            "would you like to check afternoon assignments?")

        If Len(dayToChk) = 0 Then Exit Sub 'exit if nothing entered

        If IsError(Application.Match(dayToChk, days, 0)) Then
            MsgBox dayToChk & " is not in the expected format.", vbExclamation
        Else
            Set r = ActiveSheet.Range(dayToChk & "Aft_MA_Slots")
        End If
    Loop While r Is Nothing

    'skipping the wscript messagebox code...

    For Each i In Sheets("Control").Range("MA_List")
        If i <> "OOO" Then
            n = WorksheetFunction.CountIf(r, i)
            If n < 1 Then
                sMsg = sMsg & vbLf & i & " is not assigned"
            ElseIf n > 1 Then
                sMsg = sMsg & vbLf & i & " is assigned more than once." & _
                                  "  Did you really mean to do that?"
            End If
        End If
    Next i

    If sMsg <> "" Then
        MsgBox "Some issues were found:" & sMsg, vbExclamation
    End If

End Sub
Sub-ChkAfternoonAssignmentsV2()
Dim dayToChk作为变体
Dim i作为变体
调光范围
dimpas变体
暗日,m,sMsg作为字符串,n
天数=数组(“周一”、“周二”、“周三”、“周四”、“周五”)
做
dayToChk=InputBox(“哪一天(周一、周二、周三、周四、周五)”&_
“您想查看下午的作业吗?”)
如果Len(dayToChk)=0,则退出子项“如果未输入任何内容,则退出”
如果IsError(Application.Match(dayToChk,days,0))那么
MsgBox dayToChk&“格式不符合要求。”,请使用感叹号
其他的
设置r=ActiveSheet.Range(dayToChk和“后MA_槽”)
如果结束
循环,而r什么都不是
'正在跳过wscript messagebox代码。。。
对于每一个“控制”范围(“MA_列表”)
如果我“哦”那么
n=工作表函数.CountIf(r,i)
如果n<1,则
sMsg=sMsg&vbLf&i&“未分配”
如果n>1,则
sMsg=sMsg&vbLf&i&“分配了多次。”&_
“你真的想那样做吗?”
如果结束
如果结束
接下来我
如果是“sMsg”,则
MsgBox“发现了一些问题:&sMsg,VBS感叹号”
如果结束
端接头
您可以试试这个

Option Explicit

Sub ChkAfternoonAssignmentsV2()
    Dim dayToChk As Variant
    Dim i As Variant
    Dim r As Range
    Dim p As Variant

    Do While r Is Nothing
        dayToChk = InputBox("Which day (use 3-letter abbreviation) would you like to check afternoon assignments?")
        Select Case dayToChk
            Case "Mon", "Tue", "Wed", "Thu", "Fri"
                Set r = ActiveSheet.Range(dayToChk & "Aft_MA_Slots")
            Case Else
                MsgBox "'dayToChk & " ' is not in the expected format.  Try Mon, Tue, Wed, Thu, or Fri."
        End Select
    Loop

    Dim AckTime As Integer, InfoBox As Object
    Set InfoBox = CreateObject("WScript.Shell")
    AckTime = 1
    Select Case InfoBox.Popup("Checking MA Assignments", AckTime, "Checking MA Assignments", 0)
        Case 1, -1
    End Select

    Dim notFounds As String, duplicates As String

    For Each i In Sheets("Control").Range("MA_List")
        If WorksheetFunction.CountIf(r, i) < 1 Then
            If i <> "OOO" Then notFounds = notFounds & i.Value & vbLf
        ElseIf WorksheetFunction.CountIf(r, i) > 1 Then
            If i <> "OOO" Then duplicates = duplicates & i.Value & vbLf
        End If
    Next i

    If notFounds <> "" Then MsgBox "these items have not been found: " & vbCrLf & vbCrLf & notFounds
    If duplicates <> "" Then MsgBox "these items have duplicates: " & vbCrLf & vbCrLf & duplicates

End Sub
选项显式
子chkafternoansignmentsV2()
Dim dayToChk作为变体
Dim i作为变体
调光范围
dimpas变体
当r什么都不是的时候去做
dayToChk=InputBox(“您希望在哪一天(使用三个字母的缩写)检查下午的作业?”)
选择个案日期香港
案件“星期一、星期二、星期三、星期四、星期五”
设置r=ActiveSheet.Range(dayToChk和“后MA_槽”)
其他情况
MsgBox“'dayToChk&'”不是预期的格式。试试周一、周二、周三、周四或周五。”
结束选择
环
Dim AckTime为整数,InfoBox为对象
Set InfoBox=CreateObject(“WScript.Shell”)
确认时间=1
选择案例信息框。弹出(“检查MA分配”,确认时间,“检查MA分配”,0)
案例1,-1
结束选择
Dim NOTFOUND作为字符串,复制为字符串
对于每一个“控制”范围(“MA_列表”)
如果工作表function.CountIf(r,i)<1则
如果i“OOO”,则notFounds=notFounds&i.Value&vbLf
ElseIf WorksheetFunction.CountIf(r,i)>1则
如果i“OOO”,则duplicates=duplicates&i.Value&vbLf
如果结束
接下来我
如果为notFounds“”,则MsgBox“未找到这些项:”&vbCrLf&vbCrLf¬Founds
如果重复”