1

最近有人问我是否可以在 Excel VBA 中创建一个宏,允许用户输入两个数字并让它自动下降到下一行。这样做的目的是因为他们不擅长打字,因此他们可以一次输入两个数字的考试成绩,而无需按 Enter。

当我第一次听到这个时,他提到它是 Visual Basic,所以我想我只需在单元格范围内使用 TextChanging 或 TextChanged 事件并让它解决这个问题。但是,到目前为止,我还没有在文档中找到任何此类事件或任何类似事件。我遇到的第一件事是 Workbook_Change,但只有在你按 Enter 后才会改变,这对我来说没用。其他人提到有这样一个事件,但无法直接命名,我无法找到他们在说什么。

如果有人有任何关于此类事件是否存在或可能发生的信息,我很想知道。

据我所知,Excel 版本是 2007 年。

4

3 回答 3

3

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

请参阅有关 excel 中单元格编辑模式限制的讨论: http ://www.mrexcel.com/forum/excel-questions/524860-call-macro-every-keystroke.html

如果您真的对编程解决方案充满信心,我会推荐某种击键记录插件。

祝你好运。

于 2012-09-26T15:45:57.957 回答
0

在 Excel 2003 中,(可能在 Excel2007 中有所不同?!)每次更改单元格的值时都会触发 WorkSheet_Change 事件,无论是通过按 Enter、删除、在修改单元格后选择另一个单元格,还是在使用 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
于 2012-09-26T15:42:05.070 回答
0

您可以使用该Worksheet_SelectionChange事件。不输入就触发,但是会触发很多。

但是,您也可以创建一个特殊的用户表单来输入数据,但这可能比必要的工作量更大。

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


编辑:

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

Private Const clngColumnRightToLastGrade = 5

Private Sub Worksheet_SelectionChange(ByVal Target As Range)
  If Target.Column = clngColumnRightToLastGrade Then
    Application.EnableEvents = False
    'offset selection, one row down, two cols to left
    Target.Offset(1, -2).Select
    Application.EnableEvents = True
  End If
End Sub

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

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

要将其作为可选功能,您可以将其扩展为自动生成的代码。我想到的就像一个 Ribbon-Button,它打开一个 setupForm 进行配置,以及一个 Ribbon-Button 来激活配置,它将将此代码放在配置的工作表中。但这可能有点过头了。

于 2012-09-26T14:54:47.563 回答