我有一个两个(非常长的)TO-DO列表 - 一个穿过,另一个下降。
我想要实现的是在列表的开头显示一个空白单元格,而不必滚动到列表的末尾以输入新项目。
那么当我在单元格中输入一个项目然后点击回车时,我希望刚刚填充的单元格向下移动(或者如果我点击选项卡),并且一个新的空单元格出现在列表的开头
新的空白单元格预先填充当前日期会很有用,但这并不重要。
感谢您的帮助。
答案 0 :(得分:0)
这是部分解决方案。以下事件宏监视单元格 A1 的条目。在 A1 中输入值后,宏会将 A 列中的值“推”一下。这意味着您刚输入的值已下推至 A2 且 A1 为空:
Private Sub Worksheet_Change(ByVal Target As Range)
Dim A As Range
Set A = Range("A1")
If Intersect(A, Target) Is Nothing Then Exit Sub
Application.EnableEvents = False
A.Insert Shift:=xlDown, CopyOrigin:=xlFormatFromLeftOrAbove
Application.EnableEvents = True
End Sub
因为它是工作表代码,所以很容易安装和自动使用:
如果您有任何疑虑,请先在试用工作表上试用。
如果保存工作簿,宏将随之保存。 如果您在2003年之后使用的是Excel版本,则必须保存 该文件为.xlsm而不是.xlsx
删除宏:
要了解有关宏的更多信息,请参阅:
http://www.mvps.org/dmcritchie/excel/getstarted.htm
和
http://msdn.microsoft.com/en-us/library/ee814735(v=office.14).aspx
要了解有关事件宏(工作表代码)的更多信息,请参阅:
http://www.mvps.org/dmcritchie/excel/event.htm
必须启用宏才能使其生效!
修改#1 强>
推进而不是向下:
Private Sub Worksheet_Change(ByVal Target As Range)
Dim A As Range
Set A = Range("A1")
If Intersect(A, Target) Is Nothing Then Exit Sub
Application.EnableEvents = False
A.Insert Shift:=xlToRight, CopyOrigin:=xlFormatFromLeftOrAbove
Application.EnableEvents = True
End Sub
要处理多个单元格,您必须指定推送哪些单元格以及哪些单元格被按下。
答案 1 :(得分:0)
不是针对点。
小猪支持Gary的回答,错误在于你将A
设置为Range("C4:C6")
。当您将数据输入C4
,C5,
和C6
中的任何一个时,会发生什么情况,因为A.Insert
引用了所有细胞,所以它们都会向右移动分配给A
。
这里的诀窍是完全符合您对Target
的要求。假设您有B1:E3
的表格,如下所示:
现在,假设您想要在A1
中输入内容时移动第1行,如果A2
输入第2行,等等。下面的宏应该这样做(请注意与Gary的宏的区别):
Private Sub Worksheet_Change(ByVal Target As Range)
Dim QualifyingRange As Range
'Dim OrigRng As String
Set QualifyingRange = Range("A1:A3")
If Intersect(Target, QualifyingRange) Is Nothing Then Exit Sub
Application.EnableEvents = False
'OrigRng = Target.Address
Target.Insert Shift:=xlToRight, CopyOrigin:=xlFormatFromLeftOrAbove
'Range(OrigRng).Value = Date
Application.EnableEvents = True
End Sub
以上有什么不同?很简单,但 非常 很重要。如果Worksheet_Change
位于工作表的代码中,每时间对工作表进行有效更改,则会触发宏。您编辑的范围将被宏称为Target
。现在,通常情况下,如果您没有声明Target
的资格是什么,那么Worksheet_Change
宏就会不加区分地触发。那么我们如何正确地Target
?
我们使用Intersect
。首先,我们声明要跟踪的一系列单元格。这些单元格在更改时应该触发宏。否则,宏是kaput。这一行:If Intersect(Target, QualifyingRange) Is Nothing Then Exit Sub
基本上是:如果目标不在我想要的范围内,那么没有任何反应。
这就是我将A1:A3
声明为QualifyingRange的原因。这样,如果我对上面的任何单元格进行了更改,则会触发宏。但是,.Insert
不应该应用于整个范围,而应仅适用于Target
。这是因为如果我们执行QualifyingRange.Insert
,则每次在A1:A3
中的任何单元格中检测到更改时,所有三行都将移动。这是将A
设置为三个单元格并保持A.Insert
时发生的情况。
希望这可以消除混乱。如果这有帮助,请告诉我们。