2017-03-17 117 views
0

我正在检查在3个不同的组合框中选择的3个值是否在特定的行内。如果是,请将该行号分配给变量,如果不是,请检查下一行。该范围内的所有单元格都填充了数据,并且消息框显示了正确的值(仅用于检查目的),但If语句未移至下面代码中的selectedrow = r行。下一个循环无法为变量分配一个值 - VBA

Dim Project, licence, state As String 
Dim selectedrow As Integer 
Dim LastRow As Integer 
Dim r As Integer 


Project = cmb_Project.Value 
licence = cmb_Licence.Value 
state = cmb_State.Value 


LastRow = Worksheets("Entitlements").Range("A" & Rows.Count).End(xlUp).row 


    For r = 3 To LastRow 
    MsgBox (Worksheets("Entitlements").Cells(r, 1).Value) 
    MsgBox (Worksheets("Entitlements").Cells(r, 7).Value) 
    MsgBox (Worksheets("Entitlements").Cells(r, 6).Value) 
     If Worksheets("Entitlements").Cells(r, 1).Value = Project And _ 
      Worksheets("Entitlements").Cells(r, 7).Value = licence And _ 
      Worksheets("Entitlements").Cells(r, 6).Value = state Then 

      selectedrow = r 
     End If 
    Next r 

我猜,我犯了一个愚蠢的错误,但对如何补救什么错将不胜感激任何意见。

由于

+0

我还会检查'Project','licence'和'state'的值,并对引导/尾随空格非常谨慎。 –

+1

将您的'MsgBox'语句更改为'MsgBox“|” &Worksheets(“Entitlements”)。Cells(r,1).Value&“|” &vbCrLF&“|” &Project&“|”' - 这将使您能够一次检查两个值,一个在另一个之上。 (与其他人一样,我怀疑有空白问题,或者是个案问题。) – YowE3K

+0

将'Project'和'licence'声明为'String'可能是一个好主意,而不是让它们默认为声明为“变体”。 – YowE3K

回答

3

这可能不是问题,但请注意,Project和License不是字符串变量,而是变量。当你在一行上有多于一个变量时,每个变量名必须有它自己的类型。如果没有给出类型,那么默认是Variant。

所以,尽量

Dim Project as String, license as String, state as String 

或者,使用三个Dim语句,而不是一个。

+0

“在这里插入faceplam”就是这样做的! – scb998

+0

@ scb998出于好奇,“项目”和“许可”的价值是什么?我并不期待这样解决它,因为一个'Variant/String'和一个'String'(甚至一个数字)应该已经测试好了。 – YowE3K

+0

@ YowE3K - 许可证只有3个数字,而且该项目是过程中早期生成的字母和数字的唯一组合。 – scb998

0

有几个可能的原因是因为它的变量“selectedrow”没有被设置于行“R”

  1. 值的变量的“LASTROW”被计算为小于由于这个原因,循环被跳过。

  2. 如果条件结果是错误的。在即时窗口尝试,或使用手表查看存储在变量中的值。有时,一个小空间也会否定平等。

+0

您的要点1无效,因为OP说“消息框提示正确的值”,这意味着循环没有被跳过。你的第二点几乎肯定是点亮的。 – YowE3K

3

您的ComboBox中的值可能是数字字符串,并且您范围内的值是数字(并且您已确认许可证是3个数字)。

你的代码是失败,因为Cells返回一个数字小区Variant/DoubleComboxBox.Value返回Variant/String。将这些与运营商的=进行比较会导致不平等。

您可以通过在细胞E6进入123,然后在立即窗口中运行该看到同样的事情:

?Range("E6") = "123" 
True 
?Range("E6") = 123 
True 
?Range("E6") = CVar("123") 
False 

如果你比较数字,将值转换为数字,然后进行比较(但要小心,将"1D4"和/或"1E4"转换为10000中的数字结果),或将数字转换为Strings并进行比较。 具有至少一个操作数是一个String是足够为Excel进行有效的平等操作:

?Range("E6") = CStr(CVar("123")) 
True 

但都转换,并且可以确保正确的结果。

?CStr(Range("E6")) = CStr(CVar("123")) 
True 
相关问题