检查目标行以外的列中是否存在值

问题描述 投票:1回答:1

简而言之,我的电子表格是一个数据库,在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”。 (不带引号)

excel vba textbox
1个回答
0
投票

这是语法。尽管技术上应该吐出相同的结果,但不会,因为语法错误。

当您尝试为工作表单元格分配值时,应使用IIF函数返回值,尤其是您已分配给truepart参数或falsepart参数的值。

IIF documentation语法IIfexpr,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]中带有函数(和其他样式)的括号。

Using parentheses in code语句的工作方式略有不同。 (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
有一些不错的主题,以阅读有关代码的工作方式,作用和使用方法的知识。
© www.soinside.com 2019 - 2024. All rights reserved.