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

最初のコードに続く 2 番目のコード...

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 として認識しません。

NEW: 現在、日付に問題があります。同じ 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)

有効な関数定義ではありません。Date は予約済みのキーワードであり、変数またはパラメーター名として使用することはできません。

答え

あなたの問題はRange.Find. ここのドキュメント に見られるように、列挙型から値を取得するRange.Findという名前のパラメーターがあります。find はデフォルトで前回の検索の最後の設定を使用し、Excel を最初に起動するとデフォルトで xlPart になると思います。もちろん、xlWhole を検索したい場合は、コンテンツ全体が検索文字列に一致するセルを検索したいと考えています。LookAtXlLookAtxlPartxlWhole

したがって、コードを次のように更新ID_List.Find(What:=ID, LookIn:=xlValues, LookAt:=xlWhole, SearchOrder:=xlByRows)し、そのメソッドへの他の呼び出しに対して同じことを行います。

于 2013-11-06T22:09:34.457 に答える
0

1 つの問題は、2 つの無関係なFind呼び出しを行っていることです。ID1234と日付10/10/2013が異なる行に表示されている場合でも、重複していると見なされます。

Find部分一致を行っている可能性もあります。Excel VBA インターフェイスを使用したことがないため、デフォルトが何であるかわかりません。LookAt:=xlWholeパラメータリストに追加してみてください。

あなたがする必要があるのは、検索をリンクすることです。レコードの 1 つを検索するだけです。すべての一致を確認してから、同じ行の他のレコードを比較する必要があります。これは、1 日に複数の ID を許可し、別の日に同じ ID を使用できることを前提としています。

.Offset(1,0)から返された範囲値で使用しFindて、その右側のセルを返すことができます。

于 2013-11-06T22:11:47.720 に答える