如何在刚刚填充的当前单元格之前插入新的空白单元格

时间:2014-02-11 12:13:30

标签: excel vba excel-vba

我有一个两个(非常长的)TO-DO列表 - 一个穿过,另一个下降。

我想要实现的是在列表的开头显示一个空白单元格,而不必滚动到列表的末尾以输入新项目。

那么当我在单元格中输入一个项目然后点击回车时,我希望刚刚填充的单元格向下移动(或者如果我点击选项卡),并且一个新的空单元格出现在列表的开头

新的空白单元格预先填充当前日期会很有用,但这并不重要。

感谢您的帮助。

2 个答案:

答案 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

因为它是工作表代码,所以很容易安装和自动使用:

  1. 右键单击Excel窗口底部附近的选项卡名称
  2. 选择查看代码 - 这会打开一个VBE窗口
  3. 粘贴内容并关闭VBE窗口
  4. 如果您有任何疑虑,请先在试用工作表上试用。

    如果保存工作簿,宏将随之保存。 如果您在2003年之后使用的是Excel版本,则必须保存 该文件为.xlsm而不是.xlsx

    删除宏:

    1. 按上述方式调出VBE窗口
    2. 清除代码
    3. 关闭VBE窗口
    4. 要了解有关宏的更多信息,请参阅:

      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")。当您将数据输入C4C5,C6中的任何一个时,会发生什么情况,因为A.Insert引用了所有细胞,所以它们都会向右移动分配给A

这里的诀窍是完全符合您对Target的要求。假设您有B1:E3的表格,如下所示:

enter image description here

现在,假设您想要在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时发生的情况。

enter image description here

希望这可以消除混乱。如果这有帮助,请告诉我们。