2014-02-11 54 views
0

我有两个(非常长)的TO-DO列表单 - 一个正在穿过,另一个正在下降。我如何在当前已填充的单元格之前插入新的空单元格

我想达到的目标是空白单元格出现在列表的开始位置,而不必滚动到列表的末尾以输入新的项目。

因此,当我在单元格中输入一个项目并敲入回车时,我想要单元格刚刚填充以向下移动列表(或者如果我点击标签,则跨越)并且出现在开始处的新空单元格名单。

对于新的空白单元格预填有当前日期,但这不是必需的。

感谢您的帮助。

+0

您的数据严重不完整。这不是这样做的正确方法。将所有问题从您的意见转移到您的帖子。详细内容** ALL **清晰你想要发生的事情,而不是随着你的进行而改变。加里的回答非常好,但你不断改变你的要求/描述。如果你想得到正确的答案,请提出正确的问题。另外,为什么要将列表向下移动?如果您在'A4'中输入的数据被追加到列表的末尾,会不会更好?我读它的方式,看起来好像这是你原来的方式('...而不是滚动到最后...')。 – Manhattan

+0

Garry已经给出了一些很好的回复,并在他的第二个回复中添加了一些额外的代码,以回复我在原始帖子中的WAS请求,但他没有在第一个回复中提到。我是一个擅长的新手,所以我很欣赏他的建议,但你的态度是完全不同的。在任何情况下,我都希望列表在开始时填满。否则我不会问我的问题。现在唯一缺少的环节是让ROWS独立移动。如果你能帮助解决这个问题,我将不胜感激。 (我希望我没有遇到过不敬) – user42604

+0

没有不敬也是不好的,但是在评论区放入要求是不好的做法。给它时间,你最终会明白为什么。无论如何,我认为加里的代码是完美的,这就是为什么我在等他,但也许我们会遇到“独立”这个词的问题,因为我觉得这很混乱。假设您在'A4'中输入数据并按Enter键。假设向下的列表中,'A5'中的值向下移动到'A6',刚刚输入的值进入'A5'。还会发生什么? *原始*行5是否也向右移动? – Manhattan

回答

0

不适用于积分。

对Gary的回答捎带,错误在于你设置了ARange("C4:C6")。如果将数据输入到C4,C5,C6中的任何一个,则会发生什么情况,因为A.Insert,它们全部移动到右侧,这是指分配给A的所有单元。

这里的诀窍是完全符合您对Target的要求。比方说,你有一个表从B1:E3,如下图所示:

enter image description here

现在,让我们说你要移动第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时发生的情况。

enter image description here

希望这清除了混乱。让我们知道这是否有帮助。

+0

谢谢,那正是我想要的。你不知道你为我节省了多少工作。对你和加里的祝福。 – user42604

+0

如果Gary的回答对你有帮助,请接受。这就是我们如何在SO中表示感谢。 :)祝你的项目好运。 – Manhattan

+0

对不起,最后一点。在我原来的文章中,我确实说过,如果范围开始的空单元格可以预先填充当前日期,那将会很好。这很容易实现吗? – user42604

0

以下是部分解决方案。以下事件宏监视进入单元格A1。一旦在A1中输入了一个值,宏将“A”列中的值“推”下来。这意味着,值刚才输入已被推到A2A1是空的:

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 

因为它是工作表的代码,这是非常容易安装和自动使用:

  1. 右击近Excel窗口
  2. 选择查看代码底部的标签名称 - 这带来了一个VBE窗口
  3. 粘贴的东西并关闭VBE窗口

如果您有任何疑虑,请先在试用工作表上尝试。

如果保存工作簿,宏将与其一起保存。 如果您在2003年以后使用的是Excel版本,则必须将该文件保存为.xlsm而非 。XLSX

要删除宏:

  1. 弹出VBE窗口如上
  2. 清晰的代码进行
  3. 关闭VBE窗口

要了解更多关于宏一般,参见:

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 

要处理多个细胞,你必须指定哪些细胞让人们在推和细胞将被推下来。

+0

嗨, 感谢您的及时回复。但是有几个问题: 1.我如何更改水平列表的代码?也就是说,如何才能使细胞移植到ACROSS而不是降低。 2.我可以将代码复制并粘贴到多个单元格中,例如应用于单元格A1,A2,A3等 – user42604

+0

另外,我从单元格A4开始代替A1,并且由于单元格C3具有彩色背景,所以单元格A4每次都会变为新的条目被制作出来,很快整列就会变成相同的颜色。 – user42604

+0

请参阅我的**编辑** –

相关问题