Vba 嵌套的If语句未选择适当的单元格值
我在一张表格上有3个组合框。第一个在表单加载时填充,第二个在用户从第一个组合框中选择值时填充,第三个在用户从第二个组合框中选择值时填充 当第三个组合框被更改时,我将使用一个嵌套的If语句来确定这个组合所在的行(这样我就可以填充表单上的文本框)。但是,第一个If语句未能触发(即返回“true”值)。单元格中有一个可接受的值,因此它应该前进到下一个If语句,但它只是跳到While语句的末尾Vba 嵌套的If语句未选择适当的单元格值,vba,excel,if-statement,Vba,Excel,If Statement,我在一张表格上有3个组合框。第一个在表单加载时填充,第二个在用户从第一个组合框中选择值时填充,第三个在用户从第二个组合框中选择值时填充 当第三个组合框被更改时,我将使用一个嵌套的If语句来确定这个组合所在的行(这样我就可以填充表单上的文本框)。但是,第一个If语句未能触发(即返回“true”值)。单元格中有一个可接受的值,因此它应该前进到下一个If语句,但它只是跳到While语句的末尾 Private Sub cmb_State_Change() Dim Project, licence
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
有人知道它为什么会这样吗?
单元格将其参数作为行,然后作为列,因此您需要在代码中反转i
和j
。当您进行范围(“C4”)
时,先是列,然后是行,即列C
,行4
——但单元格
则相反
那么现在你有
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
另一种选择
您可以将代码块重写为:
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
更好的选择
使用While..Wend
循环意味着如果没有匹配项,代码将运行到工作表中的最后一行(超过百万行)。您可以使用标准代码位查找数据中的最后一行:
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
注意使用OptionExplicit捕捉代码中的任何输入错误。在最初的问题中,您选择了Dim将row As Integer
和selededrow=0
,如果使用“Option Explicit”,则会引发编译时错误。您应该将Option Explicit
作为每个代码模块的第一行。这会让你的排版更准确。(但可能不会引起您的问题-我需要查看更多。)如果单元格C1
不等于Project
的值,则您的代码似乎希望接下来查看单元格D-4
。我看不出这对Wend
有什么影响,而不是崩溃。您的代码中是否有一些问题中未显示的On Error
语句?另外,您是否打算将项目
(和许可证
)声明为字符串
?您目前已将其声明为变体。能否将工作表(“权利”)中包含的数据图像粘贴到问题中?我很难想象你在用行计数器做什么,为什么?你在这里有数学问题,在循环中考虑第一次,如果没有找到项目,你<代码> i=I - 5 < /代码>这等于-4!所以,您应该在下一轮中得到错误-行从1开始。您可能需要从If行中添加/减去i
。还有,为什么选择了row=j
j
是您在这里使用的列。您是一个绝对的传奇人物-感谢您找出了我的原始问题,并改进了我的代码!!