【问题标题】:for next loop failing to allocate a value to a variable - VBAfor next 循环无法为变量分配值 - VBA
【发布时间】:2017-03-17 01:41:49
【问题描述】:

我正在检查在 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

我猜我犯了一个愚蠢的错误,但是任何关于如何纠正错误的建议将不胜感激。

谢谢

【问题讨论】:

  • 我还会检查 Projectlicencestate 的值,并非常小心前导/尾随空格。
  • 将您的MsgBox 语句更改为类似于MsgBox "|" & Worksheets("Entitlements").Cells(r, 1).Value & "|" & vbCrLF & "|" & Project & "|" - 这将使您能够同时检查两个值,一个在另一个之上。 (与其他人一样,我怀疑存在空格问题,或者可能是大小写问题。)
  • 最好将Projectlicence 声明为String,而不是将它们默认声明为Variant
  • 提醒一下,VBA 中的字符串比较区分大小写。对于您正在进行的搜索,match 公式将是合适的。
  • @YowE3K - 感谢您的建议,我一定会窃取该建议以供将来调试! :D 帮助确认没有空格问题。

标签: excel vba for-loop


【解决方案1】:

这里可能不是问题,但请注意 Project 和 License 不是 String 变量,而是 Variants。当您Dim 一行中有多个变量时,每个变量名都必须有自己的类型。如果没有给出类型,则默认为 Variant。

所以,试试

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

或者,使用三个Dimstatements 而不是一个。

【讨论】:

  • @scb998 出于好奇,Projectlicence 的值是多少?我没想到会解决它,因为 Variant/StringString(甚至是一个数字)应该测试正常。
  • @YowE3K - 许可证只有 3 个数字,该项目是在流程早期生成的字母和数字的独特组合。
  • @YowE3K 是正确的,正如我在回答中充实的那样,只要相等条件中的操作数之一是 String,那么 VBA 将为您执行隐式转换,但是如果一个是Variant\Double,另一个是Variant\String,那么你将不会得到平等。
【解决方案2】:

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

您的代码失败了,因为Cells 返回一个数字单元格为Variant/Double,而ComboxBox.Value 返回一个Variant/String。将它们与= 运算符进行比较会导致不等式。

您可以通过在单元格E6 中输入123,然后在即时窗口中运行它来看到相同的内容:

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

如果您要比较数字,请将值转换为数字,然后进行比较(但请注意,将"1D4" 和/或"1E4" 转换为数字会导致10000),或者将数字转换为Strings并比较那些。 至少有一个操作数是字符串就足以让 Excel 执行有效的相等操作:

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

但是两者都转换,你可以确定正确的结果。

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

【讨论】:

    【解决方案3】:

    有几种可能性,因为变量 'selectedrow' 未设置为行 'r'

    1. 变量“LastRow”的值被计算为小于 3。因此,正在跳过循环。

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

    【讨论】:

    • 您的第 1 点无效,因为 OP 说“消息框正在显示正确的值”,这意味着没有跳过循环。您的第 2 点几乎可以肯定是正确的。
    猜你喜欢
    • 2016-04-10
    • 1970-01-01
    • 2017-05-02
    • 2021-12-16
    • 2013-06-19
    • 2023-04-11
    • 2016-07-30
    • 2015-07-07
    • 2012-02-26
    相关资源
    最近更新 更多