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

问题描述 投票:0回答:1

这个问题可能已经有人问过了,但我还是要问一下,因为我对VBA和整个编程相当陌生,我不知道我做错了什么。我有一个用户表单,从一个文本框中获取数据(在这种情况下是一个数字),并在我的表格中搜索它。然后,从这个范围中,我正在做一些步骤来检索连接到这个数字的数据。

定义的变量。

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

这很好用!但当我试图保存文本框时(当内容发生变化时),它说 "Runtime Error 424":"Runtime Error 424":"Runtime Error 424"。

但是,当我尝试保存文本框时(当内容被改变时),它说 "Runtime Error 424"。

Private Sub CB_PZ_save_edit_Click()
Cells(PZ_RNG.Row, PZ_RNG.Column + 1) = Packzettelinfo.KD_ID
Cells(PZ_RNG.Row, PZ_RNG.Column + 2) = Packzettelinfo.Customer_Combination
Cells(PZ_RNG.Row, PZ_RNG.Column + 3) = Packzettelinfo.Ship_ID
Cells(PZ_RNG.Row, PZ_RNG.Column + 4) = Packzettelinfo.Author_ID
Cells(PZ_RNG.Row, PZ_RNG.Column + 5) = Packzettelinfo.Art_Lager
Cells(PZ_RNG.Row, PZ_RNG.Column + 6) = Packzettelinfo.Art_Bestell
Cells(PZ_RNG.Row, PZ_RNG.Column + 7) = Packzettelinfo.DTPicker1
Cells(PZ_RNG.Row, PZ_RNG.Column + 8) = Packzettelinfo.Calc_Time
Cells(PZ_RNG.Row, PZ_RNG.Column + 10) = Packzettelinfo.Time1
Cells(PZ_RNG.Row, PZ_RNG.Column + 11) = Packzettelinfo.Time2
Cells(PZ_RNG.Row, PZ_RNG.Column + 12) = Packzettelinfo.Time3
Cells(PZ_RNG.Row, PZ_RNG.Column + 13) = Packzettelinfo.Time_Special
Cells(PZ_RNG.Row, PZ_RNG.Column + 14) = Packzettelinfo.Time_Total
Cells(PZ_RNG.Row, PZ_RNG.Column + 15) = Packzettelinfo.Notes_Buero
Cells(PZ_RNG.Row, PZ_RNG.Column + 16) = Packzettelinfo.Notes_Lager
End Sub

同样,因为我是新手,这可能是一个愚蠢的方法 对于我想做的事情,但哦,好... ...

excel vba syntax
1个回答
1
投票

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

  1. 从工作簿上的一个范围中获取一些数据,并将其填充到一个用户表单的文本框中。
  2. 编辑用户表单中的数据。
  3. 将新数据更新回工作表。

现在我们可以把精力集中在这3个步骤上。

但在我们开始之前,你会受益于对以下内容的了解 范围 在VBA中。

现在你的代码不是最能说明问题的(至少不是英文),所以如果问题注释中没有说明,我就做一些假设。

下面的代码是写在一个新的用户表单上的,这个表单有一个文本框、标签和2个命令按钮,所有的按钮都有默认的名称(截图如下)。

第1步。

你获取数据并将其放入文本框的方法很好。为了避免歧义,最好总是明确地限定我们的语句,这样代码就会在正确的workbookworksheet或userform等处查找。

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

我对代码做的唯一真正的修改是用明确的 哪儿RangeCells 或我们要访问的 Value 的属性。

这和使用 Offset 财产而不是 + 1 等为列。

第2步:用户根据需要修改数据。

用户根据需要修改数据--我们在编程上没有什么可做的。

你可以在这里增加一些数据验证的步骤等。

第三步:用户修改数据。

再把数据写回表,你写得相当好。同样我也会确保明确限定对象,比如说 RangeCells 和相关的工作簿工作表,以及我们要访问的属性,如 Value.

这次我将工作簿表分配给一个变量。

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

基本上和上面的一样,但是反过来,虽然使用了保存的 Range.Address 昔日属性(在 E1).

请注意,您可以将您的语句封装在一个叫 With Statement 如我 TargetSheet 这样你就可以访问它的对象、属性和方法,而不需要每次都对其进行限定--尽管每条语句都是以 .


总结一下。

  • 不需要为任何文本框的值声明变量,只需将它们直接分配给用户表单,反之亦然。
  • 对你的对象等进行限定,例如 RangeCells 并明确引用你要使用的属性,即 Value (有些人默认是这样,但不是所有的!)。

下面是一些每次点击的截图。

UserForm首次打开。Sheet 1 with example dataUserform 1 initialized

Commandbutton1被点击。Sheet1 after commandbutton1 is clickedUserForm after commandbutton1 is clicked

TextBox1被编辑。Sheet1 after textbox is editedUSerForm1 after textbox is edited

Commandbutton2点击:TextBox1编辑:Commandbutton2点击。Sheet1 after commandbutton2 is clickedUserForm1 after commandbutton2 is clicked

© www.soinside.com 2019 - 2024. All rights reserved.