Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/excel/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在Excel 2013中使用VBA模拟使用箭头键移动_Excel_Vba_Cursor_Selection - Fatal编程技术网

在Excel 2013中使用VBA模拟使用箭头键移动

在Excel 2013中使用VBA模拟使用箭头键移动,excel,vba,cursor,selection,Excel,Vba,Cursor,Selection,我想为Excel 2013创建VBA宏以移动光标。我只是重新映射键盘快捷键,例如,我想使用CTRL+J而不是向下箭头向下移动光标。所以我不需要任何花哨的东西,只需要简单的光标移动。我也想在VBA中实现这一点,所以我不想寻找Excel插件或外接程序之类的东西 如果在“开发人员”选项卡下,我选择“使用相对引用”,然后简单地记录一个向下移动光标的宏,我会得到以下结果,它确实会移动光标: ActiveCell.Offset(1, 0).Range("A1").Select 然而,这并不是完全模仿向下箭

我想为Excel 2013创建VBA宏以移动光标。我只是重新映射键盘快捷键,例如,我想使用CTRL+J而不是向下箭头向下移动光标。所以我不需要任何花哨的东西,只需要简单的光标移动。我也想在VBA中实现这一点,所以我不想寻找Excel插件或外接程序之类的东西

如果在“开发人员”选项卡下,我选择“使用相对引用”,然后简单地记录一个向下移动光标的宏,我会得到以下结果,它确实会移动光标:

ActiveCell.Offset(1, 0).Range("A1").Select
然而,这并不是完全模仿向下箭头。此子例程/宏将移动到隐藏行中,这是我不希望看到的

以下每一项都给我一个“对象不支持此属性或方法”错误:

下面给出了一个语法错误:

Selection.MoveDown(xlWorksheetCell, 1, xlMove)
我可以想象一个中等大小的宏移动光标,检查新单元格是否隐藏,如果是,则重复直到它不隐藏。然而,我很难相信没有一个命令/方法/etc不象箭头键那样简单而容易地模拟移动光标,忽略隐藏的行/列。例如,我可以在按住控制键的同时使用箭头键进行模拟,例如,
Selection.End(xlDown)。选择
。所以我想用一个箭头键尽可能简单地模拟移动光标


(这似乎是一个非常简单的问题,我猜以前有人问过/回答过。但是,如果是这样,并且如果您将我的问题标记为重复问题,请指出原始答案的位置,因为我已经查找过,但找不到它。)

将您的快捷键分配给:

Sub MoveDown()
    Application.SendKeys "{DOWN}"
End Sub

将快捷键分配给:

Sub MoveDown()
    Application.SendKeys "{DOWN}"
End Sub

这最初是作为解决方案编写的,但后来我发现它也有问题。我将留下它,因为其他人已经发表了评论,但请注意,它不是一个解决方案(至少不是当前的形式)。

我找到了另一个网站来回答我的问题。以下是建议的解决方案:

Dim rng As Range
Set rng = Range( _
  Cells(ActiveCell.Row + 1, ActiveCell.Column), _
  Cells(Rows.Count, ActiveCell.Column) _
)
rng.SpecialCells(xlCellTypeVisible).Cells(1).Select
然而,仔细检查后,这确实适用于向下移动,但不适用于向上移动。具体来说,您可以向下移动通过隐藏行,但如果您尝试向上移动通过隐藏行,则向上移动将停止

向上:

Dim rng As Range
Set rng = Range( _
  Cells(1, ActiveCell.Column), _
  Cells(ActiveCell.Row - 1, ActiveCell.Column) _
)
Dim rw As Long
rw = rng.SpecialCells(xlCellTypeVisible).Areas( _
    rng.SpecialCells(xlCellTypeVisible).Areas.Count _
    ).Row + rng.SpecialCells(xlCellTypeVisible).Areas( _
    rng.SpecialCells(xlCellTypeVisible).Areas.Count).Rows.Count - 1
rng.SpecialCells(xlCellTypeVisible).Cells(rw).Select
对:

Dim rng As Range
Set rng = Range( _
  Cells(ActiveCell.Row, ActiveCell.Column + 1), _
  Cells(ActiveCell.Row, Columns.Count) _
)
rng.SpecialCells(xlCellTypeVisible).Cells(1).Select
左:

我将继续对此进行研究,但由于这是我自己对自己问题的回答,如果其他人(比我更了解VBA)希望采用此解决方案并在您自己的回答中成功修改它,我将全力支持您这样做


还要注意,即使成功向下移动,如果行号大于32766,此解决方案也会产生“溢出”错误。

这最初是作为解决方案编写的,但后来我发现它也存在问题。我将留下它,因为其他人已经发表了评论,但请注意,它不是一个解决方案(至少不是当前的形式)。

我找到了另一个网站来回答我的问题。以下是建议的解决方案:

Dim rng As Range
Set rng = Range( _
  Cells(ActiveCell.Row + 1, ActiveCell.Column), _
  Cells(Rows.Count, ActiveCell.Column) _
)
rng.SpecialCells(xlCellTypeVisible).Cells(1).Select
然而,仔细检查后,这确实适用于向下移动,但不适用于向上移动。具体来说,您可以向下移动通过隐藏行,但如果您尝试向上移动通过隐藏行,则向上移动将停止

向上:

