任务:
我在Excel2013工作。我尝试在VBA中编写用户表单,以将参数添加到动态命名范围中。所有命名范围都保存在一个工作表中,并使用insert> table创建。我选择范围,显示现有值并获取新值。一切顺利,直到我真的要为该范围增加价值。
问题:
当我尝试运行UserForm时,Excel会在大多数时间关闭。话说:
"运行时错误' -2147417848(80010108)'对象的方法X'范围'失败"
在我打破代码的不同阶段使用不同的方法(' _Default'我上次检查)。
Symtoms:
在此行之后,我发现错误:
Cells(y, x) = v
其中y
和x
是整数,v
是我从userform获得的字符串。在调试期间,我检查了所有值都已定义并具有值。此外,手动输入相同数字的立即窗口(不作为变量),有效!
虽然它确实贯彻了这项工作,但它大部分都不起作用。
如果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
工作表我将值添加到参数和命名范围窗口:
UserForm布局:
答案 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 )中为工作表提供代码名称:
该(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连续工作而没有任何错误!稍后我将在不同版本中尝试更新评论。