显示上一行元素的Excel按钮

显示上一行元素的Excel按钮,excel,vba,Excel,Vba,我使用了 我让它使用动态列长度并从另一个表中的单元格中获取值。此代码当前为我提供下一行的元素(即A1->click->A2),如果是最后一个元素,则返回到第一个元素。 我知道我需要把这个倒回去。它需要从下到上,如果碰到第一个,就转到最后一个。我尝试反转范围的参数,但出现错误。 任何想法或提示都将非常有用 Sub Button8_Click() Set wsh = ActiveWorkbook.Worksheets("Sheet1") Column = wsh.Range("A"

我使用了
我让它使用动态列长度并从另一个表中的单元格中获取值。此代码当前为我提供下一行的元素(即A1->click->A2),如果是最后一个元素,则返回到第一个元素。
我知道我需要把这个倒回去。它需要从下到上,如果碰到第一个,就转到最后一个。我尝试反转
范围的参数,但出现错误。
任何想法或提示都将非常有用

Sub Button8_Click()
    Set wsh = ActiveWorkbook.Worksheets("Sheet1")
    Column = wsh.Range("A" & Rows.Count).End(xlUp).Row

    If IsError(Application.Match(Range("B2").Value, wsh.Range(wsh.Cells(2, 1), wsh.Cells(Column, 1)), 0)) Then
        Range("B2").Value = wsh.Cells(2, 1).Value
    ElseIf Application.Match(Range("B2").Value, wsh.Range(wsh.Cells(2, 1), wsh.Cells(Column, 1)), 0) = wsh.Range(wsh.Cells(2, 1), wsh.Cells(Column, 1)).Cells.Count Then
        Range("B2").Value = wsh.Cells(2, 1).Value
    Else
        Range("B2").Value = wsh.Cells(2, 1).Offset(Application.Match(Range("B2").Value, wsh.Range(wsh.Cells(2, 1), wsh.Cells(Column, 1)), 0), 0).Value
    End If
End Sub

如果绝对确定没有重复项,可以使用
Range.Find
方法,这是一个内置的VBA函数

Option Explicit
Private Sub CommandButton1_Click()
    Dim rDest As Range, rCol As Range, C As Range
    Dim wsSrc As Worksheet
    Dim myRow As Long, LR As Long

Set wsSrc = Worksheets("sheet2") 'or whatever

With wsSrc
    Set rCol = .Range(.Cells(1, 1), .Cells(.Rows.Count, 1).End(xlUp))
End With

Set rDest = Cells(2, 2)

With rCol
    Set C = .Find(what:=rDest, after:=rCol(1, 1), LookIn:=xlValues, _
                lookat:=xlWhole, searchorder:=xlByRows, searchdirection:=xlPrevious)
    If Not C Is Nothing Then
      If C.Row = 1 Then Set C = rCol(rCol.Rows.Count + 1, 1)
        rDest = C.Offset(-1, 0)
    Else
        rDest = rCol(rCol.Rows.Count, 1)
    End If
End With
End Sub

我发现您的代码很麻烦(或者可能不够复杂:-)。这是另一个版本。它在双击A1时工作。需要将其安装在要对其执行操作的工作表的代码表中

Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean)

    Const Rstart As Long = 2                ' set as required

    Dim Rng As Range
    Dim Rcount As Long
    Dim R As Variant

    With Target
        If .Address = Range("A1").Address Then
            ' from Rstart to last row in column B
            Set Rng = Range(Cells(Rstart, "B"), Cells(Rows.Count, "B").End(xlUp))
            Rcount = Rng.Cells.Count

            On Error Resume Next
            R = Application.Match(.Value, Rng, 0)
            If Err Then
                R = Rcount
            Else
                R = R + 1
                If R > Rcount Then R = 1
            End If

            .Value = Rng.Cells(R).Value

            .Offset(1).Select
        End If
    End With
End Sub
一旦您理解了代码,它就更容易阅读和修改。例如,要更改单元格A1,只需在这行代码中更改对A1的引用。If.Address=范围(“A1”)。地址

您的选择列表不必从第1行开始。Const Rstart现在的值为2,这意味着您的列表从第2行开始,允许使用列标题,但如果愿意,您可以将其更改为1或3

代码集Rng=Range(Cells(Rstart,“B”)、Cells(Rows.Count,“B”).End(xlUp))的行将列表的范围设置为B列。更改两个“B”以将其移动到另一列。它动态地找到终点。从Rstart的设置开始

最后,没有按钮。但是,如果您喜欢双击按钮,则可以很容易地将代码调整为适合使用按钮


如果再没有一个词可以说,“终于”又有什么好处呢。该代码可以很容易地进行调整,使不同的触发器引用同一工作表上的不同列表。例如,您可以将B列中的列表移动到A1下方。在B列中,您可以有另一个列表响应B1等中的双击。

a列中是否可能有重复的条目?如果是这样的话,这个算法(甚至修改为自下而上)就会失败。@RonRosenfeld不,我用这个作为单词列表来帮助我记住它们。没有重复条目。当目标B2位于工作表2中,而源A列位于工作表1中时,如何使用它?这是我使用VBA的第一天,我知道从另一个工作表访问数据的唯一方法是使用
ActiveWorkbook.Worksheets(“工作表”)
,但我在这里找不到类似的内容。谢谢!最后一件事。由于标题的原因,我试图忽略列的第一行。因此,我尝试更改
.Cells(1,1)
之后:=rCol(1,1)
,但没有任何效果。如果我更改
.Cells(.Row.Count,1.End)(xlUp)的列索引,则列也会更改。那么
的列索引是什么呢?用于@MosesKim的单元格(1,1)
将在一两天内不在计算机上,但尝试将
如果c.row=1
更改为
如果c.row=2