Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/excel/28.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/vba/17.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
Excel 对于下一个循环,无法将值分配给变量-VBA_Excel_Vba_For Loop - Fatal编程技术网

Excel 对于下一个循环,无法将值分配给变量-VBA

Excel 对于下一个循环,无法将值分配给变量-VBA,excel,vba,for-loop,Excel,Vba,For Loop,我正在检查在3个不同组合框中选择的3个值是否在某一行内。如果是,则将该行号指定给变量,如果不是,则检查下一行。该范围内的所有单元格都充满了数据,消息框中显示的正确值仅用于检查,但If语句没有移动到下面代码中的selectedrow=r行 Dim Project, licence, state As String Dim selectedrow As Integer Dim LastRow As Integer Dim r As Integer Project = cmb_Project.Va

我正在检查在3个不同组合框中选择的3个值是否在某一行内。如果是,则将该行号指定给变量,如果不是,则检查下一行。该范围内的所有单元格都充满了数据,消息框中显示的正确值仅用于检查,但If语句没有移动到下面代码中的selectedrow=r行

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
我猜我犯了一个愚蠢的错误,但是任何关于如何纠正错误的建议都将不胜感激


谢谢

有两种可能,因为变量“selectedrow”没有设置为行“r”

变量“LastRow”的值计算为小于3。因此,将跳过循环

if条件的结果为false。在即时窗口中尝试,或使用watch查看存储在变量中的值。有时,一个小空间也否定了平等


有两种可能,因为变量“selectedrow”未设置为行“r”

变量“LastRow”的值计算为小于3。因此,将跳过循环

if条件的结果为false。在即时窗口中尝试,或使用watch查看存储在变量中的值。有时,一个小空间也否定了平等


这可能不是问题所在,但请注意,Project和License不是字符串变量,而是变体。当一行中有多个变量变暗时,每个变量名都必须有自己的类型。如果未指定类型,则默认为Variant

所以,试试看

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

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

这里可能不是问题所在,但请注意,Project和License不是字符串变量,而是变体。当一行中有多个变量变暗时,每个变量名都必须有自己的类型。如果未指定类型,则默认为Variant

所以,试试看

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

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

组合框中的值很可能是数字字符串,范围中的值是数字,并且您已确认许可证是3个数字

您的代码失败,因为单元格返回的数值单元格为Variant/Double,而ComboxBox.Value返回的是Variant/String。将这些与=运算符进行比较会产生一个不等式

通过在单元格E6中输入123,然后在即时窗口中运行此命令,可以看到相同的情况:

?Range("E6") = "123"
True
?Range("E6") = 123
True
?Range("E6") = CVar("123")
False
如果要比较数字,请将值转换为数字,然后进行比较,但要小心,将1D4和/或1E4转换为数字会产生10000,或者将数字转换为字符串并进行比较。 至少有一个操作数是字符串就足以让Excel执行有效的相等操作:

?Range("E6") = CStr(CVar("123"))
True
但是,将两者都转换,就可以确保得到正确的结果

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

组合框中的值可能是数字字符串,范围中的值可能是数字,并且您已确认许可证为3个数字

您的代码失败,因为单元格返回的数值单元格为Variant/Double,而ComboxBox.Value返回的是Variant/String。将这些与=运算符进行比较会产生一个不等式

通过在单元格E6中输入123,然后在即时窗口中运行此命令,可以看到相同的情况:

?Range("E6") = "123"
True
?Range("E6") = 123
True
?Range("E6") = CVar("123")
False
如果要比较数字,请将值转换为数字,然后进行比较,但要小心,将1D4和/或1E4转换为数字会产生10000,或者将数字转换为字符串并进行比较。 至少有一个操作数是字符串就足以让Excel执行有效的相等操作:

?Range("E6") = CStr(CVar("123"))
True
但是,将两者都转换,就可以确保得到正确的结果

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

我还将检查Project、License和state的值,并非常小心前导/尾随空格。将您的MsgBox语句更改为类似于MsgBox |&WorksheetEntitlements.Cellsr,1.Value&&&&&vbCrLF&&&Project&&124;-这将使您能够同时检查两个值,一个高于另一个。和其他人一样,我怀疑存在空白问题,或者可能是案例问题。最好将项目和许可证声明为字符串,而不是将它们默认声明为变体。提醒一下,VBA中的字符串比较区分大小写。对于您正在进行的搜索,匹配公式将是合适的。@YowE3K-感谢您的建议,我一定会窃取该公式以备将来调试使用!:D帮助确认没有空格问题。我还将检查Project、License和state的值,并非常小心前导/尾随空格。将您的MsgBox语句更改为类似于MsgBox |&WorksheetEntitlements.Cellsr,1.Value&&|&vbCrLF&|&Project&|-这将使您能够同时检查这两个值,一个比另一个高。和其他人一样,我怀疑存在空白问题,或者可能是案例问题。声明项目和许可证可能是个好主意
ce作为字符串,而不是将它们默认声明为变量。只是提醒一下,VBA中的字符串比较区分大小写。对于您正在进行的搜索,匹配公式将是合适的。@YowE3K-感谢您的建议,我一定会窃取该公式以备将来调试使用!:D帮助确认没有空格问题。您的第1点无效,因为OP说消息框显示了正确的值,这意味着没有跳过循环。您的第2点几乎肯定是正确的。您的第1点无效,因为OP说消息框显示的值正确,这意味着没有跳过循环。您的第2点几乎肯定是正确的。@scb998出于好奇,项目和许可证的价值是什么?我没想到能解决这个问题,因为一个变体/字符串和一个字符串,甚至一个数字都应该测试正常。@YowE3K-许可证只有3个数字,而该项目是在过程早期生成的字母和数字的唯一组合。@YowE3K是正确的,当我在回答中充实起来时,只要相等条件中的一个操作数是字符串,VBA将为您执行隐式强制转换,但如果一个是Variant\Double,另一个是Variant\String,则您将无法获得相等。@scb998出于好奇,Project和License的值是什么?我没想到能解决这个问题,因为一个变体/字符串和一个字符串,甚至一个数字都应该测试正常。@YowE3K-许可证只有3个数字,而该项目是在过程早期生成的字母和数字的唯一组合。@YowE3K是正确的,当我在回答中充实起来时,只要相等条件中的一个操作数是字符串,则VBA将为您执行隐式强制转换,但如果一个是Variant\Double,另一个是Variant\String,则无法获得相等。