使用VBA检查两个不同的图纸中是否存在单元格值

使用VBA检查两个不同的图纸中是否存在单元格值,vba,Vba,我有两张不同的纸,上面有500多个名字。我需要看看一张纸上的名字是否存在于另一张纸上。如果它在指定列中说是或否 一张表中的名称类似于ASmith,另一张表中的名称类似于ASmith,因此不需要区分大小写 我对VBA部分很困惑。我用java编程,用java做这类事情对我来说很容易。但在excel中,就不那么多了。谢谢你的帮助。TIA首先,Visual Basic确实关心大小写敏感度,因此在比较两张图纸时,需要使用VBA.UCase将所有内容转换为大写。我还包括了Trim函数,因为单词本身周围可能有

我有两张不同的纸,上面有500多个名字。我需要看看一张纸上的名字是否存在于另一张纸上。如果它在指定列中说是或否

一张表中的名称类似于ASmith,另一张表中的名称类似于ASmith,因此不需要区分大小写


我对VBA部分很困惑。我用java编程,用java做这类事情对我来说很容易。但在excel中,就不那么多了。谢谢你的帮助。TIA

首先,Visual Basic确实关心大小写敏感度,因此在比较两张图纸时,需要使用VBA.UCase将所有内容转换为大写。我还包括了Trim函数,因为单词本身周围可能有空格。创建两个可比较字符串所需的任何进一步文本操作都必须进行研究。我建议在使用Excel宏操作文本字符串时使用此选项

因此…假设两张工作表都在同一工作簿中,最好的起点是从Visual Basic编辑器中获取两张工作表的代码名(默认情况下,Sheet1/Sheet2等)。在下文中,我假设Sheet1是输出工作表,Sheet2是您正在搜索的数据。如果无法确定代码名,可以在以下代码中替换图纸(“图纸名称1”)和图纸(“图纸名称2”):

Dim SourceRow as Long
Dim DestRow as Long

For DestRow = 1 to 10
      For SourceRow = 1 to 10

            If VBA.Trim(VBA.UCase(Sheet1.Cells(DestRow,"DestCol"))) = VBA.Trim(VBA.UCase(Sheet2.Cells(SourceRow,"SourceCol"))) then
            Sheet1.Cells(DestRow,"OutputCol") = "Yes"
                  Goto NextDestRow
            End If
      Next SourceRow

Sheet1.Cells(DestRow,"OutputCol") = "No"

NextDestRow:
Next DestRow
代码假设您在每个工作表的单个列中搜索数据,在我编写的“DestCol”和“SourceCol”中,您只需插入该列的数值(其中a=1,B=2等)。“OutputCol”是要将输出放在目标工作表上的列


循环假设您对每张图纸上的第1行到第10行感兴趣;根据需要进行调整

尝试以下方法:

Sub HTH()

    With Sheet1.Range("B1", Sheet1.Cells(Rows.Count, "B").End(xlUp))
        .FormulaR1C1 = "=IF(ISERROR(VLOOKUP(RC[-1],Sheet2!C[-1],1,FALSE)),""NO"",""YES"")"
        .Value = .Value
    End With

End Sub
注释

假设查找值位于sheet1列A中,查找列为sheet2列A。在sheet1列B中放置“是/否”以显示是否找到值。Vlookup不区分大小写。您需要更改R1C1引用/列以适合您的工作簿


它将执行得非常快。

您只需要将一个列表与另一个列表进行比较,还是将两者进行比较?您是否考虑过VLookUp?是否应该在哪一页和哪一页上提及指定的列?你为什么不用比我们能帮助你更简单的方式来解释它,而不是做那么多假设呢!这让我比较500个条目的无意识任务变得有点无意识了!:)如果这完全解决了您的问题,那么最好将其标记为完整的解决方案。Cheerres使用Ed的方法建议的两个MOD,(i)在YesFlag=1时退出If测试,而不是继续冗余检查(ii)运行查找例程或使用变体数组而不是范围循环将显著减少代码运行时间Nice代码,我同意brettdj关于速度的评论,虽然500行还不错。也许另一个建议是,只要不是变量,就对行进行尺寸标注。:)