Windows Excel VBA-是否存在文本更改/文本更改或类似事件?或者如何在不使用Enter键的情况下移动选择?

Windows Excel VBA-是否存在文本更改/文本更改或类似事件?或者如何在不使用Enter键的情况下移动选择?,windows,events,vba,excel,Windows,Events,Vba,Excel,最近有人问我是否可以在ExcelVBA中创建一个宏,允许用户键入两个数字,并自动将其放到下一行。这样做的目的是,他们可以在考试中一次输入两个数字,而无需按enter键,因为他们不擅长打字 当我第一次听到这个时,他提到它是VisualBasic,所以我想我应该在单元格范围内使用一个TextChange或TextChanged事件,并将其关闭。然而,到目前为止,我还没有在文档中找到任何此类事件或类似事件。我遇到的第一件事是工作簿的更改,但只有在按enter键后才会更改,这对我来说是无用的。其他人提到

最近有人问我是否可以在ExcelVBA中创建一个宏,允许用户键入两个数字,并自动将其放到下一行。这样做的目的是,他们可以在考试中一次输入两个数字,而无需按enter键,因为他们不擅长打字

当我第一次听到这个时,他提到它是VisualBasic,所以我想我应该在单元格范围内使用一个TextChange或TextChanged事件,并将其关闭。然而,到目前为止,我还没有在文档中找到任何此类事件或类似事件。我遇到的第一件事是工作簿的更改,但只有在按enter键后才会更改,这对我来说是无用的。其他人提到有这样一个事件,但无法直接命名,我也无法找到他们在谈论什么

如果有人知道这样的事件是否存在或可能,我很想知道


据我所知,Excel版本是2007。

您可以使用
工作表\u selection change
事件。它在没有输入的情况下被触发,但会被多次触发

但是,您也可以创建一个特殊的用户表单来输入数据,但这可能需要做更多的工作

使用my Suggered event的主要问题是,在选择下一行时,您需要将其作为触发器并自己触发它,因此在更改选择之前禁用事件处理


编辑:

这是一个快速解决方案(将其粘贴到所需工作表的vba代码中):

每次您的选择更改为E列(
=5
)时,这会将您设置为向下一行和C列

当然,您不必使用常量,您可以在工作簿中指定要感测的列,这样您的用户可以自己更轻松地修改它

要将其作为可选功能,可以将其扩展到自动生成的代码。我想到的是一个功能区按钮,它打开一个setupForm进行配置,还有一个功能区按钮激活配置,它将此代码放置在配置的工作表中。但这可能有点过头了。

在Excel 2003中,(在Excel 2007中可能不同?!)无论是通过按enter键、delete键、修改单元格后选择其他单元格,还是vba脚本更改单元格的值,每次更改单元格的值时,都会触发“工作表更改”事件

我会这样做:

Private Sub Worksheet_Change(ByVal Target As Range)
    Dim RefRange As Range
    Set RefRange = Intersect(ActiveSheet.Columns("??????????"), ActiveSheet.UsedRange)
    If Not Intersect(Target, RefRange) Is Nothing Then
        Target.Offset(0, 1).EntireColumn.Range("A1").Select
        'Target.Offset(0, 1).EntireColumn.Range("A65536").End(xlUp).Offset(1,0).Select
    End If
End Sub

在我看来,这需要一个非编程解决方案。我绝对同情——看着人们变老很难——但为了他们和你自己,你必须在某个地方划清界限。回车键是计算机最基本的部分。您可能会编写一个宏,在excel中每按一次偶数(或奇数)键时自动按enter键,但您将遇到其他问题,例如无法正常使用delete。如果你真的想在单元格中放一串文本(比如学生的名字),该怎么办?也许是时候找到一个非编程的解决方案了。我的意思是,应该有人与他坦率地谈谈他想如何解决这个问题。就我个人而言,我愿意为他输入数字,因为我已经习惯了数字键盘——但最好是更直接地开始讨论退休问题

请参阅有关excel中单元格编辑模式限制的讨论:

如果你真的一心想要一个编程解决方案,我会推荐一些击键记录插件


祝你好运。

如果一个人在输入数字后不能按enter键,那么他的打字能力会有多差?!说真的,虽然我认为不可能在不实际键入enter键的情况下触发
工作表事件
。也许如果所有的数据都是用户表单,而不是工作表,这是可能的。他真的是个老人了,所以我只是觉得他不必麻烦它会更容易。几周前我看他用电脑,他速度非常慢。他需要这个来为他的微积分课输入分数,因为数学课在考试部门被削减了。好吧,很公平,如果这是可能的,如果他不小心输入了一个错误的数字呢?然后,他必须回去编辑,这可能比在进入之前确保其正确性更具挑战性?@AlistairWeir尝试我的解决方案,我感到惊讶,但我认为在某些情况下,这确实可以减轻具体工作的难度。您可以在数字键盘上输入realy fast,即使用右箭头转到下一个数据。一旦出现错误,你只需向上或向上,然后纠正自己。很好:)我喜欢用户表单的想法。他点击一个按钮,打开一个用户表单,其中有一个大文本框和一个
Done
按钮。您可以在文本框中捕获按键。一行上每两个字符打印一个
vbNewLine
。然后,当他完成后,他按下
done
,您就可以实现textbox的lines数组(可能需要通过拆分新行来创建该数组,我忘记了对象是如何设置的)。然后写任何需要写入的单元格。我不认为这正是我需要的。我认为它不应该在选择更改时触发,因为您必须按enter键或移动单元格才能触发该事件。我从您的代码中得出结论,您希望在两个不同的单元格中有两个数字,但我所说的两个数字(我猜是模糊的)类似于89。每一个都是一个等级,他说永远是两个数字。我的逻辑(在我遇到事件短缺问题之前)是在每次按键后检查当前单元格的文本(TextChanging/TextChanged event),并检查文本的长度。哦,好吧,我误解了你-但我几乎敢打赌,没有办法捕捉单元格的正在进行的编辑-我不害怕混乱的解决方案,但这感觉很糟糕,连史密斯小姐都没想到。如果是偶数
Private Sub Worksheet_Change(ByVal Target As Range)
    Dim RefRange As Range
    Set RefRange = Intersect(ActiveSheet.Columns("??????????"), ActiveSheet.UsedRange)
    If Not Intersect(Target, RefRange) Is Nothing Then
        Target.Offset(0, 1).EntireColumn.Range("A1").Select
        'Target.Offset(0, 1).EntireColumn.Range("A65536").End(xlUp).Offset(1,0).Select
    End If
End Sub