0

我正在处理 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 且日期为 2013 年 10 月 10 日的记录,并且我正在尝试输入另一条 ID 为 1234 且日期为 2013 年 10 月 10 日的记录,该代码仍然给出“记录已经存在”的消息。它没有查看整个 ID 值。即使现有 ID 的部分与新 ID 匹配,代码也不会将其识别为新 ID。

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

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

非常感谢您的帮助。

4

2 回答 2

1

吹毛求疵和旁注

你的代码甚至不会编译,更别提运行了。

Function Record(ID As String, Date As String)

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

答案

您的问题与Range.Find. 正如在文档中看到的这里 Range.Find有一个名为的参数LookAt,它从XlLookAt枚举中获取一个值,要么xlPart要么xlWhole。我相信 find 默认使用上次搜索的最后一个设置,当 Excel 首次启动时,它默认为 xlPart。你当然想搜索 xlWhole,你想搜索一个单元格,它的全部内容都与你的搜索字符串匹配。

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

于 2013-11-06T22:09:34.457 回答
0

一个问题是您正在执行两个不相关的Find调用。如果您的 ID1234和日期10/10/2013出现在不同的行上,这仍会假定它是重复的。

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

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

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

于 2013-11-06T22:11:47.720 回答