我是 VB6(以及任何形式的 Visual Basic)开发新手,我遇到了一个问题。下面可能存在词汇错误,因为我将代码格式化为在此处的帖子中更具可读性,但问题的本质仍然存在。这是代码
我的问题是显示的值MsgBox
调用(第二组,引用变量的调用scrWord
and resWord
)根据我分配给变量的时间而有所不同scrWord
and resWord
。如果我分配给变量scrWord
and resWord
在上面显示的代码中未注释的第一个位置中,那么代码底部的消息框将打印我不感兴趣的字符串(例如,第一个 messageBox 将生成如下所示的输出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
and resWord
显示“你好,世界”。
我仍然无法理解这种行为。
正如您所说,您是 VB6 的新手,这里有一些一般性的想法和建议。
第一个建议:除非你不这样做,否则永远不要使用变体really需要他们。使用您期望的具体数据类型。在MSDN http://msdn.microsoft.com/en-us/library/aa261347(VS.60).aspx有一个解释变体如何内部工作。比较变体时会发生隐式转换,因此如果您并不真正了解自己的数据,那就有点赌博了。
即使您的 GetData 函数返回 Variant,您也可以将返回值转换为该工作表列中的特定数据类型。因此,如果您的列仅包含字符串,请使用 CStr() 将其转换为字符串并将其放入字符串变量中。与数字相同,分为 double 或 long 变量。
您可能还想使用 VarType 函数来确定 Variants 中存储的值的实际类型。
以下更多的是调试工作流程,但也许它可以帮助您找到问题:
启用 Option Explicit 以避免未声明/拼写错误的变量问题。 (正如 DJ 已经提到的)
在每行之后生成调试输出,以确保您拥有所需的值而不是其他值。如果无法逐步调试或“Debug.Print”,那么您可以记录到外部日志文件或使用 MsgBox 。
将您的源代码与外部组件依赖项分离以进行测试。在您的情况下,尝试在不从外部网格读取数据的情况下重现问题(例如将变量设置为一些具体字符串)。然后你就会知道问题是出在你的编程逻辑上还是出在你必须处理的数据上。
请务必仔细检查您的外部数据源是否确实是您期望的数据源,而不是其他数据源。 (我经常遇到这种情况......)因此请检查您的网格在 (i,j) 处保存的数据以及它是否与您获得的数据匹配。
还有一点:在 VB6 中,字符串比较是区分大小写的,只要您不将“Option Compare Text”放在模块/类/表单的顶部。所以“你好世界”“你好世界”。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)