Excel VBA:运行时错误(对象“范围”的方法“值”失败),但仅限于连续运行

2024-03-22

我目前正在处理的 VBA 项目遇到问题,特别是一段代码的运行时错误,该代码查找表格底部的下一个空单元格并将存储的字符串写入该范围

现在 - 该项目的快速解释。我在 Excel 工作表中有一个表格,记录了我工作的公司可能即将出现的每项预期工作。为此,我有一个前端,可以控制创建/查看新的“工作”或“机会”,并且此处运行的代码对信息进行一些意义检查,在网络驱动器上为联系人创建标准化的文件夹结构和合同信息,并为该工作生成一个唯一的 ID,然后用于我们的 CRM 和通信

我的代码似乎第一次运行没有问题(添加新工作)->(创建),但第二次运行时崩溃它会抛出运行时错误“-2147417848(80010108)”:对象“范围”的方法“值”失败。在该行:

r.Value = pFix

Excel(Windows 10 上的 2016)将崩溃并重新启动

Edit:我相信这也许是因为r在第二次运行时未正确存储 - 或者在第一次运行后可能未正确从内存中清除。不过我已经尝试过Set r = Nothing以及我读过的内容here https://stackoverflow.com/questions/19038350/when-should-an-excel-vba-variable-be-killed-or-set-to-nothing表明这无论如何都不是问题

这段代码取自按钮_单击用户窗体上的事件来自新工作(屏幕截图中显示的报名表)

Private Sub CommandButton1_Click()
    Dim pFix As String
    Dim sNew As Long
    Dim jNumber As String
    Dim jName As String
    Dim jIndex As String
    Dim jClient As String
    Dim jSite As String
    Dim jComments As String
    Dim cName As String
    Dim createdDate As Date
    Dim r As Range
    Dim hLink As String
    Dim hLink2 As String
    Dim wDir As String
    Dim msg As String
    Dim ans As String

    Set r = Nothing


    wDir = ActiveWorkbook.Path

    If TextBox1.Value = "" Then
        Call MsgBox("Please enter a valid Requester Name", vbCritical)
        Exit Sub
    Else

        If TextBox2.Value = "" Then
            Call MsgBox("Please enter a valid Client Name", vbCritical)
            Exit Sub
        Else

            If TextBox3.Value = "" Then
                Call MsgBox("Please enter a valid Site Description", vbCritical)
                Exit Sub
            Else

            End If
        End If
    End If

    pFix = "GSM"
    sNew = WorksheetFunction.Max(Columns(2)) + 1
    jNumber = pFix & sNew
    jClient = TextBox2.Value
    jIndex = Left(jClient, 1)
    jSite = TextBox3.Value
    jName = jClient & " - " & jSite
    jComments = TextBox4.Value
    cName = TextBox1.Value
    createdDate = Now


    Set r = Sheet1.Range("A" & Rows.Count).End(xlUp).Offset(1)

    r.Value = pFix
    r.Offset(0, 1) = sNew
    r.Offset(0, 2) = jNumber
    r.Offset(0, 3) = jName
    r.Offset(0, 4) = jComments
    r.Offset(0, 5) = createdDate
    r.Offset(0, 6) = cName

    Call MsgBox("New Job Number is: " & jNumber, vbOKOnly)

    On Error Resume Next
    hLink = wDir & "\" & jIndex
    MkDir hLink

    hLink = hLink & "\" & jNumber & " - " & jName
    MkDir hLink

    hLink2 = hLink & "\" & "1. Tender Documents"
    MkDir hLink2

    hLink2 = hLink & "\" & "2. Clarifications and Addendums"
    MkDir hLink2

    hLink2 = hLink & "\" & "3. Client Correspondence and MoU's"
    MkDir hLink2

    hLink2 = hLink & "\" & "4. Technical Queries"
    MkDir hLink2

    hLink2 = hLink & "\" & "5. Document Register"
    MkDir hLink2

    hLink2 = hLink & "\" & "6. Subcontractor and Material Pricing"
    MkDir hLink2

    hLink2 = hLink & "\" & "7. Estimate"
    MkDir hLink2

    hLink2 = hLink & "\" & "8. Photos"
    MkDir hLink2

    hLink2 = hLink & "\" & "9. Tender Submission"
    MkDir hLink2

    hLink2 = hLink & "\" & "10. Drawings"
    MkDir hLink2

    hLink2 = hLink & "\" & "11. Post Tender Correspondence"
    MkDir hLink2



    Unload Me

    'Call filterByJobNumber
    Call copyTable

    msg = "Would you like to open the newly created directory?"
    ans = MsgBox(msg, vbYesNo, "Open Directory?")

    If ans = vbYes Then
        Shell "explorer """ & hLink & "", vbNormalFocus
    Else
    End If


