Vba Excel宏--符合条件的项目返回列表
我有一个非常简单的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
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
如果重复”