为什么我的VB6变体会根据分配时间而改变?

时间:2009-05-15 21:34:32

标签: vb6 types

我是VB6(以及任何形式的visual basic)开发的新手,我遇到了一个问题。下面可能存在词法错误,因为我在这里的帖子中将代码格式化为更具可读性,但问题的本质仍然存在。这是代码

我的问题是MsgBox调用显示的值(第二组,引用变量scrWord和resWord的值)根据我分配给变量scrWord和resWord的时间而不同。如果我在上面显示的代码中取消注释的第一个位置分配变量scrWord和resWord,那么代码底部的消息框将打印我不感兴趣的字符串(例如,第一个消息框将生成输出看起来像“srcws:resColNum:#”)或似乎是垃圾数据。请注意,这意味着它将我在前一个消息框中使用的静态字符串分配给变量scrWord。这绝不是预期的行为,我不知道它是如何发生的。

另一方面,如果在消息框之前完成赋值,其中变量赋值在上面的代码中被注释,那么变量会打印一个不同于预期的值,但不完全是(通常,两个变量完全相同,或者当两个变量都是不同的字符串时,一个是数字)。

我对此问题感到困惑,我相信它与GetData调用有关,返回Variant数据类型。

谢谢你, 埃文

新代码发布在下方。仍然无效。

Dim srcWord As Variant
Dim resWord As Variant

Do While (BinsCol.GetData(grouprownum, 1) = binfromnum And nogroupfound = True)
    Dim groupmismatch As Boolean

    groupmismatch = False

    For j = 1 To FormHyst.GroupList.ListCount


        srcWord = sourceWS.Columns(j).GetData(i, 1)
        resWord = "hello, world"



        MsgBox ("srcws:" & srcWord & vbNewLine &_
                "resws:" & resWord & vbNewLine &_
                "test:" & (resWord <> srcWord))
    Next
Loop

在这个新代码中,srcWord和resWord都显示“hello,world”。

我仍然无法理解这种行为。

3 个答案:

答案 0 :(得分:3)

正如你所说,你是VB6的新手,这里有一些一般的想法和建议。

作为第一个建议:只要你没有真正需要它们,就永远不要使用Variants。使用您期望的具体数据类型。在MSDN,有一个解释Variants如何在内部工作的解释。在比较Variants时会发生隐式转换,所以如果你真的不知道你的数据,那就是赌博。

即使您的GetData函数返回Variant,您也可以将retrun值强制转换为该工作表列中的特定数据类型。因此,如果您的列仅包含字符串,请使用CStr()将其强制转换为字符串,并将其放入字符串变量中。与数字相同,分为双变量或长变量。

您可能还想使用VarType函数来确定Variants中存储的值的实际类型。

以下是更多的调试工作流程,但也许它可以帮助您找出问题:

  1. 启用Option Explicit以避免未声明/拼写错误的变量问题。 (正如DJ已经提到的那样)

  2. 在每一行之后生成调试输出,以确保您拥有所期望的值而不是其他值。如果步骤调试或“Debug.Print”不可能,那么您可以登录外部日志文件或使用MsgBox。

  3. 将源与外部组件依赖关系分离以进行测试。在您的情况下,尝试重现问题而不从外部网格读取数据(例如将变量设置为某些具体字符串)。然后,您将知道问题是在您的编程逻辑中还是在您必须处理的数据中。

  4. 始终双重检查您的外部数据源是否是您期望的那个而不是其他人。 (经常发生在我身上......)因此,请检查您的网格在(i,j)处保存的数据以及是否与您获得的数据相匹配。

  5. 还有一点:字符串比较在VB6中区分大小写,只要您不在模块/类/表单的顶部放置“Option Compare Text”即可。所以“你好世界”&lt;&gt; “你好世界”。

答案 1 :(得分:2)

你的模块顶部是否有明确的选项???

你有一个错字:srcWord vs scrWord

答案 2 :(得分:1)

尝试


    Dim srcWord As Variant
    Dim resWord As Variant

Do While (BinsCol.GetData(grouprownum, 1) = binfromnum And nogroupfound = True)


    For columnnum = 1 To FormHyst.GroupList.ListCount

        scrWord = (sourceWS.Columns(columnnum ).GetData(rownum, 1))
        resWord = (resultWS.Columns(columnnum  + 3).GetData(grouprownum, 1))

        MsgBox ("srcColNum:" & columnnum  & vbNewLine & "srcRowNum:" & _
                  rownum)        MsgBox ("resColNum:" & (columnnum  + 3) & vbNewLine & "resRowNum:" & _
                  grouprownum)


        MsgBox ("srcws:" & srcWord)
    Next                                               
Loop


以下没有任何意义

MsgBox ("resws:" & resWord & vbNewLine & "test:" & (resWord <> srcWord))

你会在(resWord&lt;&gt; srcWord)结束“真”或“假”