扭曲的下一个记录按钮

时间:2018-01-15 23:46:37

标签: excel vba forms excel-vba

长时间用户,第一次询问此处。 全新到VBA并挣扎了一下。我已经在每篇专门介绍Excel VBA中的下一个记录按钮功能的帖子中查看并尝试过建议,但似乎无法找到适合我情况的解决方案。

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

enter image description here

在工作表例程中,表单将当前行捕获为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)...

我在Next按钮后面的当前代码如下所示:

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)传递给Next按钮,以便它正确地从当前行向下移动到下一个记录,并且显示从下一行的数据。电子表格?

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

1 个答案:

答案 0 :(得分:2)

一些代码建议:

  1. 将行中的代码放入没有参数的函数中。
  2. 行号将基于公共变量。 Public RowNumber as Integer
  3. 在Selection Changed中,指定RowNumber的值并调用函数
  4. 在Next按钮中,RowNumber = RowNumber + 1,然后调用相同的函数
  5. 这样,您就不再需要在两个函数之间复制代码。

    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