我是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”。
我仍然无法理解这种行为。
答案 0 :(得分:3)
正如你所说,你是VB6的新手,这里有一些一般的想法和建议。
作为第一个建议:只要你没有真正需要它们,就永远不要使用Variants。使用您期望的具体数据类型。在MSDN,有一个解释Variants如何在内部工作的解释。在比较Variants时会发生隐式转换,所以如果你真的不知道你的数据,那就是赌博。
即使您的GetData函数返回Variant,您也可以将retrun值强制转换为该工作表列中的特定数据类型。因此,如果您的列仅包含字符串,请使用CStr()将其强制转换为字符串,并将其放入字符串变量中。与数字相同,分为双变量或长变量。
您可能还想使用VarType函数来确定Variants中存储的值的实际类型。
以下是更多的调试工作流程,但也许它可以帮助您找出问题:
启用Option Explicit以避免未声明/拼写错误的变量问题。 (正如DJ已经提到的那样)
在每一行之后生成调试输出,以确保您拥有所期望的值而不是其他值。如果步骤调试或“Debug.Print”不可能,那么您可以登录外部日志文件或使用MsgBox。
将源与外部组件依赖关系分离以进行测试。在您的情况下,尝试重现问题而不从外部网格读取数据(例如将变量设置为某些具体字符串)。然后,您将知道问题是在您的编程逻辑中还是在您必须处理的数据中。
始终双重检查您的外部数据源是否是您期望的那个而不是其他人。 (经常发生在我身上......)因此,请检查您的网格在(i,j)处保存的数据以及是否与您获得的数据相匹配。
还有一点:字符串比较在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)结束“真”或“假”