【问题标题】:Why do I get run-time error -2147417848 (80010108) in excel 2013 most of the time I run UserForm?为什么我在运行用户窗体的大部分时间都在 excel 2013 中出现运行时错误 -2147417848 (80010108)?
【发布时间】:2016-04-18 00:09:07
【问题描述】:

任务:
我在 Excel2013 中工作。我试图在 VBA 中编写一个用户表单来将参数添加到动态命名范围中。所有命名范围都保存在一张表中,并使用 insert>table 创建。我选择范围,显示现有值并获取新值。一切都很顺利,直到我真正开始为该范围增加价值。

问题:
当我尝试运行用户窗体时,Excel 大部分时间都会关闭。说:

“运行时错误'-2147417848 (80010108)'对象'Range'的方法X失败”

在我分解代码的不同阶段使用不同的方法(上次检查时为“_Default”)。

症状:

  1. 在我发现这一行之后我得到了错误:

    Cells(y, x) = v
    

    其中yx 是整数,v 是我从用户窗体中获得的字符串。在调试期间,我检查了所有值都已定义并具有值。此外,立即窗口手动输入相同的数字(不是作为变量),工作!

  2. 虽然它确实完成了这项工作,但它大多不起作用。

如果有人能说出它破裂的原因,将不胜感激!

一些标题和潜在值以 Unicode 表示,以防万一,但我也尝试将其全部用英文表示。

Private Sub UserForm_Initialize()
    ' Preparing all controls of UserForm
    Sheet2.Activate
    Me.LB_parameter.SetFocus
    Me.LB_parameter.value = ""
    Me.LB_elements.RowSource = ""
    Me.L_element.Enabled = False
    Me.TB_element.Enabled = False
    Me.TB_element.Locked = True
    Me.Btn_Add.Enabled = False
    Me.Btn_Add.Locked = True
End Sub

Private Sub LB_parameter_DblClick(ByVal Cancel As MSForms.ReturnBoolean)
    ' Filling the existing list of values for the selected parametr
    If Me.LB_parameter.value <> "" Then
        Me.LB_elements.RowSource = "D_" & Me.LB_parameter.value & "s"
        Me.L_element.Enabled = True
        Me.TB_element.Enabled = True
        Me.TB_element.Locked = False
        Me.TB_element.SetFocus
    End If
End Sub

Private Sub TB_element_DblClick(ByVal Cancel As MSForms.ReturnBoolean)
    ' Catching the event of filling out the potential new value
    Me.Btn_Add.Enabled = True
    Me.Btn_Add.Locked = False
    Me.L_element.Enabled = False
    Me.TB_element.Enabled = False
    Me.TB_element.Locked = True
End Sub

Private Sub Btn_Add_Click()
    If Me.TB_element.Text = "" Then
        ' Check if Empty
        MsgBox ("Âû íå âïèñàëè çíà÷åíèå!")
        ' Reset the UserForm
        Me.Btn_Add.Enabled = False
        Me.Btn_Add.Locked = True
        Me.L_element.Enabled = True
        Me.TB_element.Enabled = True
        Me.TB_element.Locked = False
        Me.TB_element.SetFocus
    Else
        ' check if exists
        Dim str
        For Each str In range("D_" & Me.LB_parameter.value & "s")
            If Me.TB_element.Text = str Then
                MsgBox ("Ââåäåííîå çíà÷åíèå óæå ñóùåñòâóåò!")
                ' reset the UserForm
                Me.Btn_Add.Enabled = False
                Me.Btn_Add.Locked = True
                Me.L_element.Enabled = True
                Me.TB_element.Enabled = True
                Me.TB_element.Locked = False
                Me.TB_element.SetFocus
                Me.TB_element.value = ""
                Exit Sub
            End If
        Next str
        ' add to the range here
        Dim x As Integer, y As Integer, v As String
        y = range("D_" & Me.LB_parameter.value & "s").Rows.Count + 2
        x = Me.LB_parameter.ListIndex + 1
        v = Me.TB_element.value
        ' Next line causes break down
        Cells(y, x) = v
        MsgBox ("Âû äîáàâèëè ýëåìåíò:'" & v & "' äëÿ ïàðàìåòðà '" & Me.LB_parameter.value & "'.")
        ' Reset the Userform
        Me.LB_parameter.SetFocus
        Me.LB_parameter.value = ""
        Me.LB_elements.RowSource = ""
        Me.L_element.Enabled = False
        Me.TB_element.Enabled = False
        Me.TB_element.Locked = True
        Me.Btn_Add.Enabled = False
        Me.Btn_Add.Locked = True
    End If
End Sub

工作表我将值添加到参数和命名范围窗口:

用户窗体布局:

【问题讨论】:

    标签: excel vba runtime-error excel-2013


    【解决方案1】:
    Cells(y, x) = v
    

    这个调用是这个的简写:

    ActiveSheet.Cells(y, x).Value = v
    

    我不确定它为什么会在你身上崩溃,但是 Range 对象的 _Default 属性是它的 Value,我在这里尝试的是更明确地说明我想要实现的目标,即:

    • 究竟应该修改哪个Worksheet
    • 具体指的是哪个Range

    我非常非常非常很少使用ActiveSheet - 大多数时候我完全知道我正在使用什么对象。尝试使用一个对象。您可以创建一个新的:

    Dim target As Worksheet
    Set target = ThisWorkbook.Worksheets("pl")
    

    ...或者您可以在 properties 工具窗口 (F4) 中为工作表指定一个代号

    (Name) 属性定义了一个标识符,您可以在 VBA 代码中使用该标识符来访问表示该特定工作表的全局范围对象。假设那是Sheet1,你可以这样做:

    Sheet1.Cells(x, y) = v
    

    如果仍然失败,那么您可以更具体地了解您正在访问的 Range 对象和您正在设置的属性:

    Dim target As Range
    Set target = Sheet1.Cells(x, y)
    target.Value = v
    

    不过,通常这不会有什么不同。但我看到您正在拨打Range,这也是隐式调用ActiveSheet

    我会首先消除这些,然后处理明确的对象引用。

    然后我会努力将电子表格逻辑从表格中取出;该按钮单击处理程序做的事情太多了 - 但我离题了 Code Review 领域 - 当你让它按预期工作时,请随意发布你的代码!

    【讨论】:

    • 感谢您的建议!尝试像这样重写:code Dim x As Integer, y As Integer, v As String, targetSheet As Worksheet, targetRange As range y = range("D_" & Me.LB_parameter.value & "s").Rows.Count + 2 x = Me.LB_parameter.ListIndex + 1 v = Me.TB_element.value Set targetSheet = ThisWorkbook.Worksheets("pl") Set targetRange = targetSheet.Cells(y, x) targetRange.value = v code 但是问题依然存在。看起来它无法访问工作簿,虽然它偶尔可以工作..
    • 还给出错误运行时错误'-2147417848 (80010108)'对象'范围'的方法'值'失败
    【解决方案2】:

    看来问题出在我的 Excel 版本上。不确定问题是在我的副本中还是在一般的 2013 年中。在同一台机器上的 Excel 2007 中,带有给定建议的用户窗体连续工作,完全没有任何错误!稍后会在 cmets 中更新,因为我会尝试不同的版本。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2022-10-17
      • 2011-03-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-11-16
      相关资源
      最近更新 更多