Excel VBA语法:运行时错误424-需要对象
这可能已经被问过了,但我仍然需要问,因为我对VBA和整个编程相当陌生,我不知道我做错了什么。 我有一个userform,它从一个文本框(在本例中是一个数字)获取数据,并在我的表中搜索它。 然后,从该范围内,我将采取步骤检索连接到此号码的数据: 定义变量:Excel VBA语法:运行时错误424-需要对象,excel,vba,syntax,Excel,Vba,Syntax,这可能已经被问过了,但我仍然需要问,因为我对VBA和整个编程相当陌生,我不知道我做错了什么。 我有一个userform,它从一个文本框(在本例中是一个数字)获取数据,并在我的表中搜索它。 然后,从该范围内,我将采取步骤检索连接到此号码的数据: 定义变量: Sub UserForm_Initialize() Call CloseButtonSettings(Me, False) Dim selected_col As Long Dim PZ_ID As Single, KD_ID As Singl
Sub UserForm_Initialize()
Call CloseButtonSettings(Me, False)
Dim selected_col As Long
Dim PZ_ID As Single, KD_ID As Single, Customer_Combination As String, Ship_ID As String, Author_ID As String, _
Art_Lager As Single, Art_Bestell As Single, DTPicker1 As Date, Calc_Time As Single, Time1 As Single, _
Time2 As Single, Time3 As Single, Time_Special As Single, Time_Total As Single, Notes_Buero As String, Notes_Lager As Single
End Sub
搜索+将数据放入文本框
Private Sub CommandButton1_Click()
Dim PZ_RNG As Range
Dim strSearch As String
strSearch = Packzettelinfo.PZ_ID
Set PZ_RNG = Range("B:B").Find(strSearch, , xlValues, xlWhole)
If Not PZ_RNG Is Nothing Then
Else
MsgBox "Packzettel Nr. " & strSearch & " konnte nicht gefunden werden (Fehler #001)", vbOKOnly
Packzettelinfo.PZ_ID.SetFocus
End If
Range("E1") = PZ_RNG.Row 'Saving for later
Packzettelinfo.KD_ID = Cells(PZ_RNG.Row, PZ_RNG.Column + 1)
Packzettelinfo.Customer_Combination = Cells(PZ_RNG.Row, PZ_RNG.Column + 2)
Packzettelinfo.Ship_ID = Cells(PZ_RNG.Row, PZ_RNG.Column + 3)
Packzettelinfo.Author_ID = Cells(PZ_RNG.Row, PZ_RNG.Column + 4)
Packzettelinfo.Art_Lager = Cells(PZ_RNG.Row, PZ_RNG.Column + 5)
Packzettelinfo.Art_Bestell = Cells(PZ_RNG.Row, PZ_RNG.Column + 6)
Packzettelinfo.DTPicker1 = Cells(PZ_RNG.Row, PZ_RNG.Column + 7)
Packzettelinfo.Calc_Time = Cells(PZ_RNG.Row, PZ_RNG.Column + 8)
Packzettelinfo.Time1 = Cells(PZ_RNG.Row, PZ_RNG.Column + 10)
Packzettelinfo.Time2 = Cells(PZ_RNG.Row, PZ_RNG.Column + 11)
Packzettelinfo.Time3 = Cells(PZ_RNG.Row, PZ_RNG.Column + 12)
Packzettelinfo.Time_Special = Cells(PZ_RNG.Row, PZ_RNG.Column + 13)
Packzettelinfo.Time_Total = Cells(PZ_RNG.Row, PZ_RNG.Column + 14)
Packzettelinfo.Notes_Buero = Cells(PZ_RNG.Row, PZ_RNG.Column + 15)
Packzettelinfo.Notes_Lager = Cells(PZ_RNG.Row, PZ_RNG.Column + 16)
End Sub
这个很好用
但当我试图保存文本框时(当内容发生更改时),它会显示“运行时错误424”:
再说一次,因为我是新来的,这可能是一个愚蠢的方法,我想做什么,但哦,好吧…让我们后退一步,看看我们想做什么
Private Sub CommandButton1_Click()
Dim TargetCell As Range
Dim SearchString As String
SearchString = ThisWorkbook.Sheets("Sheet1").Range("A1").Value 'Only "Range("A1").Value" implies ActiveSheet which may give false results.
Set TargetCell = ThisWorkbook.Sheets("Sheet1").Range("B:B").Find(SearchString, , xlValues, xlWhole)
If Not TargetCell Is Nothing Then
'TargetRange Is Something, do the thing
'You could assign the values to the textbox here rather than outside of the If statement
'Or you could change it to If TargetCell Is Nothing Then - And only execute the code in the Else section below
Else
MsgBox "Packzettel Nr. " & strSearch & " konnte nicht gefunden werden (Fehler #001)", vbOKOnly
UserForm1.TextBox1.SetFocus
Exit Sub 'This stops the rest of the code from running - I'm assuming the above is an error that nothing was found.
End If
ThisWorkbook.Sheets("Sheet1").Range("E1") = TargetCell.Address 'Saving for later
UserForm1.TextBox1.Value = ThisWorkbook.Sheets("Sheet1").Cells(TargetCell.Row, TargetCell.Column).Offset(0, 1).Value
End Sub
我对代码所做的唯一真正的更改是明确显示范围
或单元格
的位置,或者我们希望访问该对象的值
属性
并对列使用属性而不是+1
等
步骤2:
用户根据需要更改数据-我们无需进行编程
您可以在此处添加一些数据验证等步骤。
步骤3:
再次将数据写回工作表,您已经写得相当好了。同样,我要确保使用相关工作簿/工作表明确限定对象,如范围
和单元格
,以及我们要访问的属性,如值
这次我将把工作簿/工作表分配给一个变量
Private Sub CommandButton2_Click()
Dim TargetSheet As Worksheet
Set TargetSheet = ThisWorkbook.Sheets("Sheet1")
Dim TargetCellAddress As String
With TargetSheet
TargetCellAddress = .Range("E1").Value 'Recall our saved cell address from the Commandbutton1 click
.Range(TargetCellAddress).Offset(0, 1).Value = UserForm1.TextBox1.Value
.Range("E1").ClearContents 'Remove TargetCellAddress value from the sheet
End With
End Sub
这里基本上与上面相同,但相反,尽管使用了以前保存的属性(在E1
)
注意:您可以像我使用TargetSheet
一样将语句封装在一个文件中,这样您就可以访问它的对象、属性和方法,而无需每次都对其进行限定—尽管每个语句都以开头
总结,
- 无需为任何文本框值声明变量,只需直接从/向userform/工作表分配变量,反之亦然
- 限定对象等,例如
范围
或单元格
,并明确引用要使用的属性,即值
(此属性的某些默认值,但不是全部!)李>
下面是每次单击的一些屏幕截图
首次打开的用户表单:
Commandbutton1已单击:
文本框1已编辑:
Commandbutton2已单击:
我看不到您在哪里定义了Packzettelinfo
任何地方…@braX Packzettelinfo是我的用户表单,其中的文本框(KD_ID等)位于Userform_Initialize()
中定义的所有变量在表单初始化后都会被遗忘。。。当您在CB\u PZ\u save\u edit\u Click()
中使用它们时,它们都会隐式地键入Variant
——仅供参考。您可能希望在每个要使用它们的模块中声明它们。这看起来很重要。这个链接将有助于全局变量(如果它们确实需要的话)。@nareshbople是的,我需要!电子表格中的值已更改。此外,它是一个文本框。。那我就不用申报了?(bc教科书始终是文本格式的,对吗?我需要这些值,因为我可能正在计算,但这也可能是excel本身…)好的,首先我非常感谢您的解释。事实上,这对我帮助很大。这是第一个帮助我的“真正答案”;再次感谢。有偏移量的台阶很好。我在考虑使用for循环来遍历所有的值,但对于不同的文本框名称(若它是tb1-tb15,它可能会被解决?)。在我的vba项目的另一个部分中,我想添加一个新行,其中所有内容都是空白的,所以这也适用于这个部分。我真的很感谢你的时间和奉献精神!干杯。现在你的代码不是最具描述性的(至少不是英文的),所以如果问题注释中没有澄清,我将做一些假设。-这是德语,你的假设非常准确:)@LeonS好吧,虽然这些评论对你的问题很有帮助,但网站的重点是问答——我手头有一些时间,喜欢解释一些事情您可以创建一个循环并检查每个复选框,然后访问该值-有关如何执行此操作的简单示例,请参阅。如果你想忽略其他文本框,那么写代码可能会很长,所以也要记住这一点。如果你被卡住了,问另一个问题!快乐编码!:)
Private Sub CommandButton2_Click()
Dim TargetSheet As Worksheet
Set TargetSheet = ThisWorkbook.Sheets("Sheet1")
Dim TargetCellAddress As String
With TargetSheet
TargetCellAddress = .Range("E1").Value 'Recall our saved cell address from the Commandbutton1 click
.Range(TargetCellAddress).Offset(0, 1).Value = UserForm1.TextBox1.Value
.Range("E1").ClearContents 'Remove TargetCellAddress value from the sheet
End With
End Sub