End Sub

事实上,它使 Excel 崩溃,而不仅仅是破坏并让我进行调试,这才是让我困惑的事实——事实上,它肯定会第一次运行,但第二次就会崩溃

Edit:我已经把范围缩小到了r.Value = pFix这是存储的 pFix 字符串写入新范围的点r。弹出一个msgbox(pFix)在这一行显示正确之前pFix存储的是字符串,所以错误一定是在范围内

也许一些新的眼光会发现我忽略的错误 - 并且了解原因将防止以后重蹈覆辙

Edit 2:

我已经做了一些进一步的测试,当将值写入范围时,问题肯定发生在运行的代码的第二个实例上r。我创建了一个小测试来强制崩溃,在下面的代码中,Excel 将锁定并在第二个循环中退出 - 它似乎仅在地址为r每次连续运行之间的变化(行数增加),并且创建的新行位于表格的底部(Excel 会自动将此新行添加到表格范围)。有人可以运行代码并确认他们是否有同样的问题吗?

Sub testMacro()

    Dim r As Range
    Dim str As String

    str = "TEST"
    i = 1

    Do Until i = 5
        Set r = Sheet1.Range("A" & Rows.Count).End(xlUp).Offset(1)
        Call MsgBox(r.Address, vbOKOnly, "Range address for 'r' is")
        r = str
        i = i + 1
    Loop


End Sub

我尝试卸载/重新安装并修复 Office 2016 安装作为附加措施,但没有帮助。如果它在其他地方无法重复,也许是 Windows 10 的怪癖?


作为“社区维基”回答,从未回答的问题列表中删除,并且我已在不更改代码的情况下解决了问题。

Office 2016/Excel 2016 安装似乎存在一些根本问题。在进一步的测试中,我确实设法生成了 VBA“内存不足”错误,但在这种特殊情况下,对代码的更改似乎没有产生任何积极影响。

