为什么运行时错误-2147417848(80010108)在Excel 2013大部分时间运行UserForm?
任务:
我在Excel2013工作。 我试图在VBA中写入一个用户表单来将参数添加到dynamic命名范围中。 所有命名的范围都保存在一张表中,并使用insert> table创build。 我select范围,显示现有的值,并获得新的价值。 一切都很顺利,直到我实际上增加了范围的价值。
问题:
当我尝试运行用户窗体大部分时间closuresExcel。 他说:
“运行时错误”-2147417848(80010108)“对象的方法X”范围“失败”
用不同的方法(上次我检查'_Default')在不同的阶段破解代码。
Symtoms:
-
之后,我发现我得到这个错误:
Cells(y, x) = v
其中
y
和x
是整数,v
是从用户表单获得的string。 在debugging过程中,我检查了所有的值被定义和有值。 而且,手动input相同数字的立即窗口 (不作为variables),工作! -
它大多不起作用,虽然它通过做工作。
如果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
工作表将值添加到参数和命名范围窗口:
用户窗体布局:
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 )中为工作表提供代码名称 :
该(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议的用户窗体连续工作,没有任何错误! 稍后我会在不同版本中尝试更新评论。