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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/vba/16.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/drupal/3.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 VBA:如何在application.undo之后记录更改事件中的用户按键?_Excel_Vba - Fatal编程技术网

Excel VBA:如何在application.undo之后记录更改事件中的用户按键?

Excel VBA:如何在application.undo之后记录更改事件中的用户按键?,excel,vba,Excel,Vba,我正在使用更改事件中的应用程序。撤消,以记录更改单元格的上一个值,并用新值重新分配该单元格 Application.EnableEvents = False vNew = Target.Value On Error Resume Next Application.Undo vOld = Target.Value Target.Value = vNew Application.EnableEvents = True 由于该分配,活动单元格始

我正在使用更改事件中的
应用程序。撤消
,以记录更改单元格的上一个值,并用新值重新分配该单元格

    Application.EnableEvents = False
    vNew = Target.Value
    On Error Resume Next
    Application.Undo
    vOld = Target.Value
    Target.Value = vNew
    Application.EnableEvents = True
由于该分配,活动单元格始终是该目标单元格,用户为进入下一个单元格而按下的最后一个键(回车或向右箭头)需要使用两次才能真正进入下一个单元格

有没有一种方法可以记录下按键,这样我就可以在代码中强制它


用户需要更改连续行/列中的多个单元格,这有点烦人。

问题是更改事件至少可以通过7种不同的方式触发:

  • 回车键
  • Tab键
  • 四个箭头键
  • 粘贴操作
  • 没有简单的方法(没有键盘API)来捕获用户使用的是哪一个。我建议你控制并强制解决这个问题:

    Private Sub Worksheet_Change(ByVal Target As Range)
        Application.EnableEvents = False
            vNew = Target.Value
            On Error Resume Next
            Application.Undo
            vOld = Target.Value
            Target.Value = vNew
            Target.Offset(1, 0).Select
        Application.EnableEvents = True
    End Sub
    

    问题在于,变更事件至少可以通过7种不同的方式触发:

  • 回车键
  • Tab键
  • 四个箭头键
  • 粘贴操作
  • 没有简单的方法(没有键盘API)来捕获用户使用的是哪一个。我建议你控制并强制解决这个问题:

    Private Sub Worksheet_Change(ByVal Target As Range)
        Application.EnableEvents = False
            vNew = Target.Value
            On Error Resume Next
            Application.Undo
            vOld = Target.Value
            Target.Value = vNew
            Target.Offset(1, 0).Select
        Application.EnableEvents = True
    End Sub
    

    这对你有用吗?不使用application.undo和.onkey:

    Public vOld As Variant 'these 2 in a module
    Public vOld2 As Variant
    
    Private Sub Worksheet_Change(ByVal Target As Range)
        vOld2 = vOld
    End Sub
    Private Sub Worksheet_SelectionChange(ByVal Target As Range)
        vOld = Target.Value
    End Sub
    

    这对你有用吗?不使用application.undo和.onkey:

    Public vOld As Variant 'these 2 in a module
    Public vOld2 As Variant
    
    Private Sub Worksheet_Change(ByVal Target As Range)
        vOld2 = vOld
    End Sub
    Private Sub Worksheet_SelectionChange(ByVal Target As Range)
        vOld = Target.Value
    End Sub
    

    是否希望onkey事件触发宏?你看了吗?我已经试过在上面代码的最后一行之后使用
    Application.OnKey
    。但它不会检测到按键,因此它不会进入手动强制输入的过程。您希望在“工作簿.open”或“工作表.activate”下进行初始化,或以其他方式在按键后随时调用您的过程。不在需要调用的实际过程的最后一行。还是我看错了你的问题?你想让onkey事件触发一个宏?你看了吗?我已经试过在上面代码的最后一行之后使用
    Application.OnKey
    。但它不会检测到按键,因此它不会进入手动强制输入的过程。您希望在“工作簿.open”或“工作表.activate”下进行初始化,或以其他方式在按键后随时调用您的过程。不在需要调用的实际过程的最后一行。还是我看错了你的问题?谢谢,我对
    SendKeys“{ENTER}”做了同样的事情,但我想我也可以用这个。我只是想知道是否有一种方法可以捕捉用户按下的键,但我明白你的意思,我不得不将就一下。谢谢,我用
    SendKeys“{ENTER}”
    做了同样的事情,但我想我也可以用它。我只是想知道是否有一种方法可以捕捉到用户按下的按钮,但我明白你的意思,我不得不将就一下。