嵌套如果语句没有select适当的单元格值

我有一个窗体上的3个combobox。 第一个是填充表单加载时,第二个填充时,用户从第一个combobox中select一个值,第三个填充时,用户从第二个select一个值。

当第三个combobox被改变时,我使用一个嵌套的If语句来确定这个组合所在的行(所以我可以在窗体上填充文本框)。 但是,第一个If语句无法触发(即返回“真”值)。 单元格中有一个可接受的值,所以它应该继续到下一个If语句,但是它只是跳到我的While语句的末尾。

Private Sub cmb_State_Change() Dim Project, licence, state As String Dim selectedrow As Integer Dim LastRow As Integer Dim i, j As Integer selededrow = 0 Project = cmb_Project.Value licence = cmb_Licence.Value state = cmb_State.Value i = 1 j = 3 While selectedrow = 0 If Worksheets("Entitlements").Cells(i, j) = Project Then i = i + 6 If Worksheets("Entitlements").Cells(i, j) = licence Then i = i - 1 If Worksheets("Entitlements").Cells(i, j) = state Then selectedrow = j End If End If Else j = j + 1 i = i - 5 End If Wend End Sub 

任何人都可以看到为什么它会这样呢?

Cells将其参数作为行然后列,因此您需要在代码中反转ij 。 当你做Range("C4")列,然后是行,即列C ,第4行 – 但Cells是另一种方式。

所以,现在你有

 If Worksheets("Entitlements").Cells(i, j) = Project Then i = i + 6 If Worksheets("Entitlements").Cells(i, j) = licence Then i = i - 1 If Worksheets("Entitlements").Cells(i, j) = state Then selectedrow = j 

这是你第二次查找6行,而不是6列。

重写这些为:

 If Worksheets("Entitlements").Cells(j, i) = Project Then i = i + 6 If Worksheets("Entitlements").Cells(j, i) = licence Then i = i - 1 If Worksheets("Entitlements").Cells(j, i) = state Then selectedrow = j 

另外一个select

你可以重写这个代码块:

 r = 3 While selectedrow = 0 If Worksheets("Entitlements").Cells(r, 1) = Project And _ Worksheets("Entitlements").Cells(r, 7) = licence And _ Worksheets("Entitlements").Cells(r, 6) = State Then selectedrow = r Else r = r + 1 End If Wend 

一个更好的select

使用While..Wend循环意味着代码将运行到表中最后一行(超过100万行)如果不匹配。 您可以使用标准的代码来查找数据中的最后一行:

 Set ws = Worksheets("Entitlements") LastRow = ws.Cells(ws.Rows.Count, "A").End(xlUp).Row 

然后在该范围上使用For..Next循环。 例如:

 Option Explicit Private Sub cmb_State_Change() Dim Project As String, licence As String, state As String Dim selectedrow As Integer Dim LastRow As Integer Dim r As Integer Dim ws As Worksheet selectedrow = 0 Project = "hello" 'cmb_Project.Value licence = "world" 'cmb_Licence.Value state = "stuff" 'cmb_State.Value Set ws = Worksheets("Entitlements") LastRow = ws.Cells(ws.Rows.Count, "A").End(xlUp).Row For r = 3 To LastRow If ws.Cells(r, 1) = Project And _ ws.Cells(r, 7) = licence And _ ws.Cells(r, 6) = state Then selectedrow = r Exit For Next r End Sub 

请注意使用Option Explicit来捕获代码中的任何拼写错误。 在你原来的问题中,你已经Dim selectedrow As Integerselededrow = 0 ,如果你使用Option Explicit,那么这会引发编译时错误。