Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/vba/14.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 要在列表中匹配的单元格中的值,并对该列表下的每个单元格进行匹配(标题不好)_Excel_Vba - Fatal编程技术网

Excel 要在列表中匹配的单元格中的值,并对该列表下的每个单元格进行匹配(标题不好)

Excel 要在列表中匹配的单元格中的值,并对该列表下的每个单元格进行匹配(标题不好),excel,vba,Excel,Vba,我希望宏/代码获取输入到该单元格中的产品(我猜是相对参考),并扫描我拥有的产品列表。如果不匹配,我希望消息框告诉我输入的产品与我的产品列表中的产品不匹配,并返回输入的行号 再举一个例子。假设我们在单元格中输入一个数字“1”。我需要宏来搜索我的数字列表1-100,如果1不在那里,我希望它告诉我。假设输入的下一个数字(在下面的单元格中)是101。一个消息框会告诉我101不在我的号码列表中,它位于第2行 它可能需要循环。因为我将在该列中有大约500个单元格,我希望它使用列表搜索该产品。右键单击工作表选

我希望宏/代码获取输入到该单元格中的产品(我猜是相对参考),并扫描我拥有的产品列表。如果不匹配,我希望消息框告诉我输入的产品与我的产品列表中的产品不匹配,并返回输入的行号

再举一个例子。假设我们在单元格中输入一个数字“1”。我需要宏来搜索我的数字列表1-100,如果1不在那里,我希望它告诉我。假设输入的下一个数字(在下面的单元格中)是101。一个消息框会告诉我101不在我的号码列表中,它位于第2行

它可能需要循环。因为我将在该列中有大约500个单元格,我希望它使用列表搜索该产品。

右键单击工作表选项卡-->查看代码-->并将下面给出的代码粘贴到打开的代码窗口-->关闭VB编辑器-->将工作簿另存为启用宏的工作簿。 以下代码假定您在Sheet2上有一个名为“List”的命名范围(代码名而不是选项卡名)。 如果从第2行开始在a列中输入值,代码将自动检查您输入的值是否在命名范围列表中找到,如果未找到该值,则会弹出一个msgbox以提供一些信息

Private Sub Worksheet_Change(ByVal Target As Range)
If Target.CountLarge > 1 Then Exit Sub
If Target.Column = 1 And Target.Row > 1 Then
    If Target <> "" Then
        If Application.CountIf(Sheet2.Range("List"), Target.Value) = 0 Then
            MsgBox "The value " & Target.Value & " you entered in cell " & Target.Address(0, 0) & " was not found in the List", vbExclamation, "Item Not Found!"
        End If
    End If
End If
End Sub
Private子工作表\u更改(ByVal目标作为范围)
如果Target.CountLarge>1,则退出Sub
如果Target.Column=1且Target.Row>1,则
如果目标为“”,则
如果Application.CountIf(Sheet2.Range(“List”),Target.Value)=0,则
MsgBox“值”&Target.value&“您在单元格中输入的值”&Target.Address(0,0)&“未在列表中找到”,VBEquipment,“未找到项!”
如果结束
如果结束
如果结束
端接头

编辑:

将上述建议代码替换为以下代码。 如果您一次更改多个单元格,下面的代码将非常有用,并将为您提供在名为range的列表中未找到的所有值的列表

Private Sub Worksheet_Change(ByVal Target As Range)
Dim cell As Range
Dim str As String
Dim Found As Boolean
str = "The following values were not found in the List." & vbNewLine & vbNewLine
If Target.Column = 1 And Target.Row > 1 Then
    For Each cell In Target
        If cell <> "" Then
            If Application.CountIf(Sheet2.Range("List"), cell.Value) = 0 Then
                Found = True
                str = str & cell.Address(0, 0) & " : " & cell.Value & vbNewLine
            End If
        End If
    Next cell
End If
If Found Then MsgBox str, vbExclamation, "Values Not Found!"
End Sub
Private子工作表\u更改(ByVal目标作为范围)
暗淡单元格作为范围
作为字符串的Dim str
Dim被发现为布尔值
str=“在列表中找不到以下值。”&vbNewLine&vbNewLine
如果Target.Column=1且Target.Row>1,则
对于目标中的每个单元格
如果是单元格“”,则
如果Application.CountIf(Sheet2.Range(“List”),cell.Value)=0,则
找到=真
str=str&cell.Address(0,0)&“&cell.Value&vbNewLine
如果结束
如果结束
下一个细胞
如果结束
如果找到,则MsgBox str,vb感叹号,“未找到值!”
端接头

你可以用公式得到你想要的

=IFERROR(MATCH(PRODUCT,LISTofPRODUCTS,0),"Not Found In List")
使用实际单元格引用的相同公式:

=IFERROR(MATCH(A1,$B$1:$B$500,0),"Not Found In List")
其中,要查找的值位于单元格A1中,要查找的列表为B1:B500

要知道未匹配值所在的行,可以使用以下公式

=IF(ISERROR(MATCH(A1,$B$1:$B$500,0)),"Found","Value in row " & ROW(A1) & " not found")

为什么不在数据验证中使用列表?那么只有列表中的才能输入。我有。有如此多的产品,下拉列表中的名称非常小。我也想复制和粘贴,并有代码告诉我,如果其中一个拼写错误,在哪里。faster然后使用条件格式,并仅粘贴values.OMG genius。没有其他方式来描述你,但如果你要复制粘贴(无论如何粘贴),为什么它不起作用?很高兴它起作用了。这是因为您可能会同时复制和粘贴到多个单元格,并且只有在更改一个单元格的内容时,代码才会跟踪更改。发布另一个解决方案,考虑到您同时对多个单元格进行更改。