0

Excelで作成されたテーブル(WaterTableという名前)があり、データを入力できるユーザーフォームがあります。列は、YEAR、QUARTER、SOURCE、VOLUME です。

ここや他の場所を見回して、ユーザーがフォームのボックスにデータを入力して送信できるようにするコードでソートすることができました.コードは新しい行を追加してデータを入力します.

ただし、私が苦労しているのは、現時点でユーザーが入力できることです。

YEAR - QUARTER - SOURCE - VOLUME
2013 -    4    -  MAINS -   50

それは問題ありません。ただし、間違った番号を入力して再入力したい場合は、新しい行が作成されますが、元のエントリは保持されます。これにより、データ (複数のエントリ) を表示する際に問題が発生し、エラーを修正できないことも意味します。私は周りを見回して、次のコードを入れることができました:

    Set sheet = ThisWorkbook.Worksheets("Raw Data")
    Set table = sheet.ListObjects.Item("WaterTable")
    Set EvalRange = table.DataBodyRange

If WorksheetFunction.CountIf(EvalRange, YearBox.Text) > 1 And WorksheetFunction.CountIf(EvalRange, QuarterBox.Text) > 1 And WorksheetFunction.CountIf(EvalRange, SourceBox.Text) > 1 Then
    MsgBox "Data Entry Already Present"
    Application.EnableEvents = False
    Else
    Call AddDataRow
End If

これは私の問題を部分的に解決します。現在、特定の年、四半期、およびソースに対して 1 つの「ボリューム」データ ポイントしか入力できないためです。これはある程度機能しますが、私が本当に欲しいのは、メッセージボックスに現在のデータを置き換えるか閉じるかのオプションを与えることです。誤って入力されたデータを修正できるようにします。残念ながら、私はその上にレンガの壁に出くわしてしまい、何を使うべきか考えられません!

それが理にかなっていることを願っています!

以下のコメントに続く追加として:

「find」コマンドを使用するように変更し、次のコードを作成して開始します。

SearchString = YearBox.Value
On Error Resume Next
Set bCell = oRange.Find(What:=SearchString, LookIn:=xlValues, _
            LookAt:=xlWhole, SearchOrder:=xlByRows, SearchDirection:=xlNext, _
            MatchCase:=False, SearchFormat:=False).Offset(0, 3)
If Not bCell Is Nothing Then
       MsgBox "Checking data Validity"
    ReplaceData = bCell.Address
End If

Set aCell = oRange.Find(What:=SearchString, LookIn:=xlValues, _
            LookAt:=xlWhole, SearchOrder:=xlByRows, SearchDirection:=xlNext, _
            MatchCase:=False, SearchFormat:=False)

If Not aCell Is Nothing Then
    FoundAt = aCell.Address
   Select Case MsgBox("The entered exists: " & FoundAt & "   " & ReplaceData & "  Replace?", vbYesNo)
    Case vbNo
    MsgBox "data entry cancelled"
    Case vbYes
    Select Case MsgBox("This will replace data: Are You Sure?", vbYesNo)
        Case vbYes
        bCell = VolBox.Value
        Case vbNo
        Call CommandButton1_Click
    End Select
End Select
Else
    MsgBox "Unique Data Entry Confirmed - submit data?", vbOKCancel
    Call AddDataRow
End If

残念ながら、それほどエレガントではありません(エントリが見つからない場合、bCellの最初の「検索」が失敗する理由がわかりません-事実上同じように見えるaCellは正常に動作しますか??したがって、エラーで再開します)。

ただし、これは 1 つのデータ ポイント (この場合は年) のみをチェックするため、年の列が一致するかどうかを確認し、ユーザーが希望する場合はボリューム データを変更し、希望しない場合は停止します。私ができないことは、複数の基準を使用することです。これで「AND」を使用する方法がわかりませんか?

4

1 に答える 1

0

私はそれを解決したかもしれないと思います(少し不器用な方法ではありますが!)

次の方法でデータ入力から生成されたテーブルに非表示の列を追加しました。

lastRow.Cells(1, 1) = YearBox.Text & "-" & QuarterBox.Text & "-" & SourceBox.Text

これにより、3 つの変数すべてのデータを含む行が作成されます。

次に、質問に投稿した「検索」コードの検索文字列を上記と同じになるように変更しました。

SearchString = YearBox.Text & "-" & QuarterBox.Text & "-" & SourceBox.Text

このようにして、1 つのボックスのみを検索しますが、3 つの条件すべてをチェックします。

助けてくれてありがとうシッダールス。

于 2013-10-07T10:48:40.703 に答える