重复暂停宏以进行数据输入

问题描述 投票:0回答:1
Sub COLUMN_C()
'
' COLUMN_C Macro
'
' Keyboard Shortcut: Ctrl+Shift+C
'
ActiveCell.FormulaR1C1 = "P"
ActiveCell.Offset(0, 3).Range("A1").Select
ActiveCell.FormulaR1C1 = "25"
ActiveCell.Offset(0, 2).Range("A1").Select
ActiveCell.FormulaR1C1 = "2"
ActiveCell.Offset(1, -5).Range("A1").Select
End Sub

我需要这个宏来暂停“数据”并将我带到下一个单元格,这样我就可以重新开始并希望循环“COLUMN_C”,这样我就可以从 C8 开始,然后继续沿着列向下移动,直到工作完成了,否则我的手指就会麻木。喜欢 Excel,但对编辑宏和如何使它们更加努力知之甚少!

我看了网上的几个建议,都看不懂。这是一个简单的宏,做了一项非常重要的工作,我希望专家可以向我展示如何用暂停代替“P”、“25”和“2”,并加快我现在正在做的工作有益但乏味。

excel vba pause
1个回答
0
投票

基本上,在发生某些事情之前您无法暂停宏。有一个例外,但它涉及启动一个表单(无论是内置表单,如

msgBox
inputBox
或文件对话框,或用户表单)。

您通常以不同的方式解决此类问题:您对“事件”做出反应,完成您的工作(在您的情况下填充其他一些单元格),仅此而已。

在您的情况下,事件是用户(=您)更改了工作表中的某些内容。每次输入内容时,Excel 都会查找处理此事件的例程,如果存在,Excel 会自动调用它。对工作表上的用户输入做出反应的事件称为

Change
。仅当

时,Excel 才会找到此例程
  • 它被放置在正确的模块中
  • 它有正确的名字
  • 它具有正确的参数定义。

现在听起来更复杂,因为 VBA 编辑器会帮助您。第一步是打开正确的模块 - 对于工作表更改事件,这是该工作表的工作表模块(这是自动创建的)。这就是它在项目资源管理器中查找sheet1的方式:

现在,在输入代码的窗口上方,选择左侧的

Worksheet
和右侧的
Change
,瞧,VBA 编辑器将为您创建一个(空)事件处理程序例程

例程获取一个参数

target
,告诉您的代码哪个单元格被修改(请注意,
target
可以包含多个单元格,例如,当您将数据复制并粘贴到多个单元格时,但我们将忽略这一点时刻)。

现在你想做什么?每当在 C 列的单元格中输入内容时,您想要将

25
写入同一行的 F 列中的单元格,并在
2
列中写入
H
,然后跳到下一行。

所以你的第一次尝试可能是这样的:

Private Sub Worksheet_Change(ByVal Target As Range)
    If Target.Count > 1 Then Exit Sub  ' More than one cell entered - ignore.
    If Target.Column <> 3 Then Exit Sub ' Not in Column C
    
    If IsEmpty(Target.Offset(0, 3)) Then Target.Offset(0, 3) = 25
    If IsEmpty(Target.Offset(0, 5)) Then Target.Offset(0, 5) = 2

    Target.Offset(1, 0).Select
End Sub

注意这个例程结束,不会暂停。相反,当用户输入下一个值时,它会再次被调用(一次又一次)。

需要了解的重要补充:当您在更改事件例程中修改数据时,该事件例程将再次触发。这对于我们的代码来说并不是什么大问题,但可能会导致事件例程的级联调用堆栈(直到在最坏的情况下,您得到臭名昭著的“堆栈溢出”错误)。
为了防止这种情况,您通常在代码开头禁用事件并在完成后启用它们。为了确保事件始终处于启用状态,即使在代码执行期间发生错误,也请使用错误处理程序:

Private Sub Worksheet_Change(ByVal Target As Range)
    If Target.Count > 1 Then Exit Sub  ' More than one cell entered - ignore.
    If Target.Column <> 3 Then Exit Sub ' Not in Column C
    
    On Error GoTo Change_exit
    Application.EnableEvents = False
    If IsEmpty(Target.Offset(0, 3)) Then Target.Offset(0, 3) = 25
    If IsEmpty(Target.Offset(0, 5)) Then Target.Offset(0, 5) = 2

    Target.Offset(1, 0).Select
Change_exit:
    Application.EnableEvents = True
End Sub

一个评论:正如您可能已经注意到的,在向单元格写入内容之前无需

Select
- 而且您永远不应该这样做。

© www.soinside.com 2019 - 2024. All rights reserved.