【问题标题】:Navigating through records on UserForm Excel VBA浏览用户窗体 Excel VBA 上的记录
【发布时间】:2014-01-20 16:10:48
【问题描述】:

我在 Excel VBA 中创建了一个用户表单,我将使用它来查看和更新​​我拥有的工作表中的某些记录:

UserForm1 http://im35.gulfup.com/Ay43Z.png

我似乎想不通的是如何让它在工作表中状态列中有“Y”的记录之间导航。

Sheet1 http://im36.gulfup.com/cq6CN.png

我需要用户能够通过用户窗体编辑他正在查看的记录的评论列,以便将更改保存在工作表中。 Userform 上的其余文本框都设置为 Locked,以便它们只能显示数据。

我现在面临的问题是我似乎只能在所有记录之间循环。我需要的是在以“Y”作为“状态”的那些之间导航。此外,我似乎无法弄清楚表单上的“评论”框中所做的更改是如何保存在工作表上的。

任何帮助将不胜感激!

编辑:

以下是上一个按钮的代码:

If CurRecord = 0 Then CurRecord = 1

    With ws
        For i = 1 To (CurRecord - 1)
            If Not .Range("G" & i).Value = "X" Then
                TextBox1.Text = .Range("A" & i).Value
                TextBox2.Text = .Range("B" & i).Value
                '
                '~~> And So on load the rest
                '

                CurRecord = i
                Exit Sub
            End If
        Next i

        If (i - 1) = lRow Then
            MsgBox "End of record reached"
        End If
    End With

当我使用它时,它会一直跳到第一条记录。

我也试过了:

For i = 1 To (CurRecord - 1)

但这在到达第一条记录时会给我一个“超出范围”错误。

想知道我哪里错了吗?

【问题讨论】:

  • 如果您在 www.wikisend.com 上传示例文件并在此处分享链接,我可以为您提供帮助。我很懒惰自己创建一个样本:p
  • @SiddharthRout 抱歉回复晚了,我实际上是在外地度假!无论如何,我按要求上传了文件:wikisend.com/download/461380/Book1.xlsm
  • @SiddharthRout 有什么建议吗?
  • @SiddharthRout 如果您至少能给我一些提示,我将不胜感激。提前致谢
  • 很抱歉出城了。那么我们现在卡在哪里了?

标签: vba excel


【解决方案1】:

这是Next 按钮的一个非常基本的示例。现在我确信您将能够以类似的方式编写 Previous 按钮 :)

Dim ws As Worksheet
Dim lRow As Long
Dim CurRecord As Long

'~~> Load the first record
Private Sub UserForm_Initialize()
    Set ws = ThisWorkbook.Sheets("Sheet1")

    With ws
        lRow = .Range("G" & .Rows.Count).End(xlUp).Row

        For i = 2 To lRow
            If .Range("G" & i).Value = "Y" Then
                TextBox1.Text = .Range("A" & i).Value
                TextBox2.Text = .Range("B" & i).Value
                '
                '~~> And So on load the rest
                '

                CurRecord = i
                Exit For
            End If
        Next i
    End With
End Sub

'~~> Next Button
Private Sub CommandButton3_Click()
    If CurRecord = 0 Then CurRecord = 1

    With ws
        For i = (CurRecord + 1) To lRow
            If .Range("G" & i).Value = "Y" Then
                TextBox1.Text = .Range("A" & i).Value
                TextBox2.Text = .Range("B" & i).Value
                '
                '~~> And So on load the rest
                '

                CurRecord = i
                Exit Sub
            End If
        Next i

        If (i - 1) = lRow Then
            MsgBox "End of record reached"
        End If
    End With
End Sub

来自 cmets 的跟进

试试这个(未经测试)

'~~> Previous Button
Private Sub CommandButton2_Click()
    If CurRecord = 2 Then
        MsgBox "Begining of record reached"
        Exit Sub
    ElseIf CurRecord = 0 Then
        CurRecord = 3
    End If

    With ws
        For i = (CurRecord - 1) To 2 Step -1
            If .Range("G" & i).Value = "Y" Then
                TextBox1.Text = .Range("A" & i).Value
                TextBox2.Text = .Range("B" & i).Value
                '
                '~~> And So on load the rest
                '

                CurRecord = i
                Exit Sub
            End If
        Next i

        If i = 2 Then
            MsgBox "Begining of record reached"
        End If
    End With
End Sub

【讨论】:

  • 非常感谢!刚刚有机会尝试一下,效果很好。只是出于某种原因,我很难让“上一个”按钮工作。我试过For i = (CurRecord - 1) To lRowFor i = lRow To (CurRecord + 1)lRow To (CurRecord - 1) 但它似乎不起作用。想知道我哪里错了吗?
  • 遗憾的是仍在为“以前的”按钮编码而苦苦挣扎,非常感谢您的帮助!
  • 我现在尝试了i = 1 To (CurRecord - 1),但它只是不断跳回第一行。还尝试了For i - (CurRecord - 1) To (CurRecord - 1),但使用它会卡住显示一条记录。请帮忙!
  • 抱歉错过了您的 cmets。你能用previous按钮代码更新你的问题吗?
  • 再次感谢,上面的“Previous”代码只有在第 2 行的“Y”是 Status 列时才能正常工作。如果第 2 行在“状态”列中包含“N”,则 MsgBox "Begining of record reached" 不起作用。有什么建议吗?
【解决方案2】:

如果您对“Y”进行自动过滤,则导航只会访问可见的行(其中包含“Y”)。简单地说:

ActiveSheet.Range("$A1:$G$1").AutoFilter Field:=7, Criteria1:="Y"

【讨论】:

    猜你喜欢
    • 2014-02-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-06-15
    • 1970-01-01
    相关资源
    最近更新 更多