Excel VBA语法:运行时错误424-需要对象

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

这可能已经被问过了,但我仍然需要问,因为我对VBA和整个编程相当陌生,我不知道我做错了什么。 我有一个userform,它从一个文本框(在本例中是一个数字)获取数据,并在我的表中搜索它。 然后,从该范围内,我将采取步骤检索连接到此号码的数据:

定义变量:

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”:


再说一次,因为我是新来的,这可能是一个愚蠢的方法,我想做什么,但哦,好吧…

让我们后退一步,看看我们想做什么

  • 从工作簿的某个区域获取一些数据,并将其填充到userform文本框中
  • 编辑userform上的数据
  • 将新数据更新回工作表 现在,我们可以将精力集中到这三个步骤上

    但在我们开始之前,您将受益于对VBA的理解。

    现在,您的代码不是最具描述性的(至少不是英文的),因此,如果问题注释中没有阐明,我将做出一些假设

    下面的内容写在一个新的用户表单上,带有一个文本框、标签和两个commandbutton,都带有默认名称(下面的屏幕截图)

    步骤1: 您获取数据并将其放入文本框的方法很好。为了避免歧义,最好始终明确限定我们的语句,以便代码查看正确的工作簿/工作表或用户表单等

    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