代码无法识别excel中的唯一值

时间:2013-11-06 21:32:21

标签: excel vba date excel-vba

我正在处理excel中的代码,该代码使用唯一编号和相关日期来查看工作表中是否已存在相同的记录。这是我的代码:

第一段代码的一部分......

Else
   'If all the data has been entered, go to New_Record
   Check_Record ID:=Sheets("Information").Range("A1").Value, vDate:=Sheets("Information").Range("A2").Value
End If
End Sub

第一个代码后面的第二个代码...

Function Record(ID As String, vDate As String)

    Dim Current_ID_List As Range
    Dim vCaseWasFound, vDateWasFound, vLastDataRow As Range
    Dim DestinationRow As Integer
    Dim Go_ahead_msg As String

    Set ID_List = Sheets("Records").Range("A:A")
    Set Date_List = Sheets("Records").Range("D:D")

    '-- determine whether record exists
    Set vCaseWasFound = ID_List.Find(What:=ID, LookIn:=xlValues, LookAt:=xlWhole, SearchOrder:=xlByRows)
    Set vDateWasFound = Date_List.Find(What:=vDate, LookIn:=xlValues, LookAt:=xlWhole, SearchOrder:=xlByRows)
    Set vLastDataRow = Sheets("RawData").Cells.Find(What:="*", SearchDirection:=xlPrevious, SearchOrder:=xlByRows)

    If Not vCaseWasFound Is Nothing And Not vDateWasFound Is Nothing Then
        Go_ahead_msg = "The record already exists."
    Else
        Go_ahead_msg = "This is a new record."
    End If

    If MsgBox(Go_ahead_msg, vbQuestion + vbYesNo) = vbYes Then
    New_Record
    Sheets("Sheet1").Activate
    Else
        With Sheets("Records")
        .Activate
        .Range("A1").Select
    End With
    End If
End Function

已解决:我遇到并解决的问题是,如果excel文件中有ID为1234567且日期为10/10/2013的记录,我正在尝试输入ID为1234且日期为10/10的另一条记录/ 2013,代码仍然给出了一个消息"记录已经存在"。它没有查看整个ID值。即使现有ID的一部分与新ID匹配,代码也不会将其识别为新ID。

新:我现在遇到日期问题。如果我有相同的ID和相同的日期(如12/12/2012),那么代码将识别为同一记录,并将给出一条记录已存在的消息。如果日期是格式的,那就多了2013年1月1日或4/15/2012或4/1/2013,代码不会将其识别为同一日期。

我希望我的问题有道理。如果我能澄清,请告诉我。

非常感谢你的帮助。

2 个答案:

答案 0 :(得分:1)

挑剔和旁注

你的代码甚至不会编译,也不会运行。

Function Record(ID As String, Date As String)

不是有效的函数定义。 Date是保留关键字,不能用作变量或参数名称。

答案

您的问题出在Range.Find。如图所示,here in the documentation Range.Find有一个名为LookAt的参数,该参数从XlLookAt枚举中获取值xlPartxlWhole。我相信默认情况下使用上次搜索的最后一个设置,当Excel首次启动时,默认使用xlPart。您当然想要搜索xlWhole,您想要搜索整个内容与您的搜索字符串匹配的单元格。

因此,请将您的代码更新为ID_List.Find(What:=ID, LookIn:=xlValues, LookAt:=xlWhole, SearchOrder:=xlByRows),并对该方法的其他调用执行相同操作。

答案 1 :(得分:0)

一个问题是您正在进行两次无关的Find来电。如果您的ID 1234和日期10/10/2013出现在不同的行中,则仍会认为它是重复的。

也可能Find正在进行部分匹配。我从未使用过excel VBA界面,因此我不知道默认值是什么。尝试将LookAt:=xlWhole添加到参数列表中。

您需要做的是链接您的搜索。只需搜索其中一条记录。您必须完成所有匹配,然后比较同一行中的其他记录。这假设您希望每天允许多个ID,并且您可以在不同的日期拥有相同的ID。

您可以对.Offset(1,0)返回的范围值使用Find,将单元格返回到右侧。