Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/vba/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Vba 嵌套的If语句未选择适当的单元格值_Vba_Excel_If Statement - Fatal编程技术网

Vba 嵌套的If语句未选择适当的单元格值

Vba 嵌套的If语句未选择适当的单元格值,vba,excel,if-statement,Vba,Excel,If Statement,我在一张表格上有3个组合框。第一个在表单加载时填充,第二个在用户从第一个组合框中选择值时填充,第三个在用户从第二个组合框中选择值时填充 当第三个组合框被更改时,我将使用一个嵌套的If语句来确定这个组合所在的行(这样我就可以填充表单上的文本框)。但是,第一个If语句未能触发(即返回“true”值)。单元格中有一个可接受的值,因此它应该前进到下一个If语句,但它只是跳到While语句的末尾 Private Sub cmb_State_Change() Dim Project, licence

我在一张表格上有3个组合框。第一个在表单加载时填充,第二个在用户从第一个组合框中选择值时填充,第三个在用户从第二个组合框中选择值时填充

当第三个组合框被更改时,我将使用一个嵌套的If语句来确定这个组合所在的行(这样我就可以填充表单上的文本框)。但是,第一个If语句未能触发(即返回“true”值)。单元格中有一个可接受的值,因此它应该前进到下一个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

有人知道它为什么会这样吗?

单元格将其参数作为行,然后作为列,因此您需要在代码中反转
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
是您在这里使用的列。您是一个绝对的传奇人物-感谢您找出了我的原始问题,并改进了我的代码!!