【问题标题】:Break mode and Immediate Window results are different中断模式和立即窗口结果不同
【发布时间】:2021-05-28 16:34:09
【问题描述】:

我正在使用 MS Access 2016、Windows 10、运行 SDC 的 USAF 笔记本电脑。

我在调试某些代码时遇到问题。当我在中断模式下打一行时,我得到一个运行时错误“13”:类型不匹配,当我在中断模式之外运行完全相同的代码时,代码可以正常运行。

这是导致我出现问题的基本代码:

Private Sub btn_ReqKey_Click() 'This is not all of the code only those lines that are necessary
Dim trgt_CACID as String
Dim Temp_KeyCode as String

trgt_CACID = Me.CACID.Value  'Pulls value from short text field of "1234567890"
'Here is the issue
Temp_KeyCode = UnlockCode(trgt_CACID) 'Run-time Error '13': Type mismacth
More code
End Sub

Public Function UnlockCode(ByVal CACID as String) As String
lots of code that generates a 25 digit Alpha code
End Function

当我点击按钮时,代码在“Temp_KeyCode = UnlockCode(trgt_CACID)”运行时出错'13':类型不匹配。

但是,如果我重置代码执行并在即时窗口中运行它而不按下按钮。

trgt_CACID = "1234567890"
?UnlockCode(trgt_CACID)

返回正确的代码而不抛出错误。所以函数 UnlockCode() 可以正常工作,只是在执行时没有。

此外,当按下按钮处于中断模式时,我在即时窗口中尝试相同的代码行,它返回相同的运行时错误“13”:类型不匹配。

此外,我退出中断模式,重新加载变量并执行它再次工作的同一行代码。

所以我知道执行环境中的某些东西受到了影响,但我无法弄清楚那是什么。这是我第一次看到与代码执行相比,即时窗口的功能存在差异。

旁注/怪癖,当我进入函数时,助手会弹出来指导我所需的变量。当我在模块代码中键入相同内容时,不会显示帮助程序弹出窗口。太奇怪了。对?进一步证明这两种环境之间有些不同。

任何帮助或帮助将不胜感激。 提前致谢。 KO

【问题讨论】:

  • 错误是类型不匹配,在不处于中断模式时确实有效。所以这个函数不是问题,除了它是一个替换密码,它分解各种数据元素并将它们重新分配给 Alpha 字符。我不想发布该代码,所以不,我不会提供,它与手头的问题无关。
  • 如果看到从即时窗口调用的自定义函数不起作用。与如何声明参数变量有关。至少显示 UnlockCode 函数的声明行。当设置了断码时,我也有一些程序无法正常工作,或者相反 - 我忘记了这么久没有遇到过。
  • 我做了,公共函数 UnlockCode(ByVal CACID as String) As String。我不使用引用 CACID 的其他分配。我为 CACID 的每个数字分配了 10 个字符串。但是所有类型的数据都匹配为字符串。
  • 那么当我手动分配字符串值并使用该值调用函数时,为什么它会在即时窗口中工作?
  • 好的,我查看了您之前的帖子并删除了断点,但执行同样的错误仍然失败。现在仍然处于中断模式,即时窗口中的函数仍然返回错误。观察窗口中的变量 trgt_CACID = "1234567890"。我退出中断模式重置所有变量并手动将 trgt_CACID 变量重新分配给“1234567890”,该函数工作正常。它正确地返回生成的代码。

标签: ms-access


【解决方案1】:

根据与 Erik A 和 Gustav 的讨论,我更改了与我正在使用的表字段名称发生冲突的函数名称。一旦我将所有内容更改为不同的:表字段名称、表单文本框名称和被调用的函数。一切正常。因此,显然我调用的上下文已经使用了函数的名称,并且该字段名称被拾取并发送到与该字段同名的函数。这造成了微妙的冲突,解释了在表格和表单的上下文中执行与在即时窗口中手动调用时之间的差异,以及为什么它在即时窗口中有效,但在执行期间无效。感谢 Erik A 和 Gustav 的帮助。

【讨论】:

    【解决方案2】:

    尝试使用虚拟函数运行它:

    Public Function UnlockCode(ByVal CACID As Variant) As String
        UnlockCode = String(25, "0")
    End Function
    

    如果运行,调试你的秘密函数。

    【讨论】:

    • 但是,当我从执行之外的即时窗口调用该函数时,它返回 25 个零。
    • 那 - 你看 - 是不可能的(如果 CACID 传递了一个字符串),所以其他事情正在发生 - 就像一个字符串没有传递给 CACID。尝试将变暗作为变体(请参阅编辑后的代码)。
    • 我意识到它不应该那样工作,但确实如此。我将手表设置为我正在查看的所有变量,它们都是字符串。我什至在即时窗口中使用 ?trgt_CACID 来证明它是一个字符串并验证它的值。一切都检查出来了,但仍然返回错误。
    • 听起来你有一个重复的声明。 UnlockCode 也可能是一个对象(在这种情况下 UnlockCode(1) 调用默认方法)、一个数组(在这种情况下 UnlockCode(1) 返回索引 1 处的项目)、您所在对象的方法(在这种情况下方法被调用),您所在的对象的属性可以是对象或数组等。
    • 好的,您希望将哪个 DIM 语句设置为 Variant?调用子还是函数?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-03-21
    • 1970-01-01
    • 2011-08-18
    • 2020-11-08
    • 1970-01-01
    相关资源
    最近更新 更多