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”,并加快我现在正在做的工作有益但乏味。
基本上,在发生某些事情之前您无法暂停宏。有一个例外,但它涉及启动一个表单(无论是内置表单,如
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
- 而且您永远不应该这样做。