使用VBA检查两个不同工作表中是否存在单元格值

时间:2011-09-14 15:32:53

标签: vba

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

名称将在一张纸上类似于ASmith,然后在另一张纸中使用ASMITH,因此不需要区分大小写。

我对VBA部分感到很困惑。我在java中编程并在java中做这种事情对我来说很容易。但在excel中,并非如此。感谢您的帮助。 TIA

2 个答案:

答案 0 :(得分:1)

首先,Visual Basic确实关心区分大小写,因此在比较两个工作表时,您需要使用VBA.UCase将所有内容转换为大写。我还包括了Trim函数,因为这个单词本身可能有空格。必须研究创建两个可比较的字符串所需的任何进一步的文本操作。我建议用expert guidance操作Excel宏的文本字符串

所以......假设两张工作表都在同一个工作簿中,最好的起点是从Visual Basic编辑器中获取两个工作表的代号(默认情况下为Sheet1 / Sheet2等)。在下面,我假设Sheet1是输出表,Sheet2是您正在搜索的数据。如果您不能使用精确的代码名称,可以在下面的代码中替换Sheets(“SheetName1”)和Sheets(“SheetName2”):

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行感兴趣;根据需要进行调整

答案 1 :(得分:1)

尝试这样的事情:

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引用/列以适合您的工作簿。

它会很快执行。