运行时错误424对象需要使用UserForm

时间:2018-02-19 11:15:23

标签: excel vba excel-vba excel-2010 userform

我正在尝试将我在MS Excel 2010的VBA编辑器中构建的用户表单链接到Excel工作表中的数据,但我得到了

  

运行时错误424:需要对象。

我在代码中明确地提到了活动工作表来尝试解决这个问题,但它仍然会出现相同的错误。我的代码是:

Private Sub GetData()
    Dim r As Long
    r = ActiveSheet.Range("B2").Value

    If IsNumeric(RowNumber.Text) Then
        r = CLng(RowNumber.Text)
    Else
        ClearData
        MsgBox "Invalid row number"
        Exit Sub
    End If

    If r > 1 And r <= LastRow Then
        cboFilterResultId.Text = FormatNumber(Cells(r, 1), 0)
        txtFolderPaths.Text = Cells(r, 2)
        txtFileName.Text = Cells(r, 3)
        txtDeletedDate.Text = Cells(r, 4)
        txtReason.Text = Cells(r, 5)
        txtcboAdd.Text = Cells(r, 6)
        txtcboView.Text = Cells(r, 7)
        txtcboChange.Text = Cells(r, 8)

        DisableSave   
    ElseIf r = 1 Then
        ClearData
    Else 
        ClearData
        MsgBox "Invalid row number"
    End If  
End Sub

其中RowNumber是一个文本框,用户可以在其中输入所需数据的行号。

请帮忙!

1 个答案:

答案 0 :(得分:0)

我很少使用ActiveSheet,以防万一不是我所追求的表格。通常最好明确指出您所指的是哪一张:
r=ThisWorkbook.WorkSheets("Sheet1").Range("B2")

是的,将数据从工作表提取到用户表单...因为您没有说明错误发生在哪一行,而您没有向我们提供ClearDataDisableSave我的代码我会从头开始。

示例表单设计

我创建了一个空白用户窗体并添加了三个文本框和一个旋转按钮:

  • txtRowNumber包含从中提取数据的行号。
  • TextBox1TextBox2将保留我的样本值 在Tag的{​​{1}}属性中,我输入TextBox1,在1的{​​{1}}属性中输入Tag。这些是将从中提取数据的列号 实际上,我通常会添加额外的内容,例如TextBox2。然后我会使用一些代码将它拆开,因此它粘贴在第8列,必须有一个百分比并且是必需的条目。
  • 2用于快速向上或向下移动一行。

我们需要两个过程来填充给定行号的表单并清除表单上的所有控件(准备好引入下一行)。

清除任何包含8;CPER;REQD属性内容的文本框或组合框:

spnButton

从指定的Tag和列(来自Private Sub ClearForm() Dim frmCtrl As Control For Each frmCtrl In Me.Controls If frmCtrl.Tag <> "" Then Select Case TypeName(frmCtrl) Case "TextBox", "ComboBox" frmCtrl.Value = Null Case Else 'Do nothing. End Select End If Next frmCtrl End Sub 值)填充具有Tag值(假定值正确)的任何控件。从包含VBA代码(RowNumber)的工作簿中的名为 MyDataSheet 的工作表中取值始终,无论当前是否处于活动状态:

Tag

每当ThisWorkbook更改时,表单都应使用指定行的值进行更新。要做到这一点,我们需要清除当前数据的形式,然后重新填充它:

Private Sub PopulateForm(RowNumber As Long)

    Dim frmCtrl As Control

    For Each frmCtrl In Me.Controls
        With frmCtrl
            If .Tag <> "" Then
                .Value = ThisWorkbook.Worksheets("MyDataSheet").Cells(RowNumber, CLng(.Tag))
            End If
        End With
    Next frmCtrl

End Sub

旋转按钮应增加/减少txtRowNumber中的值。我添加了检查,它不会低于1.您还应该添加检查,它不会高​​于上一个填充的行。

Private Sub txtRowNumber_Change()
    ClearForm
    PopulateForm CLng(Me.txtRowNumber)
End Sub

最后,首次打开时应填充表单:

.txtRowNumber