为什么运行时错误-2147417848(80010108)在Excel 2013大部分时间运行UserForm?

任务:
我在Excel2013工作。 我试图在VBA中写入一个用户表单来将参数添加到dynamic命名范围中。 所有命名的范围都保存在一张表中,并使用insert> table创build。 我select范围,显示现有的值,并获得新的价值。 一切都很顺利,直到我实际上增加了范围的价值。

问题:
当我尝试运行用户窗体大部分时间closuresExcel。 他说:

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

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

Symtoms:

  1. 之后,我发现我得到这个错误:

    Cells(y, x) = v 

    其中yx是整数, v是从用户表单获得的string。 在debugging过程中,我检查了所有的值被定义和有值。 而且,手动input相同数字的立即窗口 (不作为variables),工作!

  2. 它大多不起作用,虽然它通过做工作。

如果somone可以告诉它为什么打破它将不胜感激!

一些标题和潜在的价值是在Unicode的情况下,尽pipe我试图把它全部用英文。

 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 

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

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

用户窗体布局:

UserForm布局

 Cells(y, x) = v 

这个电话是这样的简写:

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

我不知道为什么它会崩溃,但是Range对象的_Default属性是它的Value ,我想在这里试试更明确一点,那就是:

  • 究竟哪个Worksheet应该被修改?
  • 究竟是哪个Range被引用?

我很less很less使用ActiveSheet ,大部分时间我都知道我正在使用什么对象。 尝试使用一个对象。 你可以创build一个新的:

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

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

属性toolwindow显示工作表模块的属性

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

 Sheet1.Cells(x, y) = v 

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

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

通常情况下,这不会有所作为。 但我看到你正在进行Range调用,这也是隐式调用到ActiveSheet

我将开始消除这些,并制定一个明确的对象引用。

然后,我会努力使电子表格逻辑脱离表单; 该button点击处理程序太多了 – 但我离开Code Review的领土 – 随时发布您的代码,当你得到它按预期工作!

看起来问题在于我的Excel版本。 不知道问题是在我的副本还是在2013年一般。 在同一台机器上的Excel 2007中,具有给定build议的用户窗体连续工作,没有任何错误! 稍后我会在不同版本中尝试更新评论。