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

这部分解决了我的问题——因为现在您只能为特定年份、季度和来源输入一个“体积”数据点。这在一定程度上有效 - 但我真正想要的是消息框提供替换当前数据或关闭的选项。以便更正错误输入的数据。不幸的是,我在那个墙上遇到了一堵砖墙,想不出该用什么!

希望这是有道理的!

作为以下评论的补充:

我已经改为使用“查找”命令,并提出以下代码让我开始:

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 工作正常?因此恢复错误)。

但是,这只会检查一个数据点(在这种情况下是年份),因此我可以找出年份列是否匹配,然后如果用户想要更改卷数据,或者如果他们不这样做则停止。我不能做的是使用多个标准。我看不出有办法用这个“和”吗?

4

1 回答 1

0

想我可能已经解决了(尽管方式有点笨拙!)

我通过以下方式在数据输入生成的表中添加了一个隐藏列:

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

这将创建一个包含所有三个变量的数据的行。

然后,我在问题中发布的“查找”代码中修改了我的搜索字符串,使其与上述相同:

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

这样,它只搜索一个框,但会检查所有三个条件。

感谢悉达多的帮助。

于 2013-10-07T10:48:40.703 回答