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