【问题标题】:Next Record Button With a Twist带有扭曲的下一个录制按钮
【发布时间】:2018-01-15 23:46:36
【问题描述】:

老用户,第一次来这里询问。 全新的 VBA 并且有点挣扎。我在 Excel VBA 中专门针对“下一个记录”按钮功能的每篇文章中都查看并尝试了建议,但似乎找不到适合我情况的解决方案。

我创建了一个用户表单,旨在帮助用户查看 Excel 电子表格中非常宽泛的数据(如果需要/有帮助,可以提供工作表示例)。由于用户要求,表单需要在选择整行时启动(这是扭曲)。我已经设法让大多数控件按预期运行,除了 Next 和 Previous 按钮。我的麻烦似乎在于从 Worksheet > SelectionChange 例程获取 'txt.rownum' (Target.Row) 到按钮。这是表格的图形:

在工作表例程中,表单将当前行捕获为UserForm1.txt_rownum = Target.Row。这是确认已选择整行并填充表单的代码的第一部分:

    Private Sub Worksheet_SelectionChange(ByVal Target As Range)
If Not Intersect(Target, Range("A2:CE1000")) Is Nothing Then
    If Target.Address = Target.EntireRow.Address Then
        'yes, full row is selected
        UserForm1.txt_prop_name = Cells(Target.Row, 1)
        UserForm1.txt_alt_prop_name = Cells(Target.Row, 2)
        UserForm1.txt_client_prop_code = Cells(Target.Row, 3)
        UserForm1.txt_rownum = Target.Row
        UserForm1.txt_mailability_score = Cells(Target.Row, 4)
        UserForm1.txt_ad_descr = Cells(Target.Row, 5)...

“下一步”按钮后面的当前代码如下所示:

Dim currentrow As Long

'Next button
Private Sub CommandButton2_Click()
Dim lastrow As Long
lastrow = Sheet1.Cells(Rows.Count, 1).End(xlUp).Row

currentrow = currentrow + 1

UserForm1.txt_prop_name = Cells(currentrow, 1)
UserForm1.txt_alt_prop_name = Cells(currentrow, 2)
UserForm1.txt_client_prop_code = Cells(currentrow, 3)

End Sub

单击“下一步”按钮时,表单一次正确地向下索引一行,但它从 A1 开始,而不是从表单显示的当前行开始。如何将 txt.rownum(或 Target.Row)传递给“下一步”按钮,以便它正确地从当前行向下移动到下一条记录显示生成的下一行数据电子表格?

提前感谢您的帮助和耐心等待 - 非常感谢!

【问题讨论】:

  • currentrow = UserForm1.txt_rownum + 1?或者只是将“下一步”按钮更改为 Rows(UserForm1.txt_rownum + 1).Select(我认为这会触发 Worksheet_SelectionChange 事件并因此填充所有内容)?
  • 您最好使用标签而不是文本框作为行号(或至少禁用文本框)
  • 最好使用 UserForm 的实例作为表单的蓝图,例如通过Dim myForm As UserForm1Set myForm = New UserForm1。相反,如果您直接引用 Userform,则您正在处理一个特殊的类,该类基本上旨在作为原型处理。您可以在 stackoverflow.com/questions/47357708/… 找到不同的方法来处理无模式 UF(允许在应用程序中执行操作)。这可以向您介绍课堂编程,但还包括一个您可以适应的工作表事件(@Excelosaurus)示例。

标签: vba forms excel


【解决方案1】:

一些代码推荐:

  1. 将填充行的代码放入不带参数的函数中。
  2. 行号将基于公共变量。公共行号为整数
  3. 在 Selection Changed 中,分配 RowNumber 的值并调用函数
  4. 在 Next Button 中,RowNumber = RowNumber + 1,然后调用相同的函数

这样,您不再需要跨 2 个函数重复代码。

Public RowNumber as Integer

Sub PopulateForm()

    UserForm1.txt_prop_name = Cells(Target.Row, 1)
    UserForm1.txt_alt_prop_name = Cells(Target.Row, 2)
    UserForm1.txt_client_prop_code = Cells(Target.Row, 3)
    UserForm1.txt_rownum = Target.Row
    UserForm1.txt_mailability_score = Cells(Target.Row, 4)
    UserForm1.txt_ad_descr = Cells(Target.Row, 5)...

End Sub

Private Sub Worksheet_SelectionChange(ByVal Target As Range)
    If Not Intersect(Target, Range("A2:CE1000")) Is Nothing Then // Whatever This Is?
        If Target.Address = Target.EntireRow.Address Then


            RowNumber = Target.Row
            Call PopulateForm
        End If
  End If
End Sub

Private Sub CommandButton2_Click()

    RowNumber = RowNumber + 1
    Call PopulateForm
End Sub

【讨论】:

    猜你喜欢
    • 2020-10-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-02-20
    • 2021-04-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多