简而言之,我的电子表格是一个数据库,在A列中有项目,在B列中有序列号。两个序列号不能相同。一个用户窗体具有带有项目和序列号的文本框。对于添加和编辑项目,都使用相同的用户窗体。
为了检查序列号是否唯一,我使用如下代码:
If Application.WorksheetFunction.CountIf(WS.Range("b4:b100"), Me.Controls("serialnumber" & i)) > j Then
MsgBox "serial number " & Me.Controls("serialnumber" & i) & " already exists in database", vbCritical, "Error"
Me.Controls("serialnumber" & i).SetFocus
Exit sub
End If
在添加j之前,仅当我使用Add new时,我使用0来测试是否存在任何情况。但是,如果要编辑项目,我也想检查重复项。这会在编辑时产生错误,不对序列号进行任何更改,但仍会使countif跳闸,并且sub退出。
我试图使用以下代码查看当前值是否已与文本框项目匹配。
IIf WS.Cells(a, 2) = Me.Controls("serialnumber" & i).Value, j = 1, j=0
“ a”是指已编辑项目所在的行。基本上,在编辑时,将在列表框中填充所有项目,并从该listindex调用“ a”
问题是,即使cell(a,2)值和textbox值完全相同,即使在debug.prints中显示完全相同,但是将它们进行比较的if语句也总是得出false。我尝试将.value都保留下来,将.value添加到等式的两边,甚至为这两个值中的每个声明了变量,使它们成为整数,并比较了两个值,仍然显示为false。
可能有另一种方法,但我想查看序列号的值是否在该列中的其他位置(不包括其来源的目标行)。如果可以,那么即使添加新项也将使用相同的错误检查,因为目标行将是列表末尾的第一个空行。有没有一种方法可以排除动态变化的行呢?
编辑:这是将数据输入到工作表的方式。
With WS.Cells(a, "a")
.Offset(0, 1).Value = Me.Controls("serialnumber" & i).Value
end with
仅是在序列号文本框中输入的数字,例如“ 123456”。 (不带引号)
这是语法。尽管技术上应该吐出相同的结果,但不会,因为语法错误。
当您尝试为工作表单元格分配值时,应使用IIF
函数返回值,尤其是您已分配给truepart参数或falsepart参数的值。
每IIF
documentation,语法为IIf(expr,truepart,falsepart)。因此,基于expr(表达式)是true还是false,将返回适当的truepart值或falsepart值。
重要的是要理解IIF
是一个函数(同样根据文档)返回两个部分中的一个,取决于表达式的求值。因为它返回值,所以您可以'在函数中分配一个值,这不是它的目的。
要在您的上下文中使用IIF
,正确的语法应为:
IIF
主要区别在于我们根据评估返回的是真还是假,将[[truepart值或falsepart值分配给j = IIF(WS.Cells(a, 2) = Me.Controls("serialnumber" & i).Value, 1, 0)
。我还在函数周围包括了圆括号,这意味着会将返回值分配给某些内容(在本例中为j
。如果不包括圆括号,则将忽略返回值。您可以阅读有关使用的更多信息[j
]中带有函数(和其他样式)的括号。
If...Then...Else
)第一行是评估,Documentation here。到目前为止,我们在评估方式上并没有什么区别,但是在此之后,我们现在将
statement
分配给do something的另一行(或多行)代码。因此要在If WS.Cells(a, 2) = Me.Controls("serialnumber" & i).Value Then
语句中重写IIF
函数:If...Then...Else
在新If WS.Cells(a, 2) = Me.Controls("serialnumber" & i).Value Then j = 1 'Do this if true Else j = 0 'Do this if false End if
中的新Worksheet
上,我通过以下两个测试子测试了所有上述语法。随意创建一个新的工作簿/工作表,以在运行代码时根据单元格Workbook
中的值在立即窗口中查看结果。
C5
Sub TestIIFFunction()
Dim j As Long
j = IIf(Sheet1.Range("C1").Value = 1, 1, 0)
Debug.Print j
End Sub
'___________________________________________________________________________________
Sub TestIfThenElseStatement()
Dim j As Long
If Sheet1.Range("C1").Value = 1 Then
j = 1
Else
j = 0
End If
Debug.Print j
End Sub
有一些不错的主题,以阅读有关代码的工作方式,作用和使用方法的知识。