【问题标题】:Excel macro type mismatch error exiting for loopExcel 宏类型不匹配错误退出 for 循环
【发布时间】:2017-01-27 10:51:08
【问题描述】:

宏退出 For 循环时出现类型不匹配错误。我不知道为什么,但如果我能得到任何帮助,我将不胜感激。我确实尝试搜索此问题,但没有任何建议适用于我的案例。

    Option Explicit
        Dim MODULE_NAME() As String
        Dim Counter As Long
        Dim i As Long
1210                            For Counter = i To CLng(i + CLng(CLng(UBound(MODULE_NAME)) Mod 127))
1220                                Call MacroLineNum(Counter, MODULE_NAME, TotalLines)
1230                                If Counter Mod UpdateFreq = 0 Then
1240                                    '**Save the file
1250                                    With gloMacroWorkbook
1260                                        If Not .ReadOnly Then
1270                                            .Save
1280                                        Else
1290                                            .Saved = False
1300                                        End If
1310                                    End With
1320                                    LockWindowUpdate 0&
1330                                    '-------------------------------------------------------------------------------------------------
1340                                    '   Update the status bar.
1350                                    '-------------------------------------------------------------------------------------------------
1360                                    Call subStatusBarUpdater("Still updating the line numbers in the modules.  " & Counter & " of " & UBound(MODULE_NAME) & " processed....")
1370                                    If VBEHwnd Then
1380                                        LockWindowUpdate VBEHwnd
1390                                    End If
1400                                End If
1410                                If Counter = UBound(MODULE_NAME) Then
1420                                    MsgBox "Exiting for loop."
1430                                End If
1440                            Next Counter
1450                            MsgBox "Saving file"

我的代码到达第 1420 行,但没有到达第 1450 行。我什至在 1210 中添加了类型转换函数“CLng”,但似乎没有任何帮助。在第 1420 行和第 1450 行之间,我总是收到“类型不匹配”错误,没有详细说明位置和原因。

MODULE_NAME() 数组是一个包含 159 个字符串条目的动态数组。任何帮助将不胜感激。

【问题讨论】:

  • MacroLineNum 是做什么的?
  • @Mat'sMug 它是 10 跳,所以它是 145 :)
  • @A A 看来你没有退出For 循环,在第1430 行之后(Next Counter 之前)添加一个MsgBox 并写MsgBox "Counter is : " & Counter
  • i 是否在进入循环之前分配了任何内容?如果为 0,则 for 循环为 For Counter = 0 To 31,这使得条件 If Counter = UBound(MODULE_NAME) 不太可能是 True。你能把你的代码去掉一点意大利面,并尝试用minimal reproducible example重现同样的问题吗?
  • @Mat's Mug 感谢您的收获。我忘了在我的问题中提到“我”的价值。在此示例中,“i”设置为 128。我会尝试看看我是否可以发布一个完整的代码集,该代码集实际上会产生问题,但“最小、完整和可验证”。

标签: vba types mismatch


【解决方案1】:

按照一些简单的步骤,我能够完全解决这个问题。我不知道为什么,但这有效。我只添加了 CLng 调用,因为我无法让它更早地工作。

Option Explicit
    Dim MODULE_NAME() As String
    Dim Counter As Long
    Dim i As Long
    Dim k As Long
1200                            k = i + (UBound(MODULE_NAME) Mod 127)
1210                            For Counter = i To k
1230                                Call MacroLineNum(Counter, MODULE_NAME, TotalLines)
1240                                If Counter Mod UpdateFreq = 0 Then
1250                                    '**Save the file
1260                                    With gloMacroWorkbook
1270                                        If Not .ReadOnly Then
1280                                            .Save
1290                                        Else
1300                                            .Saved = False
1310                                        End If
1320                                    End With
1330                                    LockWindowUpdate 0&
1340                                    '-------------------------------------------------------------------------------------------------
1350                                    '   Update the status bar.
1360                                    '-------------------------------------------------------------------------------------------------
1370                                    Call subStatusBarUpdater("Still updating the line numbers in the modules.  " & Counter & " of " & UBound(MODULE_NAME) & " processed....")
1380                                    If VBEHwnd Then
1390                                        LockWindowUpdate VBEHwnd
1400                                    End If
1410                                End If
1420                                If Counter = UBound(MODULE_NAME) Then
1430                                    MsgBox "Exiting for loop."
1440                                End If
1450                            Next Counter
1460                            MsgBox "Saving file"

感谢大家的帮助和快速响应。虽然我想深入了解这一点,但事实证明,按要求创建测试代码有点困难,因为我有太多相互关联的函数调用等,我需要存根并提供测试代码。

【讨论】:

  • 出于好奇,究竟是什么促使在 VBA 代码中使用 1980 年的行号?
  • 出于好奇,究竟是什么证明在 VBA 代码中有 1980 年的行号?
  • FWIW 如果曾经使用过行号,例如On Error GoTo 1590,然后对它们重新编号可能会引入令人讨厌的难以发现的错误。除了移植旧的遗留 QBASIC 代码之外,VBA 不需要任何行号;它们在新代码中是相当有害的,即使只是为了提高可读性。
  • 我没有在 GoTo 语句中使用行号。这些由我的自定义错误处理程序使用,它报告 Erl,如您所知,它需要行号。我的宏中有 35K+ 行,包含 159 个单独的模块。这是我能够远程调试此代码的唯一方法。我会将我的宏发布到编号/重新编号并自动缩进行。您可能会也可能不会觉得它有用。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-08-11
  • 2013-03-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多