我有两个(非常长)的TO-DO列表单 - 一个正在穿过,另一个正在下降。我如何在当前已填充的单元格之前插入新的空单元格
我想达到的目标是空白单元格出现在列表的开始位置,而不必滚动到列表的末尾以输入新的项目。
因此,当我在单元格中输入一个项目并敲入回车时,我想要单元格刚刚填充以向下移动列表(或者如果我点击标签,则跨越)并且出现在开始处的新空单元格名单。
对于新的空白单元格预填有当前日期,但这不是必需的。
感谢您的帮助。
我有两个(非常长)的TO-DO列表单 - 一个正在穿过,另一个正在下降。我如何在当前已填充的单元格之前插入新的空单元格
我想达到的目标是空白单元格出现在列表的开始位置,而不必滚动到列表的末尾以输入新的项目。
因此,当我在单元格中输入一个项目并敲入回车时,我想要单元格刚刚填充以向下移动列表(或者如果我点击标签,则跨越)并且出现在开始处的新空单元格名单。
对于新的空白单元格预填有当前日期,但这不是必需的。
感谢您的帮助。
不适用于积分。
对Gary的回答捎带,错误在于你设置了A
到Range("C4:C6")
。如果将数据输入到C4
,C5,
和C6
中的任何一个,则会发生什么情况,因为A.Insert
,它们全部移动到右侧,这是指分配给A
的所有单元。
这里的诀窍是完全符合您对Target
的要求。比方说,你有一个表从B1:E3
,如下图所示:
现在,让我们说你要移动第1行,如果你输入内容A1
,第2行,如果A2
,等下面的宏应该做的它(注意与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
时发生的情况。
希望这清除了混乱。让我们知道这是否有帮助。
以下是部分解决方案。以下事件宏监视进入单元格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
要处理多个细胞,你必须指定哪些细胞让人们在推和细胞将被推下来。
您的数据严重不完整。这不是这样做的正确方法。将所有问题从您的意见转移到您的帖子。详细内容** ALL **清晰你想要发生的事情,而不是随着你的进行而改变。加里的回答非常好,但你不断改变你的要求/描述。如果你想得到正确的答案,请提出正确的问题。另外,为什么要将列表向下移动?如果您在'A4'中输入的数据被追加到列表的末尾,会不会更好?我读它的方式,看起来好像这是你原来的方式('...而不是滚动到最后...')。 – Manhattan
Garry已经给出了一些很好的回复,并在他的第二个回复中添加了一些额外的代码,以回复我在原始帖子中的WAS请求,但他没有在第一个回复中提到。我是一个擅长的新手,所以我很欣赏他的建议,但你的态度是完全不同的。在任何情况下,我都希望列表在开始时填满。否则我不会问我的问题。现在唯一缺少的环节是让ROWS独立移动。如果你能帮助解决这个问题,我将不胜感激。 (我希望我没有遇到过不敬) – user42604
没有不敬也是不好的,但是在评论区放入要求是不好的做法。给它时间,你最终会明白为什么。无论如何,我认为加里的代码是完美的,这就是为什么我在等他,但也许我们会遇到“独立”这个词的问题,因为我觉得这很混乱。假设您在'A4'中输入数据并按Enter键。假设向下的列表中,'A5'中的值向下移动到'A6',刚刚输入的值进入'A5'。还会发生什么? *原始*行5是否也向右移动? – Manhattan