为什么我在excel 2013中运行时出现错误-2147417848(80010108),大部分时间我运行UserForm?

时间:2016-04-18 00:09:08

标签: excel vba excel-vba runtime-error excel-2013

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

问题:
当我尝试运行UserForm时,Excel会在大多数时间关闭。话说:

  

"运行时错误' -2147417848(80010108)'对象的方法X'范围'失败"

在我打破代码的不同阶段使用不同的方法(' _Default'我上次检查)。

Symtoms:

  1. 在此行之后,我发现错误:

    Cells(y, x) = v
    

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

  2. 虽然它确实贯彻了这项工作,但它大部分都不起作用。

  3. 如果somone可以说出它破裂的原因,我将不胜感激!

    有些字幕和潜在的值在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
    

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

    Sheet I add values to the parametrs and namedranges window

    UserForm布局:

    The UserForm layout

2 个答案:

答案 0 :(得分:1)

Cells(y, x) = v

此调用是此简写:

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

我不确定为什么它会对你造成影响,但_Default对象的Range属性为Value,我该怎么做?在这里尝试更清楚地了解我想要实现的目标,即:

  • 究竟哪个Worksheet应该被修改?
  • 究竟是哪个Range被提及?

我很少与ActiveSheet合作 - 大部分时间我都知道完全我正在使用的对象。尝试使用对象。您可以创建一个新的:

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

...或者您可以在属性工具窗口( F4 )中为工作表提供代码名称

Properties toolwindow showing properties of a worksheet module

(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领域 - 当你按照预期的方式工作时,随意发布你的代码!

答案 1 :(得分:1)

看起来问题出在我的Excel版本中。不确定问题是在我的副本中还是在2013年。在同一台机器上的Excel 2007中,具有给定建议的UserForm连续工作而没有任何错误!稍后我将在不同版本中尝试更新评论。