显示上一行元素的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