Dim rng As Range
Set rng = Range( _
  Cells(1, ActiveCell.Column), _
  Cells(ActiveCell.Row - 1, ActiveCell.Column) _
)
Dim rw As Long
rw = rng.SpecialCells(xlCellTypeVisible).Areas( _
    rng.SpecialCells(xlCellTypeVisible).Areas.Count _
    ).Row + rng.SpecialCells(xlCellTypeVisible).Areas( _
    rng.SpecialCells(xlCellTypeVisible).Areas.Count).Rows.Count - 1
rng.SpecialCells(xlCellTypeVisible).Cells(rw).Select
对:

Dim rng As Range
Set rng = Range( _
  Cells(ActiveCell.Row, ActiveCell.Column + 1), _
  Cells(ActiveCell.Row, Columns.Count) _
)
rng.SpecialCells(xlCellTypeVisible).Cells(1).Select
左:

我将继续对此进行研究,但由于这是我自己对自己问题的回答,如果其他人(比我更了解VBA)希望采用此解决方案并在您自己的回答中成功修改它,我将全力支持您这样做


还请注意,即使成功向下移动,如果行号大于32766,此解决方案也会产生“溢出”错误。

不确定您真正想要的是什么,但这又如何

Option Explicit

Sub move_right()
NextVisible "Right"
End Sub

Sub move_left()
NextVisible "Left"
End Sub

Sub move_up()
NextVisible "Up"
End Sub

Sub move_down()
NextVisible "Down"
End Sub

Private Sub NextVisible(direction As String)
Application.ScreenUpdating = False
Application.Calculation = xlCalculationManual
Application.EnableEvents = False

Dim i As Long
Dim r As Range
Set r = ActiveCell
For i = 1 To Rows.Count
    On Error Resume Next 'If you're in A1 and try to go up one, it'll error. This skips that error.
    Select Case direction
        Case "Up"
            Set r = r.Offset(-1, 0)
        Case "Down"
            Set r = r.Offset(1, 0)
        Case "Left"
            Set r = r.Offset(0, -1)
        Case "Right"
            Set r = r.Offset(0, 1)
        Case Else
            Set r = r
    End Select
    On Error Goto 0

    If r.EntireRow.Hidden = False And r.EntireColumn.Hidden = False Then
        r.Select
        Exit Sub
    End If
Next i

Application.ScreenUpdating = True
Application.Calculation = xlCalculationAutomatic
Application.EnableEvents = True
End Sub
然后,只需为每一个指定一个快捷方式


因此,按CTRL+I键将活动单元格向上移动。

不确定您真正想要的是什么,但是这个呢

Option Explicit

Sub move_right()
NextVisible "Right"
End Sub

Sub move_left()
NextVisible "Left"
End Sub

Sub move_up()
NextVisible "Up"
End Sub

Sub move_down()
NextVisible "Down"
End Sub

Private Sub NextVisible(direction As String)
Application.ScreenUpdating = False
Application.Calculation = xlCalculationManual
Application.EnableEvents = False

Dim i As Long
Dim r As Range
Set r = ActiveCell
For i = 1 To Rows.Count
    On Error Resume Next 'If you're in A1 and try to go up one, it'll error. This skips that error.
    Select Case direction
        Case "Up"
            Set r = r.Offset(-1, 0)
        Case "Down"
            Set r = r.Offset(1, 0)
        Case "Left"
            Set r = r.Offset(0, -1)
        Case "Right"
            Set r = r.Offset(0, 1)
        Case Else
            Set r = r
    End Select
    On Error Goto 0

    If r.EntireRow.Hidden = False And r.EntireColumn.Hidden = False Then
        r.Select
        Exit Sub
    End If
Next i

Application.ScreenUpdating = True
Application.Calculation = xlCalculationAutomatic
Application.EnableEvents = True
End Sub
然后,只需为每一个指定一个快捷方式


因此,按CTRL+I将活动单元格向上移动。

将一个单元格向下移动,前提是在隐藏行的位置没有应用过滤器

Selection.End(xlDown).Select
Selection.End(xlUp).Offset(1).Select

若在隐藏行的位置未应用过滤器,则向下移动一个单元格

Selection.End(xlDown).Select
Selection.End(xlUp).Offset(1).Select

请记住,触摸向下箭头只会向下移动
ActiveCell
,而不是所有
选择
谢谢。我不需要从复杂的选择开始移动活动单元格(例如,多个选定单元格)。我假设我从一个选定的单元格开始,然后只想模拟移动活动单元格,就像我使用了箭头键一样。让我们看看下面的SendKeys检查我的答案。SendKeys通常被警告不要使用,但肯定有应用程序。但是,更广泛地说,为什么要在快捷方式上更改单元格选择?更改选择后是否要运行宏?这可能是一个错误,请记住触摸向下箭头只会向下移动
ActiveCell
,而不是所有
选择
谢谢。我不需要从复杂的选择开始移动活动单元格(例如,多个选定单元格)。我假设我从一个选定的单元格开始,然后只想模拟移动活动单元格,就像我使用了箭头键一样。让我们看看下面的SendKeys检查我的答案。SendKeys通常被警告不要使用,但肯定有应用程序。但是,更广泛地说,为什么要在快捷方式上更改单元格选择?更改选择后是否要运行宏?如果我将此宏指定为“CTRL+J”,这可能是一个错误,现在将向下移动光标,并根据需要跳过隐藏行。但是,为了第二次工作,我需要在再次按下CTRL键和J键之前将手指从CTRL键和J键上移开,而不是让我继续按住CTRL键,然后重新按下J键。当我使用
ActiveCell.Offs时