再次删除、重新启动和重新安装 Office(第二次)似乎已解决该问题,而无需对工作簿进行任何其他更改,并且原始 Sub 运行时不会产生错误

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Excel VBA:运行时错误(对象“范围”的方法“值”失败),但仅限于连续运行 的相关文章

  • 如何删除Excel 2010单元格中的某些字符

    在 A 列中 我有很多类似这样的名称 约翰 史密斯 我仍然希望它们在 A 中 但 被删除了 If John Smith 位于单元格 A1 中 然后使用以下公式执行您想要的操作 SUBSTITUTE SUBSTITUTE A1 内部 SUBS
  • 在 Word 2010 中复制形状而不使用 .Select?

    是否可以在 Word 2010 中复制形状而无需借助 Select 根据开发中心 http msdn microsoft com en us library office ff835500 aspx the Anchor属性返回形状的锚定范
  • 按日期计算 Outlook 中的电子邮件

    我有以下代码来计算 Outlook 文件夹中的电子邮件数量 Sub HowManyEmails Dim objOutlook As Object objnSpace As Object objFolder As Object Dim Ema
  • 任务执行期间在任务窗格上滚动时工作表冻结

    我们正在使用office js API 开发一个office Addin 反复出现的问题损害了我们在店里的声誉 此问题是 Excel 插件 office js 中的工作表在滚动后被冻结 我编写了一个简单的脚本实验室片段代码 它重现了工作表冻
  • Excel VBA 最终用户选择图表对象

    我想生成一些代码 允许最终用户从工作表中选择多个图表之一 之后我将根据该选择进行一系列操作 我正在寻找类似于 Application Inputbox Type 8 的东西 它允许对象选择而不是范围选择 我对不起眼的老VBA要求太多了吗 首
  • VBA:访问 JSON

    我正在处理 VBA 投影 但不确定如何访问此 JSON 中的 id 应该将 players 设置为什么才能在循环中获取 id 我已经用更多代码更新了问题 JSON event games players id 182759 Code Pri
  • excel中的多轴折线图

    我正在寻找类似于下图中的多轴折线图 这是由 amcharts 制作的 JavaScript 图表 excel有没有可以绘制图表的选项 请注意 有 3 个 Y 轴和 3 个折线图 可让您比较数据 是否有可能获得超过 3 个数据点 每个数据点在
  • 如何从 PowerQuery/Excel 数据模型中具有多对多关系的两个表中选取数据?

    这是我第一次在 stackoverflow 上提问 让我们看看进展如何 我正在尝试将不同规模资产的场景管理器连接到其所属的成本时间序列 以便我可以计算属于特定场景的资产配置的现金流 这就是我需要连接的两个表 简而言之 的样子 场景管理器 S
  • Mono for Android,读取和写入 XLSX

    我正在使用 Mono for Android 开发一个应用程序 我需要读取和创建 XLSX Excel 文件的功能 我尝试过EPPlus和NPOI 并快速浏览了一下微软的Open XML SDK 发现了以下问题 EPPlus 需要 Wind
  • 使用 Apache POI 和 Java 创建 Excel (.xlsx) 文件后文件损坏

    我已经使用 Apache POI API 使用 Java 成功创建了 xlsx 格式的工作簿 Excel 我的代码如下 在 D 盘创建一个名为 RiponAlWasim xlsx 的文件 Workbook wb new XSSFWorkbo
  • Outlook Application_NewMailEx 在启动时不工作

    我正在使用一个Application NewMailEx处理收到的所有电子邮件 它适用于 Outlook 打开时收到的电子邮件 然而在启动时 Application NewMailEx不会因收到的电子邮件而被呼叫 我尝试使用Applicat
  • 当行数 = 0 时删除 Excel 列中的单元格

    我试图删除电子表格中某一列中的所有单元格 0 并 召唤 不在该列顶部的值 我目前正在使用 Dim row index As Integer Dim col index As Integer row index 7 col index 16
  • 更改索引设置访问 VBA

    我正在尝试自动化 Access 中的流程 我希望自动化的步骤之一是更改表中某些字段的索引设置 我需要这样做来提高后续查询的速度 使用索引查询速度大约快 100 倍 无论如何 假设我的表名为 Cars 如下所示 ID Name Charact
  • 用于将 MS Word 表导出到 Excel 工作表的宏

    我有一个包含许多表格的word文档 有谁知道如何编写宏将此类表导出到不同的 Excel 工作表 答案摘自 http www mrexcel com forum showthread php t 36875 http www mrexcel
  • 在 PowerPoint 中查找文本并替换为 Excel 单元格中的文本

    我正在尝试查找 PowerPoint 幻灯片中的单词列表并将其替换为 Excel 文件中单元格中的值 我在 PowerPoint 中运行 VBA 但出现此错误 运行时错误 2147024809 80070057 指定的值超出范围 代码似乎停
  • 如何粘贴到Excel B列的最后一行?

    我需要将单元格从 H2 L2 一直向下剪切并将其粘贴到 B 列的最后一行 数据每次都会不同 所以我无法对任何范围进行硬编码 VBA 代码会很好 从 H2 L2 向下剪切并粘贴 插入到 B 列的最后一行 到目前为止我得到了 Range H2
  • VBA仅清除数据透视表缓存,但保留数据透视表结构

    如何使用VBA清除数据透视表缓存 但不破坏数据透视表结构 我的数据透视表已连接到外部数据源 SQL 源决定哪个用户应该查看数据的哪一部分 当表刷新时 源会填充该表 我想保存 Excel 文件并使用干净的数据透视表 内部没有数据 分发它 结果
  • 将 copyfromrecordset 写入范围

    我有以下 vba 它从单元格 C10 开始读取 MCO 直到其为空 并将从 SQL 数据库获取机器数量 解密和升级机器数量 这工作正常 但我在获取相应行中的数据时遇到问题 目前它总是将数据写入 D10 因为我已经对其进行了硬编码 但我不确定
  • FileDialog 保留以前的过滤器

    我正在 Access 数据库中制作表单 我需要打开文件对话框窗口几次 我只是不明白为什么在我更改选项值几次并打开文件对话框窗口后它没有更改过滤器 Public Sub Command17 Click Dim fd As FileDialog
  • schema.ini 文件不适用于 MS Access

    我有一堆 csv 文件 我通过 VBA 将它们导入到 Access 中的表中 我在与导入的 csv 文件相同的目录中还有一个 schema ini 文件 尽管在 ini 文件中字段被指定为双精度类型 但它们在 Access 中会转换为文本类

随机推荐